JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> Stepping into the church, you hear chanting in a language you havent heard before<br><br> <<say 'Voice'>> Veneris tenebrae… sussurrare in sanguine…<br> Malefica carnis, audi me, audi me…<br> Invoco desiderium, invoco damnatio…<br> Asmodea… Lilith… aperite portas inferni…?<</say>> You look around and don't see anyone, then your eyes fall onto a man, kneeling on the floor<br><br> <<say 'Man'>>Venite, venite, venite…<br> Exsurgat succuba… in nocte, in luxuria, in furore…<br> Cor meum, corpus meum, tibi offero…<br> Fode profundum, fode animam…<br> Adesto nunc, domina infernalis…<</say>> You are not sure what's going on until you see what is carved into the floor<br><br> <<set _imgPath to "Images/Forrest/Encounters/Cave/7.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> This is a ritual, the man is trying to summon something<br><br> <<button "Watch">> <<goto "ChurchWatch">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if !$VistedForestLocations>> <<set $VistedForestLocations = []>> <</if>> <<if $Position isnot "null">> <<if $VistedForestLocations.includes($Position)>> <<goto "ForestLocationVisited">> <<else>> <<run $VistedForestLocations.push($Position)>> <</if>> <</if>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<set _imgPath to "Images/Forrest/Encounters/Abandond Church/2.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <i>This section of the game is still under development</i> <<button "Leave">> <<run $VistedForestLocations.delete($Position)>> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<set _rand to random(0, 2)>> <<if _rand is 0>> You search the house and look around, its empty today. One the way out you see a young woman walking down the path<br><br> <<set $Position to "null">> <<if $CurrentPlayer is "Overlord">> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $PlayerSpells.includes("Stalk")>><<link "Cast your stalk spell">><<run Engine.play('RandomForestHome')>><</link>> <<else>> You dont have the right spell to follow her<br><br> <</if>> <<button "Let her pass">> <<goto "ForestExplore">> <</button>> <</if>> <</if>> <<if _rand is 1>> You search the house and take some of the beams which have fallen, giving you +100 wood<br> <<set $Wood to $Wood + 100>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<if _rand is 2>> You search the house and take some of rubble laying around, giving you +100 stone<br> <<set $Stone to $Stone + 100>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<if _rand is 3>> Entering the house you search the rubble looking for anything useful... Entering the livingroom you find a young woman sitting by a fire<br><br> <<set _charPath to "Images/Forrest/Encounters/Abandond House/Vampire Trap/1.png">> <div class="Random-image"> <<set _imagePath to _charPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Woman' _charPath>>Look, I don't want any trubble... But if you have any gold you can spare that would be kind<</say>> <<button "Leave her be">> <<goto "ForestExplore">> <</button>><br> <<if $Gold >= 10>> <<button "Give her 10 gold">> <<goto "ForestHouseVampireTrap">> <</button>> <<else>> you have nothing to give her <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if !$VistedForestLocations>> <<set $VistedForestLocations = []>> <</if>> <<if $Position isnot "null">> <<if $VistedForestLocations.includes($Position)>> <<goto "ForestLocationVisited">> <<else>> <<run $VistedForestLocations.push($Position)>> <</if>> <</if>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<if $Position is "Abandond town">> <</if>> <<if $Position is "house1">> <<set _imgPath to "Images/Forrest/Encounters/Abandond House/1.png">> <</if>> <<if $Position is "house2">> <<set _imgPath to "Images/Forrest/Encounters/Abandond House/2.png">> <</if>> <<if $Position is "house3">> <<set _imgPath to "Images/Forrest/Encounters/Abandond House/3.png">> <</if>> <<if $Position is "house4">> <<set _imgPath to "Images/Forrest/Encounters/Abandond House/4.png">> <</if>> <<if $Position is "house5">> <<set _imgPath to "Images/Forrest/Encounters/Abandond House/5.png">> <</if>> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Enter the house">> <<goto "Abandoned House Inside">> <</button>><br> <<button "Leave">> <<run $VistedForestLocations.delete($Position)>> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <i>click on the chest to open it</i> <div id="chest-container"> <img id="chest-image" src="Images/Forrest/Encounters/Guard Tower/5.jpg"> </div> <<set _int to random(40, 100)>> <div id="treasure-text" style="display: none"> You found _int gold! <br> <<set $Gold to $Gold + _int>> <<button "Leave">> <<set $TowerKeyFound to false>> <<set $TowerGroundSearched to false>> <<goto "ForestExplore">> <</button>> </div> <<script>> $(document).ready(function() { $("#chest-image").one("click", function() { $("#chest-image").attr("src", "Images/Forrest/Encounters/Guard Tower/6.jpg"); $("#treasure-text").fadeIn(1000); }); }); <</script>> <style> #chest-container { cursor: pointer; text-align: center; } #chest-image { max-width: 300px; } #treasure-text { margin-top: 20px; font-size: 1.2em; color: #gold; } </style> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>><div class="text-box"><<set _rand to random(1, 6)>> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/Bandits/" + _rand + ".png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if _rand lt 4>>Sneeking into the groundfloor room, you see a woman has taken refuge here, she looks like a bandit so you decide to be careful<<else>>Sneeking into the groundfloor room, you see a man has taken refuge here, he looks like a bandit so you decide to be careful<</if>>Looking around and staying out of sight, you see a small bag close to you, you could risk searching it, or prehapse you should deal with the bandit<br><br><<set _enegy to $PlayerEnergy / 2 + 5>><<set _searchChance to _enegy>> <<if $combatCardsMax>> <<set _attackChance to 25 * $combatCardsMax>> <<else>> <<set _attackChance to 25 * 2>> <</if>> <div id="choice-buttons" style="text-align: center; margin: 20px;"> <<button "Search the bag (_searchChance% success chance)">> <<set _roll to random(1, 100)>> <<replace "#choice-buttons">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#result-area">> <<if _roll <= _searchChance>> <div class="success-message"> </div> You sneek over to the bag and open it you look through it slowly and find a small key, you take it<br><br> <<button "Back out">> <<set $TowerKeyFound to true>> <<set $TowerGroundSearched to true>> <<goto "Abandoned Tower Inside">> <</button>> <<else>> <div class="fail-message"> <<if _rand lt 4>> You dig through the bag searching for anything useful before you feel something cold and sharp press against your throat...<br> <<button "Continue">> <<set $Int to 1>> <<goto "Abandoned Tower Search">> <</button>> <<else>> You dig through the bag searching for anything useful before you feel a boot crash into your ribs...<br> <<button "Continue">> <<set $Int to 2>> <<goto "Abandoned Tower Search">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> <<button "Try to sneak attack (_attackChance% success chance)">> <<set _roll to random(1, 100)>> <<replace "#choice-buttons">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#result-area">> <<if _roll <= _attackChance>> <div class="success-message"> Sneaking up on the bandit, you draw your sword and swing it down. In one clean motion you remove the bandits head from their body and feel their soul become yours<br> <<set _foundGold to (20, 40)>> You search the body and find _foundGold gold and a key...<br><br> <<button "Leave the room">> <<set $TowerKeyFound to true>> <<set $TowerGroundSearched to true>> <<set $Gold to $Gold + _foundGold>> <<set $Souls to $Souls + 1>> <<goto "Abandoned Tower Inside">> <</button>> </div> <<else>> <div class="fail-message"> Sneaking up on the bandit, you draw your sword and swing it down. At the last moment, they roll, clearly pretending to be unaware of your presence. Your swing goes wide and strikes the stone floor<br><br><<if _rand lt 4>> <<set _NPCList to ["Blonde", "Brown", "Red"]>><<set _int to random(0, 2)>><<set $NPC to _NPCList[_int]>><<set $NPCInt to random(1, 12)>><<set $ImagePath to "Images/Forrest/Encounters/Human/Female/Bandit/" + $NPC + "/" + $NPCInt + ".png">><<set $EnemyCorruption to 0>><<set $EnemyHealth to 100>><<set $CurrentEnemy to "female Bandit">><<set $EnemyMin to 15>><<set $EnemyMax to 25>><<set $EnemyWeapon to "dagger">><<set $Tag = tags()[1]>><<set $BackgroundPath = setup.getBackgroundPath($Tag)>><<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>><<set _int to random(1, 15)>><<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", hairColor: $NPC, ImagePath: "Images/Castle/Dungon/Woman/" + $NPC + "/Clothed/" + _int + ".png", corruption: 0, status: "Clothed"}>> <<else>> <<set _Int = random(1, 10)>><<set $ImagePath to "Images/Forrest/Encounters/Human/Male/Bandit/" + _Int + ".png">><<set $EnemyCorruption to 0>><<set $EnemyHealth to 100>><<set $CurrentEnemy to "Bandit">><<set $EnemyMin to 15>><<set $EnemyMax to 25>><<set $EnemyWeapon to "dagger">><<set $Tag = tags()[1]>><<set $BackgroundPath = setup.getBackgroundPath($Tag)>><<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>><<set _int to random(1, 10)>><<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed"}>><</if>> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Female Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Armed With:</span> <span class="weapon-type"><<print $EnemyWeapon>></span></p> <div class="health-bar"> <div class="health-fill" style="width: 100%"></div> </div> </div> </div> </div> <div class="combat-buttons"> <<button "Attack">><<goto "Combat">><</button>> </div> </div> <</if>> <</replace>> <</button>> </div> <div id="result-area"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style></div><<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">><<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;')>><<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style');})>><</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<set _rand to random(5, 6)>> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/" + _rand + ".png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $TowerGroundSearched isnot true>> <<button "Search downstairs">> <<if _rand is 5>> <<goto "Abandoned Tower Downstairs">> <<else>> <<goto "Abandoned Tower Trap">> <</if>> <</button>> <</if>> <<button "Search upstairs">> <<goto "Abandoned Tower Upstairs">> <</button>><br> <<button "Leave">> <<set $TowerKeyFound to false>> <<set $TowerGroundSearched to false>> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Int is 1>> <<set _charPath to "Images/Forrest/Encounters/Abandond tower/Vampire/1.png">> <<say 'Woman' _charPath>>What do we have here... A fly stumbled into my web?<</say>> <<say 'Woman' _charPath>>I was just resting, relaxing and avoiding the sun and you came in here and tried to steal from me?<</say>> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/Vampire/2.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> She croutches down holding the blade to your neck, getting a better look at her face you see the glint of two long fangs...<br><br> <<set _charPath to "Images/Forrest/Encounters/Abandond tower/Vampire/5.png">> <<say 'Woman' _charPath>>Give me one good reason I shouldn't empty your throat little fly?<</say>> <<You>>I... I can<</You>> <<say 'Woman' _charPath>>You can't... I want nothing more than to open up that throat of yours<</say>> She smiles at you <<say 'Woman' _charPath>>But, that would be boring... I could suck you dry right now but night is coming and I much prefer to hunt my prey... So that's it we wait till dark and I'll let you run home<</say>> You stare at her, confused <<say 'Woman' _charPath>>Run little fly, I'll give you a head start... Run home before I catch you<</say>> <<button "Run">> <<script>> window.vampireHuntTimer.start(10); <</script>> <<set $Time to 9>> <<set $VampireHunt to true>> <<goto "ForestExplore">> <</button>> <</if>> <<if $Int is 2>> Something in your chest cracks as the boot strikes your chest, you roll away and look up, scramberling to your feet<br> <<if $PlayerHealth gt 10>> <<set $PlayerHealth to $PlayerHealth - 10>> <<else>> <<set $PlayerHealth to 5>> <</if>> <<say 'Man'>>Fucking thief!<</say>> <<set _Int = random(1, 10)>><<set $ImagePath to "Images/Forrest/Encounters/Human/Male/Bandit/" + _Int + ".png">><<set $EnemyCorruption to 0>><<set $EnemyHealth to 100>><<set $CurrentEnemy to "Bandit">><<set $EnemyMin to 15>><<set $EnemyMax to 25>><<set $EnemyWeapon to "dagger">><<set $Tag = tags()[1]>><<set $BackgroundPath = setup.getBackgroundPath($Tag)>><<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>><<set _int to random(1, 10)>><<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed"}>> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Female Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Armed With:</span> <span class="weapon-type"><<print $EnemyWeapon>></span></p> <div class="health-bar"> <div class="health-fill" style="width: 100%"></div> </div> </div> </div> </div> <div class="combat-buttons"> <<button "Attack">><<goto "Combat">><</button>> <<button "Run out">><<goto "ForestExplore">><</button>> </div> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You walk towards the doorway leading to the ground floor room, as your foot passes the doorway you feel your leg strike something. You instantly realise you have triggered a tripwire!<br><br> You hear a crash as old pots and pans roll across the floor, it's too hard to see far into the room so you wait, allowing your eyes time to adjust<br><br> Out of the shadows you see a blade launch towards your heart, you dodge to one side and feel it slide into your shoulder, the hand on the other end of the dagger pulls back and you let out a cry<br><br> A woman steps out of the shadow, holding her dagger <br><br> <<if $PlayerHealth gt 10>><<set $PlayerHealth to $PlayerHealth - 10>><<else>> <<set $PlayerHealth to 1>><</if>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/studded_leather_coat.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 7)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/Bandit/" + $NPC + "/" + $NPCInt + ".png">> <<set $EnemyCorruption to 0>> <<set $EnemyHealth to 100>> <<set $EnemySex to "Female">> <<set $CurrentEnemy to "female bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "bandit", sex: "Female", hairColor: $NPC, ImagePath: "Images/Castle/Dungon/Woman/" + $NPC + "/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <<button "Withdraw" "ForestExplore">><</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Knife Slash', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 6, effects: [], description: 'A wild slash' }, { name: 'Knife Stab', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 10, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/wooden_club.png', type: 'weapon', damage: 12, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/plain_dagger.png', type: 'weapon', damage: 8, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'defence', damage: 15, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Falchion Slash', image: 'Images/Items/Melee Weapons/falchion.png', type: 'weapon', damage: 12, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Hatchet Chop', image: 'Images/Items/Melee Weapons/hatchet.png', type: 'weapon', damage: 16, effects: [], description: 'A sharp small axe chop' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 20, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>>
<<nobr>> <<if !$VistedForestLocations>> <<set $VistedForestLocations = []>> <</if>> <<if $Position isnot "null">> <<if $VistedForestLocations.includes($Position)>> <<goto "ForestLocationVisited">> <<else>> <<run $VistedForestLocations.push($Position)>> <</if>> <</if>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<if $Position is "tower1">> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/1.png">> <</if>> <<if $Position is "tower2">> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/2.png">> <</if>> <<if $Position is "tower3">> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/3.png">> <</if>> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Enter the tower">> <<goto "Abandoned Tower Inside">> <</button>><br> <<button "Leave">> <<run $VistedForestLocations.delete($Position)>> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/7.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Climbing the stairs, you find a door, it locked<br><br> <<if $TowerKeyFound is true>> <<button "Unlock the door">> <<goto "Abandoned Tower Bedroom">> <</button>><br> <</if>> <<button "Go downstairs">> <<goto "Abandoned Tower Inside">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<set $names = Story.get("FemaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <<set _randomName = $names[random(0, $names.length - 1)]>> Your random name is: _randomName <<link "Add blonde Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 20)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, hairColor: "Blonde", ImagePath: "Images/Forrest/Cult/Cultists/Blonde/" + _int + ".png", corruption: 0 }>> <<run State.variables.CultOccupance.push($CurrentCaptive)>> <</link>><br><br> <<link "Add Brown Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 20)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, hairColor: "Brown", ImagePath: "Images/Forrest/Cult/Cultists/Brown/" + _int + ".png", corruption: 0 }>> <<run State.variables.CultOccupance.push($CurrentCaptive)>> <</link>><br><br> <<link "Add red Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 20)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, hairColor: "Red", ImagePath: "Images/Forrest/Cult/Cultists/Red/" + _int + ".png", corruption: 0 }>> <<run State.variables.CultOccupance.push($CurrentCaptive)>> <</link>><br><br> [[Back|Visit the coven]]
This is a cheat menu for testing. If I left this in, I am stupid <<nobr>> <div class="text-box"> <<link "Add blonde Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", hairColor: "Blonde", ImagePath: "Images/Castle/Dungon/Woman/Blonde/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <</link>><br><br> <<link "Add brown Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Woman/Brown/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</link>><br><br> <<link "Add red Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", hairColor: "Red", ImagePath: "Images/Castle/Dungon/Woman/Red/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</link>><br><br> <<link "Add Lucy">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Woman/4/1.png" , corruption: 0, status: "Imprisoned" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</link>><br><br> <<link "Add Alice">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", hairColor: "Red", ImagePath: "Images/Castle/Dungon/Woman/5/2.png", corruption: 0, status: "Imprisoned" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</link>><br><br> <<link "Add male Bandit">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <</link>><br><br> [[Back|Dungeon2]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You take a seat in the cornor of the tavern. Taking out a small book you begin to read<br> <<button "Someone Comes Over">> <<goto "AliceBarPersonIntro">> <</button>><br> <<button "Leave">> <<goto "Town">> <</button>> </div> <</nobr>>
<<nobr>> <<set _AliceShyGreeting to ["Umm, how do you do", "Good evening sir", "How-how do you do sir"]>> <<set _AliceConfidentGreeting to ["Ah, you're a bold one coming up to a lady to greet her", "Humm?", "Make yourself comfortable"]>> <<set _AliceFlirtatiousGreeting to ["Well, you're a tall handsome man aren't you?", "Take a seat where ever you like", "Hummm, hello handsome"]>> <<set _AliceShyWhore to ["Ummm, well I actually work here... You know... Upstairs", "I'm... One of the working girls here", "I actually work here... In one of the rooms upstairs..."]>> <<set _AliceConfidenWhore to ["I'm one of the working girls in this lovely establishment", "Haven't we met before? I work upstairs, if you know what I mean", "Actually, you would normally find me upstairs"]>> <<set _AliceFlirtatiousWhore to ["I work upstairs, maybe I can give you a tour", "I work here, it's my job to make sure patrons are having a great time", "I work here sir, making a living on my back... Or my knees"]>> <<set _AliceShyDrink to ["A tankard of mead would be lovely, thank you", "That would be kind, a tankard of mead please", "Ok, I prefer mead, thank you"]>> <<set _AliceConfidenDrink to ["Sure! Get my a tankard of mead", "I'll take a tankard of mead love", "I won't turn down a free drink, mead please"]>> <<set _AliceFlirtatiousDrink to ["Are you trying to get me drunk? In that case sure", "I never say no to a free drink", "A handsome man, offering a free drink? How could I say no"]>> <<set _AliceShyBusiness to ["Well, Actually I'm visiting", "I'm actually visiting on business", "I'mm just visiting on business"]>> <<set _AliceConfidentBusiness to ["If you must know... I'm working here on business, I arrived in the harbour this morning", "I'm actually visiting on business", "I'mm just visiting on business"]>> <<set _AliceFlirtatiousBusiness to ["", "", ""]>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "Drink">> You enjoy a drink together and speak. You can tell his interest in you is growing<br> <<if $AliceBarKnowArousal lt 80>> <<set $AliceBarKnowArousal to $AliceBarKnowArousal + 20>> <<else>> <<set $AliceBarKnowArousal to 100>> <</if>> <<if ($AliceBarKnowJob is false) or ($AliceBarKnowWants is false)>> However, you still dont fully know him so you can't be sure if he is on any real use to you. <<if $AliceBarKnowArousal is false>> You can't even be sure he is that interested in you... <</if>> <br><br> <</if>> You consider what to do next<br><br> <<button "Ask him more questions">> <<set $Position to "Null">> <<goto "AliceBarPersonQuestion">> <</button>> <<button "Suggest he takes you home">> <<set $Position to "Take home">> <<goto "AliceBarPerson2">> <</button>><br> <<button "Tease him">> <<set $Position to "Tease">> <<goto "AliceBarPerson2">> <</button>> <</if>> <<if $Position is "Drunk">> <<set $AliceBarKnowJob to true>> <<set $AliceBarKnowWants to true>> <<set $AliceBarKnowArousal to true>> You are both getting drunk, while his guard is down you can read him like a book, but you are begging to loose interest in your original mission<br> As the meed takes hold, you begin to focus more on your base desires. You slide under the table and crawl over to the man <<say 'Stranger' $CharImg>>What are you doing?<</say>> <<say 'Alice' $AliceTavImg>>shhh<</say>> Lust overwhelming your sence of control, you take out his manhood and begin to service him. He gasps and looks around checking to see if anyone has notices you<br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(5, 6)>> <<else>> <<set _rand to random(1, 4)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/table/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Stranger' $CharImg>>God's this is my lucy day<</say>> <<say 'Alice' $AliceTavImg>>Umm, so good...<</say>> <<button "Ask if he wants to go outside">> <<set $Position to "outside">> <<goto "AliceBarOutsideMan">> <</button>><br> <</if>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $AliceBarMeetPersonality is "Drunk">> You walk into the mans house confidently and help him undress <<say 'Alice' $AliceTavImg>>A cute little town house... Tell me does your wife know you bring women like me home?<</say>> He responds by pushing you down to your knees and pulling your head on his cock <<set _img to random(7, 8)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>That shut you up... *Hick* thats it slut<</say>> He doesn't go easy on you but you enjoy the rough hands gripping your head and the hard cock in your throat. Most men would have cum by now but the drink was clearly helping this one. <br><br> After a long messy face fucking, his cock slides out your hungry mouth and he carrys you over to a desk. <<say '$AliceBarMeetName' $CharImg>>Lets see if your cunts as good as your mouth<</say>> <<say 'Alice' $AliceTavImg>>Such a gentl...<</say>> His cock thrusts into you and all thoughts leave your brain as he hammers into you over and over <<set _img to random(4, 8)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> He hammers into you over and over. With every thrust you both fall into deeper pleasure, until his breathing becomes heavier and his cock starts to throb <<say '$AliceBarMeetName' $CharImg>>Ughhh Fuckk<</say>> Warmth rushes into you, you choose to spare his soul but you corrupt him to your will, at least for a short time <<say 'Alice' $AliceTavImg>>Umm good work, now... clean up<</say>> He gets to work licking your cunt while you think about how best to use him...<br><br> <<set _img to random(9, 10)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> <<if $AliceBarMeetPersonality is "Nervous">> He leads you into a small room with a bed and a writing desk. You stand, waiting for him to make a move... He stands fast and you can tell he has no idea what he's doing<br><br> Taking the lead, you perch on his desk and expose yourself to him <<set _img to random(1, 3)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>Well... Don't keep me waiting<</say>> Theres a pause as he takes in the view, for a moment you think he's going to stand there forever but in a flash he crosses the room, drops to his knees and burries his face between your legs <<say 'Alice' $AliceTavImg>>Ummm good boy!<</say>> <<set _img to random(9, 10)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Your legs fold around his head, pulling him in as he eats your pussy with little skill but a lot of enthusiasm <<say 'Alice' $AliceTavImg>>Why don't you get that cock out and fuck me?<</say>> He obays, standing and staring at you dumbly while thumberling with his trousers... After a moment his cock springs out and he guides it into your dripping mound with a loud moan <<set _img to random(4, 8)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You relax on the table and enjoy his cock, slowly the pleasure begins to build and you feel yourself getting close, until... <<say '$AliceBarMeetName' $CharImg>>Gods... I'm going to!<</say>> He pulls his cock from your needy hole and spills onto your stomach making a mess of you and your dress. You let his soul remain with him... But your corruption floods into him as he becomes, for now, yours... <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> <<if $AliceBarMeetPersonality is "Confident">> He leads you to his home near the edge of the city and opens the door for you. Stepping in site you allow your dress to fall to the floor<br><br> <div class="Random-image"> <<set _imagePath to "Images/Town/AliceHouse/4.png">> <img @src=_imagePath alt="Guest Image"> </div> <div class="Random-image"> <<set _imagePath to "Images/Town/AliceHouse/5.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> With a confident smile, he undresses and leads you to the bedroom, after quick foreplay you're both on the bed, with him staring up at you as you mount his cock<br><br> <<set _img to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Miss/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>That's it girl... Fuck<</say>> The passion was short lived and after a moment you're in his strong grip being hammered from below... You let out a moan and he tauts you <<say '$AliceBarMeetName' $CharImg>>You like that slut? It was so easy to get you back to my house<</say>> Rude... But he has a point, he just doesn't know why it was so easy...<br><br> After a rough pounding, he release you, sits up and carries you over to the table... Impressive, you think <br><br> <<set _img to random(11, 12)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Desk/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <<say '$AliceBarMeetName' $CharImg>>Fuck... Come here<</say>> He steps back and you struggle to get to your feet, after a moment, you stand but quickly find youself back on your keens with his cock infront of you...<br><br> Opening wide his cock slides down your throat as he fucks your face <<set _img to random(9, 10)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <<say '$AliceBarMeetName' $CharImg>>Fuck...<</say>> His cock throbs in your mouth and rough hands pull you down as he beings to shoot down your throat <<set _img to random(11, 12)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Alice' $AliceTavImg>>Umm!<</say>> Hes hands release your head and you pull away, he stands there dumbly as you spare his soul but corrupt him for a while, making him your slave <<say 'Alice' $AliceTavImg>>Well... Not so cocky now are you?<</say>> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $AliceBarKnowArousal to true>> <<set _alice50 to ["50 gold?", "Thats going to cost 50 gold for my time", "50 gold and I'm yours"]>> <<set _alice100 to ["100 gold?", "Thats going to cost 100 gold for my time", "100 gold and I'm yours"]>> <<set _alice200 to ["200 gold?", "Thats going to cost 200 gold for my time", "200 gold and I'm yours"]>> <<set _alice300 to ["300 gold?", "Thats going to cost 300 gold for my time", "300 gold and I'm yours"]>> <<set _aliceSlow to ["Umm, why doen't we slow down and get to know each other first", "Easy... Why don't we get to know eachother a bit first", "Ha, not that I wouldn't love too... But I prefer to get to know clients first"]>> <<if $Position is "100">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice100[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice50[1]>> <<else>> <<set _greeting to _alice50[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<button "Leave Together">> <<goto "AliceBarHomeMan">> <</button>> <</if>> <<if $Position is "200">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice200[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice100[1]>> <<else>> <<set _greeting to _alice100[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if ($AliceBarMeetArousal gt 30) or ($AliceBarMeetPersonality is "Drunk")>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<button "Leave Together">> <<goto "AliceBarHomeMan">> <</button>> <<else>> <<if $AliceBarStyle is "Shy">> <<say '$AliceBarMeetName' $CharImg>>Ha, I'll pass. A shy girl like you is cleary inexperianced<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<button "Leave Together">> <<goto "AliceBarHomeMan">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Sorry love, that's too much gold for me<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <</if>> <</if>> <<if $Position is "300">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice300[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice200[1]>> <<else>> <<set _greeting to _alice200[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if ($AliceBarMeetArousal gt 45) or ($AliceBarMeetPersonality is "Drunk")>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<button "Leave Together">> <<goto "AliceBarHomeMan">> <</button>> <<else>> <<if $AliceBarStyle is "Shy">> <<say '$AliceBarMeetName' $CharImg>>Ha, I'll pass. A shy girl like you is cleary inexperianced<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<button "Leave Together">> <<goto "AliceBarHomeMan">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Sorry love, that's too much gold for me<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <</if>> <</if>> <<if $Position is "Slow">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _aliceSlow[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _aliceSlow[1]>> <<else>> <<set _greeting to _aliceSlow[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if $AliceBarMeetPersonality is "Drunk">> <<say '$AliceBarMeetName' $CharImg>>Ugh, f-fuck this I didn't come here to make friends<</say>> The drunk man stands and wonders away<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>If you like... What would you like to discuss?<</say>> <<button "Ask what he does">> <<set $Position to "Does">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<if def _room2name>><<else>> <<button "Ask his name">> <<set $Position to "Name">> <<goto "AliceBarPersonQuestion">> <</button>><br><</if>> <<button "Ask him to buy you a glass of wine">> <<set $Position to "Drink">> <<goto "AliceBarPerson2">> <</button>><br> <</if>> <</if>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $AliceBarMeetPersonality is "Drunk">> The man wastes no time lifting your skirt and pressing himself into you as you both moan far too loudly <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(1, 5)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>Fu... Cum for me<</say>> He grunts in satifcation, but the drink gives him more stamina than you expected and he continues fucking you against the wall<br><br> Not that you mind, since your new life began your desires are unending but, nothing quite satisfys you like your master <<say '$AliceBarMeetName' $CharImg>>Ugh!<</say>> Lost in a moment of thought, you snap back to the warm feeling of the drunk man spilling into you as he cums<br><br> <<if $AliceDrunk lt 5>> Turning, you look at the now sober man as she stares at you with infatuation. Having the power you do, your corruption has taken hold of the man and for a few days he will be completely obedient to you<br> <<say 'Alice' $AliceTavImg>>Umm good work<</say>> <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <<else>> Your far too drunk to care about your goal and your corrupting power doesn't take hold of the man. Instead, he loses interest in you and staggers off<br><br> You in tern gather yourself up and attempt to get back to your horse<br><br> On your way back, you bump into a few other friendly towns foke whom you become more aquainted with before finally reaching your horse and returning to the castle... <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(14, 16)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(5, 8)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Go home">> <<goto "Base intro">> <</button>> <</if>> <</if>> <<if $AliceBarMeetPersonality is "Nervous">> <<say '$AliceBarMeetName' $CharImg>>Do-do you think we should find somewhere...<</say>> <<if $AliceArtStyle is "Anime">> <<set _rand to random(14, 16)>> <<else>> <<set _rand to random(6, 8)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> He cuts off when your mouth envelopes his manhood <<say '$AliceBarMeetName' $CharImg>>Ohh<</say>> <<if $AliceDrunk lt 5>> You continue sucking him in view of everyone, the nervous man tries to hide his moans while you make a mess of his cock and your face<br> <<say '$AliceBarMeetName' $CharImg>>I'm... Gona...<</say>> He spills out into your mouth and you carefully swallow his load before catching your breath and standing <<say 'Alice' $AliceTavImg>>Umm good work<</say>> <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <<else>> You continue sucking him in view of everyone, the nervous man tries to hide his moans while you make a mess of his cock and your face<br><br> Eventually he begings to cum filling your mouth and making an even bigger mess of your face. You forget your mission in your drunken haze and let him leave as you clean yourself off You in tern gather yourself up and attempt to get back to your horse<br><br> On your way back, you bump into a few other friendly towns foke whom you become more aquainted with before finally reaching your horse and returning to the castle... <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(14, 16)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(5, 8)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Go home">> <<goto "Base intro">> <</button>> <</if>> <</if>> <<if $AliceBarMeetPersonality is "Confident">> <<say '$AliceBarMeetName' $CharImg>>Thats it, kneel for me<</say>> Sinking to your knees, he helps you pull out his cock<br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(14, 16)>> <<else>> <<set _rand to random(6, 8)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Fuck... Ok stand up for me<</say>> You do as he says and he pushes his slick manhood into you <<say 'Alice' $AliceTavImg>>Ooo!<</say>> <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(1, 5)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>I'm gona fill you, slut<</say>> <<say 'Alice' $AliceTavImg>>Do it!<</say>> <<if $AliceDrunk lt 5>> Turning, you look at the now sober man as she stares at you with infatuation. Having the power you do, your corruption has taken hold of the man and for a few days he will be completely obedient to you<br> <<say 'Alice' $AliceTavImg>>Umm good work<</say>> <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <<else>> Your far too drunk to care about your goal and your corrupting power doesn't take hold of the man. Instead, he loses interest in you and staggers off<br><br> You in tern gather yourself up and attempt to get back to your horse<br><br> On your way back, you bump into a few other friendly towns foke whom you become more aquainted with before finally reaching your horse and returning to the castle... <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(14, 16)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(9, 13)>> <<else>> <<set _rand to random(5, 8)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Outside/" + _rand + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Go home">> <<goto "Base intro">> <</button>> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "AliceBarDialogue">> <<if $AliceBarStyle is "Shy">> <<set _greeting to either(_AliceShyGreeting)>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to either(_AliceConfidentGreeting)>> <<else>> <<set _greeting to either(_AliceFlirtatiousGreeting)>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if $AliceBarMeetPersonality is "Nervous">> He remains silent for a long moment, leaving a window for you to ask a question<br> <<button "Ask what he does">> <<set $Position to "Does">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask his name">> <<set $Position to "Name">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask him to buy you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<else>> <<say '$AliceBarMeetName' $CharImg>>My name is $AliceBarMeetName<</say>> <<if $AliceBarMeetPersonality is "Confident">> He speeks slowly, with a manor of a man who believes he can charm woman with ease <<set _rand to random(0, 2)>> <<if _rand is 0>> <<say '$AliceBarMeetName' $CharImg>>May I buy you a drink?<</say>> <<button "Let him get you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<elseif _rand is 1>> <<say '$AliceBarMeetName' $CharImg>>Why is such a lovely woman drinking in a tavern alone?<</say>> <<button "Tell him your here on business">> <<set $Position to "Business">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Tell him you work upstairs">> <<set $Position to "Whore">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<else>> <<say '$AliceBarMeetName' $CharImg>>I haven't seen you around here before?<</say>> <<button "Tell him your here on business">> <<set $Position to "Business">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Tell him your travaling">> <<set $Position to "Travaling">> <<goto "AliceBarPersonAnswer">> <</button>><br> <</if>> <<else>> He's clearly had a few tankards of ale, but he not too drunk <<set _rand to random(0, 2)>> <<if _rand is 0>> <<say '$AliceBarMeetName' $CharImg>>How about a drink, love?<</say>> <<button "Let him get you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<elseif _rand is 1>> <<say '$AliceBarMeetName' $CharImg>>Are you single?<</say>> <<button "Tell him your here on business">> <<set $Position to "Business">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Tell him you work upstairs">> <<set $Position to "Whore">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<else>> <<say '$AliceBarMeetName' $CharImg>>I haven't seen you around here before?<</say>> <<button "Tell him your here on business">> <<set $Position to "Business">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Tell him your travaling">> <<set $Position to "Travaling">> <<goto "AliceBarPersonAnswer">> <</button>><br> <</if>> <</if>> <</if>> <<button "Ask him to leave">> <<goto "AliceBarAlone">> <</button>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span><span class="blurred"> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "Take home">> <<say 'Alice' $AliceTavImg>>Sooo, do you live close?<</say>> <<say '$AliceBarMeetName' $CharImg>>Yes, not far. I live in the residential district<</say>> <<say 'Alice' $AliceTavImg>>Why don't you take me to see it<</say>> <<if ($AliceBarMeetPersonality is "Drunk") or ($AliceBarKnowArousal gt 55) or ($AliceBarMeetWants is "You to join him upstairs")>> You watch as a smile flashes across his face as he finally takes the hint <<say '$AliceBarMeetName' $CharImg>>Lets go<</say>> <<button "Go">> <<goto "AliceBarHomeMan">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Err, I'm sorry I should go<</say>> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <</if>> <<if $Position is "Tease">> You slip your shoe off and delecatly press it into his crotch <<say '$AliceBarMeetName' $CharImg>>What are you! Oh... ma'am I...<</say>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/6.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _rand to random(5, 6)>> <<say 'Alice' $AliceTavImg>>Shhh, you wouldn't want anyone to hear us would you?<</say>> After knocking back your drink, you slip under the table and fish his manhood out of his trousers<br> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/table/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $AliceBarMeetWants is "To take you home">> He fights back moans as you push deeper <<say '$AliceBarMeetName' $CharImg>>God's.... How about you come home with me?<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to go home with him<br> <</if>> <<button "Agree to go home with him">> <<goto "AliceBarHomeMan">> <</button>> <<elseif $AliceBarMeetWants is "To take you outside">> He fights back moans as you suck his cock <<say '$AliceBarMeetName' $CharImg>>Fuck your good at this... How about we go outside?<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to his request<br> <</if>> <<button "Agree to go outside">> <<goto "AliceBarOutsideMan">> <</button>> <<elseif $AliceBarMeetWants is "You to join him upstairs">> He fights back moans as you take him into your mouth <<say '$AliceBarMeetName' $CharImg>>Ummm, come with me, I have a room upstairs booked<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to his request<br> <</if>> <<button "Agree and go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> He fights back moans as you take him into your mouth <<say '$AliceBarMeetName' $CharImg>>Fuck... I...<</say>> You cut him off, pressing deeper and feeling him press at back of your throat. <<say '$AliceBarMeetName' $CharImg>>God's<</say>> He wispers, adjusting your position allows you to strighten your neck, letting him slide into your throat unless your nose is pressed against him. Giving him a moment, you start to rock back and forth. Fucking him with your tight troat.<br> His moans get harder and harder to supress and you push things even further licking his balls with your inhumanly long tounge.<br> This proves too much for the man as he grips the desk and beings to cum, his cock pulsing and shooting his seed down your hungry throat<br> You look up at him and watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $AliceBarKnowWants to true>> <<include "AliceBarDialogue">> <<if $Position is "Whore">> <<if $AliceBarStyle is "Shy">> <<set _greeting to either(_AliceShyWhore)>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to either(_AliceConfidenWhore)>> <<else>> <<set _greeting to either(_AliceFlirtatiousWhore)>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if ($AliceBarMeetPersonality is "Nervous") or ($AliceBarMeetWants is "To be friendly")>> <<if $AliceBarMeetPersonality is "Nervous">> <<say 'Stranger' $CharImg>>I-I see... Umm I'm sorry but prehpase your not quite the company I was looking for<</say>> <<else>> <<say 'Stranger' $CharImg>>Sorry, I'm not looking for a whore tonight<</say>> <</if>> He promptly leaves, taking his drink and disapearing into the croud. Leaving you alone<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<elseif $AliceBarMeetPersonality is "Drunk">> <<if $AliceBarMeetWants is "To take you home">> <<say '$AliceBarMeetName' $CharImg>>Ha, you're exactly what I'm looking for then, saves me finding a girl on the way home.... How mauch for you to come home with me for the night?<</say>> Name a price or slow things down to learn more<br> <<button "100 gold">><<set $Position to "100">><<goto "AliceBarHomePrice">><</button>><br> <<button "200 gold">><<set $Position to "200">><<goto "AliceBarHomePrice">><</button>><br> <<button "300 gold">><<set $Position to "300">><<goto "AliceBarHomePrice">><</button>><br> <<button "Slow things down">><<set $Position to "Slow">><<goto "AliceBarHomePrice">><</button>><br> <<else>> <<say '$AliceBarMeetName' $CharImg>>God's they don't normally have girls as lovely as you in a dump like this... What do you say we go upstairs?<</say>> Name a price or slow things down to learn more about him<br> <<button "50 gold">><<set $Position to "50">><<goto "AliceBarWhorePrice">><</button>><br> <<button "100 gold">><<set $Position to "100">><<goto "AliceBarWhorePrice">><</button>><br> <<button "200 gold">><<set $Position to "200">><<goto "AliceBarWhorePrice">><</button>><br> <<button "Slow things down">><<set $Position to "Slow">><<goto "AliceBarWhorePrice">><</button>><br> <</if>> <<else>> <<if $AliceBarMeetWants is "To take you home">> <<say '$AliceBarMeetName' $CharImg>>I see, well this is going to be easier than I thought... How much for you to leave work early and come home with me?<</say>> Name a price or slow things down to learn more about him<br> <<button "100 gold">><<set $Position to "100">><<goto "AliceBarHomePrice">><</button>><br> <<button "200 gold">><<set $Position to "200">><<goto "AliceBarHomePrice">><</button>><br> <<button "300 gold">><<set $Position to "300">><<goto "AliceBarHomePrice">><</button>><br> <<button "Slow things down">><<set $Position to "Slow">><<goto "AliceBarHomePrice">><</button>><br> <<else>> <<say '$AliceBarMeetName' $CharImg>>You're far too lovely to be a working girl... But I could use some company... How much to go to your room<</say>> Name a price or slow things down to learn more<br> <<button "50 gold">><<set $Position to "50">><<goto "AliceBarWhorePrice">><</button>><br> <<button "100 gold">><<set $Position to "100">><<goto "AliceBarWhorePrice">><</button>><br> <<button "200 gold">><<set $Position to "200">><<goto "AliceBarWhorePrice">><</button>><br> <<button "Slow things down">><<set $Position to "Slow">><<goto "AliceBarWhorePrice">><</button>><br> <</if>> <</if>> <</if>> <<if $Position is "Drink">> <<set $AliceDrunk to $AliceDrunk +1>> <<if $AliceBarStyle is "Shy">> <<set _greeting to either(_AliceShyDrink)>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to either(_AliceConfidenDrink)>> <<else>> <<set _greeting to either(_AliceFlirtatiousDrink)>> <</if>> <<if $AliceBarMeetPersonality is "Confident">> He moves away to get you a drink, returning with one tankard of mead which he places infront of you<br> <<say '$AliceBarMeetName' $CharImg>>There you go<</say>> <<button "Drink">> <<set $Position to "Drink">> <<goto "AliceBarDrink">> <</button>><br> <<elseif $AliceBarMeetPersonality is "Drunk">> He stands, clumsily and goes to collect a drink. When he returns he has two which he places infront of you<br> <<say '$AliceBarMeetName' $CharImg>>There you go, you can keep up with me now<</say>> <<button "Drink one">><<set $AliceDrunk to $AliceDrunk + 1>><<set $Position to "Drink">><<goto "AliceBarDrink">><</button>><br> <<button "Drink both">><<set $AliceDrunk to 5>><<set $Position to "Drunk">><<goto "AliceBarDrink">><</button>> <<else>> He moves away to get you a drink, returning with two tankard of mead, placing one in front of you and the other infront of himself<br> <<say '$AliceBarMeetName' $CharImg>>Here you are miss<</say>> <<button "Drink">><<set $Position to "Drink">><<goto "AliceBarDrink">><</button>><br> <</if>> <</if>> <<if $Position is "Business">> <<if $AliceBarStyle is "Shy">> <<set _greeting to either(_AliceShyBusiness)>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to either(_AliceConfidentBusiness)>> <<else>> <<set _greeting to either(_AliceShyBusiness)>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if $AliceBarMeetPersonality is "Drunk">> <<if $AliceBarMeetWants isnot "To be friendly">> <<say '$AliceBarMeetName' $CharImg>>Eh, Sorry miss I don't think you're the company I'm looking for tonight<</say>> He promptly leaves, taking his drink and disapearing into the croud. Leaving you alone<br> <<else>> You both chat for a while and share a few drinks, ultimatly it becomes clear he was just looking for converstation. After you finish your drink, you thank him and move to another table<br> <<set $AliceDunk to $AliceDunk + 1>> <</if>> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <<if $AliceBarMeetPersonality is "Confident">> <<set $AliceBarKnowJob to true>> <<say '$AliceBarMeetName' $CharImg>>Oh that's interesting, I'm actually a $AliceBarMeetJob myself<</say>><br> You both chat about your 'job' making a beliveable story for him to listen too, after a while to decide to change the subject<br><br> <<button "Ask his name">> <<set $Position to "Name">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask him to buy you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Flert with him">> <<set $Position to "Flert">> <<goto "AliceBarPersonQuestion">> <</button>><br> <</if>> <</if>> <<if $Position is "Travaling">> <<say 'Alice' $AliceTavImg>>Im actually travaling to the city<</say>> <<if $AliceBarMeetPersonality is "Drunk">> <<if $AliceBarMeetWants isnot "To be friendly">> <<say '$AliceBarMeetName' $CharImg>>Ah... Looking to see the sights, I've got a sight for you to see<</say>> He's clearly emboldened by his drink and his eyes start exploring your body<br> <<button "Indulge him">> <<set $Position to "Flert">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask him to leave">> <<goto "AliceBarAlone">> <</button>> <<else>> You both chat for a while and share a few drinks, ultimatly it becomes clear he was just looking for converstation. After you finish your drink, you thank him and move to another table<br> <<set $AliceDunk to $AliceDunk + 1>> <</if>> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <<if $AliceBarMeetPersonality is "Confident">> <<set $AliceBarKnowJob to true>> <<say '$AliceBarMeetName' $CharImg>>Oh that's interesting, I'm actually a $AliceBarMeetJob myself<</say>><br> You both chat about your 'job' making a beliveable story for him to listen too, after a while to decide to change the subject<br><br> <<button "Ask his name">> <<set $Position to "Name">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask him to buy you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Flert with him">> <<set $Position to "Flert">> <<goto "AliceBarPersonQuestion">> <</button>><br> <</if>> <</if>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _greetings to ["Hello there", "Hello Miss", "How do you do"]>> <<set _greeting to either(_greetings)>> <<set _personalites to ["Confident", "Drunk", "Nervous"]>> <<set _wants to ["To be friendly", "To take you outside", "To take you home", "You to join him upstairs"]>> <<set _jobs to ["Guard", "Farm hand", "Clerk", "Merchant"]>> <<set $names = Story.get("MaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <<set $AliceBarMeetName to $names[random(0, $names.length - 1)]>> <<set _rand to (0, 60)>> <<set $AliceBarMeetArousal to _rand>> <<set $AliceBarMeetPersonality to either(_personalites)>> <<set $AliceBarMeetJob to either(_jobs)>> <<set $AliceBarMeetWants to either(_wants)>> <<set $AliceBarKnowJob to false>> <<set $AliceBarKnowWants to false>> <<set $AliceBarKnowArousal to false>> <<if $AliceBarMeetJob is "Guard">><<set _rand to (0, 1)>><<set $AliceBarMeetPersonality to _personalites[_rand]>><</if>> <div class="character-card"> <<if $AliceArtStyle is "Anime">> <<set _rand to random(5, 7)>> <<else>> <<set _rand to random(2, 4)>> <</if>> <div class="character-image"> <<set $CharImg to "Images/Forrest/Scarldale/Tavern/Men/" + _rand + ".png">> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span><span class="blurred"> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <<say "Stranger" $CharImg>>_greeting<</say>> How you present yourself:<br> <<listbox "$AliceBarStyle">> <<option "Shy" "Shy">> <<option "Confident" "Confident">> <<option "Flirtatious" "Flirtatious">> <</listbox>><br> <<button "Greet Him">> <<set $Postion to null>> <<goto "AliceBarPerson1">> <</button>><br> <<button "Tell him you arent interested">> <<goto "AliceBarAlone">> <</button>> </div> <<if $ForestExplorewTip isnot false>> <div class="text-box"> <h2>Tip:<br></h2> <i>Rember your goal here is to find someone useful, a farm hand who can bring grain to your farm, a welthy merchant who would share a few coins in exchange for a fun night, a clerk who could redirect a few shipments to the castle, etc.<br> Find someone you think will be useful and not too smart and give them what they want, it may take some... Friendly gestures if they don't seem sure of what they want. </i><br> <<link "Do not show this again">> <<set $ForestExplorewTip to false>> <<goto "ForestExplore">> <</link>> </div> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<include "AliceBarDialogue">> <<if $Position is "Null">> <<button "Ask what he does">> <<set $Position to "Does">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<button "Ask him to buy you a drink">> <<set $Position to "Drink">> <<goto "AliceBarPersonAnswer">> <</button>><br> <<button "Flert with him">> <<set $Position to "Flert">> <<goto "AliceBarPersonQuestion">> <</button>><br> <</if>> <<if $Position is "Flert">> You slip your shoe off and delecatly press it into his crotch <<say '$AliceBarMeetName' $CharImg>>What are you! Oh... ma'am I...<</say>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/6.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _rand to random(5, 6)>> <<say 'Alice' $AliceTavImg>>Shhh, you wouldn't want anyone to hear us would you?<</say>> After knocking back your drink, you slip under the table and fish his manhood out of his trousers<br> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/table/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $AliceBarMeetWants is "To take you home">> He fights back moans as you push deeper <<say '$AliceBarMeetName' $CharImg>>God's.... How about you come home with me?<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to go home with him<br> <</if>> <<button "Agree to go home with him">> <<goto "AliceBarHomeMan">> <</button>> <<elseif $AliceBarMeetWants is "To take you outside">> He fights back moans as you suck his cock <<say '$AliceBarMeetName' $CharImg>>Fuck your good at this... How about we go outside?<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to his request<br> <</if>> <<button "Agree to go outside">> <<goto "AliceBarOutsideMan">> <</button>> <<elseif $AliceBarMeetWants is "You to join him upstairs">> He fights back moans as you take him into your mouth <<say '$AliceBarMeetName' $CharImg>>Ummm, come with me, I have a room upstairs booked<</say>> <<if $AliceDrunk lt 3>> <<button "Tell him no">> <<goto "AliceBarAlone">> <</button>> <<else>> <<set $AliceDrunk to 5>> Your too drunk to care and agree to his request<br> <</if>> <<button "Agree and go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> He fights back moans as you take him into your mouth <<say '$AliceBarMeetName' $CharImg>>Fuck... I...<</say>> You cut him off, pressing deeper and feeling him press at back of your throat. <<say '$AliceBarMeetName' $CharImg>>God's<</say>> He wispers, adjusting your position allows you to strighten your neck, letting him slide into your throat unless your nose is pressed against him. Giving him a moment, you start to rock back and forth. Fucking him with your tight troat.<br> His moans get harder and harder to supress and you push things even further licking his balls with your inhumanly long tounge.<br> This proves too much for the man as he grips the desk and beings to cum, his cock pulsing and shooting his seed down your hungry throat<br> You look up at him and watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> <</if>> <<if $Position is "Drink">> <<if $AliceBarMeetPersonality is "Nervous">> He moves away to get you a drink, returning with one tankard of mead which he places infront of you<br> <<say '$AliceBarMeetName' $CharImg>>There you go<</say>> <<button "Drink">> <<set $Position to "Drink">> <<goto "AliceBarDrink">> <</button>><br> <<elseif $AliceBarMeetPersonality is "Confident">> He moves away to get you a drink, returning with one tankard of mead which he places infront of you<br> <<say '$AliceBarMeetName' $CharImg>>There you go<</say>> <<button "Drink">> <<set $Position to "Drink">> <<goto "AliceBarDrink">> <</button>><br> <<elseif $AliceBarMeetPersonality is "Drunk">> He stands, clumsily and goes to collect a drink. When he returns he has two which he places infront of you<br> <<say '$AliceBarMeetName' $CharImg>>There you go, you can keep up with me now<</say>> <<button "Drink one">><<set $Position to "Drink">><<goto "AliceBarDrink">><</button>><br> <<button "Drink both">><<set $Position to "Drunk">><<goto "AliceBarDrink">><</button>> <<else>> He moves away to get you a drink, returning with two tankard of mead, placing one in front of you and the other infront of himself<br> <<say '$AliceBarMeetName' $CharImg>>Here you are miss<</say>> <<button "Drink">><<set $Position to "Drink">><<goto "AliceBarDrink">><</button>><br> <</if>> <</if>> <<if $Position is "Does">> <<set $AliceBarKnowJob to true>> <<say 'Alice' $AliceTavImg>>So... What do you do?<</say>> <<say '$AliceBarMeetName' $CharImg>>Actually I'm a $AliceBarMeetJob<</say>> <</if>> <<if $Position is "Name">> <<say 'Alice' $AliceTavImg>>May I know your name?<</say>> <<say '$AliceBarMeetName' $CharImg>>My name is $AliceBarMeetName<</say>> <</if>> <<if $Position isnot "Flert" or $Position isnot "Null">> <<button "Ask him more questions">> <<set $Position to "Null">> <<goto "AliceBarPersonQuestion">> <</button>> <<button "Suggest he takes you home">> <<set $Position to "Take home">> <<goto "AliceBarPerson2">> <</button>><br> <<button "Tease him">> <<set $Position to "Tease">> <<goto "AliceBarPerson2">> <</button>> <</if>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $AliceImgStyle isnot true>> <<goto "AliceImgStyle">> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<Tender>>Hello there, fancy a drink? Or we have some girls upstairs if your looking for company?<</Tender>><br> <<if $Gold >= 50>> <<button "Go Upstairs (Costs 50 gold)">> <<set $Gold to $Gold - 50>> <<run Engine.play('BarUpstairsAlice')>> <</button>> <<else>> You cant afford to visit the brothel <</if>><br> <<button "Sit and wait">> <<goto "AliceBarAlone">> <</button>><br> <<button "Leave">> <<goto "Town">> <</button>> </div> <<button "Change image style">> <<goto "AliceImgStyle">> <</button>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _rand to random(2, 3)>> You take the key marked with the numeral 'x' and go upstairs, finding a matching door with the same numeral lazilly scratched into it, you unlock the door and welcome your "customer" inside.<br><br> You take the lead, showing off your body<br> <<if $AliceArtStyle is "Anime">> <<set _img to 5>> <<else>> <<set _img to 4>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>What would you like to do first?<</say>> <<if $AliceBarMeetPersonality is "Nervous">> <<say '$AliceBarMeetName' $CharImg>>Err<</say>> <<say 'Alice' $AliceTavImg>>Come<</say>> You guide him to the bed, removing his lower clothes and sitting him on the bed<br> <<if $AliceArtStyle is "Anime">> <<set _img to random(3, 6)>> <<else>> <<set _img to random(1, 2)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Gods!<</say>> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Forrest/Scarldale/Tavern/Men/Action/" + _Vid + ".webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <<say '$AliceBarMeetName' $CharImg>>I'm cumming<</say>> You hear your queue and push yourself down his thobbing cock and he floods into your throat and you both moan in bliss<br><br> You look up to watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <<elseif $AliceBarMeetPersonality is "Drunk">> <<set _rand to random(1, 2)>> <<if _rand is 1>> <<say 'Alice' $AliceTavImg>>What are you waiting for?<</say>> <<if $AliceArtStyle is "Anime">> <<set _img to 4>> <<else>> <<set _img to 3>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>I need that big co-<</say>> He pushes his manhood into your ass and your words come out as a yelp <<if $AliceArtStyle is "Anime">> <<set _img to random(3, 4)>> <<else>> <<set _img to random(1, 2)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Anal" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>Fuck that's my...<</say>> You lose yourself to the pleasure of being used like the cheap whore you were pretending to be. Despite being irresistible to most mortals, the man's drunken state adds to his stamina and he continues to fuck you <<if $AliceArtStyle is "Anime">> <<set _img to 6>> <<else>> <<set _img to 5>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Fuck- I'm...<</say>> With one final thrust he pushes into you can floods your ass<br> You look back to watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <<else>> <<say 'Alice' $AliceTavImg>>So where do you want...<</say>> Before you can finish, he pushs you down and cuts you off by pushing himself into your mouth <<if $AliceArtStyle is "Anime">> <<set _img to 3>> <<else>> <<set _img to 1>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/tf" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You moan as his cock slids in, growing as it hits your throat <<say '$AliceBarMeetName' $CharImg>>Greedy slut<</say>> He continues fucking your face without a care for your pleasure<br><br> Eventually he pulls back, dragging his cock from your hungry mouth with a wet pop. You take a moment to catch your breath, before looking up at him and smiling<br><br> Shocked, he repositions you before pushing his slick cock back into your mouth <<say 'Alice' $AliceTavImg>>More<</say>> <<if $AliceArtStyle is "Anime">> <<set _img to 2>> <<else>> <<set _img to 4>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/tf" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>I'm gona cum down your throat whore<</say>> His thobbing cock floods into your throat and you both moan in bliss<br><br> You look up to watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> <<else>> The man confidently strows into the room and makes himself comfortable <<say 'Alice' $AliceTavImg>>So where do you me<</say>> He takes a seat on the bed <<say '$AliceBarMeetName' $CharImg>>Come here<</say>> You take a step <<say '$AliceBarMeetName' $CharImg>>Humm, actually... Why don't you crawl here?<</say>> Hiding a grin, you drop to your knees and crawl to him <<if $AliceArtStyle is "Anime">> <<set _img to random(3, 6)>> <<else>> <<set _img to random(1, 2)>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Ummm keep sucking<</say>> Hearing the words of encuragement, you double your efforts and go from easing him to taking his cock into your throat<br><br> <<if $AliceArtStyle is "Anime">> You pull away from his cock to catch your breath <<say 'Alice' $AliceTavImg>>Do you want to fuck my face?<</say>> His eyes go wide as you relax on the bed and lower your dress below your chest <<say 'Alice' $AliceTavImg>>I'm ready dadd...<</say>> He jumps on you and pushes his cock into your mouth pressing deep into your throat <<say 'Alice' $AliceTavImg>>Ummmm<</say>> <<set _img to random(5, 7)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> The strager continues fucking your throat relentlessly while you play with your body. After a few minuets he pulls out and you both catch your breath<br> <<say '$AliceBarMeetName' $CharImg>>Turn around whore, your earning your pay tonight<</say>> You obedently roll over an kneel before he takes you from behind <<set _img to random(2, 3)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/behind/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Fuck, your the best whore I've had<</say>> <<else>> <<set _img to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/" + _img + ".jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Ummm keep sucking<</say>> Hearing the words of encuragement, you double your efforts and go from teasing him to taking his cock into your throat<br><br> You continue servicing his member for some time before he stands and removes his shirt. You expect him to ask you to get on the bed, but the look of you kneeling before him must have exictied him too much and he grabs the back of your head for another turn with your mouth <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/bj/7.jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Gods I've never met a girl with a mouth like yours<</say>> He pulls you down till your nose presses againt him and he holds you there, clearly forgetting your need for air<br><br> After a few moments he lets you go <<say 'Alice' $AliceTavImg>>*Gasp* Fuck... You're lucky I like to play rough<</say>> <<say '$AliceBarMeetName' $CharImg>>On the bed<</say>> You comply, crawling onto the bed and arching your back to show off your ass <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/behind/4.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> He wasted no time, pressing deep into you as you both cry out in pleasure <<set _img to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/behind/" + _img + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$AliceBarMeetName' $CharImg>>Fuck, your the best whore I've had<</say>> <</if>> <<say '$AliceBarMeetName' $CharImg>>I'm going to cum, slut<</say>> <<say 'Alice' $AliceTavImg>>Please cum inside!<</say>> He wasn't expecting to hear that and it send him over the edge as he pushes deep and spills into you with a bellowed moan which quickly turns silent<br><br> You look back to watch his eyes glaze over as he gives in to your corrupting control <<say '$AliceBarMeetName' $CharImg>>Thank you mistress<</say>> You think about how best to use him...<br><br> <<button "Continue">><<goto "AliceTavOrders">><</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set $AliceBarKnowArousal is true>> <div class="text-box"> <<set $AliceBarKnowArousal to true>> <<set _alice50 to ["50 gold?", "Thats going to cost 50 gold for my time", "50 gold and I'm yours"]>> <<set _alice100 to ["100 gold?", "Thats going to cost 100 gold for my time", "100 gold and I'm yours"]>> <<set _alice200 to ["200 gold?", "Thats going to cost 200 gold for my time", "200 gold and I'm yours"]>> <<set _alice300 to ["300 gold?", "Thats going to cost 300 gold for my time", "300 gold and I'm yours"]>> <<set _aliceSlow to ["Umm, why doen't we slow down and get to know each other first", "Easy... Why don't we get to know eachother a bit first", "Ha, not that I wouldn't love too... But I prefer to get to know clients first"]>> <<if $Position is "50">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice50[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice50[1]>> <<else>> <<set _greeting to _alice50[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<say 'Alice' $AliceTavImg>>Let me go speak with the... My manager<</say>> You stand and walk over to the the bar tender<br> <<Tender>>Hello again, fancy a drink?<</Tender>> <<say 'Alice' $AliceTavImg>>I work, can I have a room upstairs<</say>> <<Tender>>Sure, here's a key. I take 20% of your earnings when you leave<</Tender>> He hands you a key<br> <<button "Go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <</if>> <<if $Position is "100">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice100[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice100[1]>> <<else>> <<set _greeting to _alice100[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if ($AliceBarMeetArousal gt 30) or ($AliceBarMeetPersonality is "Drunk")>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<say 'Alice' $AliceTavImg>>Let me go speak with the... My manager<</say>> You stand and walk over to the the bar tender<br> <<Tender>>Hello again, fancy a drink?<</Tender>> <<say 'Alice' $AliceTavImg>>I work, can I have a room upstairs<</say>> <<Tender>>Sure, here's a key. I take 20% of your earnings when you leave<</Tender>> He hands you a key<br> <<button "Go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> <<if $AliceBarStyle is "Shy">> <<say '$AliceBarMeetName' $CharImg>>Ha, I'll pass. A shy girl like you is cleary inexperianced<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<say 'Alice' $AliceTavImg>>Let me go speak with the... My manager<</say>> You stand and walk over to the the bar tender<br> <<Tender>>Hello again, fancy a drink?<</Tender>> <<say 'Alice' $AliceTavImg>>I work, can I have a room upstairs<</say>> <<Tender>>Sure, here's a key. I take 20% of your earnings when you leave<</Tender>> He hands you a key<br> <<button "Go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Sorry love, that's too much gold for me<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <</if>> <</if>> <<if $Position is "200">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _alice200[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _alice200[1]>> <<else>> <<set _greeting to _alice200[2]>> <</if>> <<say 'Alice' $AliceTavImg>>_greeting<</say>> <<if ($AliceBarMeetArousal gt 45) or ($AliceBarMeetPersonality is "Drunk")>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<say 'Alice' $AliceTavImg>>Let me go speak with the... My manager<</say>> You stand and walk over to the the bar tender<br> <<Tender>>Hello again, fancy a drink?<</Tender>> <<say 'Alice' $AliceTavImg>>I work, can I have a room upstairs<</say>> <<Tender>>Sure, here's a key. I take 20% of your earnings when you leave<</Tender>> He hands you a key<br> <<button "Go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> <<if $AliceBarStyle is "Shy">> <<say '$AliceBarMeetName' $CharImg>>Ha, I'll pass. A shy girl like you is cleary inexperianced<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Humm, sounds fair... Lets go<</say>> <<say 'Alice' $AliceTavImg>>Let me go speak with the... My manager<</say>> You stand and walk over to the the bar tender<br> <<Tender>>Hello again, fancy a drink?<</Tender>> <<say 'Alice' $AliceTavImg>>I work, can I have a room upstairs<</say>> <<Tender>>Sure, here's a key. I take 20% of your earnings when you leave<</Tender>> He hands you a key<br> <<button "Go upstairs">> <<goto "AliceBarUpstairsMan">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>Sorry love, that's too much gold for me<</say>> He walks away from you<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <</if>> <</if>> <</if>> <<if $Position is "Slow">> <<if $AliceBarStyle is "Shy">> <<set _greeting to _aliceSlow[0]>> <<elseif $AliceBarStyle is "Confident">> <<set _greeting to _aliceSlow[1]>> <<else>> <<set _greeting to _aliceSlow[2]>> <</if>> <<say 'Alice' $AliceImg>>_greeting<</say>> <<if $AliceBarMeetPersonality is "Drunk">> <<say '$AliceBarMeetName' $CharImg>>Ugh, f-fuck this I didn't come here to make friends<</say>> The drunk man stands and wonders away<br> <<button "Wait alone">> <<goto "AliceBarAlone">> <</button>> <<else>> <<say '$AliceBarMeetName' $CharImg>>If you like... What would you like to discuss?<</say>> <<button "Ask what he does">> <<set $Position to "Does">> <<goto "AliceBarPersonQuestion">> <</button>><br> <<if def _room2name>><<else>> <<button "Ask his name">> <<set $Position to "Name">> <<goto "AliceBarPersonQuestion">> <</button>><br><</if>> <<button "Ask him to buy you a glass of wine">> <<set $Position to "Drink">> <<goto "AliceBarPerson2">> <</button>><br> <</if>> <</if>> </div> <div class="character-card"> <div class="character-image"> <<set _imagePath to $CharImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personaltiy:</span> $AliceBarMeetPersonality</p> <<if $AliceBarKnowWants is false>> <p><span class="info-label">Wants:</span> <span class="blurred">$AliceBarMeetWants</span></p> <<else>> <p><span class="info-label">Wants:</span> $AliceBarMeetWants</p> <</if>> <<if $AliceBarKnowJob is false>> <p><span class="info-label">Job:</span> <span class="blurred"> $AliceBarMeetJob</span></p> <<else>> <p><span class="info-label">Job:</span> $AliceBarMeetJob</p> <</if>> <<if $AliceBarKnowArousal is false>> <p><span class="info-label">Arousal:</span><span class="blurred"> Unknown</span></p> <<else>> <p><span class="info-label">Arousal:</span> <progress @value="$AliceBarMeetArousal" max="100"></progress></p> <</if>> Being a succubus, you can sense some for the desires and personality of mortals<br><br> </div> </div> <</nobr>>
<<nobr>> <div class="castle-menu"> <h1>The Halls</h1> <h1>Chambers</h1> <br> <div class="menu-item" data-image="Images/Castle/Chambers/1.png"> <<link "Masters Chambers">><<goto "Chambers">><</link>> </div> <br> <hr> <h1>Explore</h1> <br> <<if $OwnesHorse is true>> <div class="menu-item" data-image="Images/Town/6.png"> <<link "Ride to the town">> <<set $OldPosition to "Entrance">> <<set $BackgroundPath to "Images/Town/5.png">> <<set _TownLocation to "Images/Town/Maps/Enterance/5.jpeg">> <<set $ForestLocation to _TownLocation>> <<set $CurrentPlayer to "AliceCloaked">> <<run Engine.play('Town')>> <</link>> </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Horse/1.png"> You need a horse to explore further </div> <</if>> </div> <<set $CloakDisabled to false>> <<set $Cloaked to false>> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .castle-menu h2 { font-size: 24px; text-align: center; margin: 20px 0; font-family: 'Georgia', serif; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <<script>> setTimeout(function() { $('.menu-item').each(function() { var $this = $(this); var imageSrc = $this.data('image'); if (imageSrc && $this.find('img').length === 0) { $this.prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }, 10); <</script>> <</nobr>>
<div class="text-box"> <<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> You enter to see Alice Corruption: <progress @value=" $AliceCorruption" max="100"></progress><br><br> <<if $AliceCorruption lt 20>> [[Corrupt Alice]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/2.png" width="700" height="700"> </div> <</if>> <<if ($AliceCorruption >= 20) and ($AliceCorruption lt 40)>> [[Corrupt Alice]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/2.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/5/2.png">> </div><</if>> <<if ($AliceCorruption >= 40) and ($AliceCorruption lt 60)>> [[Corrupt Alice]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/3.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/5/3.png">> </div><</if>> <<if ($AliceCorruption >= 60) and ($AliceCorruption lt 100)>> [[Corrupt Alice]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/4.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/5/4.png">> </div><</if>> <<if $AliceCorruption >= 100>> <<if $PlayerSpells.includes("Possess")>>[[Possess|Corrupt Alice]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/5.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/5/5.png">> </div> <<else>> You need a more powerful spell to complete Alice's corruption [[Leave|Base Intro]] <div align="center"> <img src="Images/Castle/Dungon/Woman/5/4.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/5/4.png">> </div><</if>><</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You step toward the bridge crossing over to the center. Before you can cross, a guard blocks your path <<Guard>>I'm sorry ma'am, no one is getting buy without a pass<</Guard>> <<if $AliceClerkPass isnot true>> You push down your frustation and focus on maintaining the facade of an innocent woman <<Alice>>Oh, forgive me but why? I need to speak to a clerk here<</Alice>> <<Guard>>I am sorry ma'am but we can't let you cross the bridge. Please, turn around and go<</Guard>> <<button "Leave">><<goto "Town">><</button>> <<else>> <</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set _int to random(0, 1)>> <<set $Time to $Time + 1>> <<set $AliceHunger to 5>> <<if $AlicePower != 30>> <<set $AlicePower to $AlicePower + 5>> <<else>> Alice's power is already at its max but has her fun anyway<br> <</if>> <<if $Position is "male">> You cast your domination spell on the prisoner and send him to Alice where he spend his last few hours happily satisfying her desires...<br><br> <<if _int is 0>> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/10.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/13.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/16.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/18.webm" type="video/webm"> </video><br><br> <<else>> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/11.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/12.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/15.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/19.webm" type="video/webm"> </video><br><br> <</if>> <<else>> You hand the woman over to Alice after casting a domination spell to make her more willing, you leave the two to get to know eachother better<br><br> <<if _int is 0>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/3.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/6.webm" type="video/webm"> </video><br><br> <<else>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/4.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/5.webm" type="video/webm"> </video><br><br> <</if>> <</if>> <<button "Close">> <<goto "Inside Castle">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<say 'Alice' $AliceImg>>Well sister, since you asked so nicely I'll let you have a taste<</say>><br> Excited, you undress and climb onto the bed, eager to please Alice<br><br> Alice Pushes you back and climbs over you, holding her pussy inches from your waiting tounge<br><br> <<say 'Alice' $AliceImg>>Ha, look at you down there... So eager<</say>><br> She lowers her self onto you, smuthering your face<br><br> <<say 'Alice' $AliceImg>>Umm, oh and remeber, the sooner you get me off the sooner I'll let you breath again<</say>><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/6.webm" type="video/webm"> </video><br><br> You push your tounge into her, tasting her before exploring her cunt further<br><br> <<say 'Alice' $AliceImg>>Oh fuck, that's it sister... Let me help you<</say>><br> Alice starts to rock back and forth, gringing on you and covering your chin, mouth and nose in her juices<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/9.webm" type="video/webm"> </video><br><br> <<say 'Alice' $AliceImg>>Fuck... Fuck!<</say>><br><br> Moments later you feel Alice's hips buck and her stomach tence. Hes head rolls back as she lets out a gutteral moan of pleasure as she cums<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/8.webm" type="video/webm"> </video><br><br> After a long drawn out momen of Alice lost in pleasure, she rolls off you and lays on the bed. You gasp for oxygen, sucking in a mixture of air and Alices fluids <<say 'Lucy' $LucyImg>>Thank you sister, I hope you had as much fun as I did<</say>><br><br> You say with a giggle wrapping your arms around Alice<br><br> <<say 'Alice' $AliceImg>>Umm, any excuse to ruin that pritty face of yous<</say>><br><br> She licks your lips tasting herself<br><br> <<say 'Alice' $AliceImg>>Now go, I need some rest after that... We can play again soon<</say>><br><br> <<button "Leave">> <<goto "LucyBase">> <</button>> <</nobr>> </div>
<<set $Time to $Time + 1>> <div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Alice's orgasm: <progress @value=" $AliceCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if $AliceCum >= 100>> Alice cum's <br><br> <<Succubus_Alice>>Ohh, fuck, thank you $AliceName!<</Succubus_Alice>><br> <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finish/fcum.webm" type="video/webm"> <<set $AliceCum to 0>> </video> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Face") and ($Position != "Outside") and ($Position != "Inside") and ($Position != "Throat")>> Your about to cum<br> <<Succubus_Alice>>Cum for me, $AliceName!<</Succubus_Alice>><br> <<link "Face">><<set $Position to "Face">><<run Engine.play('AliceFuck')>><</link>><br> <<link "Outside">><<set $Position to "Outside">><<run Engine.play('AliceFuck')>><</link>><br> <<link "Inside">><<set $Position to "Inside">><<run Engine.play('AliceFuck')>><</link>><br> <<link "Throat">><<set $Position to "Throat">><<run Engine.play('AliceFuck')>><</link>><br> <</if>> <<if $Position is "Face">> <br>You pull out and cum on Alice's face <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finish/face.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Outside">> <br>You pull out and cum all over Alice's tits <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finish/outside.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Inside">> <br>You push deep and fill Alice with cum <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finish/inside.webm" type="video/webm"> </video> <</if>> <br> [[Leave|Inside Castle]] <<if $Position is "Throat">> <br>You push deep and cum down Alice's throat <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finish/throat.webm" type="video/webm"> </video> <br> [[Leave|Inside Castle]] <</if>> <<if ($PlayerCum lt 100) and ($AliceCum lt 100)>> <<if $Position == "Seduce">> <br><br>Alice looks at you with lustful eyes <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Seduce/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Seduce/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "BJ">> You push Alice down and she hungrily sucks your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Bj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Bj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Bj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> You bend Alice over and fuck her from behind <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Behind/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> Alice gets on top and rides your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "TF">> You push your cock down Alice's throat <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Tf/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Tf/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Tf/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Finger">> You play with Alice's pussy <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finger/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finger/1.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Finger/1.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Miss">> You push Alice onto her back and fuck her <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Miss/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Miss/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Miss/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Prone">> You fuck Alice from behind <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Prone/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Prone/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Prone/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Anal">> You push yourself into Alice's tight ass <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Anal/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Alice/Fuck/Anal/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src= "Images/Castle/Alice/Fuck/Anal/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $PlayerCum lt 100>> <<link "Blowjob">><<set $Position to "BJ">><<set $PlayerCum to $PlayerCum + 5>> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Throat Fuck">><<set $Position to "TF">><<set $PlayerCum to $PlayerCum + 10>> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Finger">><<set $AliceCum to $AliceCum + 10>><<set $Position to "Finger">> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Doggy Style">><<set $AliceCum to $AliceCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Missionary">><<set $AliceCum to $AliceCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Miss">> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Prone">><<set $AliceCum to $AliceCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Prone">> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Cowgirl">><<set $AliceCum to $AliceCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('AliceFuck')>> <</link>><br> <<link "Anal">><<set $AliceCum to $AliceCum + 15>><<set $PlayerCum to $PlayerCum + 20>> <<set $Position to "Anal">> <<run Engine.play('AliceFuck')>> <</link>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $CurrentEnemy to "Alice">> <<You>>Maybe I can help? I have experiance dealing with the bandits<</You>><br><br> <<Alice>>Please, if you could I would be so greatful! They took my farther East into the forest I know there are a few camps in that direction<</Alice>><br><br> <<Alice>>I can show you where they may be, I think they are hiding in an old mine<</Alice>><br><br> <<You>>Thank you, point to me on this map where they are<</You>><br><br> Alice points at a location not far from here<br><br> <<Alice>>That's all I know, I don't have any gold to pay you with... But if you find my father I will make it up to you, I promise<</Alice>><br><br> <<Alice>>Oh, his name is Eduart!<</Alice>><br><br> <<link "Leave">> <<script>> UI.alert("New Quest!<br>Find Alice's father"); <</script>> <<run $Quests.push("Find Alice's father")>> <<goto "Town">> <<set $AliceMet to true>> <<set $AliceQuest to true>> <<set $AliceQuestStatus to "Started">> <</link>> <</nobr>> </div>
<<nobr>> <div class="text-box"> <h1>Choose an art style</h1> <<set $AliceImgStyle to true>> Dev note:<br> For this section, you can choose an art style, this is a test and I may make a full image pack if its popular. You can change this decision later. <br><br> <div class="bonus-options"> <div class="bonus-option" data-style="Anime"> <h1>Anime</h1> <div class="option-details"> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/AliceA.png">> <img @src=_imagePath alt="Anime Style"> </div> </div> </div> <div class="bonus-option" data-style="Realistic"> <h1>Realistic</h1> <div class="option-details"> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/Alice.png">> <img @src=_imagePath alt="Realistic Style"> </div> </div> </div> </div> </div> <</nobr>> <<widget "applyAnimeStyle">> <<set $AliceArtStyle to "Anime">> <<set $CurrentPlayer to "AliceTavA">> <<set $AliceTavImg to "Images/Town/Tavern/Alice/AliceA.jpg">> <<goto "AliceBar">> <<endwidget>> <<widget "applyRealisticStyle">> <<set $AliceArtStyle to "Realistic">> <<set $CurrentPlayer to "AliceTav">> <<set $AliceTavImg to "Images/Town/Tavern/Alice/Alice.jpg">> <<goto "AliceBar">> <<endwidget>> <<script>> $(document).ready(function() { // Handle clicking on a style option $(document).on('click', '.bonus-option', function() { var selectedStyle = $(this).data('style'); if (selectedStyle === "Anime") { SugarCube.Wikifier.wikifyEval("<<applyAnimeStyle>>"); } else if (selectedStyle === "Realistic") { SugarCube.Wikifier.wikifyEval("<<applyRealisticStyle>>"); } }); }); <</script>>
<div class="text-box"> <<nobr>> <<if $Position is "Prisoner">> You join them both on the bed and explore both their bodys<br><br> Alice continues to ride the prisoner and it's not long before you hear him begin to breath faster<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/6.webm" type="video/webm"> </video><br><br> Before he can finish, Alice hops off the man and you both suck his cock<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/5.webm" type="video/webm"> </video><br><br> You pass his cock between eachother until he eventually cum's in Alices mouth<br><br> He gasps and his body goes limp<br><br> <<say 'Lucy' $LucyImg>>Sister! You killed him<</say>><br><br> <<say 'Alice' $AliceImg>>Aha, and it felt sooo good!<</say>><br><br> <<say 'Lucy' $LucyImg>>$LucyName will be angy<</say>><br><br> <<say 'Alice' $AliceImg>>Ummm, maybe he'll punish me<</say>><br><br> <<set $AliceHunger to 3>> <<if $AlicePower < 30>> Alice's power grows<br><br> <<set $AlicePower to $AlicePower + 2>> <</if>> <<set _CheckUnit = $DungonOccupance.find(unit => unit.sex === "Male")>> <<if _CheckUnit>> <<button "Leave">> <<set _malePrisoners = $DungonOccupance.filter(unit => unit.sex === "Male")>> <<set _randomMale = _malePrisoners[Math.floor(Math.random() * _malePrisoners.length)]>> <<set $DungonOccupance = $DungonOccupance.filter(unit => unit !== _randomMale)>> <<goto "LucyBase">> <</button>> <</if>> <</if>> <<if $Position is "Merc">> You disrobe, watching the member of $LucyName milita devour Alice's pussy<br><br> <<say 'Alice' $AliceImg>>Umm, you really should try this sister. $AliceName's little guards are to eager to please<</say>><br><br> You crawl onto the bed and kiss Alice while the woman hungerly licks her cunt<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/2.webm" type="video/webm"> </video><br><br> Working your way down her body you tease Alices nipples<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/1.webm" type="video/webm"> </video><br><br> <<say 'Alice' $AliceImg>>Why don't you take turns licking me? Im sure our friend will share<</say>><br><br> Always happy to help, you lower yourself to Alices waist and take turns with the woman<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/3.webm" type="video/webm"> </video><br><br> <<say 'Alice' $AliceImg>>That's it girls. Fuck!<</say>><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/11.webm" type="video/webm"> </video><br><br> Together you bring Alice to orgasm<br><br> <<say 'Alice' $AliceImg>>Umm, you both did a great job... Now off you both go<</say>><br><br> <<button "Leave">> <<goto "LucyBase">> <</button>> <</if>> <</nobr>> </div>
<<nobr>> <<set _Outfits to [ "Images/Castle/Alice/1.png", "Images/Castle/Alice/2.png", "Images/Castle/Alice/3.png", "Images/Castle/Alice/4.png", "Images/Castle/Alice/5.png", "Images/Castle/Alice/6.png", "Images/Castle/Alice/7.png", "Images/Castle/Alice/8.png", "Images/Castle/Alice/9.png", "Images/Castle/Alice/13.png", "Images/Castle/Alice/14.png", "Images/Castle/Alice/15.png", "Images/Castle/Alice/10.png", "Images/Castle/Alice/11.png", "Images/Castle/Alice/12.png" ]>> <<if $Position isnot "null">> <<set $ImagePath to _Outfits[$Int]>> <</if>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" id="guestImage"> </div><br><br> <div style="text-align: center"> <<button "1">> <<set $Int to $Ints[0]>> <<run Engine.show()>> <</button>> <<button "2">> <<set $Int to $Ints[1]>> <<run Engine.show()>> <</button>> <<button "3">> <<set $Int to $Ints[2]>> <<run Engine.show()>> <</button>> </div> </div> <div class="text-box flex-buttons"> <<if $LucyArmor is true>> <<set $Ints to [3, 4, 5]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <<button "Armor">> <</button>> <</if>> <<button "Dress">> <<set $Ints to [6, 7, 8]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Corset">> <<set $Ints to [9, 10, 11]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Lingerie">> <<set $Ints to [0, 1, 2]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Naked">> <<set $Ints to [12, 13, 14]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> </div> <div style="text-align: center"> <<button "Save">> <<set $AliceImg to $ImagePath>> <<goto "Succubus2">> <</button>> <<button "Cancel">> <<goto "Succubus2">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> You head back to the camp moving as quickly as you can given your lack of time, eventually you reach the wooden gate to mine<br><br> <<set $path to "Images/Forrest/Encounters/Human/Male/Bandit/6.png">> <<set _path to $path>> <<You>>I've returned... With this trinket<</You>><br><br> You hold up the unassuming small wooden box... Theres silence for a long moment, but eventually the gate opens and the bandit you spoke to steps out <<say 'Bandit' _path>>I didn't expect you to come back...<</say>> <<You>>I have your prize, wheres the old man?<</You>> <<say 'Bandit' _path>>Hand it over<</say>><br><br> You toss the small move over to him, he catches it and opens it you don't see the contence<br><br> <<You>>What is it anyway?<</You>> <<say 'Bandit' _path>>Wait here, I'll get the old man<</say>><br><br> <<button "Wait">> <<script>> UI.alert("Quest Complete! <br>Find the prize the bandit wants"); <</script>> <<run $Quests.delete("Find whatever the bandit has asked for east of their mine")>> <<goto "BanditMineFarther">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You continue up an old dirly road, seaching for the mine, Alice told you about. It's getting late in the day but eventually you find the camp. You pause... Thinking about the best possible way to get the man back<br><br> <<set $path to "Images/Forrest/Encounters/Human/Male/Bandit/6.png">> <<set _path to $path>> Lost in thought, you watch the number of guards, planning the best way in, until you hear a voice behind you<br><br> <<say 'Bandit' _path>>Don't move<</say>><br><br> You feel a sharp point of a dagger pressing against your back<br><br> <<say 'Bandit' _path>>You made a mistake coming this way<</say>><br><br> Thinking on your feet, you try keep the converstation going, before its too late<br><br> <<You>>Easy, I've come to purchase one of your slaves in the mine<</You>><br><br> <<say 'Bandit' _path>>Is that so?<</say>><br><br> <<You>>Yes... The man named Eduart<</You>><br><br> <<say 'Bandit' _path>>That useless old man? 2000 gold and I'll let you leave with him<</say>><br><br> <<You>>2000! You said he was useless?<</You>><br><br> <<say 'Bandit' _path>>The 2000 is for you to live, you can have that useless old cunt for free. Besides, your not really in a place to negotiate<</say>><br><br> You feel the dagger press harder against you<br><br> <<You>>There must be something else you need? I can get you good slaves to trade<</You>><br><br> After a moment of silence, the man releases you and lets you turn around<br><br> <<You>>So, what do you really want in exchange for the old man?<</You>><br><br> <<say 'Bandit' _path>>I had a tip about an abandoned manor to the east, something is in there of value. I sent two men and they haven't returned. If you bring me whatever is in that place, you can have the old man<</say>><br><br> <<say 'Bandit' _path>>Go, now back to the main path and continue east, bring me what I want before the sun sets tomorrow or you'll be collecting a dead man<</say>><br><br> <<button "Go">> <<script>> UI.alert("New Quest! <br>Find the prize the bandit wants"); <</script>> <<run $Quests.push("Find whatever the bandit has asked for east of their mine")>> <<goto "MannorQuest1">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <div class="Random-image"> <<set _imagePath to $AliceImg>> <img @src=_imagePath alt="Guest Image"> </div> <<if $AliceDefend is true>>Alice is defending the vault at night.<br><br><</if>> <<if $AliceBrothel is true>>Alice will work in the brothel at night.<br><br><</if>> <<if $AliceDefend is false>> <<if (!$Defences[1]) and ($AliceBrothel is false)>> <<link "Assign to Defence Room 1">> <<set $Defence = {name: "Alice", type: "Succubus", ImagePath: $AliceImg}>><<set $Defences[1] = $Defence>><<set $AliceDefend to true>><<run Engine.play('AliceTask')>><</link>><br><</if>> <<if (!$Defences[2]) and ($AliceBrothel is false) and ($DefenceCount >= 2)>> <<link "Assign to Defence Room 2">> <<set $Defence = {name: "Alice", type: "Succubus", ImagePath: $AliceImg}>><<set $Defences[2] = $Defence>><<set $AliceDefend to true>><<run Engine.play('AliceTask')>><</link>><br><</if>> <<if (!$Defences[3]) and ($AliceBrothel is false) and ($DefenceCount >= 3)>> <<link "Assign to Defence Room 3">> <<set $Defence = {name: "Alice", type: "Succubus", ImagePath: $AliceImg}>><<set $Defences[3] = $Defence>><<set $AliceDefend to true>><<run Engine.play('AliceTask')>><</link>><br><</if>> <<if (!$Defences[4]) and ($AliceBrothel is false) and ($DefenceCount >= 4)>> <<link "Assign to Defence Room 4">> <<set $Defence = {name: "Alice", type: "Succubus", ImagePath: $AliceImg}>><<set $Defences[4] = $Defence>><<set $AliceDefend to true>><<run Engine.play('AliceTask')>><</link>><br><</if>> <<if (!$Defences[5]) and ($AliceBrothel is false)and ($DefenceCount >= 5)>> <<link "Assign to Defence Room 5">> <<set $Defence = {name: "Alice", type: "Succubus", ImagePath: $AliceImg}>><<set $Defences[5] = $Defence>><<set $AliceDefend to true>><<run Engine.play('AliceTask')>><</link>><br><</if>> <</if>> <<if ($AliceBrothel is false) and ($AliceDefend is false)>> <<link "Work in the brothel">><<set $AliceBrothel to true>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $InnPurchased is true>> <<link "Send Alice to your inn (Play as Alice)">><<set $CurrentPlayer to "AliceCloaked">> <<script>> UI.alert("Alice casts the cloak spell and turns back into her original self<br><br>You're Controling Alice Now, to change back return to the castle"); <</script>> <<if $Time lt 5>><<set $Time to 5>><</if>> <<run Engine.play('Inn')>><</link>><br><br> <</if>> <<if $DefenceRoom1 is "Alice">><<link "Stop task">><<set $DefenceRoom1 to "null">><<set $AliceDefend to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $DefenceRoom2 is "Alice">><<link "Stop task">><<set $DefenceRoom2 to "null">><<set $AliceDefend to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $DefenceRoom3 is "Alice">><<link "Stop task">><<set $DefenceRoom3 to "null">><<set $AliceDefend to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $DefenceRoom4 is "Alice">><<link "Stop task">><<set $DefenceRoom4 to "null">><<set $AliceDefend to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $DefenceRoom5 is "Alice">><<link "Stop task">><<set $DefenceRoom5 to "null">><<set $AliceDefend to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> <<if $AliceBrothel is true>><<link "Stop task">><<set $AliceBrothel to false>><<run Engine.play('AliceTask')>><</link>><br><br><</if>> [[Return|Inside Castle]] <</nobr>> </div>
<<nobr>> <div class="text-box"> <<if $ArmoryVisited isnot true>> <<include "DialogueStorage">> <<startdialogue "_TutorialArmory">> <<set $ArmoryVisited to true>> <</if>> <<include "CombatCSS">> <<include "WeaponData">> <div class="weapon-selection"> <h3>Select Weapons (one per slot)</h3> <!-- Dagger Slot --> <div class="weapon-slot"> <h4>🗡️ Dagger Slot</h4> <div id="daggerChoices" class="card-hand"> <!-- Dagger options will be displayed here --> </div> <div id="selectedDaggerCards" class="card-hand" style="display: none;"> <h5 style="width: 100%; text-align: center; color: #ffd700;">Selected Dagger Cards:</h5> <!-- Selected dagger's attack cards will be displayed here --> </div> <div style="text-align: center; margin: 10px 0;"> <button class="combat-btn" id="confirmDaggerBtn" onclick="confirmWeaponSelection('dagger')" style="display: none;">Confirm Dagger</button> </div> <div id="currentDagger" style="color: #fff; margin-top: 10px;"> <strong>Current Dagger:</strong> <span id="daggerName">None</span> </div> </div> <!-- Medium Slot --> <div class="weapon-slot"> <h4>⚔️ Medium Slot</h4> <div id="mediumChoices" class="card-hand"> <!-- Medium weapon options will be displayed here --> </div> <div id="selectedMediumCards" class="card-hand" style="display: none;"> <h5 style="width: 100%; text-align: center; color: #ffd700;">Selected Medium Weapon Cards:</h5> <!-- Selected medium weapon's attack cards will be displayed here --> </div> <div style="text-align: center; margin: 10px 0;"> <button class="combat-btn" id="confirmMediumBtn" onclick="confirmWeaponSelection('medium')" style="display: none;">Confirm Medium Weapon</button> </div> <div id="currentMedium" style="color: #fff; margin-top: 10px;"> <strong>Current Medium:</strong> <span id="mediumName">None</span> </div> </div> <!-- Back Slot --> <div class="weapon-slot"> <h4>🛡️ Back Slot</h4> <div id="backChoices" class="card-hand"> <!-- Back slot options will be displayed here --> </div> <div id="selectedBackCards" class="card-hand" style="display: none;"> <h5 style="width: 100%; text-align: center; color: #ffd700;">Selected Back Slot Cards:</h5> <!-- Selected back slot item's cards will be displayed here --> </div> <div style="text-align: center; margin: 10px 0;"> <button class="combat-btn" id="confirmBackBtn" onclick="confirmWeaponSelection('back')" style="display: none;">Confirm Back Slot</button> </div> <div id="currentBack" style="color: #fff; margin-top: 10px;"> <strong>Current Back:</strong> <span id="backName">None</span> </div> </div> </div> <div style="color: #fff; margin: 20px 0;"> <strong>Potions:</strong> Minor Healing x$MinorHealingPotion, Healing x$HealingPotion, Magic x$MagicPotion, Energy x$EnergyPotion<br> <strong>Player Inventory:</strong> <span id="inventoryCount">0</span> cards </div> <div style="text-align: center"> <<button "Leave">> <<goto "Inside Castle">> <</button>> </div> </div> <</nobr>> <<script>> // Global variables for weapon selection window.selectedWeapons = { dagger: null, medium: null, back: null }; // Global variable to track currently equipped weapons window.currentlyEquipped = { dagger: null, medium: null, back: null }; // FIXED detection function - looks for weapons by card names AND tracks slotType window.detectEquippedWeapons = function() { console.log('Detecting equipped weapons from combat inventory...'); if (!window.CombatSystem || !window.CombatSystem.combatInventory) { console.log('CombatSystem or inventory not available'); return; } console.log('Current combat inventory:', window.CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'no slot'})`)); // Get state variables for explicitly equipped weapons (if they exist) const explicitlyEquippedDagger = State.variables.EquippedDaggerSlot; const explicitlyEquippedMedium = State.variables.EquippedMediumSlot; const explicitlyEquippedBack = State.variables.EquippedBackSlot; console.log('Explicitly equipped weapons from state:', { dagger: explicitlyEquippedDagger, medium: explicitlyEquippedMedium, back: explicitlyEquippedBack }); // Reset equipped weapons window.currentlyEquipped = { dagger: explicitlyEquippedDagger || null, medium: explicitlyEquippedMedium || null, back: explicitlyEquippedBack || null }; // Check each weapon type to see if its cards are in the combat inventory Object.keys(window.weaponSets).forEach(weaponType => { const weaponData = window.weaponSets[weaponType]; if (!weaponData.cards || weaponData.cards.length === 0) return; // Check if all cards from this weapon are in combat inventory const weaponCardNames = weaponData.cards.map(card => card.name); const inventoryCards = window.CombatSystem.combatInventory; const weaponCardsInInventory = inventoryCards.filter(card => weaponCardNames.includes(card.name) ); // If we found all cards for this weapon if (weaponCardsInInventory.length === weaponCardNames.length) { // Determine slot type - first check if cards have slotType let slotType = weaponCardsInInventory[0]?.slotType; // If no slotType, determine from weapon slots configuration if (!slotType) { Object.keys(window.weaponSlots || {}).forEach(slot => { if (window.weaponSlots[slot].weapons && window.weaponSlots[slot].weapons.includes(weaponType)) { slotType = slot; } }); } // IMPORTANT CHANGE: Only assign if the slot is empty OR this is explicitly equipped if (slotType && (!window.currentlyEquipped[slotType] || (slotType === 'dagger' && weaponType === explicitlyEquippedDagger) || (slotType === 'medium' && weaponType === explicitlyEquippedMedium) || (slotType === 'back' && weaponType === explicitlyEquippedBack))) { window.currentlyEquipped[slotType] = weaponType; console.log(`Detected equipped weapon: ${weaponData.name} in ${slotType} slot`); // IMPORTANT: Update the slotType on all cards for this weapon weaponCardsInInventory.forEach(card => { card.slotType = slotType; card.weaponType = weaponType; // Also track which weapon this belongs to }); } } }); console.log('Final equipped state:', window.currentlyEquipped); }; // ENHANCED displayWeaponChoicesForSlot with better debugging window.displayWeaponChoicesForSlot = function(slotType) { console.log(`Displaying weapon choices for ${slotType} slot`); console.log(`Currently equipped in ${slotType}:`, window.currentlyEquipped[slotType]); console.log('Current weaponSlots state:', window.weaponSlots); const choicesDiv = document.getElementById(`${slotType}Choices`); if (!choicesDiv) { console.error(`Could not find choices div for ${slotType}`); return; } // Check if weaponSlots is defined if (!window.weaponSlots || !window.weaponSlots[slotType]) { console.error(`weaponSlots not defined or slot ${slotType} not found`); console.log('Available slots:', window.weaponSlots ? Object.keys(window.weaponSlots) : 'none'); choicesDiv.innerHTML = '<div style="color: #999;">Loading weapon data...</div>'; return; } choicesDiv.innerHTML = ''; const availableWeapons = window.weaponSlots[slotType].weapons.filter(weaponType => isWeaponOwned(weaponType)); const equippedWeapon = window.currentlyEquipped[slotType]; console.log(`Available weapons for ${slotType}:`, availableWeapons); console.log(`Equipped weapon for ${slotType}:`, equippedWeapon); availableWeapons.forEach(weaponType => { const weaponData = window.weaponSets[weaponType]; const weaponCard = createWeaponSelectionCard(weaponType, weaponData, slotType); // Highlight currently equipped weapon if (weaponType === equippedWeapon) { console.log(`Highlighting ${weaponType} as equipped in ${slotType}`); weaponCard.style.border = '3px solid #32cd32'; weaponCard.style.background = 'linear-gradient(to bottom, #f4e4bc 0%, #e6f3e6 100%)'; weaponCard.style.boxShadow = '0 0 15px rgba(50, 205, 50, 0.5)'; // Add equipped indicator const equippedIndicator = document.createElement('div'); equippedIndicator.style.cssText = ` position: absolute; top: 5px; right: 5px; background: #32cd32; color: white; padding: 3px 8px; border-radius: 12px; font-size: 10px; font-weight: bold; z-index: 10; `; equippedIndicator.textContent = 'EQUIPPED'; weaponCard.style.position = 'relative'; weaponCard.appendChild(equippedIndicator); } choicesDiv.appendChild(weaponCard); }); // Update the text display const displayName = slotType === 'dagger' ? 'daggerName' : slotType === 'medium' ? 'mediumName' : 'backName'; const nameElement = document.getElementById(displayName); if (nameElement) { if (equippedWeapon && window.weaponSets[equippedWeapon]) { const weaponData = window.weaponSets[equippedWeapon]; nameElement.textContent = `${weaponData.name} (${weaponData.cards.length} cards)`; } else { nameElement.textContent = 'None'; } } console.log(`Finished displaying choices for ${slotType}`); }; // Modified weapon selection card creation window.createWeaponSelectionCard = function(weaponType, weaponData, slotType) { const weaponCard = document.createElement('div'); weaponCard.className = 'card'; weaponCard.style.cursor = 'pointer'; weaponCard.onclick = () => selectWeapon(weaponType, slotType); weaponCard.innerHTML = ` <div class="card-content"> <div class="card-type weapon">weapon</div> <div class="card-name">${weaponData.name}</div> <div class="card-image"> <img src="${weaponData.image}" alt="${weaponData.name}" onerror="this.style.display='none'"> </div> <div class="card-damage">⚔️ ${weaponData.cards.length} Attack Types</div> <div class="card-description">${weaponData.description}</div> </div> `; return weaponCard; }; // Function to display all weapon choices window.displayWeaponChoices = function() { // First detect what's currently equipped detectEquippedWeapons(); // Display available choices for each slot displayWeaponChoicesForSlot('dagger'); displayWeaponChoicesForSlot('medium'); displayWeaponChoicesForSlot('back'); }; // FIXED weapon selection function - properly enforces one weapon per slot window.selectWeapon = function(weaponType, slotType) { console.log(`Selecting ${weaponType} for ${slotType} slot`); // If this weapon is already selected, do nothing if (selectedWeapons[slotType] === weaponType) { console.log(`${weaponType} is already selected for ${slotType}`); return; } // Clear the previous selection for this slot selectedWeapons[slotType] = null; // Remove ALL selection styling from this slot's cards document.querySelectorAll(`#${slotType}Choices .card`).forEach(card => { card.classList.remove('selected'); card.style.border = ''; card.style.background = ''; card.style.boxShadow = ''; }); // Hide any previous selection display const selectedCardsDiv = document.getElementById(`selected${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Cards`); selectedCardsDiv.style.display = 'none'; document.getElementById(`confirm${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Btn`).style.display = 'none'; // Now set the new selection selectedWeapons[slotType] = weaponType; const weaponData = window.weaponSets[weaponType]; // Find and highlight ONLY the clicked weapon card const clickedCard = event.target.closest('.card'); if (clickedCard) { clickedCard.classList.add('selected'); clickedCard.style.border = '3px solid #ffd700'; clickedCard.style.background = 'linear-gradient(to bottom, #f4e4bc 0%, #fff2cc 100%)'; clickedCard.style.boxShadow = '0 0 10px rgba(255, 215, 0, 0.5)'; } // Show the weapon's attack cards selectedCardsDiv.innerHTML = `<h5 style="width: 100%; text-align: center; color: #ffd700; margin-bottom: 15px;">Attack Cards for ${weaponData.name}:</h5>`; weaponData.cards.forEach(card => { const cardElement = createCardElement(card, true); selectedCardsDiv.appendChild(cardElement); }); selectedCardsDiv.style.display = 'flex'; document.getElementById(`confirm${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Btn`).style.display = 'inline-block'; console.log(`Selected ${weaponType} for ${slotType} slot`); }; // COMPLETELY FIXED weapon confirmation function window.confirmWeaponSelection = function(slotType) { const weaponType = selectedWeapons[slotType]; if (!weaponType || !window.CombatSystem) { console.log(`No weapon selected for ${slotType} or CombatSystem not available`); return; } const weaponData = window.weaponSets[weaponType]; console.log(`Confirming ${weaponType} for ${slotType} slot`); console.log(`Combat inventory BEFORE removal:`, CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'none'}) [${card.weaponType || 'no weapon'}]`)); // STEP 1: Remove ALL existing weapons of this slot type from inventory // We need to check BOTH slotType AND by weapon card names for this slot const removedCards = []; const weaponCardNamesForSlot = []; // Get all weapon card names that could be in this slot if (window.weaponSlots && window.weaponSlots[slotType]) { window.weaponSlots[slotType].weapons.forEach(wType => { if (window.weaponSets[wType] && window.weaponSets[wType].cards) { window.weaponSets[wType].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } }); } console.log(`Weapon card names for ${slotType} slot:`, weaponCardNamesForSlot); CombatSystem.combatInventory = CombatSystem.combatInventory.filter(card => { // Remove if card has matching slotType OR if it's a weapon card for this slot const shouldRemove = (card.slotType === slotType) || (weaponCardNamesForSlot.includes(card.name)); if (shouldRemove) { removedCards.push(`${card.name} (${card.slotType || 'none'})`); return false; // Remove this card } return true; // Keep this card }); console.log(`Removed ${removedCards.length} cards from ${slotType} slot:`, removedCards); console.log(`Combat inventory AFTER removal:`, CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'none'})`)); // STEP 2: Add all cards for the selected weapon with proper slot markers const addedCards = []; weaponData.cards.forEach(card => { const cardWithSlot = { ...card, slotType: slotType, weaponType: weaponType, id: `${slotType}_${weaponType}_${card.name}_${Date.now()}` }; CombatSystem.addCard(cardWithSlot); addedCards.push(`${card.name} (${slotType})`); }); console.log(`Added ${addedCards.length} cards to ${slotType} slot:`, addedCards); console.log(`Combat inventory AFTER addition:`, CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'none'})`)); // STEP 3: Update tracking variables window.currentlyEquipped[slotType] = weaponType; if (typeof State !== 'undefined' && State.variables) { switch (slotType) { case 'dagger': State.variables.EquippedDaggerSlot = weaponType; break; case 'medium': State.variables.EquippedMediumSlot = weaponType; break; case 'back': State.variables.EquippedBackSlot = weaponType; break; } console.log(`Set Twine variable $Equipped${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Slot to ${weaponType}`); } selectedWeapons[slotType] = null; // Clear selection after confirming console.log(`Updated currentlyEquipped[${slotType}] = ${weaponType}`); console.log('Current equipped state:', window.currentlyEquipped); // STEP 4: Update inventory count updateInventoryCount(); // STEP 5: Re-render combat system if(CombatSystem.render) { CombatSystem.render(); } // STEP 6: Hide selection UI const selectedCardsDiv = document.getElementById(`selected${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Cards`); selectedCardsDiv.style.display = 'none'; document.getElementById(`confirm${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Btn`).style.display = 'none'; // STEP 7: Clear visual selection document.querySelectorAll(`#${slotType}Choices .card`).forEach(card => { card.classList.remove('selected'); card.style.border = ''; card.style.background = ''; card.style.boxShadow = ''; }); console.log(`Successfully equipped ${weaponData.name} to ${slotType} slot (${weaponData.cards.length} cards)`); // STEP 8: REFRESH THE PASSAGE to show equipped status setTimeout(() => { // Force passage refresh to update visual state if (typeof Engine !== 'undefined' && Engine.play) { Engine.play(passage()); } else if (typeof Story !== 'undefined' && Story.get) { // Alternative Twine refresh method const currentPassage = passage(); Story.get(currentPassage).render(); } else { // Fallback: just refresh the weapon display displayWeaponChoices(); } console.log('Passage refreshed after weapon confirmation'); }, 200); }; // ENHANCED reset function with better cleanup window.resetWeaponSelection = function(slotType) { console.log(`Resetting ${slotType} slot`); // Clear selection state selectedWeapons[slotType] = null; // Hide selected weapon cards for this slot const selectedCardsDiv = document.getElementById(`selected${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Cards`); selectedCardsDiv.style.display = 'none'; document.getElementById(`confirm${slotType.charAt(0).toUpperCase() + slotType.slice(1)}Btn`).style.display = 'none'; // Remove ALL selection highlighting from this slot document.querySelectorAll(`#${slotType}Choices .card`).forEach(card => { card.classList.remove('selected'); card.style.border = ''; card.style.background = ''; card.style.boxShadow = ''; }); // Clear weapons from combat system if it exists if(window.CombatSystem) { const beforeCount = CombatSystem.combatInventory.length; // Get weapon card names for this slot const weaponCardNamesForSlot = []; if (window.weaponSlots && window.weaponSlots[slotType]) { window.weaponSlots[slotType].weapons.forEach(wType => { if (window.weaponSets[wType] && window.weaponSets[wType].cards) { window.weaponSets[wType].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } }); } // Remove cards by slotType OR by weapon card names CombatSystem.combatInventory = CombatSystem.combatInventory.filter(card => !(card.slotType === slotType || weaponCardNamesForSlot.includes(card.name)) ); const afterCount = CombatSystem.combatInventory.length; console.log(`Removed ${beforeCount - afterCount} cards from combat inventory`); // Update currently equipped tracking window.currentlyEquipped[slotType] = null; // Update inventory count updateInventoryCount(); // Re-render combat system if(CombatSystem.render) { CombatSystem.render(); } // Refresh the display to hide equipped weapon setTimeout(() => { displayWeaponChoices(); }, 100); console.log(`${slotType} slot weapon selection reset`); } }; // New function to reset all weapons window.resetAllWeapons = function() { resetWeaponSelection('dagger'); resetWeaponSelection('medium'); resetWeaponSelection('back'); console.log('All weapon selections reset'); }; // New function to confirm all weapon selections window.confirmAllWeapons = function() { let confirmedCount = 0; if(selectedWeapons.dagger) { confirmWeaponSelection('dagger'); confirmedCount++; } if(selectedWeapons.medium) { confirmWeaponSelection('medium'); confirmedCount++; } if(selectedWeapons.back) { confirmWeaponSelection('back'); confirmedCount++; } console.log(`Confirmed ${confirmedCount} weapon selections`); if(confirmedCount === 0) { alert('Please select at least one weapon before confirming.'); } }; // Add a function to clean up ALL weapon duplicates window.cleanupAllWeaponDuplicates = function() { if (!window.CombatSystem || !window.CombatSystem.combatInventory) return; console.log('Cleaning up ALL weapon duplicates...'); console.log('Before cleanup:', CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'none'})`)); // Get all weapon card names const allWeaponCardNames = []; Object.keys(window.weaponSets || {}).forEach(weaponType => { const weaponData = window.weaponSets[weaponType]; if (weaponData.cards) { weaponData.cards.forEach(card => { allWeaponCardNames.push(card.name); }); } }); console.log('All weapon card names:', allWeaponCardNames); // Remove ALL weapon cards const beforeCount = CombatSystem.combatInventory.length; CombatSystem.combatInventory = CombatSystem.combatInventory.filter(card => !allWeaponCardNames.includes(card.name) ); const afterCount = CombatSystem.combatInventory.length; console.log(`Removed ${beforeCount - afterCount} weapon cards from inventory`); console.log('After cleanup:', CombatSystem.combatInventory.map(card => `${card.name} (${card.slotType || 'none'})`)); // Reset equipped tracking window.currentlyEquipped = { dagger: null, medium: null, back: null }; // Update display updateInventoryCount(); if (CombatSystem.render) { CombatSystem.render(); } // Refresh weapon display setTimeout(() => { displayWeaponChoices(); }, 100); console.log('All weapon duplicates cleaned up'); }; // Add a debug function to check current state window.debugWeaponState = function() { console.log('=== WEAPON STATE DEBUG ==='); console.log('Currently Equipped:', window.currentlyEquipped); console.log('Selected Weapons:', window.selectedWeapons); console.log('Combat Inventory Cards:', window.CombatSystem?.combatInventory?.map(card => `${card.name} (slot: ${card.slotType || 'none'}) [weapon: ${card.weaponType || 'none'}]`)); console.log('Total Inventory Count:', window.CombatSystem?.combatInventory?.length || 0); // Count cards by slot const slotCounts = { dagger: 0, medium: 0, back: 0, none: 0 }; window.CombatSystem?.combatInventory?.forEach(card => { const slot = card.slotType || 'none'; slotCounts[slot] = (slotCounts[slot] || 0) + 1; }); console.log('Cards by slot:', slotCounts); console.log('========================'); }; // Keep your existing createCardElement function unchanged window.createCardElement = function(card, isWeaponCard = false, clickHandler = null) { const cardDiv = document.createElement('div'); cardDiv.className = 'card'; if (clickHandler) { cardDiv.style.cursor = 'pointer'; cardDiv.onclick = clickHandler; } // Format effects for display const effectsText = card.effects ? card.effects.map(effect => `${effect.name}${effect.value > 1 ? ` ${effect.value}` : ''}`).join(', ') : ''; // Show costs only if they're greater than 0 const energyCostDisplay = card.energyCost > 0 ? `<span class="energy-cost">⚡${card.energyCost}</span>` : ''; const magicCostDisplay = card.magicCost > 0 ? `<span class="magic-cost">🔮${card.magicCost}</span>` : ''; const costsDisplay = (energyCostDisplay || magicCostDisplay) ? `<div class="card-costs">${energyCostDisplay}${magicCostDisplay}</div>` : '<div class="card-costs hidden"></div>'; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${card.damage ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''} ${effectsText ? `<div class="card-effects">${effectsText}</div>` : ''} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Utility functions window.parseEffects = function(effectsString) { if(!effectsString) return []; return effectsString.split(',').map(effect => { const trimmed = effect.trim(); if(trimmed.includes(':')) { const [name, value] = trimmed.split(':'); return { name: name.trim(), value: parseInt(value.trim()) || 1 }; } return { name: trimmed, value: 1 }; }).filter(effect => effect.name); }; window.updateInventoryCount = function() { const countElement = document.getElementById('inventoryCount'); if(countElement && window.CombatSystem) { countElement.textContent = CombatSystem.combatInventory.length; } }; $(document).one(':passageend', function() { if(passage() === 'Armory') { setTimeout(() => { // Initialize weapon selection display displayWeaponChoices(); }, 100); } }); <</script>>
<div class="text-box"> <<nobr>> You take the stone from your pouch and hold it out to the man<br><br> <<You>>What can you tell me about this?<</You>><br><br> He takes the glowing stone from your hand and studies it for a moment<br><br> <<Worlock>>Where did you get this?<</Worlock>><br><br> <<You>>Does it matter?<</You>><br><br> He looks at you<br><br> <<Worlock>>This... is a soul stone, it can capture a soul and store it in here<</Worlock>><br><br> <<Worlock>>Of course, you can already hold on to a soul and use it to keep yourself alive... But this is different<</Worlock>><br><br> Trying to hide your surprise at the creature's knowledge of your power... You press more for information<br><br> <<You>>Different how?<</You>><br><br> <<Worlock>>Your ability allows you to keep a soul and prevent you from death... This keeps the essence of the being trapped in the stone<</Worlock>><br><br> <<You>>By the void, what does that mean<</You>><br><br> <<Worlock>>It means, if you trap a soul in this stone... you can bring them back to the world. You can summon the poor being back from the void to do whatever you desire<</Worlock>><br><br> <i>Pissed off dev note: This mechanic is still under development, because yours truly didn't realise how hard it would be to implement...<br><br> Sorry, this is coming in the next update! </i><br><br> <<link "Finish">> <<script>> UI.alert("Quest complete!<br>Although youll need to wait a bit longer to use the stones"); <</script>> <<run $Quests.delete("Find would what this stone is")>> <<run Engine.play("Forest Shack Inside")>><</link>> <<set $SoulStoneKnow to true>> <</nobr>> </div>
<div class="text-box"> You deal a stike to the succubus <<set $Damage to random(10, 18)>> <<nobr>> Damage dealt: $Damage <<set $EnemyHealth to $EnemyHealth - $Damage>> <</nobr>> <<if $EnemyHealth lt 1>>[[Continue|DefeatSuccubus]]<<else>>[[Continue|SuccubusAttack]]<</if>> </div>
<<nobr>> <div class="text-box"> <h1>Defeat</h1> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You lost the conflict against the $CurrentEnemy and perish<br><br> <<set $PlayerHealth to 0>> <<button "Continue">> <<goto "Respawn">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <<set $DeathCardPlayed to false>> <<set $MagicianCardPlayed to false>> <<set $VoidEnemy to false>> <<removeclass "#right-ui-bar" "stowed">> <</nobr>>
<div class="text-box"> <<nobr>> After a few moments, an old man steps from the gates and they close behind him<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Mine/2.png" width="700" height="700"> </div> <<Eduart>>Wh-Who are you?<</Eduart>> <<You>>Your daughter sent me, I'm here to help you<</You>><br><br> <<Eduart>>How do you know my daughter?<</Eduart>> <<You>>We don't have time, lets go<</You>><br><br> <<set $AliceQuestStatus to "Save">> <<button "Return to Alice">> <<run $Quests.delete("Find Alice's father")>> <<script>> UI.alert("Quest Complete! <br>You have rescued Alices farther"); <</script>> <<goto "Visit Alice">> <</nobr>> </div>
<<nobr>> <div class="text-box"> You step closer to the bandit camp to better understand it<br><br> You see more bandits than you can deal with, protecting a mine<br><br> <<You>>I have no need to get in here yet... so I had better keep my distance<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> In the distance you can see a woman slumped against a tree... You continue walking towards her, getting closer<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Ambush/3.png" width="700" height="700"> </div><br><br> Woman: Help!<br><br> You're close enough to make out details now, you can see she is injured<br><br> Woman: Please, bandits killed my father and took our horse I ran but I think they are close!<br><br> <<link "Help her">><<set $Position to "Help">><<run Engine.play('BanditQuest3')>><</link>><br><br> <<if $PlayerRangedWeapon is "Bow">><<link "Shoot her">><<set $Position to "Shoot">><<run Engine.play('BanditQuest3')>><</link>><</if>><br><br> <<link "Stab her">><<set $Position to "Stab">><<run Engine.play('BanditQuest3')>><</link>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Position is "Help">> <<set $PlayerHealth to 70>> You walk up to her and kneel infront of her<br><br> <<You>>Are you alright<</You>><br><br> Woman: I think my leg is broken, can you carry me?<br><br> <<You>>Yes, let me take your arm<</You>><br><br> You reach out to take her arm, but before you can... She pulls out a small blade and thrusts it into your side, under your ribs<br><br> <<You>>Ah! you fuck!<</You>><br><br> You scream as you stumble away from her<br><br> Before you can react, a hand grabs you from behind and throws you back onto the road<br><br> You look up to see a bandit and realise you've fallen for their trap<br><br> <<button "Face the heavy bandit">><<goto "Encounter_BanditAmbush">><</button>> <</if>> <<if $Position is "Stab">> You walk up to her and kneel infront of her<br><br> Woman: I think my leg is broken, can you carry me?<br><br> You take out a small dagger<br><br> Woman: What are you doi...<br><br> You push the dagger into the side of her throat cutting off her question, she stairs at you eyes wide.<br><br> Blood sprays from your neck as you pull your blade out, she tries to speak but is only able to make a week, wet gurgling sound<br><br> For a few moments she tries to hold her neck and stop the bleeding, until her eye's turn dull and she slumps backwards<br><br> <<You>>Did you think you could trick me<</You>><br><br> You look up to see a man approaching from the trees<br><br> Bandit: You bastard!<br><br> Realising you haddent fallen for his trap, the bandit sprints at you <<button "Face the heavy bandit">><<goto "Encounter_BanditAmbush">><</button>> <</if>> <<if $Position is "Shoot">> You take your bow from its sling on your back and and arrow from a quiver at your waist<br><br> Woman: Wait, what are you doing<br><br> You quickly nock the arrow and fire it at the woman, not wanting to give her time to react<br><br> The shot goes wide and you strike her in the shoulder pinning her to the tree she was leaning against... She screams, but its not loud enough to drown out the foot steps running behind you<br><br> <<link "Turn around">><<set $Position to "Turn">><<run Engine.play('BanditQuest3')>><</link>> <</if>> <<if $Position is "Turn">> You turn around to see a bandit sprinting towards you...<br><br> Man: You bastard, I'll kill you for that!<br><br> You nock another [[arrow|Bow]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Position is "Take">> You walk up the woman and kneel next to her, her eye's are wide and she begins to panic<br><br> Woman: Just let me go, please<br><br> Before she can speak another word, you knock her out and take her back to the castle<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<run $Quests.delete("deal with the bandits attacking caravans near the creek")>> [[Leave|Base Intro]] <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", skill: 0, hairColor: $NPC, ImagePath: "Images/Castle/Dungon/Woman/Brown/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <</if>> <<if $Position is "Leave">> You turn away from the woman and walk away, leaving her to think about her mistakes<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<run $Quests.delete("deal with the bandits attacking caravans near the creek")>> [[Leave|Base Intro]] <</if>> <<if $Position is "Finish">> You walk up the woman and kneel next to her, her eye's are wide and she begins to panic<br><br> Woman: Just let me go, ple..<br><br> You push your sword through her chest, she pauses for a moment as if trying to think of what to do, but that passes as she exhales for the last time<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<run $Quests.delete("deal with the bandits attacking caravans near the creek")>> [[Leave|Base Intro]] <</if>> <</nobr>> </div> <<set $TavQuest to 2>> <<set $TavQuestComplete to true>> <<set $TavQuestName to "null">> <<set $BanditQuest to false>>
<div class="text-box"> <<nobr>> You swing your sword low and it bites into the bandits leg, he screams and falls to one knee<br><br> You draw back your sword and prepare for the killing strike<br><br> He raises his arm<br><br> Man: No, wait!<br><br> You bring your sword down in a two handed strike, cutting through his raised forearm and down into the side of his neck between his helmet and shoulder guard<br><br> Blood sprays from his opened neck and the stump of his arm<br><br> You can hear throthing from under the helmet for a moment, before he falls forward, dead...<br><br> <<if ($Position is "Shoot") or ($Position is "Turn")>> You turn to the woman who is still pinned against the tree by the arrow<br><br> Woman: Fuck, please let me go <<if $CellsCount > $DungonOccupance.length>> You have space in your cells... You could: <br><br> <<link "Take her">> <<set $Position = "Take">> <<run Engine.play('BanditQuestFinished')>> <</link>> <</if>> <br><br> <<link "leave her">><<set $Position to "Leave">><<run Engine.play('BanditQuestFinished')>><</link>><br><br> <<link "finish her">><<set $Position to "Finish">><<run Engine.play('BanditQuestFinished')>><</link>><br><br> <</if>> <<if $Position is "Help">> You turn to the woman who is staring at you, gripped by fear<br><br> <<if $CellsCount > $DungonOccupance.length>> You have space in your cells... You could: <<link "Take her">> <<set $Position = "Take">> <<run Engine.play('BanditQuestFinished')>> <</link>> <</if>> <br><br> <<link "leave her">><<set $Position to "Leave">><<run Engine.play('BanditQuestFinished')>><</link>><br><br> <<link "kill her">><<set $Position to "Finish">><<run Engine.play('BanditQuestFinished')>><</link>><br><br> <</if>> <<if $Position is "Stab">> You take out your dagger and carve the mark of your castle into a tree near by, letting the villagers and bandits know who did this<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> [[Leave|Base Intro]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You explore the forest for a while, searching for your target. <br><br> After some time, you find a wide path with tracks and follow them...<br><br> In the distance you a see a light in the road<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Ambush/2.png" width="700" height="700"> </div><br><br> [[Continue|BanditQuest2]] <</nobr>> </div> <<set $Time to $Time + 9>> <<set $BanditQuest to true>>
<<nobr>> <div class="text-box"> <<set $AliceDrunk to $AliceDrunk + 1>> <<Tender>>What will it be?<</Tender>><br> <<if $AliceDrunk lt 3>> <<set _rand to random(1, 2)>> <<if _rand is 1>> <<say 'Alice' $AliceTavImg>>Meed please<</say>> <<else>> <<say 'Alice' $AliceTavImg>>Wine please<</say>> <</if>> He poors you a drink and you enjoy it alone <</if>> <<if $AliceDrunk is 3>> <<set _rand to random(1, 2)>> <<if _rand is 1>> <<say 'Alice' $AliceTavImg>>Meed please<</say>> <<else>> <<say 'Alice' $AliceTavImg>>Wine please<</say>> <</if>> He poors you a drunk and you begin to drink it <</if>> <<if $AliceDrunk is 4>> <<set _rand to random(1, 2)>> <<if _rand is 1>> <<say 'Alice' $AliceTavImg>>Meed please<</say>> <<else>> <<say 'Alice' $AliceTavImg>>Wine please<</say>> <</if>> He poors you a drunk and you begin to drink it <<Tender>>Ok, thats probably enough, its not safe for someone like you to walk home this late while drunk<</Tender>><br> <</if>> Your drunkness level: <progress @value="$AliceDrunk" max="5"></progress> <<button "Step away from the bar">> <<goto "AliceBar">> <</button>> </div> <</nobr>>
<div class="text-box"> <<Tender>>Hello there, fancy a drink? Or we have some girls upstairs if your looking for company?<</Tender>><br> <<if $Gold >= 10>> <<link "Buy a drink (resets health)">><<set $PlayerHealth to 100>><<run Engine.play('bar keep')>><<set $Gold to $Gold - 10>><</link>><<else>>You cant afford a drink<</if>> <<if $Gold >= 50>> <<link "Go Upstairs (Costs 50 gold)">><<set $Gold to $Gold - 50>><<run Engine.play('BarUpstairs')>><</link>> <<else>> You cant afford to visit the brothel<</if>> [[Leave|Tavern]] </div>
<<nobr>> <div class="text-box"> <<if $Position is "Tease her">> <<say 'Alice' $AliceTavImg>>Lay back<</say>> She does as told and you crawl on top of her before teasing her with your fingers <<if $AliceArtStyle is "Anime">> <<set _rand to random(1, 7)>> <<else>> <<set _rand to random(15, 18)>> <</if>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/Tease/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <<say "Whore" $CharImg>>God! I-I'm close, please don't stop<</say>> She cum on your hand, shaking and bucking her hips, you keep up the preasure and send her into a second powerful climax before slowing and allowing you both to catch your breath<br><br> <</if>> <<if $Position is "Tease you">> You move away form her and crawl to the top of the bed, before resting on your back <<say 'Alice' $AliceTavImg>>Come<</say>> She does as told and crawls onto the bed before laying next to you. You take her hand and guide it between your legs<br><br> She takes the hint and pushes a finger into you<br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(8, 13)>> <<else>> <<set _rand to random(19, 23)>> <</if>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/Tease/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <<say "Whore" $CharImg>>Is this good miss<</say>> <<say 'Alice' $AliceTavImg>>Yes! Fuck, keep going till I cum<</say>> Emboldened by your moans, she presses a second finger into you. This proves too much and a wave of pleasure flows over you as you cum<br><br> <</if>> <<if $Position is "Cul">> Taking the lead, you guide her to the bed and sit her down. She leans in to being pleasuring you as you stand over her, but you stop her, catching her by the chin and lifting her to look at you <<say 'Alice' $AliceTavImg>>Later<</say>> Before she can respond, you drop to your knees and open her legs <<set _rand to random(1, 3)>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/Cul/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> You enjoy making a mess, soaking your face and her thighs as you both moan <<say "Whore" $CharImg>>Gods<</say>> You pull away from her and the moaning stops <<say 'Alice' $AliceTavImg>>Get on your knees<</say>> She does as you say and you reposition yourself below her before pulling her hips into your face <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/Cul/4.png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <</if>> <<if $Position is "Face sit">> You push the whore onto the bed and she obediantly falls back. Cralwing onto the bed you straddle her and hold your pussy inches from her face <<say 'Alice' $AliceTavImg>>Ready?<</say>> You don't give her a chance to respond, bringing yourslef down onto her face as you both moan in pleasure <<set _rand to random(1, 3)>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/FaceSit/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceTavImg>>Fuck, I love riding your face<</say>> Contiuing to gind on her face, you smear your fluids over he face as she laps her tounge over you <<say 'Alice' $AliceTavImg>>Open wide I'm cumming<</say>> <<say "Whore" $CharImg>>Mph!<</say>> You scream as you cum on the whores face spraying her with fluid <<say 'Alice' $AliceTavImg>>Umm, well done<</say>> <<say "Whore" $CharImg>>Thank you<</say>> <</if>> <<if $Position is "Relax">> You turn over to your front and relax, the view of your ass is more than your companion can handle and she touches you. Taking your silence as permission, she pushes things further she explores you and enjoys your body while you rest <<set _rand to random(1, 3)>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/Relax/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <</if>> <<if $Position isnot "Relax">> Both of you colapse onto the bed catching your breaths, you releax together holding eachother for a long time, before reploring eachothers bodys more <<if $AliceArtStyle is "Anime">> <<set _rand to random(1, 6)>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/End/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <</if>> <</if>> <br> You think about what to do and consider leaving and going back downstairs, or playing more with your companion<br><br> <<button "Leave">> <<goto "AliceBar">> <</button>><br> <<button "Tease her">> <<set $Position to "Tease her">> <<goto "BarUpstairsAlice2">> <</button>><br> <<button "Tell her to finger you">> <<set $Position to "Tease you">> <<goto "BarUpstairsAlice2">> <</button>><br> <<if $AliceArtStyle is "Anime">> <<button "Go down on her">> <<set $Position to "Cul">> <<goto "BarUpstairsAlice2">> <</button>><br> <<button "Sit on her face">> <<set $Position to "Face sit">> <<goto "BarUpstairsAlice2">> <</button>><br> <<button "Relax on the bed">> <<set $Position to "Relax">> <<goto "BarUpstairsAlice2">> <</button>><br> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> Much to his supprise, you pay the bar keep the 50 gold and head upstairs. Following the corridor, you find the room marked 'IV' you push it open and see a woman, sat waiting on the bed<br><br> <<if $AliceArtStyle is "Anime">> <<set _rand to random(6, 8)>> <<else>> <<set _rand to random(1, 5)>> <</if>> <div class="Random-image"> <<set $CharImg to "Images/Town/Brothel/Brown/" + _rand + ".png">> <img @src=$CharImg alt="Guest Image"> </div> <br><br> <<if $AliceFirstTimeBorthel isnot true>> <<say "Woman" $CharImg>>Umm, I think you're in the wrong place?<</say>> <<say 'Alice' $AliceTavImg>>Oh no no, I'm definitely in the right place<</say>> <<else>> <<say "Stranger" $CharImg>>Welcome back miss<</say>> <</if>> It takes no time at all for both of you to be stripped naked. You can feel her lust building every second while you think about what you want to do <<if $AliceArtStyle is "Anime">> <<set _rand to random(1, 3)>> <<else>> <<set _rand to 4>> <</if>> <div class="Random-image"> <<set _ImagePath to "Images/Town/Brothel/Brown/Alice/" + _rand + ".png">> <img @src=_ImagePath alt="Guest Image"> </div> <br><br> <<button "Tease her">> <<set $Position to "Tease her">> <<goto "BarUpstairsAlice2">> <</button>><br> <<button "Tell her to finger you">> <<set $Position to "Tease you">> <<goto "BarUpstairsAlice2">> <</button>><br> <<if $AliceArtStyle is "Anime">> <<button "Go down on her">> <<set $Position to "Cul">> <<goto "BarUpstairsAlice2">> <</button>><br> <<button "Sit on her face">> <<set $Position to "Face sit">> <<goto "BarUpstairsAlice2">> <</button>><br> <</if>> <</nobr>>
<<nobr>> <<set $Time to $Time + 1>> <div class="text-box"> Pick a girl:<br><br> <<set _int to random(1, 5)>> <<set $Img to random(1, 3)>> <<set $Position to "null">> <<set $BackgroundPath to "Images/Town/Brothel/Rooms/" + _int + ".png">> The brunette <<link "woman">> <<set $ImagePath to "Images/Town/Brothel/Brown/Sex/Ready/" + $Img+ ".png">> <<set $NPC to "Brown">> <<run Engine.play('BrothelFuck')>><</link>><br><br> <<set $ImagePath to "Images/Town/Brothel/Brown/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <hr> The ebony skinned <<link "woman">> <<set $ImagePath to "Images/Town/Brothel/Ebony/Sex/Ready/" + $Img+ ".png">> <<set $NPC to "Ebony">> <<run Engine.play('BrothelFuck')>><</link>><br><br> <<set $ImagePath to "Images/Town/Brothel/Ebony/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <hr> The red headed <<link "woman">> <<set $ImagePath to "Images/Town/Brothel/Red/Sex/Ready/" + $Img+ ".png">> <<set $NPC to "Red">> <<run Engine.play('BrothelFuck')>><</link>><br><br> <<set $ImagePath to "Images/Town/Brothel/Red/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <hr> [[Leave|Tavern]] <<set $NPCCum to 0>> <<set $PlayerCum to 0>> </div> <</nobr>>
<<nobr>> <<if $FirstMilita is "Start">> <<include "DialogueStorage">> <<startdialogue "_TutorialEncounterEnemy">> <<set $FirstMilita to "ForestMeet">> <</if>> <<set $CruptMapFound to false>> <<set $NewCrypt to false>> <div class="castle-menu"> <h1>Grimshade Castle</h1> <<if $Quest1 is true>> <<if ($VisitedVault is true) and ($VisitedDungeon is true) and ($VisitedChambers is true) and ($VisitedDefences is true)>> <<script>> UI.alert("Quest complete! <br>You have visited each part of the castle, you can now sleep or explore further"); <</script>> <<run $Quests.delete("Visit each area of the base")>> <<set $Quest1 to false>> <<else>> <<You>>I should visit each one of these areas before doing anything<</You>><br> <</if>> <</if>> <br> <hr> <h2 style="color: #8B0000; text-align: center;">Courtyard</h2> <br> <div class="menu-item" data-image="Images/Castle/Portal/1.png"> [[Enter the castle|Inside Castle]] <span class="menu-description">Return to your fortress</span> </div> <div class="menu-item" data-image="Images/Castle/Defences/Wallpaper.png"> [[Manage Defences|Defences]] <span class="menu-description">Fortify your stronghold</span> </div> <<if $BarracksUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Barracks/1.png"> [[Visit the Barracks|Barracks]] <span class="menu-description">Train your minions</span> </div> <</if>> <<if $LivingQuarters is true>> <div class="menu-item" data-image="Images/Castle/Barracks/1.png"> [[Visit the Living Quarters|Quarters]] <span class="menu-description">Visist your subjects</span> </div> <</if>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Courtyard|CourtyardTraining]] <span class="menu-description">Practice combat skills</span> </div> <br> <hr> <h2 style="color: #8B0000; text-align: center;">Exploration</h2> <br> <<if $Time < 9>> <<if $OwnesHorse is false>> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Explore the area]] <span class="menu-description">Scout nearby territories on foot</span> </div><</if>> <<if $OwnesHorse is true>> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Explore the forest|Explore the area]] <span class="menu-description">Venture into the eastern woods</span> </div> <div class="menu-item" data-image="Images/Town/6.png"> [[Ride to the coast|South]] <span class="menu-description">Journey to the southern shores</span> </div> <<if $InnPurchased is true>> <div class="menu-item" data-image="Images/Town/Inn/Rooms/FOH/1.png"> [[Visit your inn|Inn]] <span class="menu-description">Check on your business</span> </div> <</if>> <<if $ArmouryVisisted isnot true>> <div class="menu-item disabled" data-image="Images/Mountains/1.png"> <span style="color: #808080;">Mountain Pass</span> <span class="menu-description" style="color: #666;">Progress further before visiting</span> </div> <<elseif $PortalVisited isnot true>> <div class="menu-item disabled" data-image="Images/Mountains/1.png"> <span style="color: #808080;">Mountain Pass</span> <span class="menu-description" style="color: #666;">Build portal room first</span> </div> <<elseif $IronPeakVisited is true>> <div class="menu-item" data-image="Images/Mountains/1.png"> [[Ride to the mountains|Ironpeak Outpost]] <span class="menu-description">Return to Ironpeak Outpost</span> </div> <<else>> <div class="menu-item" data-image="Images/Mountains/1.png"> [[Ride to the mountains|North]] <span class="menu-description">Journey to the northern peaks</span> </div> <</if>> <div class="menu-item disabled" data-image="Images/Plains/1.png"> <span style="color: #808080;">Ride to the plains</span> <span class="menu-description" style="color: #666;">Coming soon</span> </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Horse/1.png"> <span style="color: #808080;">Distant Exploration</span> <span class="menu-description" style="color: #666;">You need a horse to explore further</span> </div> <</if>> <<else>> <div class="menu-item disabled" data-image="Images/Forrest/Exploring/Path/1.png"> <span style="color: #808080;">Exploration</span> <span class="menu-description" style="color: #666;">Too late to go out</span> </div> <</if>> </div> <<set $CloakDisabled to false>> <<set $CurrentPlayer to "Overlord">> <<set $Cloaked to false>> <<if $MaxNotoriety lt 30>><<set $MaxNotoriety to 30>><</if>> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .castle-menu h2 { font-size: 24px; text-align: center; margin: 20px 0; font-family: 'Georgia', serif; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <<script>> setTimeout(function() { $('.menu-item').each(function() { var $this = $(this); var imageSrc = $this.data('image'); if (imageSrc && $this.find('img').length === 0) { $this.prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }, 10); <</script>> <<if !$MaxNotoriety>> <<set $MaxNotoriety to 3>> <</if>> <<if !$Grain>> <<set $Grain to 0>> <</if>> <<if !$Food>> <<set $Food to 0>> <</if>> <</nobr>> <<if $RightBar is true>> <<removeclass "#right-ui-bar" "stowed">> <</if>> <<set $AliceDrunk to 0>> <<if ($Time >= 5 and not $dailyActionPerformed) and ($InnPurchased is true)>> <<set _report to generatePrivateRoomReport()>> <<script>> let results = window.innFunctions.calculateInnRevenue(); State.variables.innResults = results; <</script>> <<set $dailyActionPerformed to true>> <<elseif $Time < 5>> <<set $dailyActionPerformed to false>> <</if>> <<run document.body.style.background = ''; document.body.style.backgroundImage = 'none'; $('#passage, #story, body').css('background',''); document.body.className = document.body.className.replace(/\\bbg-\\S+\\b/g,'')>>
<<nobr>> <div class="text-box"> <h1>Castle Upgrades</h1> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <!-- Dungeon Cell Upgrade --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/dungeon_cell.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dungeon Cell</h3> <p>Current Cells: $CellsCount</p> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Add Cell">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $CellsCount to $CellsCount + 1>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Defense Room Upgrade --> <<if $DefenceCount lt 5>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/defense_room.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Defense Room</h3> <p>Current Defense Rooms: $DefenceCount</p> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Add Room">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $DefenceCount to $DefenceCount + 1>> <<set $MaxNotoriety to $MaxNotoriety + 10>> <<run Engine.show()>> <<script>> UI.alert("You have increased your castle's defenses.\nAs the castle becomes larger and more heavily defended, local villages start to notice.\nYour maximum notoriety has increased!"); <</script>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $PortalRoomUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/ClosedPortal.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Ancient Portal</h3> <p>Cost: 200 Gold & 200 Stone</p> <<if ($Gold >= 200) and ($Stone >= 200)>> <<button "Build Portal">> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 200>> <<set $PortalRoomUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $Infirmary is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/Infirmary.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Infirmary</h3> <p>Cost: 200 Gold & 200 Stone</p> <<if ($Gold >= 200) and ($Stone >= 200)>> <<button "Build Infirmary">> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 200>> <<set $Infirmary to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $BarracksUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Barracks/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Barracks</h3> <p>Cost: 500 Wood & 500 Stone</p> <<if ($Wood >= 500) and ($Stone >= 500)>> <<button "Build Barracks">> <<set $Wood to $Wood - 500>> <<set $Stone to $Stone - 500>> <<set $BarracksUnlocked to true>> <<set $BarraksOccupance = []>> <<set $RaidingParty = []>> <<set $ExploreTeam = []>> <<set $BarracksMax to 3>> <<set $Exporing to false>> <<set $RaidLocationList to []>> <<set $SmallSettlementRaid to 1>> <<set $MediumSettlementRaid to 1>> <<set $SmallBanditCampRaid to 1>> <<set $MediumBanditCampRaid to 1>> <<set _dutyList = [ "None", "Guard the castle", "Raiding party" ]>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if $BarracksUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Barracks/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Barracks upgrade</h3> <p>Current Beds: $BarracksMax</p> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Upgrade">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $BarracksMax to $BarracksMax + 3>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($BarracksUnlocked is true) and ($LibraryUnlocked isnot true)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Library/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Library</h3> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Library">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $LibraryUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($BarracksUnlocked is true) and ($ArmoryUnlocked isnot true)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Forge/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Forge</h3> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Forge">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $ArmoryUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Return to chambers">> <<goto "Chambers">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> A young beautiful receptionist stands before you <div class="Random-image"> <<set _imagePath to "Images/Town/BathHouse/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<Receptionist>> <<if $Time <= 3>>Good Morning sir, welcome to the bath house, how can I help you today?<</if>> <<if $Time >= 4>>Good Afternoon sir, welcome to the bath house, how can I help you today?<</if>><</Receptionist>><br><br> <<if $VisitedBathHouse is false>> <<You>>What services do you offer?<</You>><br><br> <<Receptionist>>Our public baths are available for a small fee, the public bathsa are avilable to anyone and we guarantee you will feel rejuvenated after.<</Receptionist>><br><br> <<Receptionist>>If thats not to your liking, we offer massages in a private room, we do offer special massages for prefered customers<</Receptionist>><br><br> She says with a wink<br><br> <</if>> <<set $VisitedBathHouse to true>> <<if $Gold >= 20>> <<link "Enter public baths (20 gold)">><<set $Gold to $Gold -20>><<run Engine.play('Public Baths')>> <<set $VisitedBathHouse to true>> <</link>><<else>> You cant afford to enter the baths<</if>><br><br> <<if $MaraQuestFinished is false>> <<if $Massage is 0>> <<if $Gold >= 50>> <<link "Get a massage (50 gold)">><<set $Gold to $Gold -50>><<run Engine.play('Mara1')>> <<set $VisitedBathHouse to true>> <</link>><<else>> You cant afford a massage<</if>><</if>><br><br> <<if $Massage is 3>> <<if $Gold >= 50>> <<link "Get a massage (50 gold)">><<set $Gold to $Gold -50>><<run Engine.play('Mara3')>> <<set $VisitedBathHouse to true>> <</link>><<else>> You cant afford a massage<</if>><</if>><br><br> <<if $Massage is 8>> <<if $Gold >= 50>> <<link "Get a massage (50 gold)">><<set $Gold to $Gold -50>><<run Engine.play('Mara8')>> <<set $VisitedBathHouse to true>> <</link>><<else>> You cant afford a massage<</if>><</if>><</if>><br><br> <<if $MaraQuestFinished is true>> <<if $MaraAtBase is false>> [[Visit Mara|MaraVisit]]<br><br> <</if>> <</if>> [[Leave|Town]] <</nobr>> </div> <<set $Position to "Massage">>
<<nobr>> <div class="text-box"> You entre a bedroom<br><br> <<if $Int is 1>> Theres a woman sleeping in the bed<br><br> <div align="center"><img src="Images/Town/Houses/Bedroom/People/1.png" width="700" height="700"></div><br><br> <<set $SleepingNPC to true>> <</if>> <<if $Int is 3>> Theres a woman sleeping in the bed<br><br> <div align="center"><img src="Images/Town/Houses/Bedroom/People/2.png" width="700" height="700"></div><br><br> <<set $SleepingNPC to true>> <</if>> <<if $Int is 5>> Theres a woman sleeping in the bed<br><br> <div align="center"><img src="Images/Town/Houses/Bedroom/People/3.png" width="700" height="700"></div><br><br> <<set $SleepingNPC to true>> <</if>> <<if $Int is 7>> Theres a woman sleeping in the bed<br><br> <div align="center"><img src="Images/Town/Houses/Bedroom/People/4.png" width="700" height="700"></div><br><br> <<set $SleepingNPC to true>> <</if>> <<if $SleepingNPC is true>> <<if $PlayerSpells.includes("Dominate")>> <<link "Dominate her">><<run Engine.play('TownHouseDom')>><</link>><br><br> <<else>> You do not have the correct spell to dominate her<br><br> <</if>> <<link "Take her soul">><<run Engine.play('TownHouseSoul')>><</link>><br><br> <</if>> Theres a side table by the bed<br><br> <div align="center"> <img src="Images/Town/Houses/Bedroom/3.png" width="700" height="700"> </div><br><br> <<if $Bedroom is false>> <div id="options"> <<linkreplace "search the side table">> <div id="inner-options"> You slowly open the drawer and look through it... <<set $Bedroom to true>> <<if $SilverLocation[$Location] is "Bedroom">> While searching the drawer you find a ring...<br><br> <<set $silverfound to true>> <div align="center"> <img src="Images/Town/Houses/Jewelry/2.png" width="700" height="700"> </div><br><br> <<if $SilverNeed gt 0>> You need $SilverNeed more silver<br><br> <<set $SilverNeed to $SilverNeed - 1>> <<elseif $Quests.includes("Obtain a silver weapon")>> You have all the silver Henry needs<br><br> <</if>> <<else>> <<set $Int to random(0, 4)>> <<if ($Int gt 2) and ($GoldFound is false)>> <<set $GoldFound to true>> You find a small pouch containing 20 gold<br><br> <<set $Gold to $Gold + 20>> <<else>> Theres nothing here... <br><br><</if>> <<set $Searching to false>> <</if>> </div> <</linkreplace>> </div> <br><br> <</if>> <<if $Searching is false>> <<if $silverfound is false>> [[Try the kitchen|KitchenTwo]]<br><br> [[Try the livingroom|LivingRoom2]]<br><br> [[Leave|TownHouses]] <<else>> [[Leave|TownHouses]] <</if>><</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $NPC is "Shop Keep">> You loosen your dress, showing more of your chest<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Shop/3.png" width="700" height="700"> </div><br><br> <<Lucy>>Maybe I can convince you in another way?<</Lucy>><br><br> The shop keep looks at you with more interest<br><br> <<ShopKeep>>Lets go into my back room and I'll think about it while your sucking my cock, you better do a good job<</ShopKeep>><br><br> You smile at him<br><br> <<Lucy>>I was hoping you would ask<</Lucy>><br><br> You follow the shop keep into his back room<br><br> <</if>> <<if $NPC is "Tavern Patreon">> <<Lucy>>Soulds like fun, but I want the money up front<</Lucy>><br><br> <<set $Gold to $Gold + 50>> The man smiles, for a moment you can tell he wasn't expecting this to work<br><br. Man: Great lets go<br><br> He walks you back to his small home, holding your hand tightly so you can't run away with his money<br><br> He leads you inside and locks the door<br><br> <<Lucy>>So, what can I do for you?<</Lucy>><br><br> Man: You can start by sucking my cock and we'll see where things go. You better do a good job if you want to leave with my gold <</if>> [[Continue|BJMiniGame]] <<set $Int to random(0, 1)>> <<if $Int is 0>><<set $StripLike to true>><<else>><<set $StripLike to false>><</if>> <<if $NPC is "Tavern Patreon">><<set $StripLike to true>><</if>> <<set $Int to random(0, 1)>> <<if $Int is 0>><<set $StokeLike to true>><<else>><<set $StokeLike to false>><</if>> <<set $Int to random(0, 1)>> <<if $Int is 0>><<set $TeaseLike to true>><<else>><<set $TeaseLike to false>><</if>> <<set $Int to random(0, 1)>> <<if $Int is 0>><<set $BallsLike to true>><<else>><<set $BallsLike to false>><</if>> <<set $Int to random(0, 1)>> <<if $Int is 0>><<set $SpeedLike to true>><</if>> <<set $Int to random(0, 3)>> <<if $Int is 0>><<set $SpeakLike to "Slutty">><</if>> <<if $Int is 1>><<set $SpeakLike to "Innocent">><</if>> <<if $Int is 2>><<set $SpeakLike to "Submissive">><</if>> <<if $Int is 3>><<set $SpeakLike to "Dominant">><</if>> <<set $Tease to 0>> <<set $Strip to 0>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $SlutLines to [ "Fuck you're so big", "I'm going to suck you dry", "Do I look good with your cock between my lips?" ]>> <<set $InnocentLines to [ "Like that?", "Am I doing a good job?", "Sorry, this if my first time" ]>> <<set $SubLines to [ "I love worshiping this cock", "Do you like that, daddy", "Please let me swallow your cum" ]>> <<set $DomLines to [ "Look at me while I suck you off", "It's cute when you moan, boy", "Your going to cum when I say" ]>> <<set $NPCDomLines to [ "Keep sucking it you little whore", "You're such a slut", "Look at me while you swallow my cock, slut" ]>> <<set $NPCSubLines to [ "Fuck yes", "God's your good at this", "Keep going!" ]>> <<set $NPCDislikeSpeakLines to [ "Shut up bitch", "Less talking", "All I should hear is you choaking on my meat" ]>> <<set $NPCBoardLines to [ "Come on", "Get on with it", "Get on with it" ]>> <<set $Position to "Start">> <<set $NPCCum to 0>> <<set $NPCEnjoyment to 50>> <<if $NPC is "Shop Keep">> <<Lucy>>H-Hello Sir, I was wondering if...<</Lucy>><br><br> <<ShopKeep>>No discounts<</ShopKeep>><br><br> <<Lucy>>Oh, but Sir I really need this, is there anything I can do<</Lucy>><br><br> The shop keep looks away loosing interest in you<br><br> <<ShopKeep>>I dont care<</ShopKeep>><br><br> [[Push things further|BJLines2]]<br><br> [[Leave it|Scarldale]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Int = random(0, 1)>> <<if $NPC is "Shop Keep">> The shop keep pulls his cock out of your throat and covers your face in cum<br><br> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Finish/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Finish/2.webm" type="video/webm"> </video><</if>><br><br> <<if $NPCEnjoyment >= 90>> He falls back into a chair, out of breath. He watches you play with his cum, scooping it into your mouth<br><br> <<ShopKeep>>Fuck that was good<</ShopKeep>><br><br> <<ShopKeep>>Here, take these I don't sell them to just anyone as they are hard to come by<</ShopKeep>><br><br> He hands you two Normal Healing Potions <<set $HealingPotion to $HealingPotion + 2>> You thank him and [[leave|Scarldale]] <</if>> <<if ($NPCEnjoyment lt 90) and ($NPCEnjoyment >= 70)>> <<ShopKeep>>Not bad slut, you can have anything in the store for 30 gold<</ShopKeep>><br><br> <<set $Price to 30>> [[Return to the shop|ScarldaleShop]] <</if>> <<if ($NPCEnjoyment lt 70) and ($NPCEnjoyment >= 50)>> <<ShopKeep>>That was ok... You can have anything in the store today for 30 gold<</ShopKeep>><br><br> <<set $Price to 40>> [[Return to the shop|ScarldaleShop]] <</if>> <<if $NPCEnjoyment lt 50>> <<ShopKeep>>That was awful, get the fuck out<</ShopKeep>><br><br> <<Lucy>>But...<</Lucy>><br><br> <<ShopKeep>>Get out, or I'll call the guards and tell them you were stealing<</ShopKeep>><br><br> [[leave|Scarldale]] <</if>> <</if>> <</nobr>> </div>
<<nobr>> <<if $NPCCum is 100>><<set $Position to "Cum">><</if>> <<if $NPCCum lt 0>><<set $NPCCum to 0>><</if>> <<if $NPCEnjoyment gt 100>><<set $NPCEnjoyment to 100>><</if>> <<if $Position == "sucking">> <<if $Speed is "Slow">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Speed is "Fast">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckF/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckF/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckSF/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $Position == "throating">> <<if $Speed is "Slow">> $NPC: Thats it.. take your time <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Speed is "Fast">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $Position == "Stroke">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Stroke/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Stroke/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Stroke/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Balls">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Balls/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Balls/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Balls/3webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Tease">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Tease/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Tease/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Tease/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Strip">> <<if $Strip == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Strip/1.webm" type="video/webm"> </video> <<else>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Strip/2.webm" type="video/webm"> </video><br><br> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Strip/3.webm" type="video/webm"> </video> <</if>><</if>> <<if $Position == "Cum">> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/Finish/1.webm" type="video/webm"> </video> <</if>> <div class="text-box"> <<if $Position == "Start">> $NPC: Suck it, whore<br><br> <</if>> <<if $Position == "Speak">> <<if $Speak == "Slutty">><<Lucy>>$SlutLines[$Int]<</Lucy>><</if>> <<if $Speak == "Innocent">><<Lucy>>$InnocentLines[$Int]<</Lucy>><</if>> <<if $Speak == "Submissive">><<Lucy>>$SubLines[$Int]<</Lucy>><</if>> <<if $Speak == "Dominant">><<Lucy>>$DomLines[$Int]<</Lucy>><</if>> <br><br> <</if>> <<if $Position is "Strip">> <<if $StripLike is true>> <<if $Strip is 1>>$NPC: That's it, show me your breasts slut <<else>> $NPC: Fuck your ass is amazing <<set $NPCEnjoyment to $NPCEnjoyment + 15>> <</if>> <</if>> <<if $StripLike is false>> $NPC: I don't have time for this, get back to sucking my cock <<set $NPCEnjoyment to $NPCEnjoyment - 15>> <</if>> <</if>> <<if $Position is "Stroke">> <<if ($StokeLike is true) and ($Tease lt 3)>> $NPC: Thats it, stroke my cock<<set $NPCEnjoyment to $NPCEnjoyment + 10>> <<else>> $NPC: Come on, suck it<<set $NPCEnjoyment to $NPCEnjoyment - 10>> <</if>> <</if>> <<if $Position is "Tease">> <<if ($TeaseLike is true) and ($Tease lt 3)>> $NPC: Your such a fucking tease!<<set $NPCEnjoyment to $NPCEnjoyment + 10>> <<else>> $NPC: I'm getting board of this<<set $NPCEnjoyment to $NPCEnjoyment - 10>> <</if>> <</if>> <<if $Position is "Balls">> <<if ($BallsLike is true) and ($Tease lt 3)>> $NPC: Yes, lick my balls you filthy slut<<set $NPCEnjoyment to $NPCEnjoyment + 10>> <<else>> $NPC: That's enough<<set $NPCEnjoyment to $NPCEnjoyment - 10>> <</if>> <</if>> <<if $Position is "sucking">> <<if $SpeedLike is true>> <<if $Speed is "Slow">> $NPC: Stop teasing me and speed up bitch <<set $NPCEnjoyment to $NPCEnjoyment - 10>> <<else>> $NPC: Fuck yes suck it faster <<set $NPCEnjoyment to $NPCEnjoyment + 10>> <</if>> <</if>> <<if $SpeedLike is false>> <<if $Speed is "Slow">> $NPC: Thats it, take your time I've got all day <<set $NPCEnjoyment to $NPCEnjoyment + 10>> <<else>> $NPC: Slow down, I want this to last <<set $NPCEnjoyment to $NPCEnjoyment - 10>> <</if>> <</if>> <</if>> <<if $Position is "throating">> <<if $SpeedLike is true>> <<if $Speed is "Slow">> $NPC: Come on, I've not got all day <<set $NPCEnjoyment to $NPCEnjoyment - 10>> <<else>> $NPC: That's it, you'r throat is a great cock sleeve <<set $NPCEnjoyment to $NPCEnjoyment + 10>> <</if>> <</if>> <<if $SpeedLike is false>> <<if $Speed is "Slow">> $NPC: Thats it, take your time I've got all day <<set $NPCEnjoyment to $NPCEnjoyment + 10>> <<else>> $NPC: Slow down, I want this to last <<set $NPCEnjoyment to $NPCEnjoyment - 10>> <</if>> <</if>> <</if>> </div> <div class="text-box"> His orgasm: <progress @value=" $NPCCum" max="100"></progress><br><br> His Enjoyment: <progress @value=" $NPCEnjoyment" max="100"></progress><br><br> <<if $NPCCum <= 75>> <hr> Speach:<br><br> <<link "Say somthing:">><<set $Position to "Speak">> <<set $Int = random(0, 2)>> <<run Engine.show()>> <</link>> <<listbox "$Speak" autoselect>>` `<<option "Slutty">>` `<<option "Innocent">>` `<<option "Submissive">> `<<option "Dominant">> <</listbox>><br><br> <hr> Tease:<br><br> <<if $Strip is 2>>You are naked<br> <<else>> <<link "Strip">> <<set $Strip to $Strip + 1>> <<set $Position to "Strip">> <<run Engine.show()>> <</link>><br> <</if>> <<link "Stroke">> <<set $NPCCum to $NPCCum + 15>> <<set $Position to "Stroke">> <<set $Int = random(0, 2)>> <<set $Tease to $Tease + 1>> <<run Engine.show()>> <</link>><br> <<link "Lick">> <<set $NPCCum to $NPCCum + 10>> <<set $Position to "Tease">> <<set $Tease to $Tease + 1>> <<set $Int = random(0, 2)>> <<run Engine.show()>> <</link>><br> <<link "Lick Balls">> <<set $Position to "Balls">> <<set $Tease to $Tease + 1>> <<set $Int = random(0, 2)>> <<run Engine.show()>> <</link>><br><br> <hr> BlowJob:<br><br> [[Suck|QTEBJGame][$Position to "sucking"]]<br> [[Deep throat|QTETHroatGame][$Position to "throating"]]<br> Speed: <<listbox "$Speed" autoselect>> `<<option "Slow">>` `<<option "Fast">> <</listbox>><br><br> <<else>> <<if $NPC is "Shop Keep">> The $NPC is getting closer and starts fucking your face!<br> <<set $Speed to "Fast">> <<set $Position to "throating">> [[Continue|QTETHroatGame]] <<elseif $NPC is "Tavern Patreon">> The $NPC pulls away from your face<br><br> $NPC: Turn around whore<br><br> You turn around and bend over showing your ass<br><br> <<link "Continue">><<run Engine.play('TavernNPCFuck')>><</link>> <</if>> <</if>> </div> <</nobr>>
<div class="text-box"> Text </div> <<startblizzard>>
<div class="text-box"> <<nobr>> <<if $PlayerHealth gt 70>> <<set $charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + ".png">> <</if>> <<if ($PlayerHealth <= 70) and ($PlayerHealth >= 50)>> <<set $charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + "/1.png">> <</if>> <<if $PlayerHealth lt 50>> <<set $charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + "/2.png">> <</if>> <div class="Random-image"> <<set _imagePath to $charImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $BossFight is false>> [[Attack|AttackSuccubus]] <<set $BossFight to true>> <<set $Int to 1>> <<else>> Succubus Health: <progress @value=" $EnemyHealth" max="100"></progress><br> Your corruption: <progress @value=" $PlayerHealth" max="100"></progress><br> [[Resist and attack|AttackSuccubus]]<br> <<if $PlayerHealth == 90>>[[Touch her|GiveIn]]<br><</if>> <<if ($PlayerHealth <= 70) and ($PlayerHealth >= 60)>>[[Finger her|GiveIn]]<br><</if>> <<if ($PlayerHealth <= 50) and ($PlayerHealth >= 30)>>[[Lick her|LickSuccubus]]<br><</if>> <<if $PlayerHealth <= 20>>[[Fuck her|FuckSuccubus]]<br><</if>> <</if>> <</nobr>> </div>
<<nobr>> <<include "BowGameLines">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<set _line = either(_girlGoesDownLines)>> <<say 'Huntress' _img>>_line<</say>> <<include "Interactable images code">> <<set _image1 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/12.png">> <<set _image2 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/13.png">> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _hotspotData to [ { x: 183, y: 64, tooltip: "Hold her head" } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle dynamic-image-hidden"></div> </div> <</for>> </div> </div> <<if $DynamicImages isnot true>> <div style="text-align: center"> <i>Images with red border have hidden interactions to find<br> <<link "Don't show thing again">><<set $DynamicImages to true>><</link>></i> </div> <</if>><br><br> <<set _act = either(_bjSceneLines)>> _act <<set _GifPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.gif">> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<set _act = either(_bjFinishLines)>> _act <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/15.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _line = either(_bjAfterLines)>> <<say 'Huntress' _img>>_line<</say>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<set $ForestCampGameComplete to true>> </div> <</nobr>>
<<nobr>> <<set _critHitLine to [ "Tch... always aiming to show me up, aren’t you?", "Hmph. Another perfect shot? You truly are insufferable", "You’ll wear that smug grin till your jaw falls off, won't you?", "A fine shot, yes, but don’t expect me to praise you like some wide-eyed squire", "You must have made a pact with a bloody elf to shoot like that", "Keep shooting like that, and I may have to start actually trying", "Impressive. Annoying as hell, but impressive" ]>> <<set _midHitLine to [ "Not bad... for someone still learning which end of the bow to hold", "A fair shot. I'd clap, but I’d rather not encourage mediocrity", "Well, it didn’t disgrace the gods... but it won’t earn their favor either", "A decent mark. Don’t let it go to your head, whelp", "That’ll pass... barely. Try hitting the center next time", "I suppose not every shot of yours has to be shameful", "Not quite the bullseye, but at least I don’t have to look away in pity", "Acceptable. Which, from me, is high praise don’t squander it" ]>> <<set _missHitLine to [ "Ha! Did you aim with your eyes closed or are you just cursed by the gods?", "That shot was so far off, I’m surprised it even hit the damn target", "You call that archery? I've seen drunk peasants do better at village fairs", "Did your bowstring slip or is that just your usual level of disgrace?", "If I’d known you’d miss so wide, I’d have brought a bigger target", "Pathetic. Even the trees behind the target are laughing at you", "You’d have better luck throwing the damn thing with your hands", "A fine effort... if your goal was to decorate the edge of the target like a fool" ]>> <<set _herCritHitLine to [ "Bullseye. Again. I hope you brought extra coin", "Right through the center. Try not to cry yet", "You’re watching a master at work, darling. Take notes while you still have gold to lose", "Sweet shot. Shame you’ll be leaving here broke and humiliated", "Dead center. I wonder, will you still look so smug when I empty your purse?", "Flawless. Honestly, it’s getting boring beating you like this", "That’s how it’s done. Keep struggling, it’s entertaining", "Careful now, watching me might give you delusions of competence" ]>> <<set _herMidHitLine to [ "Not my best, but still better than whatever you just shot.", "Middle ring. Good enough to keep your coin sweating", "Could’ve been better. Still better than your last attempt, though", "Tch. Not quite center. No matter still a better mark than you’ll manage", "A fair strike. You’d kill to hit like this, wouldn't you?", "It’s not a bullseye, but it'll still bring me closer to your gold", "Acceptable. Which is more than I can say for your chances." ]>> <<set _herMissHitLine to [ "Tch! A gust, that’s all. Don’t start gloating", "Damn it. Even the best have off moments. Enjoy it while you can", "Ugh. That arrow had a mind of its own. I’ll fix that on the next round", "I let that one go wide just to give you hope", "Even legends stumble. Doesn’t mean the gold won’t end up in my pouch", "Keep your smug look for now. I’ll wipe it off with the next shot, and take your coin while I’m at it" ]>> <<set _herCritLewdHitLine to [ "Dead center. Hope you’ve got a talented tongue", "Bullseye. Get ready to kneel and earn your loss like a good little thing", "I can already feel your mouth where it belongs", "Still think you’re walking away with a fuck? No, darling you’re going down", "A flawless shot, and soon, a very satisfied cunt.", "Mmm. The tighter the grouping, the wetter I get thinking about you on your knees", "Hope you like the taste of defeat—because you’ll be swallowing it" ]>> <<set _herMidLewdHitLine to [ "Not perfect, but still enough to keep your cock in your pants", "Middle ring. You’re not winning yet, so don’t start drooling", "A fair hit. Close enough to remind you whose thighs you’ll be worshipping", "Not quite a bullseye, but enough to keep your fantasy in check", "Hmm you’re still closer to licking my cunt than any victory" ]>> <<set _herMissLewdHitLine to [ "Tch! That was... nothing. Don’t start grinning", "Missed? Hmph. Don’t get excited I haven’t lost yet", "Damn it. Keep it in your pants... it’s not over", "A single miss doesn’t mean you’ll be balls-deep in me, got it?", "So I missed are you getting hard already?", "Shit. That shot was poor—don’t make me regret this bet", "Maybe I let it slide... give you some hope before I ruin you and make you beg to taste me." ]>> <<set _removeCloakLine to [ "Off comes the cloak. Try not to drool, alright?", "There. The cloak’s gone. Let’s see if you can earn the rest.", "One layer down. You’re going to enjoy this far too much, aren’t you?", "Guess I’ll have to take you a bit more seriously.", "You win this round. Don’t let it go to your head.", "Just the cloak. Don’t act like you’ve already won everything.", "Looks like you’ve earned a glimpse. Let’s see if you can keep it up." ]>> <<set _removeCorsetLine to [ "Alright, you’re doing better than I thought...", "Well, looks like you’ve earned the next piece. Lucky you", "Fine... I said I’d play fair. Off it goes", "Try not to stare too long. You’ve still got arrows to shoot.", "There, happy now? Don’t think I’m going to make this easy", "A bit exposed, aren’t I? You better not start getting cocky", "Corset’s off. Let’s see if you’ve got the skill to take the rest" ]>> <<set _playerLoseGoldLine to [ "Ah, another round, another pouch of gold. You’re making me rich and entertained", "Thank you kindly. You’re a terrible gambler, but a very generous one", "Hmm, that jingle of coin never gets old. Keep missing, darling", "You’re not shooting badly... but clearly not as well as me. Pay up", "Gold, please. I’d feel bad for you, but I’m too busy enjoying this", "Another loss? Poor thing. Maybe archery isn’t your strong suit...", "You’re making losing look very graceful. I appreciate the tribute" ]>> <<set _girlGoesDownLines to [ "Tch... a deal’s a deal. Don’t get too full of yourself unless it’s in my mouth", "You really couldn’t just miss one more could you? Fine. Stand still", "I hate losing. But this? This, I don’t mind so much", "Strip, then shut up. If I’m doing this, I’m doing it right", "Mmm... smug little bastard. Let’s see if you shoot as well with this as you do with arrows", "Hmph. Bet you’re loving this. Just wait ‘til next match—I’ll have you begging.", "Hard already? Gods, you're easy. Let’s make that cock twitch for me." ]>> <<set _bjSceneLines to [ "She drops to her knees with a slow, practiced grace, her cloak pooling around her. One hand slides up your thigh while the other wraps around your shaft, stroking once before guiding it to her lips", "Her mouth parts as she leans in, warm breath ghosting over your cock before her tongue flicks out, just a taste, just enough to make you twitch. Then her lips close around the head and slide down with aching slowness", "Her pace is deliberate, every bob of her head smooth and unhurried. Saliva glistens on your shaft as she works her mouth deeper, her cheeks hollowing slightly with each downward motion", "Her movements speed up, spit slicking your cock as her chin starts to glisten. Each stroke is more eager now, and you can feel her moaning faintly around you—just vibrations, subtle and constant", "She tilts her head slightly to take you at a new angle, her tongue swirling along the underside of your shaft with each pass. Her eyes stay half-lidded, her breath quickening as she loses herself in the motion", "Her pace grows hungrier, more forceful. Wet sounds fill the space between you, each slurp a steady reminder of how completely you're in her mouth. Her grip tightens just a bit controlling, not desperate", "Her lips glide up and down your shaft with relentless pressure, and your hips twitch against her face. She doesn’t pull back, just sinks deeper, swallowing around you with rhythmic, greedy pulls", "Her jaw works with hungry precision. Drool runs down her chin, dripping onto her clothes as she keeps sucking, throat bobbing around your cock like she’s determined to make you finish just from the heat of her mouth alone" ]>> <<set _bjFinishLines to [ "Your hips jerk as the pressure hits its peak. Her mouth seals tighter, lips wrapped snugly around your cock as you start to pulse, releasing in thick, hot spurts. She doesn’t move she just holds you in place and swallows every drop", "You groan as the orgasm rips through you, cock twitching between her lips. She keeps sucking lightly, drawing out every last spurt while her tongue flicks along your shaft. Her throat works rhythmically, swallowing everything you give her", "You climax hard, balls tightening as your cock unloads deep in her mouth. Her lips stay locked around you, not spilling a single drop as she milks you through every pulse with slow, skillful sucks", "The heat surges through you and you come with a sharp grunt, hips bucking against her face. She takes it all, throat flexing as she swallows, a thin trail of saliva and cum slipping from the corner of her mouth", "You release with a low moan, cock throbbing in her mouth as your cum spills down her throat. She barely reacts just holds steady, letting your orgasm pulse out while her tongue lazily laps at the underside of your shaft" ]>> <<set _bjAfterLines to [ "Swallowed every drop. Maybe next time I’ll let you make a mess... if you earn it.", "You taste like victory. Shame it was yours this time but I can play again whenever you like", "All done? For now, at least. I wouldn’t mind another shot at that prize", "That was quite the finish... maybe I’ll aim for something deeper next time", "Messy finish for someone with such steady aim", "Tasted like a win. Next time, I’ll take it all and leave you begging for a rematch.", "If that’s your reward, I might just start losing on purpose." ]>> <<set _treeStartLines to [ "You press her against the tree, one hand on her lower back as she arches and spreads her legs slightly", "Her bare ass pushes back against you as she braces herself. You guide your cock between her thighs, teasing the entrance before sliding in", "She grips the bark in front of her, back arched perfectly as you line up and push into her", "You take her by the hips, steadying her against the tree as you thrust deep in one hard motion. Her breath catches, but her hips roll back into yours eagerly", "Her skin’s warm under your fingers as you grip her waist, sliding your cock into her with one long thrust. She moans low, body trembling just slightly as press deeper" ]>> <<set _treeFinishLines to [ "You slam into her one final time and bury yourself deep as your cock throbs and releases inside her. She gasps, shuddering, her body clenching tight as you fill her up.", "Your grip tightens and your pace breaks as you explode inside her. Cum floods her, dripping down her thighs as your hips slow, grinding through the final pulses.", "You bury yourself in her and groan as your orgasm crashes through you. She pushes back into you, panting, as your cum spills deep inside her slick, used pussy.", "The heat builds to a peak and you give in, emptying inside her in thick spurts. She lets out a soft, breathy sound, hips twitching as you fill her completely.", "Your cock throbs inside her as you release, thick warmth pouring into her with every twitch. She stays still, letting you fuck every last drop into her before you pull back." ]>> <<set _treeAfterLines to [ "Well... you certainly know how to claim a win.", "I might need a rematch after I can stand again.", "You filled me better than I expected. Don’t get too cocky... I'll win next time" ]>> <</nobr>>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<if $NPCArcheryScore == $PlayerArcheryScore>> <<say 'Huntress' _img>>A draw again! Boring... Well, I supose we will have to have a rematch some day. Come back soon<</say>> <</button "Leave">> <<goto "ForestExplore">> <</button>> <<elseif $NPCArcheryScore gt $PlayerArcheryScore>> <<say 'Huntress' _img>>Aha, I win! Now, be a good boy and kneel for me<</say>> <<You>>Right here?<</You>> <<say 'Huntress' _img>>Yes, now be a good looser and kneel<</say>> You drop to your knees and take position under her, she lifts her skirt and takes hold of the back of your head, pulling you in while she grinds on your face <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/3.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Huntress' _img>>Ah, fuck winning never felt so good... <</say>> <<say 'Huntress' _img>>Fuck thats good...<</say>> <<say 'Huntress' _img>>Keep going looser, I'm goi.... Fuuck!<</say>> <<say 'Huntress' _img>>You're better with your tounge than a bow. Infact, I'm not done with you. Come with me<</say>> You allow her to guide you to her tent and you watch her undress. You think about how you could kill her for this level of disrespect... But, she is fun and may be useful one day... You can get revenge by winning next time<br><br> <<say 'Huntress' _img>>Eat my pussy looser<</say>> <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/4.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Huntress' _img>>Fuck yes! do you know how boring it is, sitting around all day with nothing to do but read an old book. This is so much more fun<</say>> You keep this up for some time. She grinds on your face over and over until she eventually stops<br> <<say 'Huntress' _img>>Ok pet, I need to relax<</say>> The huntress slides off you and lays back <<say 'Huntress' _img>>Keep going, you can go when the sun sets<</say>> <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/5.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> You go back to work, with a numb tounge amazed she isn't done with you yet. After a bit more time she eventualy pushes you away <<say 'Huntress' _img>>Fuck, you did great. Come back any time for a rematch, Im here most afternoons<</say>> <<button "Leave">> <<set $Time to 9>> <<goto "ForestExplore">> <</button>> <<else>> <<say 'Huntress' _img>>Ok ok... You beat me, fuck... Well, you earned a reward. What can I do for you<</say>> You ask her to:<br> <<button "Suck your cock">> <<goto "BowGameBJ">> <</button>> <br> <<button "Bend over">> <<goto "BowGameSex">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<if $NPCArcheryScore == $PlayerArcheryScore>> <<set $NPCArcheryScore to 0>> <<set $PlayerArcheryScore to 0>> <<say 'Huntress' _img>>A draw... Well that isn't fun... How about a rematch<</say>> <<You>>I am listening<</You>> <<say 'Huntress' _img>>No more gold, it's dull... How about some real fun. If you win, I'll let you do anything you like to me, if I win, I'll be using that tounge of yours until Im board<</say>> She lifts her leg onto rock, exposing her bare pussy <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/2.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Rematch">> <<set $OldPosition to "Draw">> <<goto "BowGame">> <</button>><br> <<button "Leave for now">> <<goto "ForestExplore">> <</button>> <<elseif $NPCArcheryScore gt $PlayerArcheryScore>> <<set $NPCArcheryScore to 0>> <<set $PlayerArcheryScore to 0>> <<say 'Huntress' _img>>Well, Ill be taking that gold now<</say>> <<You>>Here<</You>><br><br> <<if $OldPosition is "bet">> You hand her 50 gold<br><br> <<set $Gold to $Gold - 50>> <<else>> You hand her 100 gold<br><br> <<set $Gold to $Gold - 100>> <</if>> <<say 'Huntress' _img>>Awww, don't look so sad... I tell you what, how about one more match but Instead of playing for coin, we play for something else<</say>> <<You>>What do you have in mind?<</You>> <<say 'Huntress' _img>>If you win, I'll let you do whatever you like to me, but if I win again, you'll be eating this till I'm board with you<</say>> She lifts her leg onto rock, exposing her bare pussy <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/2.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Huntress' _img>>And I keep the coin...<</say>> <<button "Rematch">> <<set $OldPosition to "Lost">> <<goto "BowGame">> <</button>><br> <<button "Leave for now">> <<goto "ForestExplore">> <</button>> <<else>> <<set $NPCArcheryScore to 0>> <<set $PlayerArcheryScore to 0>> <<say 'Huntress' _img>>I suppose you earned this<</say>><br><br> <<if $OldPosition is "bet">> She hands you 50 gold<br><br> <<set $Gold to $Gold + 50>> <<else>> She hands you 100 gold<br><br> <<set $Gold to $Gold + 100>> <</if>> <<You>>It was a pleasure<</You>><br><br> <<say 'Huntress' _img>>Humm, speaking of rematch... How about a rematch. If You win, I'll let you do whatever you want to me. If I win, you'll be eating my cunt for the rest of the day understood?<</say>> She lifts her leg onto rock, exposing her bare pussy <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/2.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Rematch">> <<set $OldPosition to "Won">> <<goto "BowGame">> <</button>><br> <<button "Leave for now">> <<goto "ForestExplore">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<include "BowGameLines">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<set _act = either(_treeStartLines)>> _act <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/16.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<include "Interactable images code">> <<set _image1 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/17.png">> <<set _image2 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/18.png">> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _hotspotData to [ { x: 320, y: 376, tooltip: "Spank her" } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle dynamic-image-hidden"></div> </div> <</for>> </div> </div> <<if $DynamicImages isnot true>> <div style="text-align: center"> <i>Images with red border have hidden interactions to find<br> <<link "Don't show thing again">><<set $DynamicImages to true>><</link>></i><br><br> </div> <</if>><br><br> <<set _act = either(_treeFinishLines)>> _act <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/19.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _line = either(_treeAfterLines)>> <<say 'Huntress' _img>>_line<</say>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<set $ForestCampGameComplete to true>> </div> <</nobr>>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<if $Position is "Behind">> You grip her hips firmly, guiding your cock between her slick folds before thrusting deep in one slow, claiming stroke, filling her completely as she gasps and arches against the tree. <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/25.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Huntress' _img>>Gods… you’re bigger than I imagined…<</say>> <video autoplay loop> <source src="Images/Forrest/LucyCombat/1.webm" type="video/webm"> </video><br><br> You pull back almost entirely before slamming back into her, hips snapping forward with a wet smack as your cock drives deep, setting a steady, relentless rhythm <<say 'Huntress' _img>>Ah—fuck… yes… just like that…<</say>> <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/26.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<include "Interactable images code">> <<set _image1 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/23.png">> <<set _image2 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/27.png">> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _hotspotData to [ { x: 320, y: 376, tooltip: "Spank her" } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle dynamic-image-hidden"></div> </div> <</for>> </div> </div> <<if $DynamicImages isnot true>> <div style="text-align: center"> <i>Images with red border have hidden interactions to find<br> <<link "Don't show thing again">><<set $DynamicImages to true>><</link>></i><br><br> </div> <</if>><br><br> Your thrusts grow frantic, deep and desperate, until you bury yourself to the hilt, cock throbbing as you release inside her, filling her with thick warmth as she shudders and clenches around you <video autoplay loop> <source src="Images/Forrest/LucyCombat/2.webm" type="video/webm"> </video><br><br> <<say 'Huntress' _img>>Nice job... You should come back soon and bring plenty of coin... <</say>> <<button "Leave her">> <<goto "ForestExplore">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<set _imgPath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/24.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> </div> <div style="text-align: center"> <<button "Take her from behind">> <<set $Position to "Behind">> <<goto "BowGameTent2">> <</button>> </div> <</nobr>>
<div class="text-box"> <<set $Int to $Int + 1>> Turn: $Int<br><br> You nock your arrow and take aim at the target <div id="target" style="width: 200px; height: 200px; border: 2px solid black; position: relative; margin: 20px auto; background: radial-gradient(circle, red 10%, black 10%, black 30%, red 30%, red 60%, black 60%);"> <div id="crosshair" style="width: 20px; height: 20px; position: absolute; pointer-events: none;"> <div style="position: absolute; width: 100%; height: 2px; background-color: white; top: 50%; left: 0;"></div> <div style="position: absolute; width: 2px; height: 100%; background-color: white; left: 50%; top: 0;"></div> <div style="position: absolute; width: 6px; height: 6px; background-color: red; border-radius: 50%; top: 50%; left: 50%; transform: translate(-50%, -50%);"></div> </div> </div> <button id="shootButton">Shoot!</button> <div id="result"></div> <<script>> $(document).ready(function() { const target = $('#target'); const crosshair = $('#crosshair'); const shootButton = $('#shootButton'); const result = $('#result'); let isMoving = true; let time = 0; const speed = 0.035; // Adjusted to a more manageable speed const width = target.width() - crosshair.width(); const height = target.height() - crosshair.height(); function moveCrosshair() { if (isMoving) { time += speed; const x = (Math.sin(time) * 0.5 + Math.sin(time * 1.3) * 0.3 + 0.5) * width; const y = (Math.sin(time * 1.7) * 0.5 + Math.sin(time * 0.9) * 0.3 + 0.5) * height; crosshair.css({left: x + 'px', top: y + 'px'}); requestAnimationFrame(moveCrosshair); } } moveCrosshair(); shootButton.on('click', function() { isMoving = false; shootButton.prop('disabled', true); const centerX = target.width() / 2; const centerY = target.height() / 2; const crosshairX = parseFloat(crosshair.css('left')) + (crosshair.width() / 2); const crosshairY = parseFloat(crosshair.css('top')) + (crosshair.height() / 2); const distance = Math.sqrt(Math.pow(centerX - crosshairX, 2) + Math.pow(centerY - crosshairY, 2)); let outcome; if (distance < 10) { outcome = "Centre Hit"; } else if (distance < 30) { outcome = "Middle Hit"; } else { outcome = "Miss shot"; } result.html("Result: " + outcome); setTimeout(function() { Engine.play(outcome); }, 2000); }); }); <</script>> </div>
<<nobr>> <<include "BowGameLines">> <<set _firstImg to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/" + $Turn + ".png">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> <<if $NPCArcheryScore == $PlayerArcheryScore>> <<say 'Huntress' _img>>A draw... I did say we would count that as a win for you...<</say>> <<set $Turn to $Turn + 1>> <<set _secondImg to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/" + $Turn + ".png">> <div class="image-container"> <img id="_img2" @src="_secondImg"> <img id="_img1" @src="_firstImg"> </div> <span id="fadeButton"> <<button "Strip Her">> <<run $('#_img1').css('opacity', '0'); $('#_img2').css('opacity', '1'); $('#fadeButton').hide(); $('#continueButton').show(); >> <</button>> </span> <span id="continueButton" style="display: none"> <<if $Turn is 8>> <<set _line = either(_removeCloakLine)>> <<say 'Huntress' _img>>_line<</say>> <</if>> <<if $Turn is 9>> <<set _line = either(_removeCorsetLine)>> <<say 'Huntress' _img>>_line<</say>> <</if>> <<if $Turn is 10>> <<say 'Huntress' _img>>Look at that... You won and now I'm stood here, naked. Well, I had fun and guessing from the way you're looking at me, so did you. Why don't you follow me, a little deeper into the forest<</say>> <<button "Join her">> <<goto "BowGameTent">> <</button>><br> <<button "Say not today">> <<goto "ForestExplore">> <</button>> <<else>> <<button "Continue" "BowGame">> <</button>> <</if>> </span> <<elseif $NPCArcheryScore gt $PlayerArcheryScore>> <<set _line = either(_playerLoseGoldLine)>> <<say 'Huntress' _img>>_line<</say>> <<if $Gold gt 30>> <<set $Gold to $Gold - 30>> You hand her 30 gold<br> <<button "Continue">> <<goto "BowGame">> <</button>><br> <<button "Finish the game">> <<goto "ForestExplore">> <</button>> <<else>> <<You>>Im... out of gold... You've had it all<</You>> <</if>> <<else>> <<set $Turn to $Turn + 1>> <<set _secondImg to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/" + $Turn + ".png">> <<say 'Huntress' _img>>Humm, well done I suppose<</say>> <div class="image-container"> <img id="_img2" @src="_secondImg"> <img id="_img1" @src="_firstImg"> </div> <span id="Strip Her"> <<button "Fade Images">> <<run $('#_img1').css('opacity', '0'); $('#_img2').css('opacity', '1'); $('#fadeButton').hide(); $('#continueButton').show(); >> <</button>> </span> <span id="continueButton" style="display: none"> <<if $Turn is 8>> <<set _line = either(_removeCloakLine)>> <<say 'Huntress' _img>>_line<</say>> <</if>> <<if $Turn is 9>> <<set _line = either(_removeCorsetLine)>> <<say 'Huntress' _img>>_line<</say>> <</if>> <<if $Turn is 10>> <<say 'Huntress' _img>>Look at that... You won and now I'm stood here, naked. Well, I had fun and guessing from the way you're looking at me, so did you. Why don't you follow me, theres a little wooden shack near here were we wont be disturbed<</say>> <<button "Join her">> <<goto "BowGameTent">> <</button>><br> <<button "Say not today">> <<goto "ForestExplore">> <</button>> <<else>> <<button "Continue" "BowGame">> <</button>> <</if>> </span> <</if>> <<set $NPCArcheryScore to 0>> <<set $PlayerArcheryScore to 0>> </div> <style> .image-container { position: relative; width: 100%; height: 80vh; display: flex; justify-content: center; align-items: center; margin-bottom: 10px; } #_img1, #_img2 { position: absolute; top: 0; left: 0; right: 0; bottom: 0; margin: auto; max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; transition: opacity 1s ease-in-out; } #_img2 { opacity: 0; } #_img1 { opacity: 1; } </style> <</nobr>>
<<nobr>> <div class="text-box"> <<set $ForestCamp1Quest to true>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<You>>Let's play this other game<</You>> <<say 'Huntress' _img>>Great, its simple... You take a shot, then I take a shot. If your hit is better than mine, Ill take something off, but if my hit is better, you give me 30 gold. The game ends whenever you can't afford to keep playing, or if you're lucky when I run out of clothes to take off... And, if you win then you can have some fun with me, sounds good?<</say>> <<say 'Huntress' _img>>And, because im so kind... You can take the win if we draw<</say>> <<You>>Seems simple enough<</You>> <<button "Begin the game">> <<set $Position to "Strip">> <<goto "BowGame">> <</button>> <<set $Turn to 7>> <<set $Int to 0>> <<set $PlayerArcheryScore to 0>> <<set $NPCArcheryScore to 0>> </div> <</nobr>>
<div class="text-box"> You nock your arrow and take aim at the $CurrentEnemy <div id="target" style="width: 200px; height: 200px; border: 2px solid black; position: relative; margin: 20px auto; background: radial-gradient(circle, red 10%, black 10%, black 30%, red 30%, red 60%, black 60%);"> <div id="crosshair" style="width: 20px; height: 20px; position: absolute; pointer-events: none;"> <div style="position: absolute; width: 100%; height: 2px; background-color: white; top: 50%; left: 0;"></div> <div style="position: absolute; width: 2px; height: 100%; background-color: white; left: 50%; top: 0;"></div> <div style="position: absolute; width: 6px; height: 6px; background-color: red; border-radius: 50%; top: 50%; left: 50%; transform: translate(-50%, -50%);"></div> </div> </div> <button id="shootButton">Shoot!</button> <div id="result"></div> <<script>> $(document).ready(function() { const target = $('#target'); const crosshair = $('#crosshair'); const shootButton = $('#shootButton'); const result = $('#result'); let isMoving = true; let time = 0; const speed = 0.05; // Increased speed const width = target.width() - crosshair.width(); const height = target.height() - crosshair.height(); function moveCrosshair() { if (isMoving) { time += speed; // More complex swaying motion with multiple sine waves const x = (Math.sin(time) * 0.5 + Math.sin(time * 1.3) * 0.3 + 0.5) * width; const y = (Math.sin(time * 1.7) * 0.5 + Math.sin(time * 0.9) * 0.3 + 0.5) * height; crosshair.css({left: x + 'px', top: y + 'px'}); requestAnimationFrame(moveCrosshair); } } moveCrosshair(); shootButton.on('click', function() { isMoving = false; shootButton.prop('disabled', true); const centerX = target.width() / 2; const centerY = target.height() / 2; const crosshairX = parseFloat(crosshair.css('left')) + (crosshair.width() / 2); const crosshairY = parseFloat(crosshair.css('top')) + (crosshair.height() / 2); const distance = Math.sqrt(Math.pow(centerX - crosshairX, 2) + Math.pow(centerY - crosshairY, 2)); let outcome; if (distance < 10) { outcome = "Critical Hit"; } else if (distance < 30) { outcome = "Wounding Hit"; } else { outcome = "Miss"; } result.html("Result: " + outcome); setTimeout(function() { Engine.play(outcome); }, 2000); }); }); <</script>> </div>
<<nobr>> <<set _Line to random(0, 2)>> <<set _Vid to random(1, 3)>> <<set _Img to random(1, 3)>> <<set $ImagePath to "Images/Town/Brothel/" + $NPC + "/Sex/" + $Position + "/" + _Img + ".png">> <<set $VidPath to "Images/Town/Brothel/" + $NPC + "/Sex/" + $Position + "/" + _Vid>> <<if $Position is "Lick">> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "Miss">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Behind">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Cg">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Bj">> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Hj">> <<set $PlayerCum to $PlayerCum + 5>> <</if>> <<if $Position is "Fcum">> <<set $VidPath to "Images/Town/Brothel/" + $NPC + "/Sex/" + $Position + "/1">> <</if>> <div class="text-box"> <<if $Position isnot "Fcum">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<else>> <<set $Position to $OldPosition>> <</if>> <<set _GifPath to $VidPath + ".gif">> <<set _WebpPath to $VidPath + ".webp">> <div class="centered-image"> <img @src="_WebpPath" onerror="this.style.display='none'"> </div> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if $NPCCum >= 100>> <<set $OldPosition to $Position>> <<set $Position to "Fcum">> <<link "She cums">><<set $NPCCum to 0>><<run Engine.show()>><</link>> <<elseif $PlayerCum >= 100>> <<if $PlayerCum lt 200>> You feel yourself getting close, you choose to cum: <br><br> On her <<link "face">><<set $Position to "Face">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "mouth">><<set $Position to "Mouth">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "Pussy">><<set $Position to "Inside">><<set $PlayerCum to 200>><<run Engine.show()>><</link>> <<else>> Satified, you [[leave|Town]] <</if>> <<else>> <<link "Keep going">><<run Engine.play('BrothelFuck2')>><</link>><br> <<link "Change position">><<run Engine.play('BrothelFuck')>><</link>> <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <<set _Img to random(1, 2)>> <div class="text-box"> <<if $Position is "null">> You enter the room with the girl and take a seat, she slowly undresses for you, before relaxing on the bed ready for you<br><br> <span style="color: #FF1493;">Woman: How can I help you today?</span> <br><br> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <hr> Pleasure her<br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('BrothelFuck2')>><</link>> <hr> Fuck her<br> <<link "Get on top">><<set $Position to "Miss">><<run Engine.play('BrothelFuck2')>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.play('BrothelFuck2')>><</link>><br> <<link "Let her ride you">><<set $Position to "Cg">><<run Engine.play('BrothelFuck2')>><</link>> <hr> Pleasure Yourself<br> <<link "Have her stroke your cock">><<set $Position to "Hj">><<run Engine.play('BrothelFuck2')>><</link>><br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('BrothelFuck2')>><</link>> <hr> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Captured Settlements</h1> <h2>Here is a list of locations your scouts have discovered in the local area</h2> <hr> <<if !$CapturedLocations || $CapturedLocations.length === 0>> <p>You have not captured any settlements yet. Send out scouts to find new location then send out raiding partys to capture them!</p> <<else>> <div id="settlements-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CapturedLocations.length; _i++>> <<capture _settlement _currentIndex>> <<set _currentIndex to _i>> <<set _settlement to $CapturedLocations[_i]>> <<set _totalCapacity to 0>> <<if _settlement.populatedBuildings>> <<for _entry range Object.entries(_settlement.populatedBuildings)>> <<set _buildingId to _entry[0]>> <<set _building to _entry[1]>> <<set _baseType to _buildingId.replace(/\s*\d+$/, '')>> <<if _baseType !== "Guard House">> <<set _maxOccupants = { "House": 3, "Guard House": 2, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<set _totalCapacity += _maxOccupants>> <</if>> <</for>> <</if>> <<set _getAllVillagers = function(s) { var list = []; var seen = {}; function add(v){ if(!v) return; /* Exclude garrison members (NPCID starts with "garrison_") */ var npcId = (v.NPCID || "").toString(); if(npcId.indexOf("garrison_") === 0) return; var key = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); if(!seen[key]){ seen[key]=true; list.push(v); } } /* common legacy shape */ if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i=0;i<residents.length;i++) add(residents[i]); } } } /* other possible container names */ if(Array.isArray(s.capturedVillagers)) for(var i=0;i<s.capturedVillagers.length;i++) add(s.capturedVillagers[i]); if(Array.isArray(s.villagers)) for(var i=0;i<s.villagers.length;i++) add(s.villagers[i]); if(Array.isArray(s.inhabitants)) for(var i=0;i<s.inhabitants.length;i++) add(s.inhabitants[i]); if(Array.isArray(s.residents)) for(var i=0;i<s.residents.length;i++) add(s.residents[i]); /* also scan building objects for residents arrays (newer shape) */ if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; if(bobj && Array.isArray(bobj.residents)){ for(var j=0;j<bobj.residents.length;j++) add(bobj.residents[j]); } /* sometimes occupants stored in building.occupants */ if(bobj && Array.isArray(bobj.occupants)){ for(var j=0;j<bobj.occupants.length;j++) add(bobj.occupants[j]); } /* sometimes stored in building.staff */ if(bobj && Array.isArray(bobj.staff)){ for(var j=0;j<bobj.staff.length;j++) add(bobj.staff[j]); } }catch(e){} } } return list; }>> <<set _villagerCount = _getAllVillagers(_settlement).length>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_settlement.imagePath" alt="<<_settlement.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _settlement.name>></h3> <p>Type: <<print _settlement.type>></p> <div class="forces-info"> <h4>Your Forces:</h4> <p>Garrison: <<print _settlement.garrison.length>> Raiders</p> <p>Population: <<print _villagerCount>>/<<print _totalCapacity>> Villagers</p> </div> <<button "Overview">> <<run console.log("Selected index:", _currentIndex)>> <<set $currentSettlementId to _currentIndex>> <<goto "SettlementOverview">> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <div style="text-align: center"> <<button "Return">> <<goto "Map Room">> <</button>> </div> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> You knock out the $CurrentEnemy and drag them back to your [[dungeon|Dungeon2]] <<set $Notoriety to $Notoriety + 10>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<if $Quests.includes("Capture someone and bring them to the dungeon")>> <<script>> UI.alert("Quest complete! <br>You have captured someone and taken them back to the dungeons"); <</script>> <<run $Quests.delete("Capture someone and bring them to the dungeon")>> <<set $Quest1 to false>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>>
<<nobr>> <h2>Death Card</h2> Ahh, the Death Card... a grim companion indeed. Should you choose to carry it, the Reaper shall shadow your every step, unseen but ever-present. Those foolish enough to stand against you will feel their very life force wither, their strength fading before the first blow is even struck. Death, it seems, favors your side. But, be warned... Death is a cold companion, and given time it will take you too...<br><br> Effects of carrying this card:<br> -Enemy start each fight with 10 less health<br> -Random chance of starting the day with less health, which increases over time<br><br> Effects of buring the card:<br> -If burned during combat, the enemys heath will go to 1hp<br><br> <h2>Devil Card</h2> The Devil... the Fallen Angel who commands the damned. To carry this card is to wield power over those souls that defy death’s embrace. But heed my warning nothing comes without a price. The Devil always collects what is owed...<br><br> Effects of carrying this card:<br> -Enemy from the void, such as ghouls, zombies and skeletons deal less damage and give you a soul upon their defeat<br> - Random chance of a soul being lost when you kill someone<br><br> Effects of buring the card:<br> - Gives 5 souls<br><br> <h2>Hermit Card</h2> The Hermit are you truly sure you want this... A soul bound to solitude and deep reflection. With this card, you gain the power to look inward, to seek wisdom in the quiet recesses of your mind. Yet be wary... The path to growth is narrow, and in the silence, it’s all too easy to lose yourself.<br><br> Effects of carrying this card: -Unlocks meditation in your castle, boosting your power by 5 and magic by 10 for the day<br> -Meditating can have side effects<br><br> Effects of buring the card:<br> Unknown<br><br> <h2>Magician Card</h2> Magician, sourcoer, worlock, call it what you will... a creature of great power beyond that of flesh and steel. If the magician accompaies you, you will find magic is easier to cunjure. But be warned, the magician loves his tricks and may choose to play them on you<br><br> Effects of carrying this card:<br> -Each combat spell will have a more powerful outcome<br> -Random chance to starting combat with no magic<br><br> Effects of buring the card:<br> -Adds 10 to max magic for 5 days<br><br> <<set $skillBoost to true>> <h2>Strength Card</h2> Strength... the raw, unyielding power to crush those who stand in your way. With this card, you could move mountains, shatter stone with a single blow. But remember this well: the mightier you become, the greater the fall when fate decides to strike you down<br><br> Effects of carrying this card:<br> -Your strikes have a random chance to deal double damage<br> -Upon death, you loose 2 souls<br><br> Effects of buring the card:<br> -Add 5 power to the player for 5 days<br><br> <h2>Sun Card</h2> The Sun... it shines upon all, casting its warm light without judgment. With this card, fortune may favor you, and you’ll find a few more golden rays gracing your path. But be warned friend... beneath that dazzling glow, not all that glitters is truly gold.<br><br> Effects of carrying this card:<br> -Loot is doubled (except tarot cards)<br> -Loot randomly vanishes when you find it<br><br> Effects of buring the card:<br> A chance of gaining or loosing 200 gold<br><br> <h2>Tower Card</h2> The Tower... a fortress of defense, unyielding and impenetrable. With this card, you can lock away your most guarded secrets and treasures, safe from prying eyes. But remember, the deeper you bury something, the more it yearns to be discovered. Walls, no matter how high, can crumble...<br><br> Effects of carrying this card:<br> -Raiders start with 20% corruption and 80% health<br> -1 more raider will come at night<br><br> Effects of buring the card:<br> End a raid instantly, capturing all remaining raiders<br><br> <</nobr>>
<<nobr>> <<set $ChamberInteraction to false>> <div class="castle-menu"> <h1>Castle Halls</h1> <<if $HideChambersImage isnot true>> <div class="castle-map"> <img src="Images/Castle/Maps/3.jpeg" alt="Castle Interior" class="castle-base"> <<if $AliceCorrupt>> <img src="Images/Castle/Maps/alice.png" alt="Forge" class="room-overlay"> <</if>> <<if $MaraAtBase>> <img src="Images/Castle/Maps/mara.png" alt="Map Room" class="room-overlay"> <</if>> <<if $LucyCorrupt>> <img src="Images/Castle/Maps/lucy.png" alt="Library" class="room-overlay"> <</if>> </div> <<button "Hide map">> <<set $HideChambersImage to true>> <<goto "Castle Chambers">> <</button>> <<else>> <<button "Show map">> <<set $HideChambersImage to false>> <<goto "Castle Chambers">> <</button>> <</if>> <br><br> <<if $EishethVisit is true>> <<set _visitday to $EisethVisitDay + 3>> <</if>> <<if ($WolfQuestStatus is "FirstEncounter") or ($Quests.includes("Speak to Gnarlak about the farm"))>> <div class="menu-item" data-image="Images/Castle/Gnarlak/1.png"> [[Speak to Gnarlak|GnarlakChamber]] <span class="menu-description">Consult with your loyal minion</span> </div> <</if>> <div class="menu-item" data-image="Images/Castle/Chambers/1.png"> <<if $EishethVisit is true and _visitday lt $Day>> <<link "Enter your Chambers">><<goto "EishethVisitChambers">><</link>> <<else>> [[Enter your Chambers|Chambers]] <</if>> <span class="menu-description">Retire to your private sanctum</span> </div> <<if $LucyCorrupt is true>> <div class="menu-item" data-image="Images/Castle/Chambers/2.png"> [[Visit Lucy|Succubus1]] <span class="menu-description">Visit Lucy</span> </div> <</if>> <<if $AliceCorrupt is true>> <div class="menu-item" data-image="Images/Castle/Chambers/3.png"> [[Visit Alice|Succubus2]] <span class="menu-description">Visit Alice</span> </div> <</if>> <<if $MaraAtBase is true>> <div class="menu-item" data-image="Images/Castle/Chambers/4.png"> [[Visit Mara|MaraChamber]] <span class="menu-description">Visit Mara</span> </div> <</if>> <<set _seigeChance to random(0, 1)>> <<if ($BanditSeigeDay is true) and (_seigeChance is 0)>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> <<link "Go Downstairs">> <<set $BeingSeiged to false>> <<goto "BanditSiegeStart">> <</link>> <span class="menu-description">Descend to the Castle Grounds</span> </div> <<else>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Go Downstairs|Inside Castle]] <span class="menu-description">Descend to the Castle Grounds</span> </div> <</if>> </div> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <style> .castle-map { position: relative; width: 600px; height: 600px; margin: 0 auto; } .castle-base { position: absolute; top: 0; left: 0; width: 600px; height: 600px; display: block; } .room-overlay { position: absolute; top: 0; left: 0; width: 600px; height: 600px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>>
<div class="text-box"> <<Eisheth>>Deeper<</Eisheth>> [[Continue|Cave3]] [[Leave|ForestCave]] </div>
<div class="text-box"> <div align="center"> <img src="Images/Forrest/Encounters/Cave/7.png" width="700" height="700"> </div> <span class='fadeIn'>You stand infront of a pentagram on the ground, surrounded by candles, after stairing at it for what feels like eternity...</span> <<timed 5s>> <span class='fadeIn'>You [[pass out|EishethBlow]]</span> <</timed>> </div>
<<nobr>> <div class="text-box"> Your arrow strikes the center target, scoring you 30 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<include "BowGameLines">> <<set _line = either(_critHitLine)>> <<say 'Huntress' _img>>_line<</say>> <<set $PlayerArcheryScore to $PlayerArcheryScore + 20>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore<br><br> <<button "Her turn">> <<if $Position is "Strip">> <<goto "NPCArrowShotStrip">> <<else>> <<goto "NPCArrowShot">> <</if>> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Chamber1 is false>> You enter a small chamber and find a chest You can open the chest or leave:<br> <<link "Open the chest">><<set $Chamber1 to true>><<run Engine.play('Chamber1')>><</link>><br> <<else>> <<set $ChestFind = random(0, 3)>> <<if $ChestFind is 0>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find 200 gold<br> <<set $Gold to $Gold + 200>> <</if>> <<else>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>><</if>> <<if $ChestFind is 1>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two minor healing potions<br><br> <<set $MinorHealingPotion to $MinorHealingPotion + 2>> <</if>> <<else>> You find a minior healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <</if>><</if>> <<if $ChestFind is 2>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two magic boosting potions<br><br> <<set $MagicPotion to $MagicPotion + 2>> <</if>> <<else>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <</if>> <</if>> <<if $ChestFind is 3>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two energy boosting potions<br><br> <<set $EnergyPotion to $EnergyPotion + 2>> <</if>> <<else>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <</if>><</if>> <</if>> <<button "Leave">> <<goto "Crypt2">> <</button>> <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Chamber2 is false>> You enter a small chamber and find a chest You can open the chest or leave:<br> <<link "Open the chest">><<set $Chamber2 to true>><<run Engine.play('Chamber2')>><</link>><br> <<else>> <<set $ChestFind = random(0, 3)>> <<if $ChestFind is 0>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find 200 gold<br> <<set $Gold to $Gold + 200>> <</if>> <<else>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>><</if>> <<if $ChestFind is 1>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two minor healing potions<br><br> <<set $MinorHealingPotion to $MinorHealingPotion + 2>> <</if>> <<else>> You find a minior healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <</if>><</if>> <<if $ChestFind is 2>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two magic boosting potions<br><br> <<set $MagicPotion to $MagicPotion + 2>> <</if>> <<else>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <</if>> <</if>> <<if $ChestFind is 3>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two energy boosting potions<br><br> <<set $EnergyPotion to $EnergyPotion + 2>> <</if>> <<else>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <</if>><</if>> <</if>> <<button "Leave">> <<goto "Crypt3">> <</button>> <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Chamber3 is false>> You enter a small chamber and find a chest You can open the chest or leave:<br> <<link "Open the chest">><<set $Chamber3 to true>><<run Engine.play('Chamber3')>><</link>><br> <<else>> <<set $ChestFind = random(0, 3)>> <<if $ChestFind is 0>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find 200 gold<br> <<set $Gold to $Gold + 200>> <</if>> <<else>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>><</if>> <<if $ChestFind is 1>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two minor healing potions<br><br> <<set $MinorHealingPotion to $MinorHealingPotion + 2>> <</if>> <<else>> You find a minior healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <</if>><</if>> <<if $ChestFind is 2>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two magic boosting potions<br><br> <<set $MagicPotion to $MagicPotion + 2>> <</if>> <<else>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <</if>> <</if>> <<if $ChestFind is 3>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two energy boosting potions<br><br> <<set $EnergyPotion to $EnergyPotion + 2>> <</if>> <<else>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <</if>><</if>> <</if>> <<button "Leave">> <<goto "Crypt4">> <</button>> <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Chamber4 is false>> You enter a small chamber and find a chest You can open the chest or leave:<br> <<link "Open the chest">><<set $Chamber4 to true>><<run Engine.play('Chamber4')>><</link>><br> <<else>> <<set $ChestFind = random(0, 3)>> <<if $ChestFind is 0>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find 200 gold<br> <<set $Gold to $Gold + 200>> <</if>> <<else>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>><</if>> <<if $ChestFind is 1>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two minor healing potions<br><br> <<set $MinorHealingPotion to $MinorHealingPotion + 2>> <</if>> <<else>> You find a minior healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <</if>><</if>> <<if $ChestFind is 2>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two magic boosting potions<br><br> <<set $MagicPotion to $MagicPotion + 2>> <</if>> <<else>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <</if>> <</if>> <<if $ChestFind is 3>> <<if $TarotCardInvet.includes("Sun")>> <<set _int to Random(0, 4)>><<if _int is 4>> The sun tarot tricks you, and the chest is filled with nothing but dust<br><br> <<else>> Having the sun tarot doubles your luck<br><br> You find two energy boosting potions<br><br> <<set $EnergyPotion to $EnergyPotion + 2>> <</if>> <<else>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <</if>><</if>> <</if>> <<button "Leave">> <<goto "BossCrypt">> <</button>> <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <</nobr>> </div>
<<nobr>> <<if $CurrentPlayer is "Overlord">> <<if $VisitedChambers is false>> <<Gnarlak>>This is is your chamber my Lord, as you can see you can review your equipment, give orders for new rooms to be created and of course you can rest<</Gnarlak>><br> <</if>> <div class="castle-menu"> <h1 style="color: #8B0000; text-align: center; text-shadow: 2px 2px 4px #000;">⚔️ The Overlord's Sanctum ⚔️</h1> <<set _hour = Math.floor($Time % 24)>> <<if _hour >= 6 && _hour < 12>> <p style="color: #FFD700; text-align: center;">🌅 Morning light filters through stained glass windows</p> <<elseif _hour >= 12 && _hour < 18>> <p style="color: #FFA500; text-align: center;">☀️ Afternoon sun casts long shadows across the chamber</p> <<elseif _hour >= 18 && _hour < 22>> <p style="color: #FF6347; text-align: center;">🌆 Evening torches flicker as darkness approaches</p> <<elseif (_hour >= 22 && _hour <= 23) || (_hour >= 0 && _hour < 6)>> <<if typeof window.MoonPhaseSystem !== 'undefined' && window.MoonPhaseSystem.getCurrentPhase>> <<set _moonPhase = window.MoonPhaseSystem.getCurrentPhase()>> <<set _moonSymbol = _moonPhase.symbol || '🌙'>> <<set _moonName = _moonPhase.name || 'moon'>> <<if _moonName == 'New Moon'>> <p style="color: #9370DB; text-align: center;"><<print _moonSymbol>> The new moon leaves your domain in complete darkness</p> <<elseif _moonName == 'Full Moon'>> <p style="color: #9370DB; text-align: center;"><<print _moonSymbol>> The full moon bathes your domain in ethereal light</p> <<elseif _moonName.includes('Waxing')>> <p style="color: #9370DB; text-align: center;"><<print _moonSymbol>> The waxing <<print _moonName.replace('Waxing ', '').toLowerCase()>> casts growing shadows across your domain</p> <<elseif _moonName.includes('Waning')>> <p style="color: #9370DB; text-align: center;"><<print _moonSymbol>> The waning <<print _moonName.replace('Waning ', '').toLowerCase()>> fades into the darkness of your domain</p> <<else>> <p style="color: #9370DB; text-align: center;"><<print _moonSymbol>> Night shrouds your domain in shadow</p> <</if>> <<else>> <p style="color: #9370DB; text-align: center;">🌙 Night shrouds your domain in shadow</p> <</if>> <<else>> <!-- Fallback for any edge cases --> <p style="color: #FFD700; text-align: center;">🌅 Another day in your dark domain</p> <</if>> <hr style="border-color: #8B0000;"> <div class="menu-item" data-image="Images/Castle/Chambers/5.png" data-tooltip="Expand your dark fortress"> [[Castle Upgrades|BaseManagement]] <span class="menu-description">Command minions to expand your fortress</span> </div> <<if $LucyCorrupt>> <div class="menu-item" data-image="Images/Castle/Chambers/5.png" data-tooltip="Expand your dark fortress"> [[Summon Someone|SummonToChambers]] <span class="menu-description">Summon a loyal follower</span> </div> <</if>> <<if typeof $CapturedLocations === 'undefined'>> <<else>> <<if $CapturedLocations.length >= 1>> <div class="menu-item" data-image="Images/Castle/Chambers/7.png"> [[Review Territory Reports|SettlementReports]] <span class="menu-description">Read missives from your conquered settlements</span> </div> <</if>><</if>> <<if ($VisitedVault is false) or ($VisitedDungeon is false) or ($VisitedChambers is false) or ($VisitedDefences is false)>> <div class="menu-item disabled" data-image="Images/Mountains/1.png"> <span class="menu-icon">⏳</span> <span style="color: #808080;">Rest When Ready</span> <span class="menu-description" style="color: #666;">Explore your entire castle first...</span> </div> <<else>> <div class="menu-item" data-image="Images/Icons/EndDay.png"> <<link "Retire for the Night">><<fadeToPassage "End Day">><</link>> <span class="menu-description">Sleep and advance to the next day</span> </div><</if>> <<if $TarotCardInvet.includes("Hermit")>> <div class="menu-item" data-image="Images/Castle/Chambers/6.png"> <<link "Channel Dark Energies">> <<run setup.closeEyesAndTransition('Meditate')>> <</link>> <span class="menu-description">The Hermit card grants mystical insights</span> </div> <</if>> <div class="menu-item" data-image="Images/Crypt/Chamber/1.png"> [[Enter the Hall of Ancestors|HallOfLords]] <span class="menu-description">Enter the hall of lords</span> </div> <div class="menu-item" data-image="Images/Castle/Portal/1.png"> [[Exit to Castle Halls|Castle Chambers]] <span class="menu-description">Return to your fortress corridors</span> </div> </div> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <<set $DeathCardDamage to 5>> <<set $VisitedChambers to true>> <<set $MenuPassage to passage()>> <</if>> <<if $CurrentPlayer is "Lucy" or $CurrentPlayer is "Alice">> You enter $LucyName's chambers and find him working<br><br> <<set $ImagePath to "Images/Player/1.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$LucyName' 'Images/Player/1.png'>>Hi $CurrentPlayer, what do you need?<</say>><br><br> <<button "Play as Overlord">> <<set $CurrentPlayer to "Overlord">> <<run Engine.show()>> <</button>><br><br> <<if $CurrentPlayer is "Lucy">> <<button "Leave">> <<goto "LucyBase">> <</button>> <<else>> <<button "Leave">> <<goto "AliceBase">> <</button>> <</if>> <</if>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $NameChange is false>> What do you want $Servant to call you? <<textbox "$nameInput" "Master">> <<if $Servant is "Mara">> <<button "Change">> <<set $MaraName to $nameInput>> <<set $NewName to $nameInput>> <<set $NameChange to true>> <<run Engine.play('ChangeName')>> <</button>> <<elseif $Servant is "Lucy">> <<button "Change">> <<set $LucyName to $nameInput>> <<set $NewName to $nameInput>> <<set $NameChange to true>> <<run Engine.play('ChangeName')>> <</button>> <<else>> <<button "Change">> <<set $AliceName to $nameInput>> <<set $NewName to $nameInput>>> <<set $NameChange to true>> <<run Engine.play('ChangeName')>> <</button>> <</if>><</if>> <<if $NameChange is true>> <<You>>From now on you can call me $NewName<</You>><br><br> <<if $Servant is "Mara">> <<Mara>>Of course, $MaraName<</Mara>><br><br> [[Leave|MaraChamber]] <<elseif $Servant is "Lucy">> <<say 'Lucy' $LucyImg>>Ok, $LucyName<</say>><br><br> [[Leave|Succubus1]] <<else>> <<Succubus_Alice>>Ok, $AliceName<</Succubus_Alice>><br><br> [[Leave|Succubus2]] <</if>><</if>> <</nobr>> </div>
<<nobr>> <<set _maleCharmLines to [ "Oh my, I can’t decide what’s more impressive—your voice or the way your muscles shift when you speak.", "You must have women throwing themselves at your feet… or are they just too stunned to approach?", "I bet you’ve broken more than a few hearts in this village… I should guard mine carefully.", "Tell me, do all the men here carry themselves like kings, or are you just special?", "You look like the kind of man who knows exactly what he wants… I admire that.", "With a smile like that, you could probably convince me to do just about anything.", "I can’t tell if it’s the way you move or the way you speak, but you’ve got a dangerous kind of charm.", "If you keep looking at me like that, I might start believing in love at first sight." ]>> <<set _femaleCharmLines to [ "How does someone as beautiful as you even exist in a place like this?", "You have this aura about you, like the heroine of some grand tale… and I do love a good story.", "I have to be honest, I might have forgotten what I was going to say—your eyes are a bit distracting.", "If grace and beauty were a crime, you’d be in shackles right now.", "You’re the kind of woman people write poetry about… perhaps I should start now?", "I swear, the air feels lighter when you smile. Are you sure you’re not a sorceress?", "I don’t know if it’s the way you carry yourself or just your natural charm, but you have me completely enchanted.", "Please, tell me your secret—how do you manage to look so effortlessly divine?", "I hope the men around here know how lucky they are to be in the presence of someone like you.", "Oh darling, if I stayed in this town too long, I might just fall hopelessly in love with you." ]>> <<set _guardCharmLines to [ "With someone like you standing watch, I doubt anyone would dare cause trouble.", "I feel safer just being near you. You must be quite the protector.", "I bet there’s more to you than just armor and duty… I’d love to find out.", "Tell me, do all the guards here have your level of discipline, or are you just exceptional?", "Your presence alone is enough to keep danger at bay—truly, this town is lucky to have you.", "Strong, vigilant, and commanding… I do have a weakness for authority, you know.", "That uniform looks good on you, but I bet you’d look even better out of it.", "I have to admit, I find power… exhilarating. And you wear it so well." ]>> <<set _malePositiveResponses to [ "Ha! You’ve got a sharp tongue and a good eye. I like that.", "Flattery will get you everywhere, darling. Keep talking.", "Well now, aren’t you a sweet thing? I could listen to you all day.", "Careful now, you keep talking like that, and I might start believing you.", "You’ve got a way with words… and I think I’d like to hear more of them.", "I don’t usually fall for this kind of talk… but for you, I’ll make an exception.", "You’re quite the charmer yourself. Perhaps we should get better acquainted?", "I could get used to compliments like that. Keep ‘em coming, and you might just win me over.", "Most folks around here don’t know how to flirt properly. Glad to see you’re different.", "Well, well… you’ve certainly got my attention now." ]>> <<set _femalePositiveResponses to [ "Oh my, you certainly know how to make a lady blush.", "You're too kind! If you keep this up, I might just start following you around.", "It’s rare to meet someone with such a silver tongue… I think I like it.", "I could listen to you sing my praises all day long.", "You have a way of making a girl feel special. I appreciate that.", "Flattery will get you everywhere, dear. And I do mean everywhere.", "You’ve got a dangerous charm about you… but I must admit, I don’t mind at all.", "Oh stop it—you’ll make me think you actually mean it.", "Mmm, I might have to keep an eye on you. You’re trouble, aren’t you?", "That’s the most pleasant thing I’ve heard all day. Thank you." ]>> <<set _guardPositiveResponses to [ "Heh, you’ve got a smooth way with words. I respect that.", "Hmph. You’re either very bold or very foolish. Either way… I like it.", "I’ve heard many a sweet word, but yours… well, they ain’t half bad.", "Tch. You think a little flattery will work on me? …Well, maybe just a little.", "You talk like someone who knows what they want. I can respect that.", "It’s not often someone makes a guard smile. I’ll give you that much.", "Hah. You’re trouble, aren’t you? I ought to throw you in the stocks… but I won’t.", "You might be the first traveler to actually make me enjoy a conversation.", "You’ve got nerve. I like that in a person.", "Fine, fine. I’ll admit it—you’ve got a silver tongue." ]>> <<set _maleDismissiveResponses to [ "Ha! Nice try, sweetheart, but I’m not that easy.", "Flattery? Really? You’ll have to do better than that.", "Cute, but I’ve heard better lines from a drunkard at the tavern.", "I don’t know what game you’re playing, but I’m not interested.", "Save your sweet words for someone else—I’ve got work to do.", "You talk pretty, but I’m not falling for it.", "What, you think a few nice words will make me bend over backwards for you?", "Hmph. You must think I’m a fool.", "Not buying it, lady. Move along.", "You’re wasting your breath." ]>> <<set _femaleDismissiveResponses to [ "Oh, please. Do you think I was born yesterday?", "Flattering words, but I see right through you.", "I don’t have time for whatever this is.", "Hah! You must think you’re clever, don’t you?", "Keep your honeyed words for someone else—I’m not in the mood.", "Nice try, but I’m not so easily charmed.", "Oh darling, if I had a coin for every sweet-talker I met, I’d own this village.", "I’ve heard better. Much better.", "Tch. You must think I’m desperate for attention.", "Not impressed." ]>> <<set _guardDismissiveResponses to [ "Hmph. I’m on duty, not here for your amusement.", "Do you think I’ve never heard sweet words before? Try harder.", "You’ve got guts, I’ll give you that. But no.", "Save it, succubus. I’ve got a job to do.", "If you’re looking for someone to toy with, look elsewhere.", "Tch. You think a little charm is going to make me lower my guard?", "I’m not here for small talk. Move along.", "I’ve got enough troublemakers to deal with—you don’t need to add to it.", "Hmph. I’d be more impressed if you actually had something interesting to say.", "Keep your charms to yourself. I’m not interested." ]>> <</nobr>>
<<nobr>> Sorry!<br><br> Cheats are not availble in the free version due to the password being leaked frequently. I spend at least 10 hours a week working on this game and put 90% of it out complelty for free. If you're enjoying the game please feel free to join my Patreon where members of the <b>Lord</b> tier get access to the downloadable version with more content and cheats<br><br> Sorry if this annoys anyone but this takes a huge amount of time and is almost completly free<br><br> Please note the patreon version is a download and has been tested on Windows, Linux and MacOS. It should also run on any Andoird phone/Tablet but I recomend a large screen<br><br> Thanks for your support,<br><br> North <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> You watch, as a red jagged line rips open above the circle, like a wound in reality<br><br> Through the sounds of the cultists frantic chanting you hear laughing, or screaming and a long red leg steps through the the portal followed by something beautiful and horrific<br><br. <<set _charPath to "Images/Forrest/Encounters/Abandond Church/10.png">> <div class="Random-image"> <<set _imagePath to _charPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Theres a long pause, the man goes silent, head bowed <<say 'Man' _imgPath>>Come closer<</say>> He goes to stand <<say 'Man' _imgPath>>Crawl to me<</say>> He complys dropping low and crawling towards her, you eye the exit but theres no way out without being seen<br><br> With nowhere to go you watch on as the man craws over to the succubus and kneels at her feet <<say 'Man' _imgPath>>Worship me<</say>> And with the command, he lifts his head and presses himself between his legs <<set _charPath to "Images/Forrest/Encounters/Abandond Church/8.png">> <div class="Random-image"> <<set _imagePath to _charPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You approach the door, theres a combination lock on it and an incription...<br><br> <<if $PuzzleType is "Day">> <span style="font-style: italic"> "Three souls rest, their final days, Marked in time with silent praise. The key you seek is in their end, The day they died, the path to bend. Arrange them well, from first to last, The combination, in their past." </span> <<set _CoffinKey1 to $CoffinData[1]>> <<set _CoffinKey2 to $CoffinData[5]>> <<set _CoffinKey3 to $CoffinData[9]>> <<elseif $PuzzleType is "Month">> <span style="font-style: italic"> "Three souls rest, their months defined, By when they left this world behind. The key you seek is not the year, But the month they vanished here. Order them right, from first to last, The numbers guide you to the past." </span> <<set _Month1 to $CoffinMonths.indexOf($CoffinData[2]) + 1>> <<set _Month2 to $CoffinMonths.indexOf($CoffinData[6]) + 1>> <<set _Month3 to $CoffinMonths.indexOf($CoffinData[10]) + 1>> <<set _CoffinKey1 to _Month1>> <<set _CoffinKey2 to _Month2>> <<set _CoffinKey3 to _Month3>> <<else>> <span style="font-style: italic"> "Three souls rest, their years are sealed, The final mark, their tale revealed. Not by full span, but end in sight, The closing number grants you light. Arrange them well, from first to last, The key is found within the past." </span> <<set _CoffinKey1 = String($CoffinData[3]).slice(2)>> <<set _CoffinKey2 = String($CoffinData[7]).slice(2)>> <<set _CoffinKey3 = String($CoffinData[11]).slice(2)>> <</if>> <br><br> <div class="keypad-container" style="display: flex; gap: 10px; margin-bottom: 20px;"> <input type="number" id="key1" style="width: 60px;"> <input type="number" id="key2" style="width: 60px;"> <input type="number" id="key3" style="width: 60px;"> </div> <<button "Unlock">> <<set _input1 to Number($('#key1').val())>> <<set _input2 to Number($('#key2').val())>> <<set _input3 to Number($('#key3').val())>> <<if _input1 eq _CoffinKey1 and _input2 eq _CoffinKey2 and _input3 eq _CoffinKey3>> <<script>> UI.alert("You hear a click as locks begin to open"); <</script>> <<run Engine.play($ReturnPassage)>> <<else>> <<script>> UI.alert("Nothing happens, the code must be wrong"); <</script>> <</if>> <</button>> <br><br>[[Back|CryptPuzzle]]<br><br><br><br> <<if $CoffinCheat is -1>> <<link "Clue">><<set $CoffinClue to true>><<set $CoffinCheat to $CoffinCheat + 1>><<run Engine.show()>><</link>> <<elseif $CoffinCheat is 0>> <<link "Another Clue">><<set $CoffinClue to true>><<set $CoffinCheat to $CoffinCheat + 1>><<run Engine.show()>><</link>> <<elseif $CoffinCheat is 1>> <<link "Answer">><<set $CoffinClue to true>><<set $CoffinCheat to $CoffinCheat + 1>><<run Engine.show()>><</link>> <</if>> <<if $CoffinClue is true>> <<if $PuzzleType is "Day">> <<You>>$DayCheat[$CoffinCheat]<</You>> <<elseif $PuzzleType is "Month">> <<You>>$MonthCheats[$CoffinCheat]<</You>> <<else>> <<You>>$YearCheats[$CoffinCheat]<</You>> <</if>><</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> The Venom takes over and you fall to your knees<br><br> The Arachness quickly ties you up and places you with the other captives<br><br> <<set _imagePath to "Images/Crypt/Spider/1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "You die">> <<set $PlayerHealth to 0>> <<goto "Respawn">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<style> /* Combat Board - Medieval Fantasy Styling */ .combat-board { background: linear-gradient(to bottom, #1a0000 0%, #300000 50%, #1a0000 100%); border: 3px solid #8b0000; border-radius: 10px; padding: 20px; margin: 10px 0; box-shadow: 0 0 20px rgba(139, 0, 0, 0.5), inset 0 0 20px rgba(0, 0, 0, 0.3); font-family: 'Luminari', 'MedievalSharp', fantasy; color: #c0c0c0; } /* Combat Tables - Battlefield Areas */ .enemy-section, .player-section { margin: 15px 0; position: relative; } /* Remove the force labels */ .enemy-section::before, .player-section::before { display: none; } .combat-table { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; min-height: 80px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } .combat-table.empty { background: linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%), linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%); background-size: 20px 20px; background-position: 0 0, 10px 10px; opacity: 0.7; } .combat-table.empty::after { content: "No cards deployed"; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #666; font-style: italic; text-transform: uppercase; letter-spacing: 1px; } /* Combat Action Buttons */ .combat-actions { display: flex; gap: 15px; justify-content: center; margin: 20px 0; flex-wrap: wrap; } .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.1em !important; padding: 12px 25px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 20px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) !important; } .play-card-btn:disabled { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; color: #666 !important; border-color: #444 !important; cursor: not-allowed !important; transform: none !important; } /* Card Filter Section */ .card-filters { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; padding: 15px; margin: 15px 0; box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.3); } .card-filters h4 { text-align: center; color: #ffd700; text-shadow: 0 0 5px #ff8c00; margin: 0 0 15px 0; text-transform: uppercase; letter-spacing: 2px; font-size: 1.1em; } .filter-buttons { display: flex; gap: 10px; justify-content: center; flex-wrap: wrap; } .filter-btn { background: linear-gradient(to bottom, #3a2a1a 0%, #2a1a0a 100%) !important; border: 2px solid #8b4513 !important; color: #c0c0c0 !important; padding: 8px 15px !important; font-size: 0.9em !important; border-radius: 5px !important; transition: all 0.3s !important; } .filter-btn:hover { background: linear-gradient(to bottom, #4a3a2a 0%, #3a2a1a 100%) !important; border-color: #cd853f !important; } .filter-btn.active { background: linear-gradient(to bottom, #8b4513 0%, #654321 100%) !important; border-color: #ffd700 !important; color: #ffd700 !important; text-shadow: 0 0 5px #ff8c00 !important; box-shadow: 0 0 10px rgba(255, 215, 0, 0.3) !important; } /* Card Hand Area */ .card-hand { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; min-height: 120px; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } /* Card Styling */ .card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; height: auto; /* Allow cards to grow */ padding: 8px; cursor: pointer; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4), 0 0 15px rgba(139, 69, 19, 0.3); } .card.selected { border-color: #ffd700; box-shadow: 0 0 20px rgba(255, 215, 0, 0.6), 0 4px 8px rgba(0, 0, 0, 0.3); transform: translateY(-3px); } .card.unplayable { opacity: 0.6; filter: grayscale(50%); cursor: not-allowed; } /* Card content layout */ .card-content { display: flex; flex-direction: column; height: 100%; } /* Dynamic card sizing based on content */ .card.large-content { min-height: 220px; } .card.extra-large-content { min-height: 240px; } /* Card Type Styling */ .card-type { text-align: center; font-size: 0.7em; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; padding: 2px 4px; border-radius: 3px; margin-bottom: 5px; } .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000); color: white; } .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad); color: white; } .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090); color: white; } .card-type.potion { background: linear-gradient(to right, #228b22, #32cd32); color: white; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } /* Card image improvements - square background */ .card-image { text-align: center; height: 60px; width: 60px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } /* Ensure costs section doesn't take up space when hidden */ .card-costs.hidden { display: none; } /* Better spacing for visible costs */ .card-costs:not(.hidden) { display: flex; justify-content: space-between; font-size: 0.7em; margin-bottom: 5px; } .energy-cost { color: #ff6600; font-weight: bold; } .magic-cost { color: #6600ff; font-weight: bold; } /* Hide zero values */ .card-damage:empty, .card-defense:empty { display: none; } .card-damage, .card-defense { text-align: center; font-weight: bold; font-size: 0.8em; color: #8b0000; margin-bottom: 5px; } /* Text wrapping for effects and description */ .card-effects, .card-description { font-size: 0.6em; text-align: center; color: #444; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin-top: auto; /* Push to bottom */ padding-top: 5px; } .card-effects { margin-bottom: 3px; } /* Combat attack animation */ @keyframes enemy-attack { 0% { transform: translateY(0); } 50% { transform: translateY(20px); } 100% { transform: translateY(0); } } .enemy-card.attacking { animation: enemy-attack 0.6s ease-in-out; } /* Enemy Cards */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%); color: #ff4444; border-color: #8b0000; } .enemy-card .card-name { color: #ff6666; } .enemy-card-icon { font-size: 2em; color: #ff4444; } /* Stack indicators */ .card.stacked::after { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; } .stack-indicator { position: absolute; top: -5px; right: -5px; background: #8b0000; color: white; border-radius: 50%; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; font-size: 0.7em; font-weight: bold; border: 2px solid #ffd700; } /* Messages */ .combat-message { text-align: center; padding: 10px; margin: 10px 0; border-radius: 5px; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .combat-message.success { background: linear-gradient(to right, #006400, #228b22); color: white; border: 2px solid #32cd32; } .combat-message.error { background: linear-gradient(to right, #8b0000, #a00000); color: white; border: 2px solid #ff4444; } /* Responsive adjustments */ @media (max-width: 768px) { .card { width: 120px; min-height: 170px; } .combat-actions { flex-direction: column; align-items: center; } .filter-buttons { flex-direction: column; align-items: center; } } /* Combat Report Styles - Updated for single round */ .combat-report-container { margin: 20px 0; padding: 0; background: transparent; } .combat-report { background: #2a2a2a; border: 2px solid #555; border-radius: 8px; padding: 20px; margin: 20px 0; color: #fff; max-height: 400px; overflow-y: auto; } .combat-report.hidden { display: none; } .combat-report h3 { color: #ffd700; text-align: center; margin-bottom: 20px; border-bottom: 2px solid #555; padding-bottom: 10px; margin-top: 0; } .combat-round { border: 1px solid #444; border-radius: 5px; padding: 15px; background: #333; } /* Removed h4 styles since we're not showing round numbers */ .combat-action { margin: 8px 0; padding: 8px; border-radius: 4px; border-left: 4px solid #666; } .combat-action.damage-action { background: rgba(220, 20, 60, 0.2); border-left-color: #dc143c; } .combat-action.block-action { background: rgba(70, 130, 180, 0.2); border-left-color: #4682b4; } .combat-action.heal-action { background: rgba(50, 205, 50, 0.2); border-left-color: #32cd32; } .actor { font-weight: bold; color: #ffd700; } .weapon-used { color: #87ceeb; font-style: italic; } .damage-amount { color: #ff6b6b; font-weight: bold; } .blocked-amount { color: #4682b4; font-weight: bold; } .combat-report-controls { text-align: center; margin: 15px 0; } .combat-report-controls button { margin: 0 10px; padding: 8px 16px; background: #555; color: #fff; border: none; border-radius: 5px; cursor: pointer; font-size: 14px; } .combat-report-controls button:hover { background: #666; } .combat-report-controls button:disabled { background: #333; color: #888; cursor: not-allowed; } .combat-report-container.empty { display: none; } /* Add this to your CSS file or in a <style> tag */ .card, .card * { -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-touch-callout: none; -webkit-tap-highlight-color: transparent; } .card { cursor: pointer; } .card:hover { cursor: pointer; } /* Prevent dragging of images and other elements within cards */ .card img { -webkit-user-drag: none; -khtml-user-drag: none; -moz-user-drag: none; -o-user-drag: none; user-drag: none; pointer-events: none; } .card-order-number { position: absolute; top: -8px; right: -8px; width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 14px; z-index: 10; border: 2px solid white; box-shadow: 0 2px 4px rgba(0,0,0,0.3); } .player-order { background-color: #4CAF50; color: white; } .enemy-order { background-color: #f44336; color: white; } .order-legend { text-align: center; margin-top: 10px; color: #666; font-style: italic; } // Example weapon card with corruption effect { id: 'cursed_blade_001', name: 'Cursed Blade', type: 'weapon', damage: 15, magic: 0, energy: 2, effects: [ { name: 'corruption', value: 25 // Adds 25 to EnemyCorruption } ] } /* Priority Border Styling */ .combat-table.has-priority { border: 3px solid #ff4444; box-shadow: 0 0 15px rgba(255, 68, 68, 0.5); animation: priorityPulse 2s ease-in-out infinite; } @keyframes priorityPulse { 0%, 100% { border-color: #ff4444; box-shadow: 0 0 15px rgba(255, 68, 68, 0.5); } 50% { border-color: #ff6666; box-shadow: 0 0 25px rgba(255, 68, 68, 0.8); } } /* Priority Indicator Styling */ .priority-indicator { display: block; text-align: center; font-weight: bold; margin: 10px 0; padding: 8px; border-radius: 6px; font-size: 14px; } .priority-indicator.player-priority { background: linear-gradient(135deg, #4CAF50, #45a049); color: white; border: 2px solid #4CAF50; } .priority-indicator.enemy-priority { background: linear-gradient(135deg, #f44336, #d32f2f); color: white; border: 2px solid #f44336; } /* Fast Trait Indicator */ .fast-trait-indicator { display: block; text-align: center; font-weight: bold; margin: 5px 0; padding: 6px; background: linear-gradient(135deg, #FF9800, #F57C00); color: white; border-radius: 4px; font-size: 12px; border: 1px solid #FF9800; } /* Enhanced card order numbers for priority */ .has-priority .card-order-number { animation: priorityOrderPulse 1.5s ease-in-out infinite; border-width: 3px; } @keyframes priorityOrderPulse { 0%, 100% { transform: scale(1); box-shadow: 0 2px 4px rgba(0,0,0,0.3); } 50% { transform: scale(1.15); box-shadow: 0 4px 8px rgba(0,0,0,0.5); } } </style>
<div class="text-box"> <<nobr>> <<set $PlayerCorruption to $PlayerCorruption + 30>> <<set _submit to ["surrender", "submit", "give in", "worship her", "kneel", "obey"]>> <<set _dominate to ["fuck her", "use her", "let her help you", "let her serve you"]>> <<if _submit.includes($Position)>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Succubus' _imagePath>>Thats it pet, worship me<</say>> <<set _rand to random(1, 4)>> <<if $SuccInt is 6 or $SuccInt is 7>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Normal/Cul/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Glammour/Cul/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Crypt/SuccubusGame/Lick/" + _Vid + ".webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <<else>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Succubus' _imagePath>>I know you like being called $LucyName... Well $LucyName why don't you relax<</say>> <<set _positions to ["bj", "tf"]>> <<set _position to either(_positions)>> <<set _rand to random(1, 4)>> <<if $SuccInt is 6 or $SuccInt is 7>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Normal/"+ _position + "/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Glammour/"+ _position + "/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<if _position is "bj">> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Crypt/SuccubusGame/Bj/" + _Vid + ".webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <</if>> <<if $PlayerCorruption >= 100>> You are too corrupted to resist<br> <<button "Give in to her">> <<goto "CombatPlayerCorrupted">> <</button>> <<else>> <<button "Resist her">> <<goto "Combat">> <</button>><br> <<button "Give in to her">> <<goto "CombatPlayerCorrupted">> <</button>> <</if>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<<nobr>> <<silently>> /* Reset navigation flags */ <<set $ShouldNavigateAfterEffects to false>> <<set $NavigationTarget to "">> <<if def $CombatCardEffects and $CombatCardEffects.length > 0>> <<for _i to 0; _i lt $CombatCardEffects.length; _i++>> <<if $CombatCardEffects[_i].effectName is "Stun">> <<set $CombatStunnedValue to $CombatCardEffects[_i].effectValue>> <<set $EnemyLevel to $EnemyLevel - $CombatStunnedValue>> <<set $CombatEnemyStunned to true>> <<set $StunValue to $CombatCardEffects[_i].effectValue>> <</if>> <<if ($CombatCardEffects[_i].effectName is "Bleeding") and (!$enemyTraits.includes('fleshless'))>> <<set $CombatBleeding to true>> <<set $CombatBleedingValue to $CombatBleedingValue + $CombatCardEffects[_i].effectValue>> <</if>> <<if $CombatCardEffects[_i].effectName is "Leaching">> <<set $EnemyHealth to $EnemyHealth - $CombatCardEffects[_i].effectValue>> <<set $PlayerHealth to $PlayerHealth + $CombatCardEffects[_i].effectValue>> <<if $PlayerHealth gt 100>><<set $PlayerHealth to 100>><</if>> <</if>> <<if $CombatCardEffects[_i].effectName is "magic">> <<set $PlayerMagic to $PlayerMagic + $CombatCardEffects[_i].effectValue>> <<if $PlayerMagic gt $PlayerMaxMagic>><<set $PlayerMagic to $PlayerMaxMagic>> <</if>> <</if>> <<if $CombatCardEffects[_i].effectName is "energy">> <<set $PlayerEnergy to $PlayerEnergy + $CombatCardEffects[_i].effectValue>> <<if $PlayerEnergy gt 100>><<set $PlayerEnergy to 100>><</if>> <</if>> <<if $CombatCardEffects[_i].effectName is "healing">> <<set $PlayerHealth to $PlayerHealth + $CombatCardEffects[_i].effectValue>> <<if $PlayerHealth gt 100>><<set $PlayerHealth to 100>><</if>> <</if>> <<if $CombatCardEffects[_i].effectName is "Disrobe">> <<set $EnemyHelmet to false>> <<set $EnemyChestArmour to false>> <<if $NPCInt lt 8>> <<set $NPCInt to $NPCInt + 7>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/Bandit/" + $NPC + "/" + $NPCInt + ".png">> <</if>> <</if>> <<if $CombatCardEffects[_i].effectName is "Armor-Break">> <<if $EnemyHelmet is true>> <<set $EnemyHelmet to false>> <<set $EnemyArmourValue to $EnemyArmourValue - 1>> <<elseif $EnemyChestArmour is true>> <<set $EnemyChestArmour to false>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <</if>> <</if>> <</for>> <<set $$CombatCardEffects to []>> <</if>> <</silently>> /* Display effect messages */ <<if $CombatEnemyStunned>> <div class="effect-message stun">⚡ Enemy stunned! Level reduced by $StunValue.</div> <</if>> <<if $ShouldNavigateAfterEffects>> <<if $NavigationTarget is "EnemyFleesCombat">> <div class="effect-message dreadful">😱 The enemy flees in terror!</div> <<elseif $NavigationTarget is "EnemySurrendersCombat">> <div class="effect-message overwhelming">💪 The enemy surrenders to your overwhelming power!</div> <</if>> <</if>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $BeingRaided is true>> <<if $CurrentRaider.gender is "Female">> <<set _img to random(1, 3)>> <<set $ImagePath to "Images/Castle/Raid/TrapDoor/" + _img + ".webm">> <<set _VidPath to $ImagePath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> With the $CurrentEnemy's mind broken. You lock them away to be sorted later<br><br> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue">> <<goto "Raid">> <</button>> <<else>> <<if $CurrentCaptive.sex is "Female">> <<set $CharPath to $ImagePath>> <<set _int to random(1, 4)>> <<set _imagePath to "Images/Forrest/Encounters/Human/Female/Bandit/" + $NPC + "/Sex/Solo/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Image"> </div> <br><br> <<say $CurrentEnemy '$CharPath'>>Gods!<</say>><br><br> <<button "You think of what to do with her">><<goto "Fight Won">><</button>> <<else>> The man loses himself to the corrupting influence of your weapon, without someone to satisfy him, he loses control of himself and passes out<br><br> <<button "You think of what to do with him">><<goto "Fight Won">><</button>> <</if>> <</if>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You give in to the succubus corruption and allow her to use you in whatever way she likes<br><br> <<set $PlayerCorruption to $PlayerCorruption + 30>> <<set _submit to ["surrender", "submit", "give in", "worship her", "kneel", "obey"]>> <<set _dominate to ["fuck her", "use her", "let her help you", "let her serve you"]>> <<if _submit.includes($Position)>> <div class="Random-image"> <<set _rand to random(1, 4)>> <<if $SuccInt is 6 or $SuccInt is 7>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Normal/Miss/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Glammour/Miss/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Crypt/SuccubusGame/Miss/" + _Vid + ".webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <<else>> <<if $SuccInt is 6 or $SuccInt is 7>> <<set _rand to random(1, 2)>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Normal/throat/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _rand to random(1, 5)>> <<set _imagePath to "Images/Crypt/Enemy/Lesser Succubus/Glammour/throat/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Crypt/SuccubusGame/Bj/" + _Vid + ".webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <</if>> <<button "She takes your soul">> <<set $PlayerHealth to 0>> <<goto "Respawn">> <</button>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<div class="text-box"> <<nobr>> The webs prove too great to pull free from and you stumble and fall to the ground with a crash. Wriggling you try to break free, but the arachness presses down on you and releases your manhood, toying with you<br><br> <<set _rand to random(1, 5)>> <<set _imagePath to "Images/Crypt/Spider/bj/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _rand to random(1, 5)>> <<set _imagePath to "Images/Crypt/Spider/sex/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> After having her fun with you, your left with her other pay for what feels like days... You're not sure when she comes back for you but eventually, you pass out and die <<set _imagePath to "Images/Crypt/Spider/1.jpg">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Resporn">> <<goto "Resporn">> <</button>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<<nobr>> <<include "WeaponData">> <<include "CombatCSS">> <<removeclass "#right-ui-bar" "stowed">> <<if $PlayerEnergy lt 0>> <<set $PlayerEnergy to 0>> <</if>> <<if $PlayerVenom is true>> <<if $PlayerVenomCount is 1>> The venom is starting to take hold, you speed start to slow <<set $PlayerCorruption to $PlayerCorruption + 25>> <<set $PlayerEnergy to $PlayerEnergy - 20>> <<set $PlayerVenomCount to 2>> <<elseif $PlayerVenomCount is 2>> You feel yourself becoming weeker and less willing to battle the Arachness as the venom flows through you <<set $PlayerCorruption to $PlayerCorruption + 25>> <<set $PlayerEnergy to $PlayerEnergy - 20>> <<if $PlayerEnergy lt 0>><<set $PlayerEnergy to 0>><</if>> <<set $PlayerVenomCount to 2>> <<set $PlayerCorruption to $PlayerCorruption + 25>> <<set $PlayerEnergy to $PlayerEnergy - 20>> <<if $PlayerEnergy lt 0>><<set $PlayerEnergy to 0>><</if>> <<elseif $PlayerVenomCount is 3>> <<set $PlayerCorruption to $PlayerCorruption + 25>> <<set $PlayerEnergy to $PlayerEnergy - 20>> <<if $PlayerEnergy lt 0>><<set $PlayerEnergy to 0>><</if>> <</if>> <</if>> <<if ($PlayerCorruption is 100) and ($CurrentEnemy is "Arachness")>> <<goto "CombatCorrupted">> <</if>> <<include "CombatEffectHandler">> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<include "SpellEffects">> <<if $EnemyFleesCombat is true>><<goto "EnemyFleesCombat">><</if>> <<if $EnemySurrendersCombat is true>><<goto "EnemySurrendersCombat">><</if>> <<if $enemyTranceSpellCast is true>><<run window.combatSystem && window.combatSystem.render()>><</if>> <<if $enemyTranceSpellCast is true>> <<if $SuccState is 1>><<set $SuccState to 2>><<else>><<set $SuccState to 4>><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $SuccInt + "/" + $SuccState + ".png">> <<if $enemyTranceSpellCastCount gt 0>> <<set $enemyTranceSpellCastCount to $enemyTranceSpellCastCount - 1>> <<else>> <<set $enemyTranceSpellCast to false>> <<if $SuccState is 2>><<set $SuccState to 1>><<else>><<set $SuccState to 3>><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $SuccInt + "/" + $SuccState + ".png">> <</if>> <</if>> <<if $enemyDominateSpellCast is true>> <<set $SuccState to 4>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $SuccInt + "/" + $SuccState + ".png">> <<if $enemyDominateSpellCastCount gt 0>> <<set $enemyDominateSpellCastCount to $enemyDominateSpellCastCount - 1>> <<else>> <<set $SuccState to 3>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $SuccInt + "/" + $SuccState + ".png">> <<set $enemyDominateSpellCast to false>> <</if>> <</if>> <!-- Enemy Table --> <div class="enemy-section"> <div class="combat-table enemy empty"> <!-- Enemy cards will be rendered here --> </div> </div> <!-- Combat Report Container (between enemy and player tables) --> <div class="combat-report-container empty"> <!-- Combat report will be displayed here --> </div> <!-- Player Table --> <div class="player-section"> <div class="combat-table player empty"> <!-- Player cards will be rendered here --> </div> </div> <div class="combat-actions"> <button class="execute-combat-btn" onclick="CombatSystem.executeCombat()">Execute Combat</button> </div> <!-- Card Filter Buttons --> <div class="card-filters"> <h4>Card Types</h4> <div class="filter-buttons"> <button class="filter-btn" data-filter="all" onclick="CombatSystem.filterCards('all')">All Cards</button> <button class="filter-btn weapon active" data-filter="weapon" onclick="CombatSystem.filterCards('weapon')">Weapons</button> <button class="filter-btn spell" data-filter="spell" onclick="CombatSystem.filterCards('spell')">Magic</button> <button class="filter-btn defence" data-filter="defence" onclick="CombatSystem.filterCards('defence')">Defence</button> <button class="filter-btn potion" data-filter="potion" onclick="CombatSystem.filterCards('potion')">Potions</button> </div> </div> <<set $Int to random(0, 10)>> <<if ($TarotCardInvet.includes("Death")) and ($DeathCardPlayed is false)>> <h3>The death card drains the $CurrentEnemy health before the fight begins</h3> <<set $EnemyHealth to $EnemyHealth - 10>> <<set $DeathCardPlayed to true>> <</if>> <<if ($TarotCardInvet.includes("Devil")) and ($VoidEnemy is true)>> <h3>Having the Devil tarot card, means the $CurrentEnemy does less damage</h3> <</if>> <<if ($TarotCardInvet.includes("Magician")) and ($Int gt 6) and ($MagicianCardPlayed is false)>> <h3>The magician tarot card plays its tricks and drains your magical power</h3> <<set $PlayerMagic to 0>> <<set $MagicianCardPlayed to true>> <</if>> <<if $enemyDominateSpellCast is true>> <h3>Some of your cards are corrupted</h3> <<elseif $enemyTranceSpellCast is true>> <h3>You are falling for her trance, focusing becomes hard</h3> <</if>> <<if $PlayerEntangled is true>> <h3>You're partly entangled in a web and cannot use your weapons, free yourself or kill the beast before she can fully entangle you!</h3> <</if>> <!-- Player Hand --> <div class="card-hand"> <!-- Player cards will be rendered here --> </div> <<script>> $(document).one(':passageend', function() { if(passage() === 'Combat') { setTimeout(() => { CombatSystem.init(); }, 100); } }); <</script>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set $Time to $Time + 3>> <<if $AliceCorruption == 0>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/1.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $AliceCorruption == 20>> You cast a corruption spell on Alice while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/2.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $AliceCorruption == 40>> You cast a corruption spell on Alice while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/3.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $AliceCorruption == 60>> You cast a corruption spell on Alice while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/4.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $AliceCorruption == 80>> You cast a corruption spell on Alice while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/5.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $AliceCorruption == 100>> You cast the possession spell causing Alice to loose herself and let you fuck her from behind <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/6.webm" type="video/webm"> </video> <br><br> <video autoplay loop> <source src="Images/Castle/Dungon/Woman/5/corrupt/7.webm" type="video/webm"> </video> You posess Alice, turning her into a succubus. You release her from the Dungeon and give her a [[room|Succubus2]] <<run $DungonOccupance.delete(_prisoner)>> <<set $AliceHunger to 0>> <<set $AliceDefend to false>> <<set $AliceCorrupt to true>> <<set $Chamber2 to "Alice">> <<set $AliceImg to "Images/Castle/Alice/3.png">> <div class="Random-image"> <<set _imagePath to $AliceImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <</nobr>> </div> <<set _prisoner.corruption to _prisoner.corruption + 20>> <<set $AliceCorruption to $AliceCorruption + 20>>
<<nobr>> <<include "LucyDungeonLinesMale">> <<if $Position is "KeepWarm">> You start subtly shaking<br><br> <<set _line = either(_coldLines)>> <<say 'Lucy' $LucyImg>>_line<</say>><br><br> <<if $Personality is "Arrogant">> <<say 'Prisoner' $CharacterPath>>Sure... I'm cold too<</say>><br><br> <<elseif $Personality is "Defensive">> <<say 'Prisoner' $CharacterPath>>Sorry but not a chance, stay over there<</say>><br><br> <<else>> <<say 'Prisoner' $CharacterPath>>I-I... Ok, just to keep warm<</say>> <</if>> <<if $Personality isnot "Defensive">> You stand and strech letting the clothes (which you knew were too small) ride up slightly too much. Then you walk over to him and lay on the narrow cot besides him, its far too small for you both, so you place a leg over his waist and and arm over his chest. Then you pull in close for "warmth" and let your tight body press against his<br><br> <<say 'Lucy' $LucyImg>>T-Thank you...<</say>><br><br> He places a hand on your thigh and you feel his guard slip<br><br> <<set $WillPower to 90>> You close your eyes and pretend to sleep, letting your body do the work<br><br> After some time the mans lonlyness or prehaps his frustartion gets the better of him and he slides his hand up your leg to your soft ass<br><br> <<button "Act innocent and pretend to sleep">> <<goto "CorruptionPrisoner2">> <<set $Position to "Sleep">> <</button>><br> <<button "Take charge and reach for his cock">> <<goto "CorruptionPrisoner2">> <<set $Position to "Dominate">> <</button>><br> <<else>> You stand and strech letting the clothes (which you knew were too small) ride up slightly too much <</if>> <div class="character-card"> <div class="character-image"> <img @src=$CharacterPath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personality:</span> $Personality</p> <p><span class="info-label">Desire:</span> To be $Desire</p> <p><span class="info-label">Likes:</span> <<set _visibleCount = Math.floor($Understanding / 10)>> <<for _i to 0; _i < $NPCLikes.length; _i++>> <<if _i < _visibleCount>> $NPCLikes[_i] <<else>> <span class="blurred">$NPCLikes[_i]</span> <</if>> <<if _i < $NPCLikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Dislikes:</span> <<for _i to 0; _i < $NPCDislikes.length; _i++>> <<if _i < _visibleCount>> $NPCDislikes[_i] <<else>> <span class="blurred">$NPCDislikes[_i]</span> <</if>> <<if _i < $NPCDislikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Neutral:</span> <<for _i to 0; _i < $DungeonActivies.length; _i++>> <<if _i < _visibleCount>> $DungeonActivies[_i] <<else>> <span class="blurred">_sourceArray[_i]</span> <</if>> <<if _i < $DungeonActivies.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Will Power: <progress @value="$WillPower" max="100"></progress></span></p> </div> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set $Time to $Time + 3>> <<if $LucyCorruption == 0>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/1.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $LucyCorruption == 20>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/2.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $LucyCorruption == 40>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/3.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $LucyCorruption == 60>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/4.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $LucyCorruption == 80>> You cast a corruption spell on Lucy while playing with her, bringing her closer to total obedience <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/5.webm" type="video/webm"> </video> [[Leave|Inside Castle]] <</if>> <<if $LucyCorruption == 100>> You cast the possession spell causing lucy to loose herself and let you use her ass <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/6.webm" type="video/webm"> </video> <br><br> <video autoplay loop> <source src="Images/Castle/Dungon/Woman/4/corrupt/7.webm" type="video/webm"> </video> You posess Lucy, turning her into a succubus. You release her from the Dungeon and give her a [[room|Succubus1]] <<run $DungonOccupance.delete(_prisoner)>> <<set $LucyHunger to 0>> <<set $LucyDefend to false>> <<set $LucyCorrupt to true>> <<set $Chamber1 to "Lucy">> <<set $LucyImg to "Images/Castle/Lucy/6.png">> <div class="Random-image"> <<set _imagePath to $LucyImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <</nobr>> </div> <<set _prisoner.corruption to _prisoner.corruption + 20>> <<set $LucyCorruption to $LucyCorruption + 20>>
<div class="text-box"> <<set $Time to $Time +5>> You cast a corrupting spell on the flower allowing it to poison the mind of anyone who holds it. <div align="center"> <img src="Images/Crypt/1.png" width="700" height="700"> </div> <<set $Flower to true>> <<set $CryptFinished to true>> <<button "Return to the castle">> <<goto "Base Intro">> <</button>> <<set $Crypt to false>> </div>
<<nobr>><div class="text-box"> <<if typeof $CourtyardOccupance !== "undefined" and $CourtyardOccupance.length gt 0>> <h1>Training Courtyard</h1> <<if !$CourtyardOccupance>><<set $CourtyardOccupance = []>><</if>> <<if $TrainingPrisoner && !$TrainingScenePlayed>> <div class="training-description"> You dominate the prisoners mind, making them more agresive and driven, this will make them a better training target for your subject.<br> <<if $selectedTrainer.sex is "Female" && _prisoner.sex is "Male">> <<set _VidPath to "Images/Castle/Courtyard/Sex/FM.webm">> The woman attacks the prisoner and quickly has him on the ground, she takes the oppertunity to enjoy her victory in the first of many fights they will have today<br> <<elseif $selectedTrainer.sex is "Male" && _prisoner.sex is "Female">> The man quickly overpowers the woman and they fight together on the training floor. It does not take long for the prisoner to become over powered and your guard takes the advantage<br> <<set _VidPath to "Images/Castle/Courtyard/Sex/FM.webm">> <<elseif $selectedTrainer.sex is "Male" && _prisoner.sex is "Male">> The two men clash together and you leave them to spar for the rest of the day<br> <<else>> The two woman wrestle to the ground, one quickly overpowers the other and takes full advantage of the position, you leave them to enjoy eachother<br> <<set _VidPath to "Images/Castle/Courtyard/Sex/FF.webm">> <</if>> </div> <<set $TrainingScenePlayed to true>> <video autoplay loop> <source @src="_VidPath" type="video/webm" onerror="this.style.display='none'"> </video> <</if>> You currently have $CourtyardOccupance.length units training (Maximum: 5)<br><br> <<if $CourtyardOccupance.length === 0>> <p>The courtyard is empty. Send units here to begin training.</p> <<else>> <div id="training-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CourtyardOccupance.length; _i++>> <<capture _trainee>> <<set _trainee to $CourtyardOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_trainee.ImagePath" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _trainee.name>></h3> <p>Training: <<print _trainee.specialization>></p> <h4>Skill Level:</h4> <progress @value="_trainee.skill" max="100"></progress> <<button "End Training">> <<run $BarraksOccupance.push(_trainee)>> <<run $CourtyardOccupance.delete(_trainee)>> <<goto "CourtyardTraining">> <</button>> </div> <</capture>> <</for>> </div> <</if>> <</if>> <div style="text-align: center; margin-top: 20px;"> <<if $CombatTutorialComplete isnot true>> <<button "Practice Combat">> <<goto "Encounter_Practice">> <</button>><br> <</if>> <h2>Courtyard defences</h2><br> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<if $CourtyardTentaclesDefence isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Seige/Trap/Icons/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Writhing Tentacles</h3> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Build">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $CourtyardTentaclesDefence to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if $ForestSpiderDefence isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Seige/Trap/Icons/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Forest Spiders</h3> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Build">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $ForestSpiderDefence to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> </div> <<button "Leave">> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<<nobr>> <<set _prisoner to $CultOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set _Img to random(1, 2)>> <<set $ImagePath to "Images/Forrest/Cult/Cultists/Brown/Sex/" + $Position +"/" + _Img + ".png">> $ImagePath <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<if $Position isnot "Front">> <<link "Tell her to get on her knees">> <<set $Position to "Front">> <<run Engine.show()>> <</link>><br><</if>> <<if !$Position isnot "Back">> <<link "Tell her to lay on her back">> <<set $Position to "Back">> <<run Engine.show()>> <</link>><</if>> <hr> Pleasure her<br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Finger her">><<set $Position to "Finger">><<run Engine.play('Fuck Elizabeth2')>><</link>> <hr> Pleasure Yourself<br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Let her stroke you">><<set $Position to "Hj">><<run Engine.play('Fuck Elizabeth2')>><</link>> <hr> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $CurrentEnemy is "Ghoul">> You land a perfect hit on the ghoul, the arrow strikes the figure in the centre of its chest, a killing blow for any living thing... But the figure doesn't react, instead it turns slowly to face you... <<set $EnemyHealth to $EnemyHealth - 25>> <<link "Continue">><<run Engine.play('GhoulQuest2')>><</link>> <</if>> <<if $CurrentEnemy is "Armored Bandit">> You land a critical hit on the bandit, but his armor is thick and only does 25 damage<br><br> <<set $EnemyHealth to 75>> [[Combat]] <</if>> <<if $CurrentEnemy is "Werewolf">> You land a perfect hit on the beast and it stumbles, its enormous form crashing to the ground and sliding across the floor<br><br> You nock another arrow and fire it into the beasts chest... Kill it<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<link "Leave">> <<script>> UI.alert("Quest complete! <br>You now have a weapon strong enough to kill the werewolf"); <</script>> <<run $Quests.delete("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run Engine.play('WolfQuestOver')>> <</link>> <</if>> <<if ($OldPosition is "bet") or ($OldPosition is "betDouble")>> Your arrow strikes the center target, scoring you 30 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<say 'Huntress' _img>>Humm, lucky shot<</say>> <<set $PlayerArcheryScore to $PlayerArcheryScore + 30>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore <<if $Int lt 3>> <<button "Her turn">> <<goto "NPCArrowShot">> <</button>> <<else>> <<button "The game is over">> <<goto "ArrowGameOver">> <</button>> <</if>> <</if>> </div> <audio autoplay> <source src="Audio/ArrowShot.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <</nobr>>
<<set $Crypt to true>> <<nobr>> <div class="text-box"> You enter the crypt. It's dark, cold, and damp. You pause for a moment, straining to hear any sound, but the silence is absolute. Steeling yourself, you press forward, hoping to find something—anything.<br><br> <<set $CryptLevel to 1>> <<set $Route = random(0, 1)>> <<if $Crypt1Won is false>> <<set $EncounterHappen = random(0, 9)>> <<set $WhichEncounter = random(0, 2)>> <<if $EncounterHappen <= 3>> <<if $WhichEncounter is 0>> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">><</if>> <<if $WhichEncounter is 1>> <<set $CurrentEnemy to "skeleton">> <<set $ImagePath to "Images/Crypt/Enemy/Skell/3.png">><</if>> <<if $WhichEncounter is 2>> <<set $CurrentEnemy to "ghoul">> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/1.png">><</if>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> Before you stands a $CurrentEnemy<br><br> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span> </div></p> </div> </div> <<set $Crypt1Won to true>> [[Fight|Combat]] <<else>> <<if $Route == 0>> [[Go left|Crypt2]]<br> [[Go Right|Chamber1]] <<else>> [[Go left|Chamber1]]<br> [[Go Right|Crypt2]] <</if>><</if>> <<else>> <<if $Route == 0>> [[Go left|Crypt2]]<br> [[Go Right|Chamber1]] <<else>> [[Go left|Chamber1]]<br> [[Go Right|Crypt2]] <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $CryptLevel to 2>> <<set $Route = random(0, 1)>> <<if $Crypt2Won is false>> <<set $EncounterHappen = random(0, 9)>> <<set $WhichEncounter = random(0, 2)>> <<if $EncounterHappen <= 3>> <<if $WhichEncounter is 0>> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <</if>> <<if $WhichEncounter is 1>> <<set $CurrentEnemy to "skeleton">> <<set $ImagePath to "Images/Crypt/Enemy/Skell/3.png">> <</if>> <<if $WhichEncounter is 2>> <<set $CurrentEnemy to "ghoul">> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/1.png">> <</if>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span> </div></p> </div> </div> <<set $Crypt2Won to true>> [[Fight|Combat]] <<else>> <<if $Route == 0>> [[Go left|Crypt3]]<br> [[Go Right|Chamber2]] <<else>> [[Go left|Chamber2]]<br> [[Go Right|Crypt3]] <</if>><</if>> <<else>> <<if $Route == 0>> [[Go left|Crypt3]]<br> [[Go Right|Chamber2]] <<else>> [[Go left|Chamber2]]<br> [[Go Right|Crypt3]] <</if>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $CryptLevel to 3>> <<set $Route = random(0, 1)>> <<if $Crypt3Won is false>> <<set $EncounterHappen = random(0, 9)>> <<set $WhichEncounter = random(0, 2)>> <<if $EncounterHappen <= 3>> <<if $WhichEncounter is 0>> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <</if>> <<if $WhichEncounter is 1>> <<set $CurrentEnemy to "skeleton">> <<set $ImagePath to "Images/Crypt/Enemy/Skell/3.png">> <</if>> <<if $WhichEncounter is 2>> <<set $CurrentEnemy to "ghoul">> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/1.png">> <</if>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span> </div></p> </div> </div> <<set $Crypt3Won to true>> [[Fight|Combat]] <<else>> <<if $Route == 0>> [[Go left|Crypt4]]<br> [[Go Right|Chamber3]] <<else>> [[Go left|Chamber3]]<br> [[Go Right|Crypt4]] <</if>><</if>> <<else>> <<if $Route == 0>> [[Go left|Crypt4]]<br> [[Go Right|Chamber3]] <<else>> [[Go left|Chamber3]]<br> [[Go Right|Crypt4]] <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $CryptLevel to 4>> <<set $Route = random(0, 1)>> <<if $Crypt3Won is false>> <<set $EncounterHappen = random(0, 9)>> <<set $WhichEncounter = random(0, 2)>> <<if $EncounterHappen <= 3>> <<if $WhichEncounter is 0>> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <</if>> <<if $WhichEncounter is 1>> <<set $CurrentEnemy to "skeleton">> <<set $ImagePath to "Images/Crypt/Enemy/Skell/3.png">> <</if>> <<if $WhichEncounter is 2>> <<set $CurrentEnemy to "ghoul">> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/1.png">> <</if>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span> </div></p> </div> </div> <<set $Crypt3Won to true>> [[Fight|Combat]] <<else>> <<if $Route == 0>> [[Go left|BossCrypt]]<br> [[Go Right|Chamber4]] <<else>> [[Go left|Chamber4]]<br> [[Go Right|BossCrypt]] <</if>><</if>> <<else>> <<if $Route == 0>> [[Go left|BossCrypt]]<br> [[Go Right|Chamber4]] <<else>> [[Go left|Chamber4]]<br> [[Go Right|BossCrypt]] <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Victory</h1> <p2>You defeated the $CurrentEnemy</p2> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You look around and find two items on a plinth, touching one will cause the other to turn to dust<br><br> The corruption rune, which will corrupt people in your dungeon quicker<br><br> Or<br><br> A tarot card<br><br> <<button "Take the rune">> <<set $CorruptionRune to 1>> <<goto "Base Intro">> <<script>> UI.alert("You take the rune back to your castle, increasing the speed of corruption in your dungeon"); <</script>> <</button>><br> <<if $TarotCardInvet.length >= 3>> You can't carry any more tarot cards <<else>> <<button "Take the tarot card">> <<goto "Tarot Turn">> <</button>><br> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have alrady searched this cell<br><br> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <<set _rand to random(0, 1)>> <<if _rand is 0>> Searching the blood stained cell, you find a corps holding a pendant, you pick it up an read it<br><br> Etched in dark, tarnished silver, the script curls unnaturally, as if the letters were carved by something with too many fingers:<br><br> <i>Blood to breath, pain to power. Ten drops for the flame to rise.<br> Touch and be unmade, remade, alight once more.</i><br><br> The pendant can restore your magic in exchange for 10 health<br><br> <<if $PlayerHealth gt 10>> <<button "Use it">> <<set $PlayerHeath to $PlayerHealth - 10>> <<set $PlayerMagic to $PlayerMaxMagic>> <<<<goto "CryptExplore">> <<script>> UI.alert("You sacrifice your health in exchange for magic and leave the pendant"); <</script>> <</button>> <<else>> You are alrady too injured to give this<br><br> <</if>> <</if>> <<if _rand is 1>> Searching the blood stained cell, you find a corps holding a pendant, you pick it up an read it<br><br> Etched in dark, tarnished silver, the script curls unnaturally, as if the letters were carved by something with too many fingers:<br><br> <i>Give what drives you, take what tempts you.<br> Gold gleams brighter in the hands of the broken.</i><br><br> The pendant can give you 50 gold in exchange for half your remaining enegy<br><br> <<if $PlayerEnergy gt 10>> <<button "Use it">> <<set $PlayerEnergy to $PlayerEnergy / 2>> <<set $Gold to $Gold + 50>> <<<<goto "CryptExplore">> <<script>> UI.alert("You feel your strength leave you as the pendant turns to a small handful of gold in your hands"); <</script>> <</button>> <<else>> You are alrady too week to give this<br><br> <</if>> <</if>> <</if>> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have already searched this chest<br><br> <<else>> <i>click on the chest to open it</i> <div id="chest-container"> <img id="chest-image" src="Images/Crypt/Chest.png"> </div> <div id="treasure-text" style="display: none"> <<set $ChestFind = random(0, 4)>> <<if $ChestFind is 0>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>> <<if $ChestFind is 1>> You find a minor healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <div align="center"> <img src="Images/Items/Potions/MinHP_potion.png" width="300" height="300"> </div> <</if>> <<if $ChestFind is 2>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <div align="center"> <img src="Images/Items/Potions/MP_potion.png" width="300" height="300"> </div> <</if>> <<if $ChestFind is 3>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <div align="center"> <img src="Images/Items/Potions/EN_potion.png" width="300" height="300"> </div> <</if>> <<if $ChestFind is 4>> <div id="potion-card-discovery"> <div style="text-align: center; color: #ffd700; font-size: 1.3em;"> <strong>You found a magical potion card!</strong><br> <em>Watch as it joins your combat collection...</em> </div> </div> <</if>> <<if $ChestFind is 5>> You find a silver dagger <<set $SilverDaggers to $SilverDaggers + 1>> <div align="center"> <img src="Images/Items/Melee Weapons/dagger.png" width="300" height="300"> </div> <</if>> <<set $CryptLoad to $CryptLoad + 1>> </div> <<set $CryptSearchLogs.push(_fullId)>> <</if>> <<button "Leave">><<goto "CryptExplore">><</button>> </div> <style> #chest-container { cursor: pointer; text-align: center; margin: 20px 0; } #chest-image { max-width: 300px; transition: transform 0.3s ease; } #chest-image:hover { transform: scale(1.05); } #treasure-text { margin-top: 20px; font-size: 1.2em; color: #ffd700; text-align: center; } #potion-card-discovery { padding: 20px; background: rgba(0, 0, 0, 0.3); border-radius: 10px; margin: 20px 0; } /* Animation styles for the potion card */ #animated-potion-card { box-shadow: 0 0 20px rgba(255, 215, 0, 0.8) !important; border: 2px solid #ffd700 !important; } /* Basic card styles */ .card { display: inline-block; margin: 5px; border-radius: 10px; overflow: hidden; box-shadow: 0 4px 8px rgba(0,0,0,0.2); background: white; width: 200px; height: 280px; padding: 10px; box-sizing: border-box; font-family: Arial, sans-serif; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;')>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<script>> console.log("Chest script loading..."); // Potion card data window.potionCards = [ { variable: 'MinorHealingPotion', name: 'Minor Healing Potion', type: 'potion', image: 'Images/Items/Potions/MinHP_potion.png', energyCost: 0, magicCost: 0, damage: 0, effects: [{name: 'healing', value: 20}], description: 'Restores 20 health' }, { variable: 'HealingPotion', name: 'Healing Potion', type: 'potion', image: 'Images/Items/Potions/HP_potion.png', energyCost: 0, magicCost: 0, damage: 0, effects: [{name: 'healing', value: 50}], description: 'Restores 50 health' }, { variable: 'MagicPotion', name: 'Magic Potion', type: 'potion', image: 'Images/Items/Potions/MP_potion.png', energyCost: 0, magicCost: 0, damage: 0, effects: [{name: 'magic', value: 20}], description: 'Restores 20 magic' }, { variable: 'EnergyPotion', name: 'Energy Potion', type: 'potion', image: 'Images/Items/Potions/EN_potion.png', energyCost: 0, magicCost: 0, damage: 0, effects: [{name: 'energy', value: 50}], description: 'Restores 50 energy' } ]; // Simple card creation function function createSimpleCardElement(card) { console.log("Creating card element for:", card.name); const cardDiv = document.createElement('div'); cardDiv.className = 'card'; cardDiv.style.cssText = ` width: 200px; height: 280px; background: linear-gradient(135deg, #f4e4bc 0%, #fff2cc 100%); border-radius: 10px; padding: 10px; box-sizing: border-box; font-family: Arial, sans-serif; position: relative; `; const effectsText = card.effects ? card.effects.map(effect => `${effect.name}${effect.value > 1 ? ` ${effect.value}` : ''}`).join(', ') : ''; cardDiv.innerHTML = ` <div style="text-align: center;"> <div style="background: #8B4513; color: white; padding: 2px 8px; border-radius: 12px; font-size: 10px; margin-bottom: 5px;">${card.type}</div> <div style="font-weight: bold; font-size: 14px; margin-bottom: 10px;">${card.name}</div> <img src="${card.image}" alt="${card.name}" style="width: 80px; height: 80px; object-fit: cover; border-radius: 5px; margin-bottom: 10px;" onerror="this.style.display='none'"> ${effectsText ? `<div style="color: #4CAF50; font-size: 12px; margin-bottom: 5px;">${effectsText}</div>` : ''} <div style="font-size: 11px; color: #666; line-height: 1.3;">${card.description}</div> </div> `; return cardDiv; } // Function to animate potion card function animatePotionCard(potionCard) { console.log('Starting animation for:', potionCard.name); const cardElement = createSimpleCardElement(potionCard); cardElement.id = 'animated-potion-card'; // Set initial position cardElement.style.position = 'fixed'; cardElement.style.top = '50%'; cardElement.style.left = '50%'; cardElement.style.transform = 'translate(-50%, -50%) scale(0)'; cardElement.style.zIndex = '1000'; cardElement.style.transition = 'all 1.5s ease-out'; cardElement.style.pointerEvents = 'none'; cardElement.style.boxShadow = '0 0 20px rgba(255, 215, 0, 0.8)'; cardElement.style.border = '2px solid #ffd700'; document.body.appendChild(cardElement); // Animate appearance setTimeout(() => { cardElement.style.transform = 'translate(-50%, -50%) scale(1)'; cardElement.style.opacity = '1'; }, 100); // Slide away setTimeout(() => { cardElement.style.left = '20px'; cardElement.style.top = '20px'; cardElement.style.transform = 'scale(0.3)'; cardElement.style.opacity = '0.8'; }, 1500); // Remove and add to inventory setTimeout(() => { cardElement.remove(); // Add to combat system if available if (window.CombatSystem) { const cardInstance = { ...potionCard, id: `potion_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`, slotType: 'consumable' }; window.CombatSystem.addCard(cardInstance); if (window.updateInventoryCount) { window.updateInventoryCount(); } } // Show confirmation const msg = document.createElement('div'); msg.style.cssText = ` position: fixed; top: 20px; right: 20px; background: rgba(0, 0, 0, 0.8); color: #ffd700; padding: 10px 20px; border-radius: 5px; z-index: 1001; font-weight: bold; border: 2px solid #ffd700; `; msg.textContent = `${potionCard.name} added to inventory!`; document.body.appendChild(msg); setTimeout(() => msg.remove(), 3000); }, 3000); } // Function to handle potion card discovery function discoverPotionCard() { console.log("Discovering potion card..."); const randomIndex = Math.floor(Math.random() * window.potionCards.length); const potionCard = window.potionCards[randomIndex]; console.log("Selected potion:", potionCard.name); // Update Twine variable if (typeof State !== 'undefined' && State.variables) { const currentCount = State.variables[potionCard.variable] || 0; State.variables[potionCard.variable] = currentCount + 1; console.log(`Updated ${potionCard.variable} to ${currentCount + 1}`); } // Update treasure text const treasureText = document.getElementById('treasure-text'); if (treasureText) { treasureText.innerHTML = ` <div style="text-align: center; color: #ffd700; font-size: 1.3em; margin-bottom: 20px;"> <strong>You found a ${potionCard.name}!</strong><br> <em>The card has been added to your combat inventory.</em> </div> `; } // Start animation animatePotionCard(potionCard); } // Main chest click handler $(document).ready(function() { console.log("Document ready, setting up chest click handler"); $("#chest-image").one("click", function() { console.log("Chest clicked!"); // Change chest image $("#chest-image").attr("src", "Images/Crypt/Chest2.png"); // Show treasure text $("#treasure-text").fadeIn(1000); // Check if we found a potion card const chestFind = State.variables.ChestFind; console.log("ChestFind value:", chestFind); if (chestFind === 5) { console.log("Potion card found! Starting discovery..."); setTimeout(() => { discoverPotionCard(); }, 1500); } }); console.log("Chest click handler set up successfully"); }); console.log("Chest script loaded successfully"); <</script>>
<<nobr>> <div class="text-box"> <audio autoplay> <source src="Audio/ChestOpending.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<set $ChestFind = random(0, 3)>> <<if $ChestFind is 0>> You open the chest and find 100 gold <<set $Gold to $Gold + 100>> <</if>> <<if $ChestFind is 1>> You find a minior healing potion <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <div align="center"> <img src="Images/Items/Potions/MinHP_potion.png" width="700" height="700"> </div> <</if>> <<if $ChestFind is 2>> You find a magic boosting potion <<set $MagicPotion to $MagicPotion + 1>> <div align="center"> <img src="Images/Items/Potions/MP_potion.png" width="700" height="700"> </div> <</if>> <<if $ChestFind is 3>> You find an energy boosting potion <<set $EnergyPotion to $EnergyPotion + 1>> <div align="center"> <img src="Images/Items/Potions/EN_potion.png" width="700" height="700"> </div> <</if>> <<button "Leave">><<run Engine.play($ReturnPassage)>><</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<link "Leave">><<run Engine.play($ReturnPassage)>><</link>>
<<nobr>> <<set $OldPosition to $Position>> <div class="text-box"> <<set _int to random(0, 3)>> <<if _int is 0>> <<goto "Encounter_Succ">> <</if>> <<if _int is 1>> <<goto "Encounter_Ghoul">> <</if>> <<if _int is 2>> <<goto "Encounter_Undead">> <</if>> <<if _int is 3>> <<goto "Encounter_Skell">> <</if>> <h2>$CurrentEnemy</h2> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> A $CurrentEnemy stands in your way<br><br> <<if $CurrentEnemy is "Vampire">> <<button "She speaks to you">> <<goto "CryptVampireStart">> <</button>> <<else>> <<button "Attack">> <<goto "Combat">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You stand infront of the enterance of a crypt<br><br> <<if $CryptFinished is true>> <<if ($Souls gt 0) and ($EishethMet is true)>> <<button "Enter">> <<goto "CryptGeneration">> <</button>> <<else>> Theres something dark in there... I should return when I have more power <</if>><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> <div align="center"> <img src="Images/Crypt/2.png" width="700" height="700"> </div><br><br> <<if ($Souls gt 0) and ($EishethMet is true)>> <<button "Enter">> <<goto "CryptGeneration">> <</button>> <<else>> Theres something dark in there... I should return when I have more power <</if>><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<set $CryptLevel to 0>> <<set $Chamber1 to false>> <<set $Chamber2 to false>> <<set $Chamber3 to false>> <<set $Chamber4 to false>> <<set $Crypt1Won to false>> <<set $Crypt2Won to false>> <<set $Crypt3Won to false>> <<set $Crypt4Won to false>> <<set $BossFight to false>> <<set $NPCCum to 0>> <</if>> </div> <</nobr>>
<<nobr>> <<set _img to random(1, 36)>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<set $currentMapId = "Crypt-" + $playerY + "-" + $playerX>> <<set _int to random(1, $CryptSpawnRate)>> <<set _slimeInt to random(1, 3)>> <<if ($SimeSpawnLocations.includes($CryptLocation)) and (_slimeInt is 1) and ($SlimeGirlsDisables isnot true)>> Slime attack<br> <<goto "CryptSlimeAttack">> <<elseif _int is 1>> <<goto "CryptEnemyMenu">> <<else>> <<if not $executionLock>> <<set $executionLock to true>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</if>> <</if>> <</nobr>>
<<nobr>> <<set $CryptLoad to 0>> <<set setup.buildingData = new Map()>> <<set $executionLock to false>> <<include "CryptLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $CryptLocation>> <img @src=_imagePath alt="Dungeon Location" width="800" height="800"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($CryptLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<set _currentCell to $dungeon[$playerY][$playerX]>> <<set _directions to ["top", "left", "right", "bottom"]>> <<set _labels to { "top": "Up", "left": "Left", "right": "Right", "bottom": "Down" }>> <div class="navigation-buttons"> <div class="nav-row"> <<if _currentCell.connections.includes('top')>> <<button "Up">> <<set $Position to "top">><<goto "CryptExploreRelay">> <</button>> <</if>> </div> <div class="nav-row"> <<if _currentCell.connections.includes('left')>> <<button "Left">> <<set $Position to "left">><<goto "CryptExploreRelay">> <</button>> <</if>> <<if _currentCell.connections.includes('right')>> <<button "Right">> <<set $Position to "right">><<goto "CryptExploreRelay">> <</button>> <</if>> </div> <div class="nav-row"> <<if _currentCell.connections.includes('bottom')>> <<button "Down">> <<set $Position to "bottom">><<goto "CryptExploreRelay">> <</button>> <</if>> </div> <<if _imagePath.includes("Chamber")>> You have found the final chamber of this crypt you can enter it or continue exploring<br><br> <<button "Enter the final chamber">> <<goto "DynamicCryptFinalChamber">> <</button>> <</if>> </div> <style> .navigation-buttons { display: flex; flex-direction: column; align-items: center; gap: 5px; margin-top: 20px; } .nav-row { display: flex; gap: 10px; } .nav-button { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; width: 80px; } .nav-button:disabled { background-color: #cccccc; cursor: not-allowed; } .nav-button:not(:disabled):hover { background-color: #45a049; } .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; width: 800px !important; height: 800px !important; border: 2px solid white !important; } .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; border-radius: 50% !important; border: none !important; } .hotspot .tooltip { opacity: 0; visibility: hidden; position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: opacity 0.3s, visibility 0.3s; } .hotspot:hover { background-color: rgba(255, 255, 255, 0.2) !important; border: 2px solid white !important; } .hotspot:hover .tooltip { opacity: 1; visibility: visible; } .circle.hidden { opacity: 0.1; } </style> <<script>> jQuery(document).ready(function() { jQuery(document).on('keydown', function(e) { const currentCell = State.variables.dungeon[State.variables.playerY][State.variables.playerX]; if (currentCell && currentCell.connections) { const directions = { 37: ['left', 'left'], 38: ['top', 'up'], 39: ['right', 'right'], 40: ['bottom', 'down'] }; if (directions[e.which] && currentCell.connections.includes(directions[e.which][0])) { State.variables.Position = directions[e.which][0]; Engine.play('CryptExploreRelay'); } } }); $('.hotspot').on('click', function(e) { e.preventDefault(); e.stopPropagation(); let currentPath = State.variables.CryptLocation; let pos = setup.buildingData.get(currentPath).hotspots.find(h => h.x === parseInt($(this).css('left')) && h.y === parseInt($(this).css('top')) ).position; State.variables.currentHotspotId = setup.buildingData.get(currentPath).hotspots.find(h => h.x === parseInt($(this).css('left')) && h.y === parseInt($(this).css('top')) ).id; let nextPassage = $(this).data('passage'); Engine.play(nextPassage); return false; }); }); <</script>> <<script>> console.log("CryptExplore loaded, Position:", State.variables.Position); <</script>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $TarotCardInvet.length >= 3>> You cannot carry any more tarot cards, but you find 300 gold and leave<br><br> <<button "Go home">> <<set $Gold to $Gold + 200>> <<goto "Base Intro">> <</button>> <<else>> You unlock the door and enter the final chamber, its smaller than you expected and in centre there is a small wooden table. On the table is a card, facing down...<br><br> <<button "Approach the table">> <<goto "Tarot Turn">> <</button>> <</if>> <<set $Time to 9>> </div> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/19.png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _selectedName = Story.get("CryptNames").text.split("\n").filter(name => name.trim() !== "").random()>> <div id="loading-screen" class="loading-overlay"> <div class="loading-content"> <div class="loading-spinner"></div> <div class="loading-text">Generating Crypt...</div> </div> </div> <<set $NewCrypt to true>> <<set setup.visitedPositions = new Set()>> <<set _img to random(1, 36)>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<set _dungeonGenerated to false>> <<set _retryCount to 0>> <<set _maxRetries to 10>> <<set $CruptMapFound to false>> <<widget "generateAndValidate">> <<set $dungeon to window.generateDungeon()>> <<set $chamberLocation to window.selectChamberLocation($dungeon)>> <<set _pathInfo to []>> /* Build pathInfo while generating the map */ <<for _row = 0; _row < $dungeonSize; _row++>> <<for _col = 0; _col < $dungeonSize; _col++>> <<set _connections = $dungeon[_row][_col].connections>> <<if _row === $chamberLocation.row && _col === $chamberLocation.col>> <<set _imagePath to getChamberImage(_connections)>> <<else>> <<set _imagePath to getImagePath(_connections)>> <</if>> <<run _pathInfo.push({ row: _row, col: _col, path: _imagePath, connections: _connections, isChamber: (_row === $chamberLocation.row && _col === $chamberLocation.col) })>> <</for>> <</for>> <<set $pathInfo to _pathInfo>> <<set $dungeonPaths to {}>> <<for _cell range _pathInfo>> <<set $dungeonPaths[_cell.row + '-' + _cell.col] to _cell.path>> <</for>> <<set _errors to window.validateDungeon($dungeon, _pathInfo, $chamberLocation)>> <<if _errors && _errors.length === 0>> <<set _dungeonGenerated to true>> <<run $("#loading-screen").fadeOut()>> <<run $(".crypt-info").show()>> <<else>> <<set _retryCount += 1>> <<if _retryCount < _maxRetries>> <<timed 100ms>><<generateAndValidate>><</timed>> <<else>> <<goto "CryptDifficulty">> <</if>> <</if>> <<endwidget>> /* Set initial dungeon parameters */ <<if $MaxNotiriaty is 2>> <<set $dungeonSize to random(0, 9) > 3 ? 4 : 4>> <<elseif $MaxNotiriaty <= 4>> <<set $dungeonSize to random(0, 9) <= 3 ? 4 : (random(0, 9) <= 7 ? 6 : 8)>> <<else>> <<set $dungeonSize to random(0, 9) <= 2 ? 4 : (random(0, 9) <= 5 ? 6 : 8)>> <</if>> <<set $CryptSpawnRate to random(3, 5)>> <<set $cryptDifficulty = "Unknown">> <<if $dungeonSize is 4>> <<if $CryptSpawnRate <= 4>> <<set $cryptDifficulty = "Easy">> <<else>> <<set $cryptDifficulty = "Medium">> <</if>> <<elseif $dungeonSize is 6>> <<if $CryptSpawnRate is 3>> <<set $cryptDifficulty = "Easy">> <<else>> <<set $cryptDifficulty = "Medium">> <</if>> <<else>> <<if $CryptSpawnRate is 3>> <<set $cryptDifficulty = "Medium">> <<else>> <<set $cryptDifficulty = "Hard">> <</if>> <</if>> <<timed 500ms>><<generateAndValidate>><</timed>> <div class="crypt-info" style="display: none"> <div class="difficulty-card"> <h2> _selectedName</h2> <div class="stat-row"> <span class="stat-label">Difficulty:</span> <span class="stat-value" style="color: <<if $cryptDifficulty is 'Easy'>>green<<elseif $cryptDifficulty is 'Medium'>>yellow<<else>>red<</if>>;"> <<print $cryptDifficulty>> </span> </div> <div class="stat-row"> <span class="stat-label">Size:</span> <span class="stat-value"> <<if $dungeonSize is 4>>Small <<elseif $dungeonSize is 6>>Medium <<else>>Large<</if>> </span> </div> <div class="stat-row"> <span class="stat-label">Enemy Presence:</span> <span class="stat-value"> <<if $CryptSpawnRate is 3>>Low <<elseif $CryptSpawnRate is 4>>Medium <<else>>High<</if>> </span> </div> <div class="enter-button"> [[Enter the Crypt|GameInit]] </div> </div> </div> <div class="text-box"> <div style="text-align: center"> <h1>Crypt Enemy</h1><h2>Hover over an enemy to learn more</h2></div> <div class="enemy-catalog"> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Ghoul/1.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Ghoul</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Lesser Succubus/4/1.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Lesser Succubus</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Skell/1.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Skeleton</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Slime/7.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Slime</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Zombie/2.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Undead</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Spider/Start/5.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Arachness</div> </div> </div> <div class="enemy-card"> <div class="enemy-image"> <img src="Images/Crypt/Enemy/Succubus/1.png" alt=""> </div> <div class="enemy-info"> <div class="enemy-name">Greater Succubus</div> </div> </div> </div> <div id="enemy-description-panel" class="description-panel"></div> </div> <div class="text-box"> <div style="text-align: center"> <h3> The anchent crypts are some of the most dangerous places in the kingdom, but also yeald some of the best riches. Move through the crypt carefully as there can be enemy at every turn. Seek the main chamber and prepare to either strike down—or strike a deal with whatever awaits within. Keep an eye out for items and hidden clues you can interact with along the way... but beware. Curiosity can be deadly.</h3> </div> <style> .enemy-catalog { display: flex; flex-direction: row; justify-content: center; width: 100%; position: relative; overflow: hidden; font-size: 0; } .enemy-card { width: 20%; height: 400px; overflow: hidden; cursor: pointer; position: relative; transition: all 0.4s ease; flex: 1; display: inline-block; font-size: 16px; border: none; } .enemy-card:hover { flex: 1.5; } .enemy-image { position: relative; height: 100%; width: 200%; transform: translateX(-25%); transition: all 0.4s ease; } .enemy-image img { display: block; width: 50%; height: 100%; object-fit: cover; filter: grayscale(100%) brightness(50%); transition: all 0.4s ease; } .enemy-card:hover .enemy-image { width: 100%; transform: translateX(0); } .enemy-card:hover .enemy-image img { width: 100%; filter: grayscale(0%) brightness(100%); } .enemy-card::after { content: ''; position: absolute; right: 0; top: 0; width: 2px; height: 100%; background: linear-gradient(to bottom, #8b0000 0%, #8b0000 50%, transparent 100%); z-index: 2; } .enemy-info { position: absolute; bottom: 0; width: 100%; padding: 15px; background: rgba(0, 0, 0, 0.8); color: #fff; transform: translateY(100%); transition: all 0.4s ease; } .enemy-card:hover .enemy-info { transform: translateY(0); } .enemy-name { font-size: 1.4em; font-weight: bold; margin-bottom: 10px; text-align: center; color: #8b0000; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); } .enemy-description { font-size: 0.9em; line-height: 1.4; padding: 0 10px; } .description-panel { margin-top: 20px; padding: 20px; background: rgba(0, 0, 0, 0.8); color: #fff; border: 2px solid #8b0000; display: none; text-align: center; } .description-panel.active { display: block; } </style> <<script>> $(document).ready(() => { const enemyDescriptions = { 'Ghoul': 'A lost soul from the void, Ghouls have a higher amount of health that other crypt monsters, but are less common.</i>', 'Lesser Succubus': 'A lesser succubus uses trance and corruption to brake you down, they cannot directly fight you, but will try to corrupt so they can drain your soul', 'Skeleton': 'Skeletons have lower health, but are more agile, allowing them to roll and dodge attacks. <br><br>', 'Slime': 'Slime monsters inhabit the flooded areas of the crypt, waiting in the murky water to attack. If you are caught, they will not kill you, but will imobalise you with their body and slowly tire you out, absorbing as much of your bodys heat and fluids as they can before letting you go. Leaving you without any energy for up coming fights. <br><br> <i>Tip: Striking with your sword is all but useless, fireballs are the most effective against this type of fow. Failing that you can try to break free of their grasp</i> <br><br> <i>Dev note: Slime monster conflict contains a light absorbtion themes. This enemy can be disabled in settings</i> ', 'Undead': 'Reanimated corpses of others who braved the crypt. They do not have the most health or strength, but they make up for this in numbers', 'Greater Succubus': 'A more powerful threat which lingers in the final chamber of the crypt, they will offer you what you seek in exchange for souls, or they may choose to toy with you', 'Arachness': 'A beast found guarding the main chamber in the crypt. Her web can be difficult to escape so make sure you have the energy to break free', 'Vampire': 'Vampires stalk the corridors of the crypts avoiding the sunlight. They are savage monsters which cannot be killed without a silver blade. Most however, are board and would rather toy with you by making a deal or playing a game rather than directly attacking you.<br><br> <i>Tip: You can find silver in the town houses once you unlock lock picks and use this to forge silver weapons in Scarldale</i>' }; $('.enemy-card').on('click', function() { const enemyName = $(this).find('.enemy-name').text(); $('#enemy-description-panel').html(enemyDescriptions[enemyName]).addClass('active'); }); }); <</script>> <<set $SimeSpawnLocations to [ "Images/Crypt/Maps/B-L/1.jpg", "Images/Crypt/Maps/B-R/6.jpg", "Images/Crypt/Maps/L-R/6.jpg", "Images/Crypt/Maps/T/1.jpg", "Images/Crypt/Maps/T-B/5.jpg", "Images/Crypt/Maps/T-L/5.jpg", "Images/Crypt/Maps/T-L/6.jpg", "Images/Crypt/Maps/T-R/3.jpg", "Images/Crypt/Maps/T-R/5.jpg" ]>> <</nobr>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["XV"|CryptStright3]], or [["XXII"|CryptLeft3]] or [["XVII"|CryptRight3]]. <br><br> [[Return|Down]] </div> <div class="text-box"> The room you are in has a marking: "XIV"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["VIII"|CryptStright8]], or [["V"|CryptLeft8]] or [["VII"|CryptRight8]]. <br><br> [[Return|CryptRight1]] </div> <div class="text-box"> The room you are in has a marking: "VI"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["XXIV"|CryptStright4]], or [["XXI"|CryptLeft4]] or [["XXIII"|CryptRight4]]. <br><br> [[Return|CryptLeft1]] </div> <div class="text-box"> The room you are in has a marking: "XXII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to 4>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Shrine")>> <div class="text-box"> <<set $NewPuzzle to true>> You enter a dimmly lit room with three statues infront of you. You see a statue of a woman, a demon and a cloaked figure.<br><br> Getting closer you realise these are <<link "shrines">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptOffering')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This is a deadend <br><br> [[Return|CryptLeft3]] </div> <div class="text-box"> The room you are in has a marking: "XXI"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <<if $LastRoom is "CryptStright3">> You see a door marked [["XVIII"|CryptRight3]]<br><br> [[Return|CryptStright3]] <<else>> You see a door to the [["XV"|CryptStright3]]<br><br> [[Return|CryptRight3]] <</if>> <div class="text-box"> The room you are in has a marking: "XIX"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if> > <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> This is a dead end<br><br> <</if>> <div class="text-box"> The room you are in has a marking: "XI"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This is a dead end <br><br> [[Return|CryptLeft2]] </div> <div class="text-box"> The room you are in has a marking: "XIV"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/2.jpg", { hotspots: [ { id: "Tomb-1", x: 649, y: 287, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/1.jpg", { hotspots: [ { id: "Chest-13", x: 503, y: 269, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/2.jpg", { hotspots: [ { id: "Chest-1", x: 123, y: 449, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-1", x: 349, y: 667, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/1.jpg", { hotspots: [ { id: "Chest-2", x: 421, y: 298, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-2", x: 403, y: 692, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/2.jpg", { hotspots: [ { id: "Chest-3", x: 313, y: 358, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-3", x: 397, y: 369, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/3.jpg", { hotspots: [ { id: "Tomb-2", x: 317, y: 127, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { id: "Urn-1", x: 447, y: 125, tooltip: "Search Broken Urn", passage: "CryptUrnSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/L-R/2.jpg", { hotspots: [ { id: "Tomb-3", x: 142, y: 455, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/L-R/7.jpg", { hotspots: [ { id: "Tomb-4", x: 357, y: 316, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { id: "Chest-4", x: 380, y: 484, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/1.jpg", { hotspots: [ { id: "Chest-5", x: 669, y: 95, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-4", x: 400, y: 414, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/2.jpg", { hotspots: [ { id: "Tomb-5", x: 362, y: 309, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/3.jpg", { hotspots: [ { id: "Tomb-6", x: 536, y: 123, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { id: "Chest-6", x: 616, y: 611, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-5", x: 357, y: 330, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/1.jpg", { hotspots: [ { id: "Coffin-1", x: 478, y: 175, tooltip: "Search Coffin", passage: "CryptSearchCoffin", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/1.jpg", { hotspots: [ { id: "Chest-7", x: 263, y: 151, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Tomb-7", x: 417, y: 498, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { id: "Skeleton-6", x: 411, y: 130, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/3.jpg", { hotspots: [ { id: "Tomb-8", x: 121, y: 456, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/1.jpg", { hotspots: [ { id: "Coffin-2", x: 331, y: 189, tooltip: "Search Coffin", passage: "CryptSearchCoffin", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/2.jpg", { hotspots: [ { id: "Urn-2", x: 360, y: 134, tooltip: "Search Urn", passage: "CryptUrnSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/5.jpg", { hotspots: [ { id: "Chest-8", x: 294, y: 256, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Corpse-1", x: 401, y: 364, tooltip: "Search Corpse", passage: "CryptSearchCorpse", position: "position" }, { id: "Table-1", x: 266, y: 494, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/3.jpg", { hotspots: [ { id: "Table-2", x: 281, y: 283, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/6.jpg", { hotspots: [ { id: "Sacks-1", x: 30, y: 635, tooltip: "Search Sacks", passage: "CryptSackSearch", position: "position" }, { id: "Chest-9", x: 399, y: 349, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { id: "Skeleton-7", x: 170, y: 600, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { id: "Cell-1", x: 52, y: 712, tooltip: "Search cell", passage: "CryptCellSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/4.jpg", { hotspots: [ { id: "Table-3", x: 58, y: 40, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" }, { id: "Skeleton-8", x: 141, y: 148, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/5.jpg", { hotspots: [ { id: "Tomb-9", x: 556, y: 97, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { id: "Skeleton-9", x: 268, y: 271, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/6.jpg", { hotspots: [ { id: "Table-4", x: 360, y: 333, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/4.jpg", { hotspots: [ { id: "Chest-10", x: 279, y: 426, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/5.jpg", { hotspots: [ { id: "Skeleton-10", x: 434, y: 681, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/6.jpg", { hotspots: [ { id: "Skeleton-11", x: 526, y: 196, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { id: "Corpse-2", x: 548, y: 348, tooltip: "Search Corpse", passage: "CryptSearchCorpse", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/6.jpg", { hotspots: [ { id: "Chest-11", x: 401, y: 518, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/3.jpg", { hotspots: [ { id: "Sacks-2", x: 93, y: 107, tooltip: "Search Sacks", passage: "CryptSackSearch", position: "position" }, { id: "Skeleton-12", x: 228, y: 229, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { id: "Chest-12", x: 84, y: 592, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <</nobr>>
<<nobr>> <h1>Crypt Map</h1> <div class="dungeon-grid"> <<for _row = 0; _row < $dungeonSize; _row++>> <div class="grid-row"> <<for _col = 0; _col < $dungeonSize; _col++>> <<set _imagePath to $dungeonPaths[_row + '-' + _col]>> <<set _connections to $dungeon[_row][_col].connections>> <div class="grid-cell"> <img @src=_imagePath alt="corridor" class="corridor-image"> </div> </div> <</for>> </div> <</for>> </div> <div class="map-controls"> You take the map with you<br> <i>Its accessable from the left hand panel above the cloak button</i><br><br> <<button "Close Map">> <<goto "CryptExplore">> <</button>> </div> <style> .path-debug { font-size: 8px; color: white; background: rgba(0,0,0,0.7); position: absolute; bottom: 0; left: 0; right: 0; padding: 2px; } .grid-cell { position: relative; } <</style> <</nobr>>
<<nobr>> <div class="responsive-image-container"> <img src="Images/Crypt/cryptmap.png" alt="Description"> </div> <<return "Leave">> <</nobr>>
Ashfall Rest Thornhollow Rest Crypt of the Withered Kings The Howling Graves Crypt of Broken Oaths Gravehold Below The Whispering Vaults The Wyrm-Burrow Dreadmoor Catacombs Crypt of Broken Oaths Gravehold Below Shrine of the Nameless Dead The Redstone Ossuary Thornhollow Rest Duskhollow Rest The Graven Hollow Wraithhold Below Emberwake Rest Crypt of the Last Monarch The Forgotten Hold Emberwake Rest Nightshade Hollow The Sable Barrow Harrowdeep Vaults The Unhallowed Deep The Hollow of Thorns The Wailing Barrow Nightthorn Rest Crypt of the Hollow Saint
<<nobr>> <div class="text-box"> <<if $NewPuzzle is true>> <<set $Int to random(1, 3)>> <<set $NewPuzzle to false>> <</if>> <<set $Position to "null">> You can approach:<br><br> [[The Woman|CryptTributeMaiden]]<br><br> [[The Demon|CryptTributeDemon]]<br><br> You don't have time for this, so you look around for a <<link "door">><<run Engine.play($ReturnPassage)>><</link>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $PuzzleCheats to 1>> <<if $NewPuzzle is true>> <<set $Statue1 to 1>> <<set $Statue2 to 1>> <<set $Statue3 to 1>> <<set $Statue4 to 1>> <<set $PuzzleDays to []>> <<set $PuzzleMonths to []>> <<set $PuzzleYears to []>> <<set $PuzzleKey to []>> <<for _i = 0; _i < 4; _i++>> <<set $RandomDay to random(1, 30)>> <<run $PuzzleDays.push($RandomDay)>> <<set $RandomMonth to random(1, 12)>> <<run $PuzzleMonths.push($RandomMonth)>> <<set $RandomYear to random(1345, 1360)>> <<run $PuzzleYears.push($RandomYear)>> <<run $PuzzleKey.push(_i)>> <</for>> <<run $PuzzleKey.sort(function(a, b) { if ($PuzzleYears[a] !== $PuzzleYears[b]) { return $PuzzleYears[b] - $PuzzleYears[a]; } if ($PuzzleMonths[a] !== $PuzzleMonths[b]) { return $PuzzleMonths[b] - $PuzzleMonths[a]; } return $PuzzleDays[b] - $PuzzleDays[a]; })>> You look around the room, allowing your eyes to adjust to the lack of light. After a few moment, you realise you're not alone. You draw your $PlayerMeleeWeapon, but after a few more seconds of adjusting to the darkness, you realise the shapes are just statues<br><br> Not just statues but monuments, in the style of angles found in a grave yard. You lower your weapon and see there is a door on the other side of the room.<br><br> <<set $Button to 0>> <<set $NewPuzzle to false>> <</if>> [[Examin the door|RomanDoorPuzzle]]<br><br> [[Examin the first statue]]<br><br> [[Examin the second statue]]<br><br> [[Examin the Thrid statue]]<br><br> [[Examin the Forth statue]] <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $CoffinCheat to -1>> <<set $DayCheat to[ "Seems like its hinting towards the day's of people's death", "There are three coffins and three combinations...", "The riddle hints towards the day these people died... they are _CoffinKey1, _CoffinKey2 and _CoffinKey3"]>> <<set $MonthCheats to[ "Seems like its hinting towards the Months's of people's death", "There are three coffins and three combinations...", "The riddle hints towards the Month these people died, but as a number... they are _CoffinKey1, _CoffinKey2 and _CoffinKey3"]>> <<set $YearCheats to[ "Seems like its hinting towards the Years's of people's death, but theres something more...", "Its hinting towards the last numbers on the year...", "The riddle hints towards last numbers of the year people died, so... they are _CoffinKey1, _CoffinKey2 and _CoffinKey3"]>> <<set $CoffinClue to false>> <<if $NewPuzzle is true>> <<set $CoffinData to []>> <<set $CoffinPuzzles to ["Day", "Month", "Year"]>> <<set $PuzzleType to $CoffinPuzzles[random(0, $CoffinPuzzles.length - 1)]>> <<for _i = 0; _i < 3; _i++>> <<set $RandomName to $CoffinName[random(0, $CoffinName.length - 1)]>> <<run $CoffinData.push($RandomName)>> <<set $RandomDay to random(1, 30)>> <<run $CoffinData.push($RandomDay)>> <<set $RandomMonth to $CoffinMonths[random(0, $CoffinMonths.length - 1)]>> <<run $CoffinData.push($RandomMonth)>> <<set $RandomYear to random(1345, 1360)>> <<run $CoffinData.push($RandomYear)>> <</for>> <<set $NewPuzzle to false>> <</if>> You step into a dimly lit chamber, its air thick with the musty scent of age. At the far end, a peculiar door stands out, its design unlike anything you've seen before. In the center of the room, three coffins rest ominously...<br><br> [[Examin the door|CoffinDoorPuzzle]]<br><br> [[Examin coffins 1]]<br><br> [[Examin coffins 2]]<br><br> [[Examin coffins 3]] <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to 2>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["III"|CryptStright2]], or [["VI"|CryptLeft2]], or [["X"|CryptRight2]]. <br><br> [[Return|Down]] </div> <div class="text-box"> The room you are in has a marking: "II"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["IX"|CryptRight7]], or [["XI"|CryptLeft7]] or [["XII"|CryptStright7]]. <br><br> [[Return|CryptRight1]] </div> <div class="text-box"> The room you are in has a marking: "X"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["XX"|CryptStright5]], or [["XIX"|CryptLeft5]] or [["XVII"|CryptRight5]]. <br><br> [[Return|CryptLeft1]] </div> <div class="text-box"> The room you are in has a marking: "XVIII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <<if $LastRoom is "CryptStright3">> You see a door marked [["XXII"|CryptLeft3]]<br><br> [[Return|CryptStright3]] <<else>> You see a door marked [["XV"|CryptStright3]]<br><br> [[Return|CryptLeft3]] <</if>> <div class="text-box"> The room you are in has a marking: "XXIII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This is a deadend <br><br> [[Return|CryptRight3]] </div> <div class="text-box"> The room you are in has a marking: "XVII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</if>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This is a deadend <br><br> [[Return|CryptRight2]] </div> <div class="text-box"> The room you are in has a marking: "IX"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> This is a dead end<br><br> <div class="text-box"> The room you are in has a marking: "VII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have alrady searched this sack<br><br> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <</if>> <<if _rand is 1>> <</if>> <</if>> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _hotspotId = $currentHotspotId>> <<if !$CryptSearchLogs>> <<set $CryptSearchLogs = []>> <</if>> <<if $CryptSearchLogs.includes(_hotspotId)>> You have alrady searched this coffin<br><br> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <<set _rand to random(0, 2)>> <<if _rand is 0>> Searching the corps, you notice it start to move... Backing away you watch as the corps stands and turns to face you<br><br> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <<else>> <<set $EnemyMin to 15>> <<set $EnemyMax to 20>> <</if>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <<set $CryptSearchLogs.push(_hotspotId)>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Attack">> <<set $CryptAmbush to true>> <<goto "Combat">> <</button>> <</if>> <<if _rand is 1>> Searching the blood stained cell, you find a corps holding a pendant, you pick it up an read it<br><br> Etched in dark, tarnished silver, the script curls unnaturally, as if the letters were carved by something with too many fingers:<br><br> <i>Blood to breath, pain to power. Ten drops for the flame to rise.<br> Touch and be unmade, remade, alight once more.</i><br><br> The pendant can restore your magic in exchange for 10 health<br><br> <<if $PlayerHealth gt 10>> <<button "Use it">> <<set $PlayerHealth to $PlayerHealth - 10>> <<set $PlayerMagic to $PlayerMaxMagic>> <<<<goto "CryptExplore">> <<script>> UI.alert("You sacrifice your health in exchange for magic and leave the pendant"); <</script>> <</button>> <<else>> You are alrady too injured to give this<br><br> <</if>> <</if>> <<if _rand is 2>> Searching the blood stained cell, you find a corps holding a pendant, you pick it up an read it<br><br> Etched in dark, tarnished silver, the script curls unnaturally, as if the letters were carved by something with too many fingers:<br><br> <i>Give what drives you, take what tempts you.<br> Gold gleams brighter in the hands of the broken.</i><br><br> The pendant can give you 50 gold in exchange for half your remaining enegy<br><br> <<if $PlayerEnergy gt 10>> <<button "Use it">> <<set $PlayerEnergy to $PlayerEnergy / 2>> <<set $Gold to $Gold + 50>> <<<<goto "CryptExplore">> <<script>> UI.alert("You feel your strength leave you as the pendant turns to a small handful of gold in your hands"); <</script>> <</button>> <<else>> You are alrady too week to give this<br><br> <</if>> <</if>> <</if>> <<if _rand isnot 0>> <<set $CryptSearchLogs.push(_hotspotId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have already searched this corpse.<br><br> <<button "Leave">><<goto "CryptExplore">><</button>> <<else>> <<set $CryptLoad += 1>> <<set _rand to random(0, 2)>> <<set $CryptSearchLogs.push(_fullId)>> You pat down the corpse, trying not to disturb the rotting body too much.<br><br> <<if _rand is 0>>\ Searching the corpse, you notice it starts to move... Backing away, you watch as it stands and turns to face you.<br><br> <<set $CurrentEnemy to "zombie">> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <<set $EnemyHealth to 50>> <<set $EnemyMin to $TarotCardInvet.includes("Devil") ? 10 : 15>> <<set $EnemyMax to $TarotCardInvet.includes("Devil") ? 15 : 20>> <<set $EnemyWeapon to "sword">> <<set $VoidEnemy to true>> <div class="Random-image"> <img @src="$ImagePath" alt="Guest Image"> </div><br><br> <<button "Attack">> <<set $CryptAmbush to true>> <<goto "Combat">> <</button>> <<elseif _rand is 1>> <<set _gold to random(10, 20)>> Searching the pockets of the lifeless corpse, you find a small amount of gold.<br><br> You take the <<print _gold>> gold and leave.<br> <<set $Gold += _gold>> <<button "Leave">><<goto "CryptExplore">><</button>> <<elseif _rand is 2>> Searching the pockets of the lifeless corpse, you find nothing.<br><br> <<button "Leave">><<goto "CryptExplore">><</button>> <</if>> <<if $CryptLoad <= 1>> <br><i>You feel something, but you aren't ready to investigate further yet...</i><br><br> <<button "Leave">><<goto "CryptExplore">><</button>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have alrady searched this table<br><br> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <h1>You find a map of the crypt and take it with you</h1> <div class="dungeon-grid"> <<for _row = 0; _row < $dungeonSize; _row++>> <div class="grid-row"> <<for _col = 0; _col < $dungeonSize; _col++>> <<set _imagePath to $dungeonPaths[_row + '-' + _col]>> <<set _connections to $dungeon[_row][_col].connections>> <div class="grid-cell"> <img @src=_imagePath alt="corridor" class="corridor-image"> </div> </div> <</for>> </div> <</for>> </div> You take the map with you<br> <i>Its accessable from the left hand panel above the cloak button</i><br><br> <<set $CryptSearchLogs.push(_fullId)>> <<button "Take Map">> <<set $CruptMapFound to true>> <<goto "CryptExplore">> <</button>> <<set $CryptLoad to $CryptLoad + 1>> <</if>> </div> <style> .path-debug { font-size: 8px; color: white; background: rgba(0,0,0,0.7); position: absolute; bottom: 0; left: 0; right: 0; padding: 2px; } .grid-cell { position: relative; } <</style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Shrines/Jester/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $Position is "null">> You stand before the shrine for the fool, you become faintly hear the sounds of laughter and music but its distorted... You're not even sure if the sound is real<br><br> You see the shrine of the fool, locked in dance with a distorted grin. Below the fool's sculpture, there is a dark stone bowl<br><br> You are not sure what the fool's shrine offers or demands<br><br> <<if $PlayerHealth gt 10>> <<link "Offer Blood">> <<set $Position to "Blood">><<run Engine.show()>> <</link>><br><br> <<else>> You've lose enough blood already<br><br> <</if>> <<if $Gold gt 100>> <<link "Offer Gold">> <<set $Position to "Gold">><<run Engine.show()>> <</link>><br><br> <<else>> You don't have enough gold<br><br> <</if>> <<if $PlayerMagic gt 10>> <<link "Offer Magic">> <<set $Position to "Magic">><<run Engine.show()>> <</link>><br><br> <<else>> You're too drained to cast a spell<br><br> <</if>> <<if $Souls gt 1>> <<link "Offer a soul">> <<set $Position to "Soul">><<run Engine.show()>> <</link>><br><br> <<else>> You have no souls to spare<br><br> <</if>> [[Return|CryptOffering]] <</if>> <<if $Position is "Blood">> You run your blade over the palm of your hand, letting your blood flow into the stone bowl<br><br> <<if _int is 1>> You hear a distant cackle as the jester takes more than you offer<br><br> You loose more strength and the statues vanish<br><br> <<set $PlayerHealth to 10>> <<else>> The jester smiles at you before all statues disappear<br><br> For your sacrifice, you gain 5 power for 4 days<br><br> <<set $PlayerHealth to $PlayerHealth - 5>> <<set $PlayerPower to $PlayerPower + 5>> <<set $PowerBoost to true>> <<set $BoostDays to 4>> <</if>><</if>> <<if $Position is "Gold">> You take 100 gold from your pouch and place it in the bowl<br><br> <<if _int is 1>> <<else>> <</if>><</if>> <<if $Position is "Magic">> You cast a fireball and place it into the bowl setting it ablaze<br><br> <<if _int is 1>> <<else>> <</if>><</if>> <<if $Position is "Soul">> You reach to your chest and pull away. In your hand is a small bright light akin to a star, this was someones soul, you dont remember who's<br><br> <<if _int is 1>> <<else>> <</if>><</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have already searched this skeleton.<br><br> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<else>> <<set $CryptLoad += 1>> <<set _rand = random(0, 1)>> <<if _rand is 0>> Picking through the old bones of the skeleton, you find it was carrying a healing potion, you take it with you and move on<br><br> <<set $MinorHealingPotion to $MinorHealingPotion + 1>> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<else>> Searching the corps, you notice it start to move... Backing away you watch as the corps stands and turns to face you<br><br> <<button "Attack">> <<set $CryptAmbush to true>> <<goto "Encounter_Skell">> <</button>> <</if>> <</if>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <<if $PlayerEnergy lt 0>><<set $PlayerEnergy to 0>><</if>> <<if $PlayerEnergy gt 100>><<set $PlayerEnergy to 100>><</if>> <<set $OldPosition to $Position>> <<set $Position to "null">> <div class="text-box"> <<set $EnemyHealth to 100>> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/7.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Health: <div class="health-bar"> <progress @value=" $EnemyHealth" max="100"></progress><br> </div> A creature from slides out of the pool, forming into the shape of a woman, before it takes a step towards you reaching out for you<br> <hr> <<set _successChance to 25 * $combatCardsMax>> <<button "Sword Attack (success chance _successChance%)">> <<goto "SlimeSword">> <</button>> <<if ($PlayerMagic >= 20) and ($PlayerSpells.includes("Fire")) or ($PlayerSpells.includes("Inferno"))>><<button "Fire">><<run Engine.play('SlimeFire')>><</button>><</if>> <<set _successChance to $PlayerEnergy>> <<button "Try dodge and flee (success chance _successChance%)">> <<goto "SlimeDodge">> <</button>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> The air grows colder as you step into the crypt, the weight of centuries building the grim atmosphere. Stale, damp air clings to your skin, carrying faint hints of decay and mildew. You see ancient stone walls etched with runes, worn smooth by time. Ahead, a narrow staircase spirals downward, disappearing into the oppressive blackness below. The faint sound of dripping water echoes up from the depths, a ghostly rhythm that quickens your pulse.<br><br> [[You walk down the stairs|Down]] </div> <<set $LastRoom to "null">> <<set $RoomsCleared to []>> <<set $Crypt to true>> <<set $NewCrypt to true>> <<set $RoomStyle to ["Combat", "Treasure", "Combat", "Puzzle", "Shrine"]>> <<set $EnemyType to ["Skeleton", "Zombie", "Ghoul", "Lesser Succubus"]>> <<set $PathStyles to ["Fork", "Stright", "Left Turn", "Right Turn"]>> <<set $SuccubusGreetLines to ["A fresh soul comes...", "Another mortal, come to me I'll make your deams come true", "Another man entres this place in seach of gold, were you expecting me?"]>> <<set $LeftPath to 0>> <<set $RightPath to 0>> <<set $RightRoomKey to random(7, 9)>> <<set $LeftRoomKey to random(4, 6)>> <<set $LeftPathComplete to false>> <<set $RightPathComplete to false>> <<set $RoomImages to []>> <<set $CoffinName to [ "Aldric Thorvald", "Bertrand de Clare", "Cedric Greywolf", "Eadric Hawthorne", "Godwin Ravenshield", "Halbert Ironfist", "Leofric of Blackmoor", "Oswin Oakheart", "Roderic Bramblethorn", "Sigmund Firebrand", "Theobald Grimhelm", "Wulfgar Stormblade", "Balthar Ironwood", "Anselm the Bold", "Cuthbert Ashbourne", "Adeliza Fairbrooke", "Beatrix Ashenvale", "Catrin Windmere", "Elysande of Eldwynd", "Freydis Emberlake", "Gisela Thornfield", "Hildegard of Ravensreach", "Isolde Brightflame", "Leofwyn Duskbane", "Mathilda Frosthaven", "Rosamund Winterfell", "Sibylla Darkmoor", "Theodora Silverglade", "Ysabel Redfern", "Winifred of Highmere"]>> <<set $CoffinMonths to [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]>> <</nobr>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle2')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you can go through a door marked [["IIIV"|CryptStright9]]. <br><br> [[Return|CryptRight1]] </div> <div class="text-box"> The room you are in has a marking: "III"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <<if $RoomsCleared.includes(passage())>> <<run $[passage()].push("Complete")>> <<else>> <<run $RoomImages.push(passage())>> <<set _int to random (1, 36)>> <<run $RoomImages.push(_int)>> <<set $[passage()] to []>> <<set $Int to random(0, 3)>> <<run $[passage()].push($RoomStyle[$Int])>> <<set $Int to random(0, 3)>> <<set $LastRoom to $RoomStyle[$Int]>> <<run $[passage()].push($EnemyType[$Int])>> <<set $Int to random(0, 3)>> <<run $[passage()].push($PathStyles[$Int])>> <</if>> <<if not $[passage()].includes("Complete")>> <<if $[passage()].includes("Combat")>> <<set $EnemyHealth to 50>> <<if $TarotCardInvet.includes("Devil")>> <<set $EnemyMin to 5>> <<set $EnemyMax to 10>> <<else>> <<set $EnemyMin to 10>> <<set $EnemyMax to 15>> <</if>> <<set $VoidEnemy to true>> <<if $[passage()].includes("Skeleton")>> <<set $CurrentEnemy to "Skeleton">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 3)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Zombie")>> <<set $CurrentEnemy to "Zombie">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 4)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Ghoul")>> <<set $CurrentEnemy to "Ghoul">> <<set $EnemyWeapon to "rusted sword">> <<set $Int to random(1, 2)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/" + $Int + ".png">> <</if>> <<if $[passage()].includes("Lesser Succubus")>> <<set $CurrentEnemy to "Lesser Succubus">> <<set $Int to random(1, 6)>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $Int + ".png">> <</if>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Enemy:</span> <<print $CurrentEnemy>></p> <p><span class="info-label">Health:</span> <div class="health-bar"> <div class="health-bar-fill" style="width: <<print $EnemyHealth>>%"></div> <span class="health-text"><<print $EnemyHealth>>%</span></div></p> Demons from the void cannot fully form so their power and health is limited </div> </div> <div class="text-box"> <<set _Int to random(0, 3)>> <<link "Fight">><<set $ReturnPassage to passage()>><<run Engine.play('Combat')>><</link>> </div><</if>> <<if $[passage()].includes("Treasure")>> <div class="text-box"> You find yourself in a small room with a chest in the centre <div align="center"> <img src="Images/Crypt/Chest.png" width="700" height="700"> </div> <<link "Open">><<set $ReturnPassage to passage()>><<run Engine.play('CryptChest')>><</link>> </div> <</if>> <<if $[passage()].includes("Puzzle")>> <div class="text-box"> You enter the room and look around, the moment you step through you hear the door swing shut and lock behind <<link "you...">><<set $ReturnPassage to passage()>><<set $NewPuzzle to true>><<run Engine.play('CryptPuzzle')>><</link>> </div> <</if>> <<if $[passage()].includes("Dark")>> <div class="text-box"> You step through the door and enter a new room, peering into the darkness you realise you can't see <<link "anything...">><<set $ReturnPassage to passage()>><<run Engine.play('CryptDark')>><</link>> </div> <</if>><</if>> <<if $RoomsCleared.includes(passage())>> <div class="text-box"> This room is safe, you look around and see three doors, you can go through the door marked [["XVI"|CryptStright6]], or [["XIX"|CryptLeft5]] or [["XXIII"|CryptRight4]]. <br><br> [[Return|CryptLeft1]] </div> <div class="text-box"> The room you are in has a marking: "XV"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<set _int = $RoomImages.indexOf(passage())>> <<set _int to _int + 1>> <<set _img to $RoomImages[_int]>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<run $RoomsCleared.push(passage())>> <<set $LastRoom to passage()>>
<<nobr>> <div class="text-box"> <<if $LeftRoomKey is 4>> <<set $Int to 1>> You look around the room and see a young girl <br><br> <<set $BackgroundPath to "Images/Crypt/VampireGame/7.png">> <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Girl: Come closer</span><br><br> <<link "Obay">><<run Engine.play("VampireGamtSit")>><</link>><br><br> <<link "Draw your sword">><<run Engine.play("VampireGameAttack")>><</link>> <<set $PlayerScore to 0>> <<set $NPCScore to 0>> <<set $RightLines to [ "Awww, the little mortal wants to live", "Getting closer to that key", "Humm..."]>> <<set $WrongLines to [ "So unfortunate...", "Poor choise", "Oh I can't wait to open your throat"]>> <<else>> This room is a dead end<br><br> [[Return|CryptLeft3]] <div class="text-box"> The room you are in has a marking: "XXIV"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $LeftRoomKey is 5>> <<set $Int to 1>> You look around the room and see a young girl <br><br> <<set $BackgroundPath to "Images/Crypt/VampireGame/7.png">> <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Girl: Come closer</span><br><br> <<link "Obay">><<run Engine.play("VampireGamtSit")>><</link>><br><br> <<link "Draw your sword">><<run Engine.play("VampireGameAttack")>><</link>> <<set $PlayerScore to 0>> <<set $NPCScore to 0>> <<set $RightLines to [ "Awww, the little mortal wants to live", "Getting closer to that key", "Humm..."]>> <<set $WrongLines to [ "So unfortunate...", "Poor choise", "Oh I can't wait to open your throat"]>> <<else>> This room is a dead end<br><br> [[Return|CryptRight3]] <div class="text-box"> The room you are in has a marking: "XX"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $LeftRoomKey is 6>> <<set $Int to 1>> You look around the room and see a young girl <br><br> <<set $BackgroundPath to "Images/Crypt/VampireGame/7.png">> <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Girl: Come closer</span><br><br> <<link "Obay">><<run Engine.play("VampireGamtSit")>><</link>><br><br> <<link "Draw your sword">><<run Engine.play("VampireGameAttack")>><</link>> <<set $PlayerScore to 0>> <<set $NPCScore to 0>> <<set $RightLines to [ "Awww, the little mortal wants to live", "Getting closer to that key", "Humm..."]>> <<set $WrongLines to [ "So unfortunate...", "Poor choise", "Oh I can't wait to open your throat"]>> <<else>> This room is a dead end<br><br> [[Return|CryptStright3]] <div class="text-box"> The room you are in has a marking: "XVI"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <</if>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $RightRoomKey is 7>> <<set $BackgroundPath to "Images/Crypt/SuccubusGame/4.png">> <<set $PlayerCum to 0>> <<set $PlayerLust to 0>> <<set $NPCCum to 0>> <<set $Turn to 0>> <<set $HerTurn to 0>> <<set $Int to random(1, 3)>> You enter a dark room for a moment you think its a normal empty chamber, but then you hear it... a faint giggle coming from the shadows, for a few moment you smell a sweet smell of perfume, before... <br><br> <<link "You Pass Out">><<fadeToPassage "SuccubusMiniBoss2">><</link>> <audio autoplay> <source src="Audio/GirlLaugh.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<script>> $(function() { toggleDarkEdges(true); }); <</script>> <<set $ApprovalLines to [ "You're doing such a good job for a mortal", "God's, maybe I'll keep you as a pet", "Fuck, keep going"]>> <<set $FingerlinesEnjoy to [ "Ummm, thats it", "Work your fingers into me", "Ah, yes tease my clit"]>> <<set $LicklinesEnjoy to [ "Yes, bury your tounge in me", "Do you like the taste?", "Keep this up and I might just drag you back to the void to meet my sisters"]>> <<set $AskHerLines to [ "Oh, you want me to pick do you?", "Such a good boy, asking me what I want to do with you", "Giving in so soon?"]>> <<set $BoardLines to [ "I was getting board of that...", "Ummm, what to do with you", "You've had your fun"]>> <<set $LowerLines to [ "Look at you, trying so hard not to cum", "You really want this key dont you?", "Arn't you enjoying this?"]>> <<else>> This room is a dead end<br><br> [[Return|CryptRight2]] <</if>> </div> <div class="text-box"> The room you are in has a marking: "XII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $RightRoomKey is 8>> <<set $BackgroundPath to "Images/Crypt/SuccubusGame/4.png">> <<set $PlayerCum to 0>> <<set $PlayerLust to 0>> <<set $NPCCum to 0>> <<set $Turn to 0>> <<set $HerTurn to 0>> <<set $Int to random(1, 3)>> You enter a dark room for a moment you think its a normal empty chamber, but then you hear it... a faint giggle coming from the shadows, for a few moment you smell a sweet smell of perfume, before... <br><br> <<link "You Pass Out">><<fadeToPassage "SuccubusMiniBoss2">><</link>> <audio autoplay> <source src="Audio/GirlLaugh.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<script>> $(function() { toggleDarkEdges(true); }); <</script>> <<set $ApprovalLines to [ "You're doing such a good job for a mortal", "God's, maybe I'll keep you as a pet", "Fuck, keep going"]>> <<set $FingerlinesEnjoy to [ "Ummm, thats it", "Work your fingers into me", "Ah, yes tease my clit"]>> <<set $LicklinesEnjoy to [ "Yes, bury your tounge in me", "Do you like the taste?", "Keep this up and I might just drag you back to the void to meet my sisters"]>> <<set $AskHerLines to [ "Oh, you want me to pick do you?", "Such a good boy, asking me what I want to do with you", "Giving in so soon?"]>> <<set $BoardLines to [ "I was getting board of that...", "Ummm, what to do with you", "You've had your fun"]>> <<set $LowerLines to [ "Look at you, trying so hard not to cum", "You really want this key dont you?", "Arn't you enjoying this?"]>> <<else>> This room is a dead end<br><br> [[Return|CryptLeft2]] <</if>> </div> <div class="text-box"> The room you are in has a marking: "VIII"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $RightRoomKey is 9>> <<set $BackgroundPath to "Images/Crypt/SuccubusGame/4.png">> <<set $PlayerCum to 0>> <<set $PlayerLust to 0>> <<set $NPCCum to 0>> <<set $Turn to 0>> <<set $HerTurn to 0>> <<set $Int to random(1, 3)>> You enter a dark room for a moment you think its a normal empty chamber, but then you hear it... a faint giggle coming from the shadows, for a few moment you smell a sweet smell of perfume, before... <br><br> <<link "You Pass Out">><<fadeToPassage "SuccubusMiniBoss2">><</link>> <audio autoplay> <source src="Audio/GirlLaugh.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<script>> $(function() { toggleDarkEdges(true); }); <</script>> <<set $ApprovalLines to [ "You're doing such a good job for a mortal", "God's, maybe I'll keep you as a pet", "Fuck, keep going"]>> <<set $FingerlinesEnjoy to [ "Ummm, thats it", "Work your fingers into me", "Ah, yes tease my clit"]>> <<set $LicklinesEnjoy to [ "Yes, bury your tounge in me", "Do you like the taste?", "Keep this up and I might just drag you back to the void to meet my sisters"]>> <<set $AskHerLines to [ "Oh, you want me to pick do you?", "Such a good boy, asking me what I want to do with you", "Giving in so soon?"]>> <<set $BoardLines to [ "I was getting board of that...", "Ummm, what to do with you", "You've had your fun"]>> <<set $LowerLines to [ "Look at you, trying so hard not to cum", "You really want this key dont you?", "Arn't you enjoying this?"]>> <<else>> This room is a dead end<br><br> [[Return|CryptStright2]] <</if>> </div> <div class="text-box"> The room you are in has a marking: "IIIV"<br><br> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <<run $RoomsCleared.push(passage())>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> Ahead of you is a large locked door, there are two keys on either side of the door<br><br> <<if ($LeftPathComplete is false) or ($RightPathComplete is false)>> <<if $LeftPathComplete is false>> You dont have the left key<br> <<else>> You have the left key<br> <</if>> <<if $RightPathComplete is false>> You dont have the right key<br> <<else>> You have the right key<br> [[Return|Down]] <</if>> <</if>> <<if ($LeftPathComplete is true) and ($RightPathComplete is true)>> You have both keys, so you unlocked the [[door|CryptFinalChamber]] <</if>> </div> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/31.png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have already searched this tomb<br><br> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <<set _rand to random(0, 2)>> You reach your hand into the dark tomb searching for something useful<br><br> <<if _rand is 0>> In the dark something grabs your arm you pull back and back away...<br><br> <<set $CryptSearchLogs.push(_fullId)>> <<button "Something craws out of the tomb">> <<set $CryptAmbush to true>> <<goto "CryptEnemyMenu">> <</button>> <<elseif _rand is 1>> <<set _gold to random(10, 60)>> In the dark you find something, lifting it out you hold a small handful of gold<br><br> You pocket the _gold gold and leave<br> <<set $Gold += _gold>> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<elseif _rand is 2>> You search for a moment, but theres nothing besides dust and bones<br><br> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> <<else>> You find nothing of interest.<br><br> <<button "Leave">><<goto "CryptExplore">><</button>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $ImagePath to "Images/Crypt/Shrines/Hooded/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $Position is "null">> You move closer to the statue wearing a cloak, you feel stronger in the presence of the statue and your desire for power grow beyond your usual drive<br><br> Looking down at the statue, there is a small black stone bowl<br><br> The cloaked statue demands blood<br><br> <<if $PlayerHealth gt 10>> <<link "Offer Blood">><<set $Position to "Blood">><<run Engine.show()>><</link>><br><br> <<else>> You've lose enough blood already<br><br> <</if>> [[Return|CryptOffering]] <</if>> <<if $Position is "Blood">> You run your blade over the palm of your hand, letting your blood flow into the stone bowl<br><br> After a few moments, you feel power flow into you<br><br> For your sacrifice, you gain 5 power for 3 days<br><br> <<set $PlayerHealth to $PlayerHealth - 5>> <<set $PlayerPower to $PlayerPower + 5>> <<set $PowerBoost to true>> <<set $BoostDays to 3>> <<link "Time to leave">><<run Engine.play($ReturnPassage)>><</link>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> <<set $ImagePath to "Images/Crypt/Shrines/Succubus/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> You step closer to the stone carving of a demon succubus, even in a stone form you are struck by her beauty, but as you stare at her, she seems to writh and twise without ever changing form<br> You look closer, trying not to stare for too long, for a moment you could have sworn her eyes were glowing with fire<br><br> Below the shrine, there is a dark stone bowl... The demon demands a soul as a tribute<br><br> <<if $Souls gt 1>> <<link "Offer a soul">><<set $Position to "Soul">><<run Engine.show()>><</link>><br><br> <<else>> You have no souls to spare<br><br> <</if>> [[Return|CryptOffering]] <</if>> <<if $Position is "Soul">> You reach to your chest and pull away. In your hand is a small bright light akin to a star, this was someones soul, you dont remember who's<br><br> <<set _Vid to random(1, 3)>> <<set $VidPath to "Images/Crypt/Shrines/Succubus/" + _Vid + ".webm">> You have a vision of something beautiful but demonic serving you<br><br> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br><br> <<set $ImagePath to "Images/Items/Stones/Red.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<set $Souls to $Souls - 1>> <<if (typeof $SoulStones === "undefined")>> <<set $SoulStones to []>> <<set $SoulStoneKnow to false>> <<run $SoulStones.push("Succubus")>> You see the light of the soul slowly fade, and in its place a red glowing stone<br><br> You aren't sure what to make of the stone prehapse you could ask someone<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>> <<script>> UI.alert("New Quest! <br>You've received a stone and you're not sure what its for. Maybe someone can help you find out"); <</script>> <<run $Quests.push("Find would what this stone is")>> <</link>> <<else>> <<run $SoulStones.push("Succubus")>><br><br> <<if $SoulStoneKnow is false>> You see the light of the soul slowly fade, and in its place is another strange glowing gem<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>><</link>> <</if>> <</if>> <<if $SoulStoneKnow is true>> You see the light of the soul slowly fade, and in its place is another soul stone<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>><</link>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $ImagePath to "Images/Crypt/Shrines/Maiden/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $Position is "null">> Standing before the maiden, you feel a sense of tranquility, her dead eyes staire at you<br><br> Below the shrine, there is a dark stone bowl... The maiden asked for a soul as a sacrifice<br><br> <<if $Souls gt 1>> <<link "Offer a soul">><<set $Position to "Soul">><<run Engine.show()>><</link>><br><br> <<else>> You have no souls to spare<br><br> <</if>> [[Return|CryptOffering]] <</if>> <<if $Position is "Soul">> You reach to your chest and pull away. In your hand is a small bright light akin to a star, this was someones soul, you dont remember who's<br><br> <<set _Vid to random(1, 3)>> <<set $VidPath to "Images/Crypt/Shrines/Maiden/" + _Vid + ".webm">> You have a vision of someone lovingly serving you, a wife in another life prehapse? It passes after a few moment<br><br> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br><br> <<set $ImagePath to "Images/Items/Stones/White.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<set $Souls to $Souls - 1>> <<if (typeof $SoulStones === "undefined")>> <<set $SoulStones to []>> <<set $SoulStoneKnow to false>> <<run $SoulStones.push("Succubus")>> You see the light of the soul slowly fade, and in its place a red glowing stone<br><br> You aren't sure what to make of the stone prehapse you could ask someone<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>> <<script>> UI.alert("New Quest! <br>You've received a stone and you're not sure what its for. Maybe someone can help you find out"); <</script>> <<run $Quests.push("Find would what this stone is")>> <</link>> <<else>> <<run $SoulStones.push("Succubus")>><br><br> <<if $SoulStoneKnow is false>> You see the light of the soul slowly fade, and in its place is another strange glowing gem<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>><</link>> <</if>> <</if>> <<if $SoulStoneKnow is true>> You see the light of the soul slowly fade, and in its place is another soul stone<br><br> You take the stone and <<link "leave">><<run Engine.play($ReturnPassage)>><</link>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _fullId = $currentMapId + "::" + $currentHotspotId>> <<if $CryptSearchLogs.includes(_fullId)>> You have alrady searched this urn<br><br> <<else>> <<set $CryptLoad to $CryptLoad + 1>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <</if>> <<if _rand is 1>> <</if>> <</if>> <<set $CryptSearchLogs.push(_fullId)>> <<button "Leave">> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _rand to (1, 4)>> <<set _charPath to "Images/Crypt/Enemy/Vampire/" + _rand + ".png">> <<set _rand to (0, 2)>> <<if _rand is 0>> <<say 'Vampire' _imgPath>>Another trespasser… or perhaps, a guest. It’s been decades since someone interesting wandered in<</say>> <<say 'Vampire' _imgPath>>I could drain you dry where you stand. Tear you open and drink until there’s nothing left but a stain on my floor. But I’m so very tired of the obvious. Violence is such a waste when we could have… an arrangement<</say>> <<You>>What do you want<</You>> <<say 'Vampire' _imgPath>>I’ll offer you a trade. Half of your remaining vitality... Nothing fatal, just enough to leave you aching. In return, I restore your magic. Fully. Instantly<</say>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<You>>Ah, my fucking head...<</You>><br><br> <<You>>Where am I this time?<</You>><br><br> You look around before seeing two woman<br><br> <<set $ImagePath1 to "Images/Forrest/Cult/Vaelora.png">> <<set $ImagePath2 to "Images/Forrest/Cult/Elizabeth/1.png">> <div class="image-container"> <div class="image-wrapper"> <img @src=$ImagePath1 alt="First Image"> </div> <div class="image-wrapper"> <img @src=$ImagePath2 alt="Second Image"> </div> </div> <br><br> <<Vaelora>>You're safe, this place is a sanctuary<</Vaelora>><br><br> <<You>>Ok. Thank you, I should be leaving now<</You>><br><br> <<Vaelora>>Wait, it is no coincidence that you are here, I believe you are the one that will save us from damnation<</Vaelora>><br><br> <<You>>Ok. This is getting a bit much<</You>><br><br> <<Vaelora>>Ok, I understand. Have a look around our church, feel free to visit myself or sister Elizabeth... She will be able to help with anything<</Vaelora>><br><br> <<Elizabeth>>Hello, Sir<</Elizabeth>><br><br> <<link "Get up">> <<script>> UI.alert("New Quest! <br>Find out what Vaelora wants"); <</script>> <<run $Quests.push("Find out what Vaelora wants")>> <<run Engine.play('Cult')>> <</link>> <<set $CultOccupance = []>> <</nobr>> </div>
<<nobr>> You slowly come around, eyes shut you are able to hear voices...<br><br> <span style="color: #FF1493;">Is it him?</span><br><br> <span style="color: #FF1493;">Quiet sister</span><br><br> <span style="color: #FF1493;">Sorry priestess its just...</span><br><br> <span style="color: #FF1493;">I know... I belive he is the one but we must be careful</span><br><br> [[Open your eyes|CultInto2]] <<set $CultUnlocked to true>> <</nobr>>
<div class="demo-end"> <h1>Thank you for playing!</h1> <div class="message"> Sorry! Content will be coming here soon for Patreons! <<set $VidPath to "Images/Mountains/1.webp">> <div align="centre">[img[$VidPath]]</div> </div> [[Go Home|Base Intro]] </div>
<<nobr>> <div class="text-box"> <<set _prisoner to $CultOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_prisoner.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _prisoner.name>></h2> <div style="margin: 20px 0;"> <h3>Prisoner Details</h3> </div> <div style="margin: 20px 0;"> <h3>Corruption</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value=" _prisoner.corruption" max="100"></progress> <span><<print _prisoner.corruption>>%</span> </div> </div> <<if $CurrentPlayer is "Overlord">> <span style="color: #FF1493;">How may I be of service lord?</span><br><br> <<if _prisoner.corruption is 100>> <<link "Sacrifice her">> <<set _prisoner.corruption to _prisoner.corruption + 25>> <<goto "CovenSacrifice">> <</link>><br><br> <</if>><</if>> <<if $CurrentPlayer is "Vaelora">> <span style="color: #FF1493;">Mistress</span><br><br> <<if _prisoner.corruption lt 100>> <<link "Corrupt her">> <<set _prisoner.corruption to _prisoner.corruption + 25>> <<goto "CovenCorruption">> <</link>><br><br> <<else>> The prisoner is fully corrupt<br><br> <</if>><</if>> <<button "Leave her be">> <<goto "Visit the coven">> <</button>> </div> </div> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $CurrentPlayer is "Overlord">> [[Visit Vaelora]]<br><br> [[Visit Elizabeth]]<br><br> <</if>> <<if not $Quests.includes("Find out what Vaelora wants")>> [[Visit the coven]]<br><br> <</if>> <<if $CultTear isnot true>> <<if ($PlayerSpells.includes("Tear")) and ($PortalVisited is true)>> <<button "Create tear">> <<run setup.addPortalDestination('Coven', 'Cult', 'Cult.png')>> <<set $CultTear to true>> <<run Engine.show()>> <</button>><br><br> <</if>> <</if>> <<if $CurrentPlayer is "Overlord">> <<link "Leave">> <<run Engine.play('Forrest Explore')>> <</link>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You look around in the darkness and wait for your eyes to adjust... They don't<br><br> In the distance, you hear a whisper<br><br> </div> <</nobr>>
<h2>Death Card</h2> Ahh, the Death Card... a grim companion indeed. Should you choose to carry it, the Reaper shall shadow your every step, unseen but ever-present. Those foolish enough to stand against you will feel their very life force wither, their strength fading before the first blow is even struck. Death, it seems, favors your side. But, be warned... Death is a cold companion, and given time it will take you too...<br><br> Effects of carrying this card:<br> -Enemy start each fight with 10 less health<br> -Random chance of starting the day with less health, which increases over time<br><br> Effects of buring the card:<br> -If burned during combat, the enemy will die instantly<br><br>
<div class="text-box"> <<nobr>> Unable to fully kill the greater succubus, you knock her down and claim the souls she was holding.<br><br> The succubus cralls away into the darkness, giving you time to look around. You search for a while until you find a corruption rune... This must have been what she used to almost overpower you... You take it for your castle<br><br> <<set $CorruptionRune to 1>> <<if $Quests.includes("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> You search for the flower Lucy asked for, and eventually you find something...<br><br> <<button "The flower">> <<goto "Flower">> <</button>> <<else>> <<button "Time to leave">> <<goto "Base Intro">> <</button>> <</if>> <<set $Souls to $Souls + 5>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<set _Room to 1>> <h1>Defence Room _Room</h1> <hr> <<if !$Defences[_Room]>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <!-- Trap Door --> <<if !($DefenceRoom2 is "Trap Door" or $DefenceRoom3 is "Trap Door" or $DefenceRoom4 is "Trap Door" or $DefenceRoom5 is "Trap Door")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Trap_Door.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trap Door</h3> <p>Cost: 400 Wood</p> <<if $Wood >= 400>> <<button "Build Trap Door">> <<set $Defence = { name: "Trap Door", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Trap_Door.png", successChance: 25, maxTriggers: 1, passage: "RaidTrapDoor", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <!-- Arrow Trap --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Arrow_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Arrow Trap</h3> <p>Cost: 200 Wood, 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Arrow Trap">> <<set $Defence = { name: "Arrow Trap", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Arrow_Trap.png", successChance: 25, maxTriggers: 1, passage: "RaidArrowTrap", damage: 40 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Spider Lair --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Spider.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Spider Lair</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Build Spider Lair">> <<set $Defence = { name: "Spider Lair", type: "Monster", ImagePath: "Images/Castle/Defences/Spider.png", successChance: 20, maxTriggers: 2, passage: "RaidSpidersLair", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Thief's Lure --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Theif's_Lure.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Thief's Lure</h3> <p>Cost: 400 Gold</p> <<if $Gold >= 400>> <<button "Build Thief's Lure">> <<set $Defence = { name: "Thief's Lure", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Theif's_Lure.png", successChance: 25, maxTriggers: 1, passage: "RaidThiefLure", damage: 20 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Guardian --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Guardian.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Guardian</h3> <p>Cost: 200 Gold, 300 Stone</p> <<if ($Gold >= 200) and ($Stone >= 300)>> <<button "Build Guardian">> <<set $Defence = { name: "Guardian", type: "Monster", ImagePath: "Images/Castle/Defences/Guardian.png", successChance: 0, maxTriggers: 0, damage: 20, passage: "RaidGuardian", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Black Pool --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Tentical_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Black Pool</h3> <p>Cost: 400 Gold, 200 Stone</p> <<if ($Gold >= 400) and ($Stone >= 200)>> <<button "Build Black Pool">> <<set $Defence = { name: "Black Pool", type: "Monster", ImagePath: "Images/Castle/Defences/Tentical_Trap.png", successChance: 20, damage: 0, maxTriggers: 1, passage: "RaidBlackPool", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> </div> <<else>> <div class="Random-image"> <<set _imagePath to $Defences[_Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <h3>$Defences[_Room].name</h3> <<if $Defences[_Room].type is "Trap">> <p>Type: $Defences[_Room].type</p> <p>Success Rate: $Defences[_Room].successChance%</p> <<if $Defences[_Room].damage > 0>> <p>Damage: $Defences[_Room].damage</p> <</if>> <<if $Defences[_Room].maxTriggers > 0>> <p>Max Nightly Triggers: $Defences[_Room].maxTriggers</p> <</if>> <<else>> <<if ($Defences[_Room].name is "Spider Lair") or ($Defences[_Room].name is "Black Pool")>> <p>Skill: <progress @value=" $Defences[_Room].successChance" max="80"></progress><br></p> <<elseif $Defences[_Room].name is "Lucy">> Skill: <progress @value=" $LucyPower" max="30"></progress> <<elseif $Defences[_Room].name is "Alice">> Skill: <progress @value=" $AlicePower" max="30"></progress> <<else>> <p>Damage: <progress @value=" $Defences[_Room].damage" max="80"></progress></p> <</if>> <</if>> <<include "DefenceUpgrades">> <br><br> <<button "Reset Room">> <<if $Defences[_Room].name is "Lucy">> <<set $LucyDefend to false>> <<elseif $Defences[_Room].name is "Alice">> <<set $AliceDefend to false>><</if>> <<set $Defences[_Room] to null>> <<run Engine.show()>> <</button>> <</if>> <br><br> [[Return|Defences]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<set _Room to 2>> <h1>Defence Room _Room</h1> <hr> <<if !$Defences[_Room]>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <!-- Trap Door --> <<if !($DefenceRoom2 is "Trap Door" or $DefenceRoom3 is "Trap Door" or $DefenceRoom4 is "Trap Door" or $DefenceRoom5 is "Trap Door")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Trap_Door.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trap Door</h3> <p>Cost: 400 Wood</p> <<if $Wood >= 400>> <<button "Build Trap Door">> <<set $Defence = { name: "Trap Door", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Trap_Door.png", successChance: 25, maxTriggers: 1, passage: "RaidTrapDoor", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <!-- Arrow Trap --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Arrow_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Arrow Trap</h3> <p>Cost: 200 Wood, 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Arrow Trap">> <<set $Defence = { name: "Arrow Trap", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Arrow_Trap.png", successChance: 25, maxTriggers: 1, passage: "RaidArrowTrap", damage: 40 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Spider Lair --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Spider.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Spider Lair</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Build Spider Lair">> <<set $Defence = { name: "Spider Lair", type: "Monster", ImagePath: "Images/Castle/Defences/Spider.png", successChance: 20, maxTriggers: 2, passage: "RaidSpidersLair", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Thief's Lure --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Theif's_Lure.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Thief's Lure</h3> <p>Cost: 400 Gold</p> <<if $Gold >= 400>> <<button "Build Thief's Lure">> <<set $Defence = { name: "Thief's Lure", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Theif's_Lure.png", successChance: 25, maxTriggers: 1, passage: "RaidThiefLure", damage: 20 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Guardian --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Guardian.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Guardian</h3> <p>Cost: 200 Gold, 300 Stone</p> <<if ($Gold >= 200) and ($Stone >= 300)>> <<button "Build Guardian">> <<set $Defence = { name: "Guardian", type: "Monster", ImagePath: "Images/Castle/Defences/Guardian.png", successChance: 0, maxTriggers: 0, damage: 20, passage: "RaidGuardian", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Black Pool --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Tentical_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Black Pool</h3> <p>Cost: 400 Gold, 200 Stone</p> <<if ($Gold >= 400) and ($Stone >= 200)>> <<button "Build Black Pool">> <<set $Defence = { name: "Black Pool", type: "Monster", ImagePath: "Images/Castle/Defences/Tentical_Trap.png", successChance: 20, damage: 0, maxTriggers: 1, passage: "RaidBlackPool", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> </div> <<else>> <div class="Random-image"> <<set _imagePath to $Defences[_Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <h3>$Defences[_Room].name</h3> <<if $Defences[_Room].type is "Trap">> <p>Type: $Defences[_Room].type</p> <p>Success Rate: $Defences[_Room].successChance%</p> <<if $Defences[_Room].damage > 0>> <p>Damage: $Defences[_Room].damage</p> <</if>> <<if $Defences[_Room].maxTriggers > 0>> <p>Max Nightly Triggers: $Defences[_Room].maxTriggers</p> <</if>> <<else>> <<if ($Defences[_Room].name is "Spider Lair") or ($Defences[_Room].name is "Black Pool")>> <p>Skill: <progress @value=" $Defences[_Room].successChance" max="80"></progress><br></p> <<elseif $Defences[_Room].name is "Lucy">> Skill: <progress @value=" $LucyPower" max="30"></progress> <<elseif $Defences[_Room].name is "Alice">> Skill: <progress @value=" $AlicePower" max="30"></progress> <<else>> <p>Damage: <progress @value=" $Defences[_Room].damage" max="80"></progress></p> <</if>> <</if>> <<include "DefenceUpgrades">> <br><br> <<button "Reset Room">> <<if $Defences[_Room].name is "Lucy">> <<set $LucyDefend to false>> <<elseif $Defences[_Room].name is "Alice">> <<set $AliceDefend to false>><</if>> <<set $Defences[_Room] to null>> <<run Engine.show()>> <</button>> <</if>> <br><br> [[Return|Defences]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<set _Room to 3>> <h1>Defence Room _Room</h1> <hr> <<if !$Defences[_Room]>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <!-- Trap Door --> <<if !($DefenceRoom2 is "Trap Door" or $DefenceRoom3 is "Trap Door" or $DefenceRoom4 is "Trap Door" or $DefenceRoom5 is "Trap Door")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Trap_Door.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trap Door</h3> <p>Cost: 400 Wood</p> <<if $Wood >= 400>> <<button "Build Trap Door">> <<set $Defence = { name: "Trap Door", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Trap_Door.png", successChance: 25, maxTriggers: 1, passage: "RaidTrapDoor", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <!-- Arrow Trap --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Arrow_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Arrow Trap</h3> <p>Cost: 200 Wood, 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Arrow Trap">> <<set $Defence = { name: "Arrow Trap", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Arrow_Trap.png", successChance: 25, maxTriggers: 1, passage: "RaidArrowTrap", damage: 40 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Spider Lair --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Spider.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Spider Lair</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Build Spider Lair">> <<set $Defence = { name: "Spider Lair", type: "Monster", ImagePath: "Images/Castle/Defences/Spider.png", successChance: 20, maxTriggers: 2, passage: "RaidSpidersLair", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Thief's Lure --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Theif's_Lure.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Thief's Lure</h3> <p>Cost: 400 Gold</p> <<if $Gold >= 400>> <<button "Build Thief's Lure">> <<set $Defence = { name: "Thief's Lure", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Theif's_Lure.png", successChance: 25, maxTriggers: 1, passage: "RaidThiefLure", damage: 20 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Guardian --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Guardian.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Guardian</h3> <p>Cost: 200 Gold, 300 Stone</p> <<if ($Gold >= 200) and ($Stone >= 300)>> <<button "Build Guardian">> <<set $Defence = { name: "Guardian", type: "Monster", ImagePath: "Images/Castle/Defences/Guardian.png", successChance: 0, maxTriggers: 0, damage: 20, passage: "RaidGuardian", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Black Pool --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Tentical_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Black Pool</h3> <p>Cost: 400 Gold, 200 Stone</p> <<if ($Gold >= 400) and ($Stone >= 200)>> <<button "Build Black Pool">> <<set $Defence = { name: "Black Pool", type: "Monster", ImagePath: "Images/Castle/Defences/Tentical_Trap.png", successChance: 20, damage: 0, maxTriggers: 1, passage: "RaidBlackPool", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> </div> <<else>> <div class="Random-image"> <<set _imagePath to $Defences[_Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <h3>$Defences[_Room].name</h3> <<if $Defences[_Room].type is "Trap">> <p>Type: $Defences[_Room].type</p> <p>Success Rate: $Defences[_Room].successChance%</p> <<if $Defences[_Room].damage > 0>> <p>Damage: $Defences[_Room].damage</p> <</if>> <<if $Defences[_Room].maxTriggers > 0>> <p>Max Nightly Triggers: $Defences[_Room].maxTriggers</p> <</if>> <<else>> <<if ($Defences[_Room].name is "Spider Lair") or ($Defences[_Room].name is "Black Pool")>> <p>Skill: <progress @value=" $Defences[_Room].successChance" max="80"></progress><br></p> <<elseif $Defences[_Room].name is "Lucy">> Skill: <progress @value=" $LucyPower" max="30"></progress> <<elseif $Defences[_Room].name is "Alice">> Skill: <progress @value=" $AlicePower" max="30"></progress> <<else>> <p>Damage: <progress @value=" $Defences[_Room].damage" max="80"></progress></p> <</if>> <</if>> <<include "DefenceUpgrades">> <br><br> <<button "Reset Room">> <<if $Defences[_Room].name is "Lucy">> <<set $LucyDefend to false>> <<elseif $Defences[_Room].name is "Alice">> <<set $AliceDefend to false>><</if>> <<set $Defences[_Room] to null>> <<run Engine.show()>> <</button>> <</if>> <br><br> [[Return|Defences]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<set _Room to 4>> <h1>Defence Room _Room</h1> <hr> <<if !$Defences[_Room]>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <!-- Trap Door --> <<if !($DefenceRoom2 is "Trap Door" or $DefenceRoom3 is "Trap Door" or $DefenceRoom4 is "Trap Door" or $DefenceRoom5 is "Trap Door")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Trap_Door.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trap Door</h3> <p>Cost: 400 Wood</p> <<if $Wood >= 400>> <<button "Build Trap Door">> <<set $Defence = { name: "Trap Door", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Trap_Door.png", successChance: 25, maxTriggers: 1, passage: "RaidTrapDoor", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <!-- Arrow Trap --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Arrow_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Arrow Trap</h3> <p>Cost: 200 Wood, 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Arrow Trap">> <<set $Defence = { name: "Arrow Trap", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Arrow_Trap.png", successChance: 25, maxTriggers: 1, passage: "RaidArrowTrap", damage: 40 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Spider Lair --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Spider.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Spider Lair</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Build Spider Lair">> <<set $Defence = { name: "Spider Lair", type: "Monster", ImagePath: "Images/Castle/Defences/Spider.png", successChance: 20, maxTriggers: 2, passage: "RaidSpidersLair", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Thief's Lure --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Theif's_Lure.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Thief's Lure</h3> <p>Cost: 400 Gold</p> <<if $Gold >= 400>> <<button "Build Thief's Lure">> <<set $Defence = { name: "Thief's Lure", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Theif's_Lure.png", successChance: 25, maxTriggers: 1, passage: "RaidThiefLure", damage: 20 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Guardian --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Guardian.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Guardian</h3> <p>Cost: 200 Gold, 300 Stone</p> <<if ($Gold >= 200) and ($Stone >= 300)>> <<button "Build Guardian">> <<set $Defence = { name: "Guardian", type: "Monster", ImagePath: "Images/Castle/Defences/Guardian.png", successChance: 0, maxTriggers: 0, damage: 20, passage: "RaidGuardian", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Black Pool --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Tentical_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Black Pool</h3> <p>Cost: 400 Gold, 200 Stone</p> <<if ($Gold >= 400) and ($Stone >= 200)>> <<button "Build Black Pool">> <<set $Defence = { name: "Black Pool", type: "Monster", ImagePath: "Images/Castle/Defences/Tentical_Trap.png", successChance: 20, damage: 0, maxTriggers: 1, passage: "RaidBlackPool", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> </div> <<else>> <div class="Random-image"> <<set _imagePath to $Defences[_Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <h3>$Defences[_Room].name</h3> <<if $Defences[_Room].type is "Trap">> <p>Type: $Defences[_Room].type</p> <p>Success Rate: $Defences[_Room].successChance%</p> <<if $Defences[_Room].damage > 0>> <p>Damage: $Defences[_Room].damage</p> <</if>> <<if $Defences[_Room].maxTriggers > 0>> <p>Max Nightly Triggers: $Defences[_Room].maxTriggers</p> <</if>> <<else>> <<if ($Defences[_Room].name is "Spider Lair") or ($Defences[_Room].name is "Black Pool")>> <p>Skill: <progress @value=" $Defences[_Room].successChance" max="80"></progress><br></p> <<elseif $Defences[_Room].name is "Lucy">> Skill: <progress @value=" $LucyPower" max="30"></progress> <<elseif $Defences[_Room].name is "Alice">> Skill: <progress @value=" $AlicePower" max="30"></progress> <<else>> <p>Damage: <progress @value=" $Defences[_Room].damage" max="80"></progress></p> <</if>> <</if>> <<include "DefenceUpgrades">> <br><br> <<button "Reset Room">> <<if $Defences[_Room].name is "Lucy">> <<set $LucyDefend to false>> <<elseif $Defences[_Room].name is "Alice">> <<set $AliceDefend to false>><</if>> <<set $Defences[_Room] to null>> <<run Engine.show()>> <</button>> <</if>> <br><br> [[Return|Defences]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<set _Room to 5>> <h1>Defence Room _Room</h1> <hr> <<if !$Defences[_Room]>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <!-- Trap Door --> <<if !($DefenceRoom2 is "Trap Door" or $DefenceRoom3 is "Trap Door" or $DefenceRoom4 is "Trap Door" or $DefenceRoom5 is "Trap Door")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Trap_Door.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trap Door</h3> <p>Cost: 400 Wood</p> <<if $Wood >= 400>> <<button "Build Trap Door">> <<set $Defence = { name: "Trap Door", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Trap_Door.png", successChance: 25, maxTriggers: 1, passage: "RaidTrapDoor", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <!-- Arrow Trap --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Arrow_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Arrow Trap</h3> <p>Cost: 200 Wood, 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Arrow Trap">> <<set $Defence = { name: "Arrow Trap", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Arrow_Trap.png", successChance: 25, maxTriggers: 1, passage: "RaidArrowTrap", damage: 40 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Spider Lair --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Spider.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Spider Lair</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Build Spider Lair">> <<set $Defence = { name: "Spider Lair", type: "Monster", ImagePath: "Images/Castle/Defences/Spider.png", successChance: 20, maxTriggers: 2, passage: "RaidSpidersLair", damage: 0 }>> <<set $Defences[_Room] = $Defence>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Thief's Lure --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Theif's_Lure.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Thief's Lure</h3> <p>Cost: 400 Gold</p> <<if $Gold >= 400>> <<button "Build Thief's Lure">> <<set $Defence = { name: "Thief's Lure", level: 1, type: "Trap", ImagePath: "Images/Castle/Defences/Theif's_Lure.png", successChance: 25, maxTriggers: 1, passage: "RaidThiefLure", damage: 20 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Guardian --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Guardian.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Guardian</h3> <p>Cost: 200 Gold, 300 Stone</p> <<if ($Gold >= 200) and ($Stone >= 300)>> <<button "Build Guardian">> <<set $Defence = { name: "Guardian", type: "Monster", ImagePath: "Images/Castle/Defences/Guardian.png", successChance: 0, maxTriggers: 0, damage: 20, passage: "RaidGuardian", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Black Pool --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Defences/Tentical_Trap.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Black Pool</h3> <p>Cost: 400 Gold, 200 Stone</p> <<if ($Gold >= 400) and ($Stone >= 200)>> <<button "Build Black Pool">> <<set $Defence = { name: "Black Pool", type: "Monster", ImagePath: "Images/Castle/Defences/Tentical_Trap.png", successChance: 20, damage: 0, maxTriggers: 1, passage: "RaidBlackPool", health: 100 }>> <<set $Defences[_Room] = $Defence>> <<set $Gold to $Gold - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> </div> <<else>> <div class="Random-image"> <<set _imagePath to $Defences[_Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <h3>$Defences[_Room].name</h3> <<if $Defences[_Room].type is "Trap">> <p>Type: $Defences[_Room].type</p> <p>Success Rate: $Defences[_Room].successChance%</p> <<if $Defences[_Room].damage > 0>> <p>Damage: $Defences[_Room].damage</p> <</if>> <<if $Defences[_Room].maxTriggers > 0>> <p>Max Nightly Triggers: $Defences[_Room].maxTriggers</p> <</if>> <<else>> <<if ($Defences[_Room].name is "Spider Lair") or ($Defences[_Room].name is "Black Pool")>> <p>Skill: <progress @value=" $Defences[_Room].successChance" max="80"></progress><br></p> <<elseif $Defences[_Room].name is "Lucy">> Skill: <progress @value=" $LucyPower" max="30"></progress> <<elseif $Defences[_Room].name is "Alice">> Skill: <progress @value=" $AlicePower" max="30"></progress> <<else>> <p>Damage: <progress @value=" $Defences[_Room].damage" max="80"></progress></p> <</if>> <</if>> <<include "DefenceUpgrades">> <br><br> <<button "Reset Room">> <<if $Defences[_Room].name is "Lucy">> <<set $LucyDefend to false>> <<elseif $Defences[_Room].name is "Alice">> <<set $AliceDefend to false>><</if>> <<set $Defences[_Room] to null>> <<run Engine.show()>> <</button>> <</if>> <br><br> [[Return|Defences]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <h1>Defences</h1> <h2>These defences defend your side gate and will hinder any would-be raider who looks to slip into your vault in the night</h2> <<if $Defences[1]>><<set _room1name to $Defences[1].name>> <<else>><<set _room1name to "null">><</if>> <<if $DefenceCount >= 2>> <<if $Defences[2]>><<set _room2name to $Defences[2].name>> <<else>><<set _room2name to "null">><</if>> <</if>> <<if $DefenceCount >= 3>> <<if $Defences[3]>><<set _room3name to $Defences[3].name>> <<else>><<set _room3name to "null">><</if>><</if>> <<if $DefenceCount >= 4>> <<if $Defences[4]>><<set _room4name to $Defences[4].name>> <<else>><<set _room4name to "null">><</if>><</if>> <<if $DefenceCount is 5>> <<if $Defences[5]>><<set _room5name to $Defences[5].name>> <<else>><<set _room5name to "null">><</if>><</if>> <<if (_room1name is "Alice") or (_room1name is "Lucy")>> <<set _room1 to "Images/Castle/Defences/Maps/Succ/1.png">> <<else>> <<set _room1 to "Images/Castle/Defences/Maps/" + _room1name +"/1.png">><</if>> <<if (_room2name is "Alice") or (_room2name is "Lucy")>> <<set _room2 to "Images/Castle/Defences/Maps/Succ/2.png">> <<else>> <<set _room2 to "Images/Castle/Defences/Maps/" + _room2name +"/2.png">><</if>> <<if (_room3name is "Alice") or (_room3name is "Lucy")>> <<set _room3 to "Images/Castle/Defences/Maps/Succ/3.png">> <<else>> <<set _room3 to "Images/Castle/Defences/Maps/" + _room3name +"/3.png">><</if>> <<if (_room4name is "Alice") or (_room4name is "Lucy")>> <<set _room4 to "Images/Castle/Defences/Maps/Succ/4.png">> <<else>> <<set _room4 to "Images/Castle/Defences/Maps/" + _room4name +"/4.png">><</if>> <<if (_room5name is "Alice") or (_room5name is "Lucy")>> <<set _room5 to "Images/Castle/Defences/Maps/Succ/5.png">> <<else>> <<set _room5 to "Images/Castle/Defences/Maps/" + _room5name +"/5.png">> <</if>> <div class="castle-map"> <img src="Images/Castle/Defences/Maps/base.jpeg" alt="Castle Interior" class="castle-base"> <<if _room1name isnot "null">> <img @src="_room1" alt="room1" class="room-overlay"><</if>> <<if def _room2name>> <img @src="_room2" alt="room2" class="room-overlay"><</if>> <<if def _room3name>> <img @src="_room3" alt="room3" class="room-overlay"><</if>> <<if def _room4name>> <img @src="_room4" alt="room4" class="room-overlay"><</if>> <<if def _room5name>> <img @src="_room5" alt="room5" class="room-overlay"><</if>> </div> <br><br> <<if $VisitedDefences is false>> <<include "DialogueStorage">> <<startdialogue "_TutorialDefences">> <</if>> <<if typeof $DefenceCount === "undefined" or $DefenceCount === 0 or not $DefenceCount>> <<set $DefenceCount to 1>> <</if>> You currently have space for <<print $DefenceCount>> defence position(s).<br> <hr> <div style="display: grid; grid-template-columns: auto 1fr; gap: 20px; align-items: center;"> /* Room 1 */ <div> <<button "Room 1">><<goto "DefenceRoom1NEW">><</button>> </div> <div> <<if $Defences[1]>> <span>$Defences[1].name ($Defences[1].type)</span> <<else>> <span style="color: #666;">Empty</span> <</if>> </div> /* Room 2 */ <<if $DefenceCount >= 2>> <div> <<button "Room 2">><<goto "DefenceRoom2NEW">><</button>> </div> <div> <<if $Defences[2]>> <span>$Defences[2].name ($Defences[2].type)</span> <<else>> <span style="color: #666;">Empty</span> <</if>> </div> <</if>> /* Room 3 */ <<if $DefenceCount >= 3>> <div> <<button "Room 3">><<goto "DefenceRoom3NEW">><</button>> </div> <div> <<if $Defences[3]>> <span>$Defences[3].name ($Defences[3].type)</span> <<else>> <span style="color: #666;">Empty</span> <</if>> </div> <</if>> /* Room 4 */ <<if $DefenceCount >= 4>> <div> <<button "Room 4">><<goto "DefenceRoom4NEW">><</button>> </div> <div> <<if $Defences[4]>> <span>$Defences[4].name ($Defences[4].type)</span> <<else>> <span style="color: #666;">Empty</span> <</if>> </div> <</if>> /* Room 5 */ <<if $DefenceCount >= 5>> <div> <<button "Room 5">><<goto "DefenceRoom5NEW">><</button>> </div> <div> <<if $Defences[5]>> <span>$Defences[5].name ($Defences[5].type)</span> <<else>> <span style="color: #666;">Empty</span> <</if>> </div> <</if>> </div> <hr> <<button "Trap Into">> <<goto "Traps Info">> <</button>><br> <<button "Go outside">> <<goto "Base Intro">> <</button>> <style> .castle-map { position: relative; width: 600px; height: 600px; margin: 0 auto; } .castle-base { position: absolute; top: 0; left: 0; width: 600px; height: 600px; display: block; } .room-overlay { position: absolute; top: 0; left: 0; width: 600px; height: 600px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>> <<set $VisitedDefences to true>> </div>
<<nobr>> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <<if ($Defences[_Room].name is "Trap Door") and ($Defences[_Room].successChance is 25)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Upgrade.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade Success Rate to 50%</h3> <p>Cost: 300 Wood</p> <<if $Wood >= 300>> <<button "Upgrade">> <<set $Defences[_Room].successChance to 50>> <<set $Wood to $Wood - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Trap Door") and ($Defences[_Room].successChance is 50)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Upgrade.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade Success Rate to 75%</h3> <p>Cost: 300 Wood, 200 Stone</p> <<if ($Wood >= 300) and ($Stone >= 200)>> <<button "Upgrade">> <<set $Defences[_Room].successChance to 75>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Trap Door") and ($Defences[_Room].maxTriggers is 1)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Capacity.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade capacity to two</h3> <p>Cost: 300 Wood, 300 Stone</p> <<if ($Wood >= 300) and ($Stone >= 300)>> <<button "Upgrade">> <<set $Defences[_Room].maxTriggers to 2>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Arrow Trap") and ($Defences[_Room].successChance is 25)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Upgrade.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade Success Rate to 50%</h3> <p>Cost: 300 Wood, 300 Stone</p> <<if ($Wood >= 300) and ($Stone >= 300)>> <<button "Upgrade">> <<set $Defences[_Room].successChance to 50>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Arrow Trap") and ($Defences[_Room].successChance is 50)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Upgrade.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade Success Rate to 75%</h3> <p>Cost: 400 Wood, 200 Stone</p> <<if ($Wood >= 400) and ($Stone >= 200)>> <<button "Upgrade">> <<set $Defences[_Room].successChance to 75>> <<set $Wood to $Wood - 400>> <<set $Stone to $Stone - 200>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Arrow Trap") and ($Defences[_Room].damage is 40)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Damage.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade damage to 60</h3> <p>Cost: 250 Wood, 100 Gold</p> <<if ($Wood >= 250) and ($Gold >= 100)>> <<button "Upgrade">> <<set $Defences[_Room].damage to 60>> <<set $Wood to $Wood - 250>> <<set $Gold to $Gold - 100>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Arrow Trap") and ($Defences[_Room].damage is 60)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Damage.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade damage to 80</h3> <p>Cost: 500 Wood, 300 Gold</p> <<if ($Wood >= 500) and ($Gold >= 300)>> <<button "Upgrade">> <<set $Defences[_Room].damage to 80>> <<set $Wood to $Wood - 500>> <<set $Gold to $Gold - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Arrow Trap") and ($Defences[_Room].maxTriggers is 1)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Arrow.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade to trigger up to twice per night</h3> <p>Cost: 400 Wood, 250 Gold</p> <<if ($Wood >= 400) and ($Gold >= 250)>> <<button "Upgrade">> <<set $Defences[_Room].maxTriggers to 2>> <<set $Wood to $Wood - 400>> <<set $Gold to $Gold - 250>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Thief's Lure") and ($Defences[_Room].successChance is 25)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Upgrade.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade Success Rate to 50%</h3> <p>Cost: 300 Wood</p> <<if $Wood >= 300>> <<button "Upgrade">> <<set $Defences[_Room].successChance to 50>> <<set $Wood to $Wood - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Thief's Lure") and ($Defences[_Room].maxTriggers is 1)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Capacity.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade capacity to two</h3> <p>Cost: 300 Wood, 300 Stone</p> <<if ($Wood >= 300) and ($Stone >= 300)>> <<button "Upgrade">> <<set $Defences[_Room].maxTriggers to 2>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Thief's Lure") and ($Defences[_Room].damage is 20)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Damage.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade corruption damage to 40</h3> <p>Cost: 300 Gold</p> <<if $Gold >= 300>> <<button "Upgrade">> <<set $Defences[_Room].damage to 40>> <<set $Gold to $Gold - 300>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($Defences[_Room].name is "Thief's Lure") and ($Defences[_Room].damage is 40)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Damage.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Upgrade corruption damage to 60</h3> <p>Cost: 500 Gold</p> <<if $Gold >= 500>> <<button "Upgrade">> <<set $Defences[_Room].damage to 60>> <<set $Gold to $Gold - 500>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> </div> <</nobr>>
<h2>Devil Card</h2> The Devil... the Fallen Angel who commands the damned. To carry this card is to wield power over those souls that defy death’s embrace. But heed my warning nothing comes without a price. The Devil always collects what is owed...<br><br> Effects of carrying this card:<br> -Enemy from the void, such as ghouls, zombies and skeletons deal less damage and give you a soul upon their defeat<br> - Random chance of a soul being lost when you kill someone<br><br> Effects of buring the card:<br> - Gives 5 souls<br><br>
<<nobr>> <<set _TutorialArmory to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Your armory Lord"}, {speaker: 1, text: "It's empty?"}, {speaker: 2, text: "Yes, Lord for now we gave a few weapons you can take but it will need restocking. If you find or purchase any weapons on your journey please bring them back for safe keeping here"}, {speaker: 2, text: "You can only carry up to 3 weapons, your dagger slot, a medium weapon slot and the weapon on your back"}, {speaker: 2, text: "Any weapons you buy or find will return whatever you are carrying here in case you want to change back later"}, {speaker: 2, text: "Remember, each weapon has a few uses, select a weapon to see the cards you can use in combat, we will go into more detail about combat when we practice later"} ] }>> <<set _TutorialDefences to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Here, my lord, we can oversee the castle's defences. This corridor leads to your vault - any intruder must pass through here."}, {speaker: 1, text: "You're expecting us to be attacked?"}, {speaker: 2, text: "Without question, master. Word of your return spreads like plague. Bandits infest these forests, and they grow bold. Once they learn of your growing wealth, they'll come - thieves seeking gold, heroes seeking glory, all will test our defences."}, {speaker: 2, text: "We must fortify the path to your vault. Any would-be thief will either feed the crows... or fill your dungeon cells. Your choice, my lord."}, {speaker: 2, text: "Currently, we have space for one defence position. You can install trap doors, arrow traps, summon guardians, or even more... creative deterrents. I await your command to begin construction."}, {speaker: 1, text: "Can we expand our defensive capabilities?"}, {speaker: 2, text: "Absolutely, master! Your chambers contain the planning table for expansions. We can build up to five defence positions when fully upgraded. But remember - greater power draws greater attention. The more we grow, the more enemies will seek to destroy us."}, ] }>> <<set _TutorialVault to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Behold, the vault, my lord! Or... what remains of it."}, {speaker: 1, text: "It's practically barren. Where is my hoard?"}, {speaker: 2, text: "Forgive me, master. The looters were... thorough. But we shall rebuild your wealth beyond their pathetic imaginations!"}, {speaker: 1, text: "What resources do we need to restore the castle?"}, {speaker: 2, text: "Gold for hiring workers and bribes, stone for walls and fortifications, wood for construction and scaffolding. With these, I can reshape this ruin into a fortress worthy of your dark majesty."}, {speaker: 2, text: "But remember, master - raiders always target the vault first. Common bandits care nothing for glory or justice. They want only gold! Our defences must protect this chamber above all else."} ] }>> <<set _TutorialDungeon to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Ah, you've descended into the dungeons, my lord. Can you feel it? The darkness here is... alive."}, {speaker: 1, text: "There's a strange energy down here. The air itself feels thick with malevolence."}, {speaker: 2, text: "Indeed, master! An ancient corruption rune is embedded in these walls. Any prisoner held here will slowly have their will broken, their mind twisted to serve your dark purpose. The castle itself corrupts them."}, {speaker: 1, text: "How effective is this corruption?"}, {speaker: 2, text: "Currently we have two cells ready, and one corruption rune active. Prisoners will gradually submit over time, but if you desire faster results, we'll need more runes. I can expand the dungeon with additional cells if you provide the materials."}, {speaker: 1, text: "Where would I find more corruption runes?"}, {speaker: 2, text: "The ancient crypts scattered across the land often contain them, my lord. Other dark beings hoard such artifacts... some may even rival your power. Tread carefully when seeking them."} ] }>> <<set _TutorialEncounterEnemy to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Welcome to the coutyard Master, here you and your followers can practice combat, We have a spare guardian ahead, he's an excelent traning partner as we can kill him as many times as we like so feel free to come back to practice any time"}, {speaker: 2, text: "Before all enounters we first must assess our enemy, look at this closely before attacking otherwise you might find they are a little beyond your skill"}, {speaker: 2, text: "First at the top, we can see the enemy name, level. Their level is important, a high level enemy will be able to play more cards per attack so for now, avoid them where you can, remeber that as our power grows greater threats may appear"}, {speaker: 2, text: "This guardian wears no armour, but some threats will, their armour will lower the damage you can do per blow"}, {speaker: 2, text: "Below the enemy, you can see the cards they will be taking into battle... Our friend here has one weapon a long sword with two attack types and a defence type"}, {speaker: 1, text: "Simple enough."}, {speaker: 2, text: "This weaker enemy is, but others may carry more weapons and tougher armour..."}, {speaker: 2, text: "The next thing you must look at the the enemy traits, see this one is fleshless and soulless? Fleshless enemy are immune to fire damage and soulless enemy cannot be corrupted nor can you gain a soul be defeating them"}, {speaker: 2, text: "Let's enter the battle, click Attack when your ready"} ] }>> <<set _TutorialCombatEnemy1 to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Here we are, the throws of combat... In front of you, you'll see 4 boxes, the top two, and the bottom two, the very top box is your enemys table, you can see they have placed a card they are going to play against you"}, {speaker: 2, text: "Below that, is your table, its empty for now but we will add a card to it in moment, any cards placed on your table will be used in combat"}, {speaker: 2, text: "Below your table is your combat deck showing your weapon cards, you can also see your spells, potions, defence cards or all of them at once if you like"}, {speaker: 2, text: "looking at the weapon cards, you can see the energy cost, magic cost and damge which it will deal to your enemy, you can also see any effects specific to that weapon, not all effects are positive so keep an eye out, remember you can review your weapon effects and enemy traits with the tabs at the bottom of the screen"}, {speaker: 2, text: "Go ahead and place any card you like on the table by selecting the card and selecting the table, or double click the card. Then click execute combat, I'd recomend you start with a weapon card"} ] }>> <<set _TutorialCombatEnemy2 to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Well done, you can swing a blade, now notice the enemys health bar on the right panel and your health bar on the left, needless to say if you wish to defeat your enemy get their health to 0 or corruption to 100, also pay attention to your energy and magic stats. Powerful weapons do plenty of damage yes, but use a lot of energy to use. If your expecting more than one fight then try to conserve energy! Or pack plenty of potions..."}, {speaker: 2, text: "Now, on to round two, if your looking closely you'll see there is a glowing ring around our opponents table, who evers table has the glowing red ring holds priority this means their first card is the first card played, then its the turn of whoever doesn't have priority, pay close attention to this, theres no point setting up a parry after they enemy has alreay stabbed you!"}, {speaker: 2, text: "To help you understand how the cards play out, you'll see a number at the top of each one this is the order the cards are going to be payed, keep this in mind if you need to play defensively. These numbers are only shown in this tutorial, but if you find them helpful you can re-enable them in settings"} ] }>> <<set _TutorialCombatEnemy3 to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "You've probably noticed but you are not as fierce a worrior as some at this stage, fighting even one enemy can be difficult, don't worrry theres plenty of better weapons out there and ways to improve how you fight, but for now, be careful!"}, {speaker: 2, text: "Try drinking a healing potion if you haven't already, remember to always keep a few if you can and use them wisely, they do take up a space on your table which for now is half the amount of cards you can play"} ] }>> <<set _FirstMilitaConvo to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Master, do you have a moment?"}, {speaker: 1, text: "What is it?"}, {speaker: 2, text: "I have noticed you have... Convinced somone to join your milita, congratulations Master. This is an excellent first step! But it does raise an issue"}, {speaker: 1, text: "Get to the point"}, {speaker: 2, text: "Yes, sorry Lord... We must grow our army, but we must also look after it. We are immortal but they are not, what we need, lord is food and plenty of it to go around. The most corrupted and devoted of your forces will break and possibly even flee if we cannot provide the basics, they have a bed, water and steel but they need food"}, {speaker: 1, text: "What do you suggest we do"}, {speaker: 2, text: "There's a farm in the forest, to the East. You've probably already passed it, I believe it to be abandoned due to raiders. Meet me there and we can discuss a plan"} ] }>> <<set _FarmIntro to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Ah my Lord, it's perfect!"}, {speaker: 1, text: "It's practically a ruin"}, {speaker: 2, text: "Umm, yes well it's abandoned which also means it's free. We need food for our forces and captured land, this small farm will do just that for us"}, {speaker: 1, text: "How"}, {speaker: 2, text: "For the farm to run correctly we need staff and grain, you already have a tallent for shall we say, convincing people to work for you, once you have corrupted some humans consider sending them here we need at least two to tend the field and we could do with a few more to guard the farm"}, {speaker: 1, text: "I can do that, what about grain to sow"}, {speaker: 2, text: "Theres a few ways we can go about obtaining grain, first and most honest we could buy it from the local shop in scarldale or the merchant"}, {speaker: 1, text: "Any alternative suggestions?"}, {speaker: 2, text: "A few, send out scouts to search for bandit camps they should have what we need, or you could find a way to convincing a local clerk to redirect some carts to us? A bribe prehapse? Eitherway we need staff and grain. I will get to work fixing up the place, once you have some grain return here"} ] }>> <<set _FarmDefence to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "Congrats Lord, we have more food for the settlements"}, {speaker: 1, text: "Yes, but I can't keep doing this myself"}, {speaker: 2, text: "Of course you can't, I have set up some new quarters next to the barracks for your loyal servants to live who do not swing a sword. Choose some you like, send them to study in the library so they can become farmers and we will send them here"}, {speaker: 1, text: "We're the dungeons not sufficient?"}, {speaker: 2, text: "Theres no need to keep loyal followers in the dungeons, we need that space for trubble makers"}, {speaker: 1, text: "Thank you"}, {speaker: 2, text: "A pleasure my lord, now... We have a bigger problem, you've probably noticed the bandit camp up the road, there are too many of them for us to attack for now. So I suggest paying them to leave us alone, or placing guards at the farm"}, {speaker: 1, text: "Thank you for your council"} ] }>> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Explore Team</h1> <<if $ExploreTeam.length === 0>> <p>No one is exploreing</p> <<else>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $ExploreTeam.length; _i++>> <<capture _prisoner>> <<set _prisoner to $ExploreTeam[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <p>Armor: <<print _prisoner.armor>></p> <p>Weapon: <<print _prisoner.weapon>></p> <p>Days till return: <<print _prisoner.daysremaining>></p> </div> <</capture>> <</for>> </div> <</if>> </div> <div style="text-align: center"> <<button "Back">> <<run Engine.play('Barracks')>> <</button>> </div> <</nobr>>
<<nobr>> <div class="path-dialog-custom dominion-theme"> <div class="path-dialog-header"> <div class="path-icon">👑</div> <h2>PATH OF DOMINION</h2> <div class="path-divider"></div> </div> <div class="path-dialog-content"> <p class="path-lore">Ancient vaults open before you, revealing treasures hoarded by your predecessors. Gold, timber, and stone await your command to rebuild an empire of darkness.</p> <div class="path-benefits"> <div class="benefit-item"> <span class="benefit-icon">💰</span> <span><strong>500</strong> Gold coins fill your coffers</span> </div> <div class="benefit-item"> <span class="benefit-icon">🪵</span> <span><strong>700</strong> units of timber for construction</span> </div> <div class="benefit-item"> <span class="benefit-icon">🪨</span> <span><strong>600</strong> blocks of stone for fortifications</span> </div> </div> <p class="path-warning">Wealth commands loyalty. Resources build power. Your fortress shall rise swiftly from the ashes.</p> </div> <div class="path-dialog-footer"> <<button "Embrace the Path of Dominion" "dominion-btn">> <<set $Gold to 500>> <<set $Wood to 700>> <<set $Stone to 600>> <<set $selectedBonus to "Resources">> <<script>>Dialog.close();<</script>> <<goto "GnarlakEncounter">> <</button>> <<button "Reconsider">> <<script>>Dialog.close();<</script>> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set _int1 to random(1, 5)>> <<set _int2 to random(6, 7)>> You enter the cell and begin the corruption. It doesn't take long for him to break and you spend hours satisfying his every desire...<br><br> <<set $ImagePath to "Images/Castle/Dungon/Men/Lucy/Corruption/Sex/" + _int1 + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set $ImagePath to "Images/Castle/Dungon/Men/Lucy/Corruption/Sex/" + _int2 + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Finish/face.webm">> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <i>More content here will be coming soon</i><br><br> <<set _prisoner.corruption to _prisoner.corruption + 100>> <<set $Time to $Time + 3>> <<button "Leave">> <<goto "LucyBase">> <</button>> </div> <</nobr>>
<<nobr>> <<set $CurrentPlayer to "Lucy">> <<set $Position to "null">> <<set $OldPosition to "null">> <<set $Lust to 0>> <<set $Orgasm to 0>> <<set $OldImage to $LucyImg>> <<set $WillPower to 100>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set $haircolour to _prisoner.hairColor>> <<set $CharacterPath to _prisoner.ImagePath>> <<set _Personalitys to ["Arrogant", "Defensive", "Timid"]>> <<set _int to random(0, 1)>> <<set $Personality to _Personalitys[_int]>> <<set _Desires to ["Overpowered", "Worshipped"]>> <<set _int to random(0, 1)>> <<set $Desire to _Desires[_int]>> <<set $DungeonActivies = ["Deepthroat", "Blowjob", "Handjob", "Eating pussy", "Being ridden", "Anal", "Being teased"]>> <<set $NPCLikes to []>> <<set $NPCDislikes to []>> <<set _int to random(3, 5)>> <<for _i to 0; _i <= _int; _i++>> <<set _ran to random(0, $DungeonActivies.length - 1)>> <<run $NPCLikes.push($DungeonActivies[_ran])>> <<run $DungeonActivies.deleteAt(_ran)>> <</for>> <<set _int to random(1, $DungeonActivies.length - 1)>> <<for _i to 0; _i <= _int; _i++>> <<set _ran to random(0, $DungeonActivies.length - 1)>> <<run $NPCDislikes.push($DungeonActivies[_ran])>> <<run $DungeonActivies.deleteAt(_ran)>> <</for>> <<widget "getVisibleCount">> <<return Math.floor($Understanding / 10)>> <</widget>> <div class="character-card"> <div class="character-image"> <img @src=$CharacterPath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personality:</span> $Personality</p> <p><span class="info-label">Desire:</span> To be $Desire</p> <p><span class="info-label">Likes:</span> <<set _visibleCount = Math.floor($Understanding / 10)>> <<for _i to 0; _i < $NPCLikes.length; _i++>> <<if _i < _visibleCount>> $NPCLikes[_i] <<else>> <span class="blurred">$NPCLikes[_i]</span> <</if>> <<if _i < $NPCLikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Dislikes:</span> <<for _i to 0; _i < $NPCDislikes.length; _i++>> <<if _i < _visibleCount>> $NPCDislikes[_i] <<else>> <span class="blurred">$NPCDislikes[_i]</span> <</if>> <<if _i < $NPCDislikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Neutral:</span> <<for _i to 0; _i < $DungeonActivies.length; _i++>> <<if _i < _visibleCount>> $DungeonActivies[_i] <<else>> <span class="blurred">_sourceArray[_i]</span> <</if>> <<if _i < $DungeonActivies.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Will Power: <progress @value="$WillPower" max="100"></progress></span></p> </div> </div> <div class="text-box"> You look through a small hole in the cell door, observing the prisoner pondering his wants and needs.<br><br> You think about the best way to manipulate the prisoner...<br><br> You could, disguise yourself and pretend to be another prisoner thrown into the cell.<br> <<button "Change into prisoner clothing">> <<set $LucyImg to "Images/Castle/Dungon/Men/Lucy/Corruption/2.png">> <<goto "DongeonCorruptionPrisoner">> <</button>><br><br> You could disguise yourself and pretend to be a gift from $LucyName, a toy to win over the prisoner.<br> <<button "Changing into revealing clothing">> <<set $LucyImg to "Images/Castle/Dungon/Men/Lucy/Corruption/1.png">> <<goto "DongeonCorruptionToy">> <</button>><br><br> Enter as you are, in all your demonic glory.<br> <<button "Enter as you are">> <<goto "DongeonCorruptionSucc">> <</button>><br><br> </div> <</nobr>>
<<nobr>> <<set _lines to [ "You… you’re another prisoner too, right? Gods, I thought I was alone in this place…", "Shhh, keep your voice down. If the guards hear us talking, they’ll separate us.", "They took me from my home weeks ago… I don’t even know where we are. Do you?", "I can’t believe they left us alone together… maybe we can figure a way out of this mess. Together." ]>> <<set _line = either(_lines)>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> You slip into the dimly lit cell, the heavy door groaning as it closes behind you. The damp air clings to your skin, the scent of stone and confinement filling your lungs. Your clothes are tattered, carefully chosen to match the look of a fellow prisoner<br><br> He sits on the cot, his posture tense, his eyes flicking toward you with suspicion. You shiver slightly, playing your part, hugging your arms around yourself pretending to be cold<br><br> </div> <<say 'Prisoner' $CharacterPath>>Who are you?<</say>><br><br> <<say 'Lucy' $LucyImg>>_line<</say>><br><br> <<if $Personality is "Arrogant">> <<set _lines to [ "Oh, great. Another stray tossed in here, well you can sleep in the cornor", "Tch. Just what I needed—a sobbing, scared little thing in my cell.", "Pathetic. If you’re waiting for me to protect you, you’re in for a rough time.", "Tears already? You’ll break in a day. Maybe less.", "Oh, come on. Don’t look at me like that. I didn’t put you in here. But… maybe I’ll have a little fun watching you squirm.", "You’re shaking. What, never been locked up before? You’ll get used to it. Or you won’t.", "Tch. Just my luck. I’d rather be alone than stuck with some fragile little thing who’s going to start crying any second.", "Go sit in the corner and stay quiet. I don’t babysit." ]>><</if>> <<if $Personality is "Defensive">> <<set _lines to [ "Stay back. I don’t trust strangers. Especially ones who show up looking like lost lambs.",, "If you think I’m going to fall for some sob story, you’re wrong.", "Don’t talk to me. Don’t get close to me. I don’t care who you are.", "You’re too clean. Too soft. Either you’re bait, or you’re a fool.", "This is a test, isn’t it? A trick? I won’t fall for it.", "Stay on your side of the cell. If you’re smart, you’ll keep your head down and your mouth shut." ]>><</if>> <<if $Personality is "Timid">> <<set _lines to [ "Oh—oh gods, they put someone else in here? Are you hurt?", "T-They just threw you in here? Did they say anything to you? Do you know why?", "You—y-you don’t look like you belong here…", "Oh no… oh no, this place isn’t safe. You shouldn’t be here…", "Please don’t cry… it’s—it’s bad enough in here without that…", "They—um—they won’t come back for a while. If you need anything, I… I don’t have much, but…", "I—I don’t know how long I’ve been here. I don’t know what they want. But you… you shouldn’t be here.", "I… I don’t like seeing people scared. It makes it worse for both of us.", "I don’t know what to say. I… I’m sorry. I wish I could help you.", "Please just… just don’t do anything to make them angry, okay?" ]>><</if>> <<set _line = either(_lines)>> <<say 'Prisoner' $CharacterPath>>_line<</say>><br><br> <div class="text-box"> You look at him, planning your next move to decieve him into tusting you, you know that you need to work with his $Personality personality to get him where you want him, if he lets his guard down you will know more about his desires<br><br> <<button "Ask if you can keep warm together">> <<goto "CorruptionPrisoner1">> <<set $Position to "KeepWarm">> <</button>><br> <<button "Prentend to sleep">> <<goto "CorruptionPrisoner1">> <<set $Position to "Sleep">> <</button>><br> </div> <div class="character-card"> <div class="character-image"> <img @src=$CharacterPath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Personality:</span> $Personality</p> <p><span class="info-label">Desire:</span> To be $Desire</p> <p><span class="info-label">Likes:</span> <<set _visibleCount = Math.floor($Understanding / 10)>> <<for _i to 0; _i < $NPCLikes.length; _i++>> <<if _i < _visibleCount>> $NPCLikes[_i] <<else>> <span class="blurred">$NPCLikes[_i]</span> <</if>> <<if _i < $NPCLikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Dislikes:</span> <<for _i to 0; _i < $NPCDislikes.length; _i++>> <<if _i < _visibleCount>> $NPCDislikes[_i] <<else>> <span class="blurred">$NPCDislikes[_i]</span> <</if>> <<if _i < $NPCDislikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Neutral:</span> <<for _i to 0; _i < $DungeonActivies.length; _i++>> <<if _i < _visibleCount>> $DungeonActivies[_i] <<else>> <span class="blurred">_sourceArray[_i]</span> <</if>> <<if _i < $DungeonActivies.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Will Power: <progress @value="$WillPower" max="100"></progress></span></p> </div> </div> <</nobr>>
<<nobr>> <<set _lines to [ "Mmm… finally, they send me someone worth my time.", "You can glare all you like, but soon, you’ll be *begging* for my touch.", "Shhh… no prayers, no pointless resistance. Let’s not waste time pretending you don’t want this.", "I can *smell* your desires, feel them in the air… why fight what’s already inside you?", "You’re trying to resist me? How *adorable*…", "Your body is already betraying you… shall we skip the struggle and go straight to surrender?", "Mmm… I could break you in an hour, but where’s the fun in that? Let’s take our time.", "I’ve turned stronger men than you into devoted playthings… will you really be any different?", "I don’t need to chain you down. You’ll be begging to kneel soon enough.", "Don’t fight it. Let me show you pleasure unlike anything a mortal woman could give you." ]>> <<set _line = either(_lines)>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> You enter, and the door slams shut behind you, the torches flickering with the force of the air. You slowly and seductivly step into the room, letting him drink in the view of your perfect body<br><br> <<say 'Prisoner' $CharacterPath>>Who are you?<</say>><br><br> <<say 'Lucy' $LucyImg>>_line<</say>><br><br> <</nobr>>
<<nobr>> <<set _lines to [ "Mmm… don’t look so confused. I was sent here *for you*. A gift, a reward, a distraction—whichever makes you feel better about accepting me.", "You’ve been locked away for so long… my Master thought it was time you had a little *entertainment*.", "The $LucyName knows how to treat his guests. Whether you plan to resist him or serve him, you deserve some… *comfort*.", "I was told to make sure you’re *satisfied* during your stay here. A well-kept prisoner is a useful one, after all.", "I don’t know what they’ve told you about this place, but we’re not all about pain and suffering. Some of us… prefer to offer *pleasure*.", "Consider me a token of goodwill. A taste of what submission could offer. My Master rewards those who accept his gifts… and punishes those who refuse them.", "If you’re going to be locked away, wouldn’t you rather spend your time with *me*? Or would you prefer cold chains and an empty cell?", "You’re free to refuse me, of course… but why would you? I was chosen *specifically* to please you.", "You may not have a choice in your captivity, but this? This moment? This is yours to *accept*… or *deny*. Which will it be?", "No need to pretend, no need to fight. I’m here for *one* reason—to make sure you leave this room *wanting more*." ]>> <<set _line = either(_lines)>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> You push the door open without hesitation, stepping into the cell with the grace of someone who belongs. The dim torchlight flickers against your bare skin, casting shadows that move with you as you glide forward. The prisoner looks at you, clearly trying to mask his interest in your body.<br><br> <<say 'Prisoner' $CharacterPath>>Who are you?<</say>><br><br> <<say 'Lucy' $LucyImg>>_line<</say>><br><br> <</nobr>>
<<nobr>> <div class="text-box"> You reach the bottom of the stone stairs, entering a dark chamber you see a door stright ahead of you, another to your left and another to your right. You look around and find a paper laying on the ground, studying it, you find it shows rooms connected to eachother and numbered... You take it, hopeing not to get lost in this maze<br><br> [[You go stright|CryptStright]]<br><br> <<if $LeftPathComplete is true>> You have the key from the left side of the crypt<br><br> <<else>> [[You take the door marked "XIV"|CryptLeft1]]<br><br> <</if>> <<if $RightPathComplete is true>> You have the key from the right side of the crypt<br><br> <<else>> [[You take the door marked "II"|CryptRight1]] <</if>> <br><br> <<link "Leave">><<set $Crypt to false>><<run Engine.play("Forrest Explore")>><</link>> </div> <div class="text-box"> <<link "Check your map">> <<script>> Dialog.setup("Map", "map-dialog"); Dialog.wiki(` <div class="map-image"> <img src="Images/Crypt/cryptmap.png" alt="Crypt Map"> </div> `); Dialog.open(); <</script>> <</link>> <<set $BackgroundPath to "Images/Crypt/4.png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Position is "Start">> You wake up, not fully sure where you are. Your jaw and pussy ache...<br><br> Looking around you see a man sleeping next to you, it becomes clear what had happend last night... In your old life an act like this would have tramtised you, but now your just annoyed...<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Men/Action/1.png" width="700" height="700"> </div><br><br> <<button "Leave">> <<goto "LucyBase">> <</button>> <br><br> <<link "Wake him">><<set $Position to "Wake">><<run Engine.show()>><</link>><br><br> <<link "Kill him the old fashion way">><<set $Position to "Kill">><<run Engine.show()>><</link>> <</if>> <<if $Position is "Kill">> You get up quietly and look through your cloaths, finding a small blade you keep on yourself. Although you're not much of a fighter, he's still a sleep and is an easy target...<br><br> You walk around to his side of the bed and cut this throat... <br><br> He opens his eyes just long enough to realise whats going on, in his panic he graps at his opened throat desperatly but in a matter of seconds he loses all stenght and his arms fall to his side<br><br> Although he deserved this fait, you know the villagers will blame the castle for this murder... Your influence over Scarldale slips...<br><br> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <</if>> <<button "Leave">> <<goto "LucyBase">> <</button>> <</if>> <<if $Position is "Wake">><br><br> Although killing him sounds like a lot of fun, you decide to save it, you roll over and try to wake him.<br><br> He opens his eyes in surprise at your enthusiasm<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Men/Action/1.png" width="700" height="700"> </div><br><br> His surprise quickly turns to lust as you tell him what you want<br><br> <<Lucy>>I bet you had a lot of fun with me last night, well how about a second round, now we can both enjoy it<</Lucy>><br><br> He doesn't even reply, instead he pulls of your remaining clothes and pushes you onto your back before pulling out his already hard cock and aiming it at your pussy<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/4.webm" type="video/webm"> </video><br><br> He hammers away at you, not caring about your pleasure<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/5.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/6.webm" type="video/webm"> </video><br><br> After a surprisingly short time, he starts to moan louder<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/7.webm" type="video/webm"> </video><br><br> You feel his seed rush into you, along with any semblance of a soul he had left... He pauses for a moment, before going limp and collapsing on you<br><br> Although he deserved this fait, you know the villagers will blame the castle for this murder... Your influence over Scarldale slips...<br><Br> <<set $Souls to $Souls + 1>> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <<button "Leave">> <<goto "LucyBase">> <</button> <</if>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> <<if $VisitedDungeon is false>> <<include "DialogueStorage">> <<startdialogue "_TutorialDungeon">> <</if>> <h1>Prisoners</h1> <<if typeof $CellsCount === "undefined">> <<set $CellsCount to 2>> <</if>> <<if typeof $DungonOccupance === "undefined">> <<set $DungonOccupance to []>> <</if>> You have space for <<print $CellsCount>> prisoners<br> You currently have <<print $DungonOccupance.length>> prisoners<br><br> <<if $DungonOccupance.length === 0>> <p>The dungeon is empty.</p> <<else>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $DungonOccupance.length; _i++>> <<capture _prisoner>> <<set _prisoner to $DungonOccupance[_i]>> <<if !_prisoner.skill>> <<set _prisoner.skill to "none">> <</if>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <p>Sex: <<print _prisoner.sex>></p> <<if _prisoner.name.toLowerCase() === "villager" or _prisoner.name === _prisoner.job>> <p>Job: <<print _prisoner.job>></p> <<else>> <p>Skill: <<print _prisoner.skill>></p> <</if>> <<if _prisoner.name == "Lucy" or _prisoner.name == "Alice">> You choose to corrupt her personally <<else>> <p>Corruption:</p> <progress @value=" _prisoner.corruption" max="100"></progress> <</if>> <<button "Visit Prisoner">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<if _prisoner.name == "Lucy">> <<goto "LucyCell">> <<elseif _prisoner.name == "Alice">> <<goto "AliceCell">> <<else>> <<goto "ManagePrisoner">> <</if>> <</button>> </div> <</capture>> <</for>> </div> <</if>> <span id="prisonerStatus"></span> </div> <<if $DungeonRuneTip isnot false>> <div class="text-box"> <h2>Tip:<br></h2> <i>You castle corrupts anyone inside, bending them to your will over time. You can speed this up by finding Corruption Runes in crypts</i><br> <<link "Do not show this again">> <<set $DungeonRuneTip to false>> <<goto "Dungeon2">> <</link>> </div> <</if>> <div style="text-align: center"> <<set $VisitedDungeon to true>> <<if $CurrentPlayer is "Overlord">> <<button "Upgrade the dungeon">> <<goto "DungeonUpgrades">> <</button>> <<if $Quest3 is true>> <<button "Leave">> <<goto "Inside Castle">> <</button>> <<else>> <<button "Leave">> <<script>> UI.alert("New Quest! <br>Capture someone and bring them to the dungeon"); <</script>> <<set $Quest1 to true>> <<run $Quests.push("Capture someone and bring them to the dungeon")>> <<run Engine.play('Base Intro')>> <<set $Quest3 to true>> <</button>> <</if>> <</if>> <<if $CurrentPlayer is "Lucy">> <<button "Leave">> <<goto "LucyBase">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> Explore her body to find areas to use<br> <<include "LoadCorruptionDataChair">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _imageNum to Number(_imagePath.match(/(\d+)\.png$/)[1])>> <<if _imageNum > 10>> <<set _lookupPath to _imagePath.replace(_imageNum + '.png', (_imageNum - 10) + '.png')>> <<else>> <<set _lookupPath to _imagePath>> <</if>> <<set _currentData to setup.buildingData.get(_lookupPath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-position="_hotspot.position" data-passage="_hotspot.passage"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> Lust: <progress @value=" $Lust" max="100"></progress><br> </div> <<script>>jQuery(document).ready(function(){function updateHotspotPositions(){const container=jQuery('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;jQuery('.hotspot').each(function(){const hotspot=jQuery(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}jQuery('.image-container img').on('load',updateHotspotPositions);jQuery(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);jQuery('#showHotspots').on('change',function(){jQuery('.circle').toggleClass('hidden');});jQuery('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;console.log("Current Path:",currentPath);let imageNum=Number(currentPath.match(/(\d+)\.png$/)[1]);let lookupPath=imageNum>10?currentPath.replace(imageNum+'.png',(imageNum-10)+'.png'):currentPath;console.log("Looking up data for path:",lookupPath);let buildingData=setup.buildingData.get(lookupPath);if(buildingData&&buildingData.hotspots){const originalX=parseInt(jQuery(this).attr('data-original-x'));const originalY=parseInt(jQuery(this).attr('data-original-y'));let hotspot=buildingData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot){State.variables.Position=String(hotspot.position);let nextPassage=jQuery(this).data('passage');Engine.play(nextPassage);}}return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> Explore her body to find areas to use<br> <<include "LoadCorruptionDataWall">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> Lust: <progress @value=" $Lust" max="100"></progress><br> You use your: <<set $Act to $Act ?? "Hands">> <<listbox "$Act">> <<option "Hands" "Hands">> <<option "Mouth" "Mouth">> <</listbox>><br> <<if $Lust >= 100>> <br><br> You have built up her lust and the corruption has start to set in, you can:<br><br> <<button "Leave her and return her clothes">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her and take her clothes">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Naked/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her bound with rope">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Bound/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <</if>> </div> <<script>> $(document).ready(function() { $('.hotspot').hover( function() { $(this).find('.tooltip').fadeIn(200); }, function() { $(this).find('.tooltip').fadeOut(200); } ); $('#showHotspots').on('change', function() { $('.circle').toggleClass('hidden'); }); $('.hotspot').on('click', function(e) { e.preventDefault(); e.stopPropagation(); let currentPath = State.variables.ImagePath; let pos = setup.buildingData.get(currentPath).hotspots.find(h => h.x === parseInt($(this).css('left')) && h.y === parseInt($(this).css('top')) ).position; State.variables.Position = String(pos); let nextPassage = $(this).data('passage'); Engine.play(nextPassage); return false; }); }); <</script>> <style> .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } </style> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> Explore her body to find areas to tease<br> <<include "LoadCorruptionDataCeiling">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _imageNum to Number(_imagePath.match(/(\d+)\.png$/)[1])>> <<if _imageNum > 10>> <<set _lookupPath to _imagePath.replace(_imageNum + '.png', (_imageNum - 10) + '.png')>> <<else>> <<set _lookupPath to _imagePath>> <</if>> <<set _currentData to setup.buildingData.get(_lookupPath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-position="_hotspot.position" data-passage="_hotspot.passage"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> Lust: <progress @value=" $Lust" max="100"></progress><br> <<if $Lust lt 100>> You use your: <<set $Act to $Act ?? "Hands">> <<listbox "$Act">> <<option "Hands" "Hands">> <<option "Mouth" "Mouth">> <</listbox>><br> <<if $OldPosition is "null">> <<button "Bend her over">> <<set $OldPosition to "Bent">> <<if $Spanked is true>><<set $int to $int + 10>><</if>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + $haircolour + "/Ceiling-Bent/" + $int + ".png">> <<run Engine.show()>> <</button>> <<else>> <<button "Strighten her up">> <<if $int gt 10>><<set $int to $int - 10>><</if>> <<set $OldPosition to "null">> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + $haircolour + "/Ceiling-Stright/" + $int + ".png">> <<run Engine.show()>> <</button>> <</if>> <</if>> <<if $Lust >= 100>> <br><br> You have built up her lust and the corruption has start to set in, you can:<br><br> <<button "Leave her and return her clothes">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her and take her clothes">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Naked/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her bound with rope">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Bound/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <</if>> </div> <<script>>jQuery(document).ready(function(){function updateHotspotPositions(){const container=jQuery('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;jQuery('.hotspot').each(function(){const hotspot=jQuery(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}jQuery('.image-container img').on('load',updateHotspotPositions);jQuery(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);jQuery('#showHotspots').on('change',function(){jQuery('.circle').toggleClass('hidden');});jQuery('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;console.log("Current Path:",currentPath);let imageNum=Number(currentPath.match(/(\d+)\.png$/)[1]);let lookupPath=imageNum>10?currentPath.replace(imageNum+'.png',(imageNum-10)+'.png'):currentPath;console.log("Looking up data for path:",lookupPath);let buildingData=setup.buildingData.get(lookupPath);if(buildingData&&buildingData.hotspots){const originalX=parseInt(jQuery(this).attr('data-original-x'));const originalY=parseInt(jQuery(this).attr('data-original-y'));let hotspot=buildingData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot){State.variables.Position=String(hotspot.position);let nextPassage=jQuery(this).data('passage');Engine.play(nextPassage);}}return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> <<if $Position is "Ass">> <<set _int to random(1, 5)>> <<if $Act is "Hands">> <<set $Lust to $Lust + 10>> <<if $ImagePath.includes("Wall-Up")>> <<else>> <<if $Spanked isnot true>><<set $int to $int + 10>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + $haircolour + "/Ceiling-Bent/" + $int + ".png">><</if>> <<set $Spanked to true>> <</if>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Spank/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set $Lust to $Lust + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Rim/" + _int + ".gif">> <</if>> <</if>> <<if $Position is "Breasts">> <<if $Act is "Hands">> <<set _int to random(4, 6)>> <<set $Lust to $Lust + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Breasts/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set _int to random(1, 3)>> <<set $Lust to $Lust + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Breasts/" + _int + ".gif">> <</if>> <</if>> <<if $Position is "Pussy">> <<set _int to random(1, 5)>> <<if $Act is "Hands">> <<set $Lust to $Lust + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Finger/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set $Lust to $Lust + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Cul/" + _int + ".gif">> <</if>> <</if>> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if $Lust >= 100>> She cums<br><br> <video autoplay loop> <source src="Images/Castle/Raid/Captives/Fcum.webm" type="video/webm"></video><br><br> <<button "Leave her and return her clothes">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her naked">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Naked/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her bound with rope">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Bound/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<else>> Lust: <progress @value=" $Lust" max="100"></progress><br> <<button "Keep going">><<run Engine.play('DungeonCorruptionFuckCeiling')>><</button>><br> <<if $ImagePath.includes("Wall-Up")>> <<button "Change position">><<run Engine.play('DungeonCorrptionWall')>><</button>> <<else>> <<button "Change position">><<run Engine.play('DungeonCorruptionCeiling')>><</button>> <</if>> <</if>> </div> <<if $DongeonDialogue is true>> <<link "Tell her to stop talking (Disable Dialogue)">> <<set $DongeonDialogue to false>> <<goto "DungeonCorruptionFuckCeiling">> <</link>> <<else>> <<link "Enable Dialogue">> <<set $DongeonDialogue to true>> <<goto "DungeonCorruptionFuckCeiling">> <</link>> <</if>> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<include "LucyDungeonLines">> <<set $Repeat to $Repeat + 1>> <div class="text-box"> <<set _Like to "Nutral">> <<if $Position is "Lips">> <<set _lucyLines = either(_kisslines)>> <<if $NPCDislikes.includes("Lips Kissing")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Lips Kissing")>><<set _Like to "Like">><</if>> <<set _action to "Lips Kissing">> <<set _int to random(13, 15)>> <<set $Orgasm to $Orgasm + 3>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Position is "Neck">> <<set _lucyLines = either(_kisslines)>> <<if $NPCDislikes.includes("Neck Kissing")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Neck Kissing")>><<set _Like to "Like">><</if>> <<set _action to "Neck Kissing">> <<set _int to random(4, 6)>> <<set $Orgasm to $Orgasm + 3>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Position is "Ass">> <<if $Act is "Hands">> <<set _lucyLines = either(_spankLines)>> <<set _int to random(19, 21)>> <<if $NPCDislikes.includes("Spanking")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Spanking")>><<set _Like to "Like">><</if>> <<set _action to "Spanking">> <<set $Orgasm to $Orgasm + 5>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set _lucyLines = either(_rimLines)>> <<set _int to random(22, 24)>> <<if $NPCDislikes.includes("Rimming")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Rimming")>><<set _Like to "Like">><</if>> <<set _action to "Rimming">> <<set $Orgasm to $Orgasm + 5>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <</if>> <<if $Position is "Chest">> <<set _lucyLines = either(_nippleLines)>> <<if $NPCDislikes.includes("Nipples licked")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Nipples licked")>><<set _Like to "Like">><</if>> <<set _action to "Nipples licked">> <<set _int to random(1, 3)>> <<set $Orgasm to $Orgasm + 5>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Position is "Clit">> <<if $Act is "Hands">> <<set _lucyLines = either(_clitTouchLines)>> <<if $NPCDislikes.includes("Clitoris Rubbed")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Clitoris Rubbed")>><<set _Like to "Like">><</if>> <<set _action to "Clitoris Rubbed">> <<set _int to random(16, 18)>> <<set $Orgasm to $Orgasm + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set _lucyLines = either(_clitLickLines)>> <<if $NPCDislikes.includes("Clitoris Licked")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Clitoris Licked")>><<set _Like to "Like">><</if>> <<set _action to "Clitoris Licked">> <<set _int to random(7, 9)>> <<set $Orgasm to $Orgasm + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <</if>> <<if $Position is "Vagina">> <<if $Act is "Hands">> <<set _lucyLines = either(_fingeringLines)>> <<if $NPCDislikes.includes("Pussy Fingered")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Pussy Fingered")>><<set _Like to "Like">><</if>> <<set _action to "Pussy Fingered">> <<set _int to random(16, 18)>> <<set $Orgasm to $Orgasm + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $Act is "Mouth">> <<set _lucyLines = either(_toungFuckLines)>> <<if $NPCDislikes.includes("Tongue Fucking")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Tongue Fucking")>><<set _Like to "Like">><</if>> <<set _action to "Tongue Fucking">> <<set _int to random(7, 9)>> <<set $Orgasm to $Orgasm + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <</if>> <<if $Position is "VaginaBehind">> <<set _lucyLines = either(_behindLickLines)>> <<if $NPCDislikes.includes("Tongue Fucking")>><<set _Like to "Dislike">><</if>> <<if $NPCLikes.includes("Tongue Fucking")>><<set _Like to "Like">><</if>> <<set _action to "Tongue Fucking">> <<set _int to random(10, 12)>> <<set $Orgasm to $Orgasm + 10>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Lucy/" + _int + ".gif">> <</if>> <<if $DongeonDialogue isnot false>> <<if $Position isnot "Skip">> <<say 'Lucy' $LucyImg>>_lucyLines<</say>><br><br> <</if>> <</if>> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if (_Like is "Like") and ($Lust lt 100)>> <<set $Lust to $Lust + 8>> <<if $Lust lt 30>> <<set _line = either(_lowLines)>> <<elseif $Lust lt 70>> <<set _line = either(_midLines)>> <<else>> <<set _line = either(_hightLines)>> <</if>> <<set _hint = either(_successLines)>> _hint<br><br> <<if $DongeonDialogue isnot false>> <<say 'Prisoner' $CharacterPath>>_line<</say>> <</if>> <</if>> <<if _Like is "Nutral">> <<set _hint = either(_failLines)>> _hint<br><br> <</if>> <<if _Like is "Dislike">> <<set _hint = either(_failLines)>> _hint<br><br> <<if $Lust >= 10>> <<set $Lust to $Lust - 10>> <</if>> <</if>> <<if $Repeat >= 4>> <i>Your prisoner is getting board of you repeating the same acts on her, her lust and orgasm decrease</i><br><br> <<set $Lust to $Lust - 8>> <<set $Orgasm to $Orgasm - 10>> <</if>> <br> Orgasm: <progress @value=" $Orgasm" max="100"></progress><br> <<if $Orgasm >= 100>> The prisoner comes to a screaming orgasm as she is unable to resist the teasing any longer<br><br> <video autoplay loop> <source src="Images/Castle/Raid/Captives/Fcum.webm" type="video/webm"></video><br><br> <<if $Lust gt 70>> <<if $DongeonDialogue isnot false>> <<set _line = either(_finishSuccesslines)>> <<say 'Prisoner' $CharacterPath>>_line<</say>><br><br> <</if>> The prisoner looks at you with excitement as you release her from her beindings now she is fully corrupted<br><br> <<set _prisoner.corruption to 100>> <<set $Time to $Time + 3>> <<else>> <<if $DongeonDialogue isnot false>> <<set _line = either(_finishFaillines)>> <<say 'Prisoner' $CharacterPath>>_line<</say>><br><br> <</if>> You failed to break her will and leave her in her cell<br><br> <<set _prisoner.corruption to 0>> <<set $Time to $Time + 3>> <</if>> <<button "Leave her and return her clothes">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her naked">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Naked/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<button "Leave her bound with rope">> <<set _int to random(1, 15)>> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/" + _prisoner.hairColor + "/Bound/" + _int + ".png">> <<goto "Dungeon2">> <</button>><br> <<else>> <<button "Keep going">><<run Engine.play('DungeonCorruptionFuckLucy')>><</button>> <<button "Change position">><<run Engine.play('DungeonCorruptionLucy')>><</button>> <</if>> <<if $DongeonDialogue isnot false>> <<link "Disable Dialogue">> <<set $DongeonDialogue to false>> <<goto "DungeonCorruptionFuckLucy">> <</link>> <<else>> <<link "Enable Dialogue">> <<set $DongeonDialogue to true>> <<goto "DungeonCorruptionFuckLucy">> <</link>> <</if>> </div> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> <<include "DungonSexLines">> <<if $Position is "Mouth">> <<set _act = either(_throatAct)>> <<set _int to random(1, 2)>> <<set _VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/FF/" + _int + ".webm">> <</if>> <<if $Position is "Ass">> <<set _act = either(_analAct)>> <<set _line = either(_analLines)>> <<set _int to random(1, 3)>> <<set $Lust to $Lust + 10>> <<set _VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Anal/" + _int + ".webm">> <</if>> <<if $Position is "Breasts">> <<set _act = either(_titFuckAct)>> <<set _line = either(_titFuckLines)>> <<set _int to random(1, 4)>> <<set $Lust to $Lust + 10>> <<set _VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/TF/" + _int + ".webm">> <</if>> <<if $Position is "Pussy">> <<if $ImagePath.includes("Chair-Start")>> <<set _img to random(1, 4)>> <<set $path to "Images/Castle/Dungon/Woman/Corruption/" + $haircolour + "/Chair-Fuck/" + _img + ".png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div> <br><br> <</if>> <<set _act = either(_missAct)>> <<set _line = either(_missLines)>> <<set _int to random(1, 4)>> <<set $Lust to $Lust + 10>> <<set _VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Miss/" + _int + ".webm">> <</if>> _act<br><br> <video autoplay loop> <source @src="_VidPath" type="video/webm" onerror="this.style.display='none'"> </video><br><br> <<if ($Position isnot "Mouth") and ($DongeonDialogue is true)>> <<say 'Prisoner' $ImagePath>>_line<</say>><br><br> <</if>> <<if $Lust >= 100>> <<set _act = either(_cumAct)>> _act<br><br> <video autoplay loop> <source src="Images/Castle/Raid/Captives/Fcum.webm" type="video/webm"></video><br><br> This drives you over the edge and you spray your seed on her<br><br> <video autoplay loop> <source src= "Images/Castle/Dungon/Woman/Corruption/Sex/Cum.webm" type="video/webm"></video><br><br> <<say 'Prisoner' _prisoner.ImagePath>>Thank you... Master<</say>><br><br> She is more corrupted to your will<br><br> <<set _prisoner.corruption to _prisoner.corruption + 10>> <<if _prisoner.corruption > 100>><<set _prisoner.corruption = 100>><</if>> <<button "Leave">> <<goto "Dungeon2">> <</button>> <<else>> Lust: <progress @value=" $Lust" max="100"></progress><br> <<button "Keep going">><<run Engine.play('DungeonCorruptionFuck')>><</button>><br> <<if $ImagePath.includes("Chair-Start")>> <<button "Change position">><<run Engine.play('DungeonCorrptionChair')>><</button>> <<else>> <<button "Change position">><<run Engine.play('DungeonCorruption')>><</button>> <</if>> <</if>> </div> <<if $DongeonDialogue is true>> <<link "Tell her to stop talking (Disable Dialogue)">> <<set $DongeonDialogue to false>> <<goto "DungeonCorruptionFuck">> <</link>> <<else>> <<link "Enable Dialogue">> <<set $DongeonDialogue to true>> <<goto "DungeonCorruptionFuck">> <</link>> <</if>> <</nobr>>
<<nobr>> <<set $CurrentPlayer to "Lucy">> <<set $Position to "null">> <<set $OldPosition to "null">> <<set $Lust to 0>> <<set $Orgasm to 0>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set $haircolour to _prisoner.hairColor>> <<set $CharacterPath to _prisoner.ImagePath>> <<set _Personalitys to ["Submissive", "Dominant"]>> <<set _int to random(0, 1)>> <<set $Personality to _Personalitys[_int]>> <<set $DungeonActivies = ["Neck Kissing", "Lips Kissing", "Nipples licked", "Pussy Fingered", "Clitoris Rubbed", "Clitoris Licked", "Tongue Fucking", "Rimming", "Spanking"]>> <<set $NPCLikes to []>> <<set $NPCDislikes to []>> <<set _int to random(3, 5)>> <<for _i to 0; _i <= _int; _i++>> <<set _ran to random(0, $DungeonActivies.length - 1)>> <<run $NPCLikes.push($DungeonActivies[_ran])>> <<run $DungeonActivies.deleteAt(_ran)>> <</for>> <<set _int to random(1, $DungeonActivies.length - 1)>> <<for _i to 0; _i <= _int; _i++>> <<set _ran to random(0, $DungeonActivies.length - 1)>> <<run $NPCDislikes.push($DungeonActivies[_ran])>> <<run $DungeonActivies.deleteAt(_ran)>> <</for>> <<widget "getVisibleCount">> <<return Math.floor($Understanding / 10)>> <</widget>> <div class="character-card"> <div class="character-image"> <img @src=$CharacterPath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Likes:</span> <<set _visibleCount = Math.floor($Understanding / 10)>> <<for _i to 0; _i < $NPCLikes.length; _i++>> <<if _i < _visibleCount>> $NPCLikes[_i] <<else>> <span class="blurred">$NPCLikes[_i]</span> <</if>> <<if _i < $NPCLikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Dislikes:</span> <<for _i to 0; _i < $NPCDislikes.length; _i++>> <<if _i < _visibleCount>> $NPCDislikes[_i] <<else>> <span class="blurred">$NPCDislikes[_i]</span> <</if>> <<if _i < $NPCDislikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Neutral:</span> <<for _i to 0; _i < $DungeonActivies.length; _i++>> <<if _i < _visibleCount>> $DungeonActivies[_i] <<else>> <span class="blurred">_sourceArray[_i]</span> <</if>> <<if _i < $DungeonActivies.length - 1>>, <</if>> <</for>> </p> </div> </div> <<include "LucyDungeonLines">> <<set _PLine = either(_OpeningLines)>> <<set _LucyLine = either(_LucyOpeningLines)>> You enter the cell and find the wide eyed woman stairing at you<br><br> <<say 'Prisoner' _prisoner.ImagePath>>_PLine<</say>><br><br> <<say 'Lucy' $LucyImg>>_LucyLine<</say>><br><br> <<button "Remove her clothes and bind her">> <<set $int to random(1, 5)>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + _prisoner.hairColor + "/Face/" + $int + ".png">> <<goto "DungeonCorruptionLucy">> <</button>> <</nobr>>
<<nobr>> <<set $Repeat to 0>> <<set $Position to "null">> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> <h2> Explore her body to find areas to tease</h2> <<include "LoadCorruptionDataLucy">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _imageNum to Number(_imagePath.match(/(\d+)\.png$/)[1])>> <<if _imageNum > 10>> <<set _lookupPath to _imagePath.replace(_imageNum + '.png', (_imageNum - 10) + '.png')>> <<else>> <<set _lookupPath to _imagePath>> <</if>> <<set _currentData to setup.buildingData.get(_lookupPath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-position="_hotspot.position" data-passage="_hotspot.passage"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> Lust: <progress @value=" $Lust" max="100"></progress><br> Orgasm: <progress @value=" $Orgasm" max="100"></progress><br> <<if $OldPosition isnot "null">> You use your: <<set $Act to $Act ?? "Hands">> <<listbox "$Act">> <<option "Hands" "Hands">> <<option "Mouth" "Mouth">> <</listbox>><br> <</if>> <<if $OldPosition is "null">> <<button "Kneel">> <<set $OldPosition to "Kneeling">> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/Pussy/" + $int + ".png">> <<run Engine.show()>> <</button>> <<else>> <<button "Stand">> <<if $int gt 10>><<set $int to $int - 10>><</if>> <<set $OldPosition to "null">> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + $haircolour + "/Face/" + $int + ".png">> <<run Engine.show()>> <</button>> <<button "Turn her around">> <<if $OldPosition is "Kneeling">> <<set $OldPosition to "Ass">> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/Ass/" + $int + ".png">> <<else>> <<set $OldPosition to "Kneeling">> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/Pussy/" + $int + ".png">> <</if>> <<run Engine.show()>> <</button>> <</if>> <br><br> <<button "Skip corruption">> <<set $Position to "Skip">> <<set $Lust to 100>> <<set $Orgasm to 100>> <<goto "DungeonCorruptionFuckLucy">> <</button>> <div style="text-align: center"> <<button "Help">> <<script>> UI.alert("As a succubus, your powers are similar, but different to that of your master. Like him, if you can seduce a person and make them orgasm, they are yours either to steal their soul or possess. However, unlike your master you cannot cast a spell tricking them into willingly submitting to you. So, you must convince them. Learn what they like and turn them on enough to make them cum for you willingly. <br><br> To help you with this, you have the succubus's eye, a power allowing you to see into their soul and understand their desire. The more lust you build in them, the more you can see.<br><br> But be careful, if they cum without their lust being full you won't be able to possess them... But you could always just take their sould and be done with them."); <</script>> <</button>> </div> </div> <<widget "getVisibleCount">> <<return Math.floor($Understanding / 10)>> <</widget>> <div class="character-card"> <div class="character-image"> <img @src=$CharacterPath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <h2><span class="info-label">Succubus Eye</span></h2> <p><span class="info-label">Likes:</span> <<set _visibleCount = Math.floor($Lust / 10)>> <<for _i to 0; _i < $NPCLikes.length; _i++>> <<if _i < _visibleCount>> $NPCLikes[_i] <<else>> <span class="blurred">$NPCLikes[_i]</span> <</if>> <<if _i < $NPCLikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Dislikes:</span> <<for _i to 0; _i < $NPCDislikes.length; _i++>> <<if _i < _visibleCount>> $NPCDislikes[_i] <<else>> <span class="blurred">$NPCDislikes[_i]</span> <</if>> <<if _i < $NPCDislikes.length - 1>>, <</if>> <</for>> </p> <p><span class="info-label">Neutral:</span> <<for _i to 0; _i < $DungeonActivies.length; _i++>> <<if _i < _visibleCount>> $DungeonActivies[_i] <<else>> <span class="blurred">_sourceArray[_i]</span> <</if>> <<if _i < $DungeonActivies.length - 1>>, <</if>> <</for>> </p> </div> </div> <<script>>jQuery(document).ready(function(){function updateHotspotPositions(){const container=jQuery('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;jQuery('.hotspot').each(function(){const hotspot=jQuery(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}jQuery('.image-container img').on('load',updateHotspotPositions);jQuery(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);jQuery('#showHotspots').on('change',function(){jQuery('.circle').toggleClass('hidden');});jQuery('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;console.log("Current Path:",currentPath);let imageNum=Number(currentPath.match(/(\d+)\.png$/)[1]);let lookupPath=imageNum>10?currentPath.replace(imageNum+'.png',(imageNum-10)+'.png'):currentPath;console.log("Looking up data for path:",lookupPath);let buildingData=setup.buildingData.get(lookupPath);if(buildingData&&buildingData.hotspots){const originalX=parseInt(jQuery(this).attr('data-original-x'));const originalY=parseInt(jQuery(this).attr('data-original-y'));let hotspot=buildingData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot){State.variables.Position=String(hotspot.position);let nextPassage=jQuery(this).data('passage');Engine.play(nextPassage);}}return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <div class="text-box"> <<set $OldPosition to "null">> <<set $Lust to 0>> <<set $Spanked to false>> <<set $DongeonDialogue to true>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set $haircolour to _prisoner.hairColor>> <<set $ImagePath to _prisoner.ImagePath>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if _prisoner.corruption lt 60>> You prisoners lust has grown, but she is not fully yours you think about how to satisfy her and continue her corruption<br> <<else>> Now she is more corrupt, she is more willing. You think of what to do<br> <</if>> You choose too:<br><br> <<if _prisoner.corruption >= 60>> <<button "Tie her down and fuck her">> <<set $int to random(1, 15)>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + _prisoner.hairColor + "/Naked/" + $int + ".png">> <<goto "DungeonCorruption">> <</button>><br> <<if $DungeonChair is true>> <<button "Tie her to a chair">> <<set $int to random(1, 4)>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + _prisoner.hairColor + "/Chair-Start/" + $int + ".png">> <<goto "DungeonCorrptionChair">> <</button>><br> <</if>> <</if>> <<button "Bind her arms and suspend her from the ceiling">> <<set $int to random(1, 4)>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + _prisoner.hairColor + "/Ceiling-Stright/" + $int + ".png">> <<goto "DungeonCorruptionCeiling">> <</button>><br> <<if $DungeonWall is true>> <<button "Lock her to the wall">> <<set $int to random(1, 4)>> <<set $ImagePath to "Images/Castle/Dungon/Woman/Corruption/" + _prisoner.hairColor + "/Wall-Up/" + $int + ".png">> <<goto "DungeonCorrptionWall">> <</button>> <</if>> <<set _prisoner.corruption to _prisoner.corruption + 10>> <<if _prisoner.corruption > 100>><<set _prisoner.corruption = 100>><</if>> <<set $Time to $Time + 3>> </div> <</nobr>>
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="text-box"> Explore her body to find areas to use<br> <<include "LoadCorruptionData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _imageNum to Number(_imagePath.match(/(\d+)\.png$/)[1])>> <<if _imageNum > 10>> <<set _lookupPath to _imagePath.replace(_imageNum + '.png', (_imageNum - 10) + '.png')>> <<else>> <<set _lookupPath to _imagePath>> <</if>> <<set _currentData to setup.buildingData.get(_lookupPath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-position="_hotspot.position" data-passage="_hotspot.passage"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> Lust: <progress @value=" $Lust" max="100"></progress><br> </div> <<script>>jQuery(document).ready(function(){function updateHotspotPositions(){const container=jQuery('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;jQuery('.hotspot').each(function(){const hotspot=jQuery(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}jQuery('.image-container img').on('load',updateHotspotPositions);jQuery(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);jQuery('#showHotspots').on('change',function(){jQuery('.circle').toggleClass('hidden');});jQuery('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;console.log("Current Path:",currentPath);let imageNum=Number(currentPath.match(/(\d+)\.png$/)[1]);let lookupPath=imageNum>10?currentPath.replace(imageNum+'.png',(imageNum-10)+'.png'):currentPath;console.log("Looking up data for path:",lookupPath);let buildingData=setup.buildingData.get(lookupPath);if(buildingData&&buildingData.hotspots){const originalX=parseInt(jQuery(this).attr('data-original-x'));const originalY=parseInt(jQuery(this).attr('data-original-y'));let hotspot=buildingData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot){State.variables.Position=String(hotspot.position);let nextPassage=jQuery(this).data('passage');Engine.play(nextPassage);}}return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Dungeon Upgrades</h1> <h2>These are optional tools for the corruption process, capacity expantion can be managed from your chambers</h2> <div id="trap-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; padding: 20px;"> <<if $DungeonWall isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <h3>Wall Restraints</h3> <p>For locking your prisoner to a wall, useful for satisfying your prisoner in the earily stages of corruption</p> <p>Iron Required: 2</p> <<if $Iron >= 2>> <<button "Build">> <<set $DungeonWall to true>> <<set $Iron to $Iron - 2>> <<goto "Dungeon2">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <</if>> <<if $DungeonChair isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <h3>Restraining Chair</h3> <p>A chair with restaints, useful for enjoying the prisoner in the later stages of there corruption</p> <p>Iron Required: 2</p> <<if $Iron >= 2>> <<button "Build">> <<set $DungeonChair to true>> <<set $Iron to $Iron - 2>> <<goto "Dungeon2">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <</if>> </div> </div> <div style="text-align: center"> <<button "Return">> <<goto "Dungeon2">> <</button>> </div> <</nobr>>
<<nobr>> <<set _analLines to [ "I-It’s too much… but I love it… please, don’t stop…", "I can feel every inch stretching me… I’m all yours to use.", "Please, ruin me… I want to be your perfect little toy.", "It hurts so good… I’ll take whatever you give me.", "I wasn’t made for this, but fuck—I never want you to stop!", "I’m so full… I can feel you in my stomach… please, claim me.", "Use me however you want—my body belongs to you.", "I love being your dirty little slut… fuck me however you like.", "I can’t believe I like this… but I need more… please, don’t stop.", "You’re making me feel things I never imagined… please, keep going.", "I’ll be a good girl and take it all… just for you.", "I love how rough you are with me… treat me like your personal plaything.", "I’m so helpless like this… completely at your mercy…", "You’re breaking me in so perfectly… I was made for this.", "Please, don’t hold back—I want you to make me yours completely." ]>> <<set _analAct to [ "She gasps sharply, her bound arms twitching as she instinctively tries to resist the overwhelming sensation.", "Her eyes roll back as you stretch her, her mind struggling to comprehend the pleasure coursing through her body.", "Her voice cracks as she moans your name, the corruption dulling her shame and turning it into desperate lust.", "Her legs tremble as her body adjusts, the last traces of resistance fading as she begins to beg for more.", "Her fingers curl as she realizes how good it feels, her body arching as the corruption takes hold.", "Her moans grow louder, no longer mixed with resistance—just pure, shameless need.", "She gasps, her bound body shaking as she realizes she never wants you to stop.", "Her once-tight entrance now welcomes you, her body fully broken, fully yours, addicted to the pleasure you give her.", "She begs for more, her voice dripping with desperation, promising that she’ll never resist you again.", "She moans mindlessly, her mind shattered, her body trained to crave nothing but your touch." ]>> <<set _titFuckLines to [ "Your cock feels so good between my tits. I’ll make them nice and wet for you…", "I can feel it twitching against my throat. Are you going to paint me with your seed, master?", "I love how your cock feels sliding between them. Please, use me more…", "It’s so warm, so thick. I’ll squeeze them tighter just for you…", "I can feel your heat soaking into me. Please, don’t stop until you’ve covered me…", "Am I a good girl, master? Do my tits please you? I want you to use them however you like…", "I love feeling you thrust between them. I’ll do anything for more…", "I want to be drenched in you. Please, claim me completely…", "Let me clean you with my tongue, master. I exist only for your pleasure now…", "I can feel your cock throbbing. Are you going to mark me?", "I don’t care about anything else… just keep using my body like this…", "My tits belong to you now. Use them however you want, whenever you want…", "I was meant to be used like this. I want to feel your warmth all over me…", "I love tasting you after you’ve used me..." ]>> <<set _titFuckAct to [ "Her moans grow louder with every thrust, her bound wrists twitching as she realizes how good it feels to be used like this.", "She gasps, her eyes clouding with lust as her body fully submits, pressing her chest together to give you even more to fuck.", "Her resistance fades completely, her lips parting in breathless devotion as she whispers that she loves this.", "Her nipples harden, her body betraying her as she loses herself in the feeling of your cock sliding between her soft, wet tits.", "Her chest glistens with spit and precum, her body shuddering as she whispers how badly she wants to be marked by you.", "She moans your name, her once-defiant eyes now filled with mindless devotion as she realizes she belongs to you.", "Her legs twitch as the corruption floods her mind, her body arching as she begs you to never stop using her.", "She licks her lips, her tongue flicking out desperately as she craves your taste, no longer able to think of anything else.", "She whimpers, fully broken, fully yours, her bound body trembling in pleasure as she admits she never wants to be freed." ]>> <<set _missLines to [ "It’s too deep… but I don’t want you to stop…", "You’re stretching me so much… I can feel you reshaping me…", "I was never supposed to feel this good… what are you doing to me?", "Harder! I want to feel you break me completely…", "Gods, I can’t think anymore…", "Please, keep going… I want to be nothing but your plaything…", "I can feel myself changing… you’re corrupting me… and I love it…", "My body is giving in… please, ruin me completely…", "I want to belong to you… fill me, claim me, own me…", "I don’t care about anything else… I just want to be yours…", "You feel so good inside me… please, don’t ever stop…", "Every thrust is making me fall deeper… I can’t resist anymore…", "I love the way you use me… please, don’t stop until I’m completely broken…", "Mark me, claim me… make sure everyone knows I belong to you…", "I never want this to end…" ]>> <<set _missAct to [ "She gasps, her body tightening around you, her wrists pulling against the ropes as her mind fights against the pleasure.", "Her hips twitch, unsure whether to pull away or grind against you, the corruption seeping deeper as her resistance weakens.", "Her moans turn from shaky whimpers to desperate cries, her body arching as she realizes how much she loves being filled by you.", "Her fingers clench, her mind slipping further into lust as she begs for more, her body no longer resisting.", "She shudders, her once-reluctant moans turning into eager, mindless cries of pleasure as the corruption overtakes her completely.", "Her back arches, the ropes biting into her skin as she surrenders to the pleasure, her body craving every deep thrust.", "She whispers your name, her voice dripping with devotion, promising that she’ll never resist again.", "Her walls tighten around you as the last traces of her old self disappear, leaving only a willing, desperate slut in her place.", "Her bound body shivers, her toes curling as she realizes she never wants to be without this feeling ever again.", "She moans shamelessly, her mind fully broken, fully corrupted, her only desire now to be used by you forever." ]>> <<set _throatAct to [ "Her eyes widen as you push deep into her mouth, her throat tightening around you, her body still fighting against the inevitable corruption.", "She whimpers as you hold her in place, her wrists trembling against the ropes as she realizes she can’t escape your control.", "Her lips part willingly now, her body betraying her as she starts to crave the feeling of being used like this.", "Her mind crumbles as the corruption seeps in, her tongue swirling around you eagerly, desperate to please.", "She no longer flinches when you thrust deep—her throat now welcoming you, devoted to your pleasure.", "Her eyes turn glassy with submission, her body trembling as she realizes how much she loves worshipping you like this.", "She moans around your cock, her resistance fully gone, her only concern now being to satisfy your every desire.", "Her legs twitch as she lets go completely, her body flooded with pleasure as she drinks in your taste like it’s all she’s ever needed.", "She was once proud, once defiant, but now she lies there helplessly, her only purpose to serve.", "She looks up at you with complete worship, her lips curling into a desperate, addicted smile as she begs for more." ]>> <<set _cumAct to [ "Her entire body seizes up, her back arching violently as she cries out, pleasure ripping through her bound form.", "She shudders helplessly, her fingers twitching against the restraints as wave after wave of bliss crashes over her.", "Her toes curl, her legs shaking uncontrollably as she succumbs completely, her moans turning into desperate, breathless cries.", "Her mouth falls open, her eyes rolling back as the pleasure overtakes her, breaking what little resistance she had left.", "She screams your name, her body writhing against the ropes as she drowns in the ecstasy you've forced upon her.", "Her muscles spasm, her bound arms flexing as she loses control, the corruption flooding her mind with overwhelming need.", "She convulses beneath you, her once-defiant body now trembling in absolute submission, addicted to your touch.", "Her breath catches in her throat, her body locking up for a long, shuddering moment before she collapses in blissful exhaustion.", "She moans mindlessly, her body shaking violently as she cumes harder than she ever thought possible, her last shreds of resistance erased forever." ]>> <</nobr>>
<<nobr>> <<set $PlayerHealth to 100>> <<set $EnemyHealth to 100>> <div class="text-box"> <<if $Quests.includes("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> <<goto "SuccubusMiniBoss3">> <<else>> <<set _rand to random(0, 2)>> <<if _rand is 0>> <<goto "SuccubusMiniBoss">> <<elseif _rand is 1>> <<goto "SuccubusMiniBoss3">> <<else>> <<goto "Encounter_Arachness">> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <<set $CruptMapFound to false>> <<set $NewCrypt to false>> <div class="text-box"> <h1>The Forests</h1> <div class="Random-image"> <<set _imagePath to "Images/Forrest/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set $ForestLocation to "Images/Forrest/Maps/Centre.jpg">> <<set $OldPosition to "Centre">> <<button "Enter the forest">> <<goto "ForestExplore">> <</button>> <br> <<button "Return home">> <<goto "Base Intro">> <</button>> <<addclass "#right-ui-bar" "stowed">> </div> <</nobr>>
<<nobr>> <div class="text-box"> This is as far as you are comfortable with leaving your castle for now, you can send out scouts to search further<br><br> <i>Dev note: This is the current edge of the map, it will be expended and if popular implimented into other areas like the mountains, and the harbour</i><br><br> <<button "Turn back">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<div class="text-box"> <<You>>Where am I, whats going on<</You>><br> <<Eisheth>>How are you alive! I drained your soul?<</Eisheth>><br> <<You>>I can also take souls<</You>><br> <<Eisheth>>I thought that was a power only us succubus have<</Eisheth>><br> <<Eisheth>>Well, mortal... Prehaps we can come to an arrangement<</Eisheth>><br> <<You>>What do you mean?<</You>><br> <<Eisheth>>I cannot leave this place, its where I was summoned and where I must stay now my previous follower is dead. If you collect souls and bring them to me, I can reward you with power. Im sure you'll find the trade beneficial and enjoyable<</Eisheth>><br> She said with a wink [[Continue|Eisheth]] </div>
<div class="text-box"> <<You>>Whats going on<</You>><br> <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/2.webm" type="video/webm"> </video> <<Eisheth>>Quiet, give in to me<</Eisheth>><br> <<You>>What are you doing<</You>><br> <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/1.webm" type="video/webm"> </video> <<Eisheth>>Cum for me<</Eisheth>><br> The feeling is overwhelming and you cum <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/3.webm" type="video/webm"> </video> <<Eisheth>>Gooood<</Eisheth>><br> <<set $Souls to $Souls - 1>> <<link "You blackout">><<fadeToPassage "EishethWake">><</link>> </div>
<div class="text-box"> Eisheth kneels in front of you and sucks your cock <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/7.webm" type="video/webm"> </video> <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/8.webm" type="video/webm"> </video> You cum on Eisheth, feeling the souls you have flow out of your body and into Eisheth <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/9.webm" type="video/webm"> </video> <<Eisheth>>Thank you<</Eisheth>> [[Leave|ForestCave]] </div>
<<nobr>> <<set $Time to $Time + 1>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to "Images/Forrest/Encounters/Cave/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<Eisheth>>What do you have for me?<</Eisheth>><br> <<if $EishethCave isnot true>> <<if ($PlayerSpells.includes("Tear")) and ($PortalVisited is true)>> <<button "Create tear">> <<run setup.addPortalDestination('Eisheth Cave', 'Eisheth', 'EishethCave.png')>> <<set $EishethCave to true>> <<run Engine.show()>> <</button>><br><br> <</if>> <</if>> <<if $Souls gt 0>> <hr> <h2>Sell Souls</h2> Souls you wish to sell: $EishethSoulsSell <<if $EishethSoulsSell lt $Souls>> <<button "+1">> <<set $EishethSoulsSell to $EishethSoulsSell + 1>> <<goto "Eisheth">> <</button>> <</if>> <br><br>Eisheth will pay 100 gold for each soul<br><br> <<button "Sell $EishethSoulsSell souls for gold">> <<set $Souls to $Souls - $EishethSoulsSell>> <<goto "Sell Souls">> <</button>><br> <hr> <h2>Trade Souls</h2> <<button "Trade souls for power">> <<goto "Trade Souls">> <</button>><br> <<button "Corrupt your weapons">> <<goto "WeaponUpgrade">> <</button>><br> <<if $CaptureSuccubi is true>> <<if $Souls >= 5>> <<button "Purchase a succubus soul (Costs 5 souls)">> <<set $Souls to $Souls - 5>> <<set $CapturedSuccubiSouls to $CapturedSuccubiSouls + 1>> <<goto "Eisheth">> <</button>> <<else>> <i>You can't afford a succubus soul</i> <</if>> <</if>> <<else>> <<You>>I have no souls to give<</You>> <<Eisheth>>Disapointing, return when you do<</Eisheth>><br> <</if>> <<button "Leave">> <<goto "ForestExplore">><<set $ForestLocation to "Images/Forrest/Maps/Cave.jpg">> <</button>><br> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $EishethMet to true>> You wake up and struggle to stand <<You>>Where am I<</You>> [[Look around|Eisheth1]] </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set $ImagePath to "Images/Forrest/Cult/Elizabeth/1.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<You>>I wanted to ask you a question<</You>><br><br> <<Elizabeth>>Of course<</Elizabeth>><br><br> <<if $Position is "null">> <<link "What do you think of this place?">> <<set $Position to "Place">> <<run Engine.show()>> <</link>><br><br> <<link "Who is Vaelora?">> <<set $Position to "Vaelora">> <<run Engine.show()>> <</link>><br><br> <<link "Vaelora said you would help with things?">> <<set $Position to "Sex">> <<run Engine.show()>> <</link>><br><br> <</if>> <<if $Position is "Place">> <<You>>What do you think of this place<</You>><br><br> <<Elizabeth>>Vaelora took me in years ago, it's all I really know... There were more of us back then but now it's just us<</Elizabeth>><br><br> <<Elizabeth>>I love Vaelora, some may say she is unethical, but what we do here will benifit all<</Elizabeth>><br><br> <</if>> <<if $Position is "Vaelora">> <<You>>Who is Vaelora?<</You>><br><br> <<Elizabeth>>You'll have to ask her that... But if you are who she thinks you are, then she is like you someone with power<</Elizabeth>> <</if>> <<if $Position is "Sex">> <<Elizabeth>>As my lady said, I'm happy to assit with anything you may need<</Elizabeth>><br><br> <<You>>Meaning?<</You>><br><br> <<Elizabeth>>I'm no sorcerous or warrior but I have tallents you can use any time you like<</Elizabeth>><br><br> She winks at you<br><br> <<set $ElizabethFuck to true>> <</if>> <<if $Position is not "null">> <<link "Ask another question">> <<set $Position to "null">> <<run Engine.show()>> <</link>><br><br> <</if>> [[Leave|Cult]] <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $CurrentEnemy to "Alice">> <div align="center"> <img src="Images/Forrest/Encounters/Human/Female/7.png" width="700" height="700"> </div> <<Alice>>Stay away!<</Alice>><br><br> The girl jumps away when she sees you and holds a farm tool infront of herself<br><br> <<Thoughts>>Whats wrong with this girl, she cant see who I really am<</Thoughts>><br><br> <<You>>It's ok, I'm not going to hurt you<</You>><br><br> <<Thoughts>>...Yet<</Thoughts>><br><br> <<Alice>>I don't want any more trubble<</Alice>><br><br> <<You>>What are you talking about?<</You>><br><br> <<Alice>>You're not one of them are you?<</Alice>><br><br> She lowers her shovel <<You>>One of who? Who are you talking about?<</You>><br><br> <<Alice>>The bandits, camped out in the forrest, they came a few weeks ago and asked for protection money. My father said no and they left<</Alice>><br><br> <<You>>They dont sound that ba...<</You>><br><br> <<Alice>>They came back in the night and took him, I've tried asking the guards for help, but they dont want to deal with the bandits<</Alice>><br><br> <<Thoughts>>I need this girl... Maybe I could "help" her out and get her to trust me<</Thoughts>><br><br> [[Continue|AliceGivesQuest]] <</nobr>> </div>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $Animal to true>> <<set $VoidEnemy to true>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 1>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<run $enemyTraits.push("soulless")>> <<set $CurrentEnemy to "Arachness">> <<set _rand to random(3, 5)>> <<set $ImagePath to "Images/Crypt/Spider/Start/" + _rand + ".png">> <<set $EnemyHealth to 100>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Claws', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 15, effects: [], description: 'A powerful strike with sharp claws' }, { name: 'Sting', image: 'Images/Items/Melee Weapons/sting.png', type: 'weapon', damage: 10, effects: [{name: 'venom', value: 1}], description: 'A venomus sting which is tiring and corrupting' }, { name: 'Web', image: 'Images/Items/Melee Weapons/Web.png', type: 'weapon', damage: 0, effects: [{name: 'entangle', value: 1}], description: 'A sticky silk for stunning prey' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // UPDATED: Apply the same value=1 logic to bandit cards window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display with value=1 logic const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => { if (typeof effect === 'object' && effect.name && effect.value) { // If value is 1, just show the name, otherwise show name and value return effect.value === 1 ? effect.name : `${effect.name}: ${effect.value}`; } return effect; }).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $CurrentEnemy to "Armored Bandit">> <<set $CombatBleeding to false>> <<set $enemyTraits to []>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 2>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!--armor generation --> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/gothic_plate_armor.png">> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/sallet.png">> <!-- Enemy setup --> <<set $Animal to false>> <<set $ImagePath to "Images/Forrest/Exploring/Ambush/4.png">> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level2: [ { name: 'Claymore Swing', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 15, effects: [], description: 'Heavy swing from a sharp blade' }, { name: 'Claymore Thrust', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 15, effects: [], description: 'A quick thrust from a sharp weapon' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/studded_leather_coat.png">> <</if>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/studded_leather_hachi.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set _Int = random(1, 6)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Male/Bandit/" + _Int + ".png">> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Prisoner setup --> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 10)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed" }>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <<button "Withdraw" "ForestExplore">><</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <<if $MaleContentTip isnot false>> <div class="text-box"> <h2>Tip:<br></h2> <i>There is no 'MM' content in this game, but you can also turn off male badits and Raiders in settings if you prefer</i><br> <<link "Do not show this again">> <<set $MaleContentTip to false>> <<goto "Encounter_Bandit">> <</link>> </div> <</if>> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Knife Slash', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 6, effects: [], description: 'A wild slash' }, { name: 'Knife Stab', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 10, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/wooden_club.png', type: 'weapon', damage: 12, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/plain_dagger.png', type: 'weapon', damage: 8, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'defence', damage: 15, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Falchion Slash', image: 'Images/Items/Melee Weapons/falchion.png', type: 'weapon', damage: 12, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Hatchet Chop', image: 'Images/Items/Melee Weapons/hatchet.png', type: 'weapon', damage: 16, effects: [], description: 'A sharp small axe chop' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 20, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<set $CombatTraining to true>> <<set $CombatTrainingRound to 1>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to true>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 2>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<run $enemyTraits.push("soulless")>> <<run $enemyTraits.push("Unyielding")>> <<run $enemyTraits.push("Stubborn")>> <!-- Enemy setup --> <<set $ImagePath to "Images/Forrest/Encounters/Animals/Bear/1.png">> <<set $Animal to true>> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Bear">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Claws Slash', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 12, effects: [], description: 'Sharp claws' } ], level2: [ { name: 'Claws Slash', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 12, effects: [], description: 'Sharp claws' }, { name: 'Fangs Bite', image: 'Images/Items/Melee Weapons/fangs.png', type: 'weapon', damage: 16, effects: [], description: 'Sharp and hungry jaws of a beast' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Function to create bandit card elements using combat CSS classes window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/studded_leather_coat.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 7)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/Bandit/" + $NPC + "/" + $NPCInt + ".png">> <<set $EnemyCorruption to 0>> <<set $EnemyHealth to 100>> <<set $EnemySex to "Female">> <<set $CurrentEnemy to "female bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "bandit", sex: "Female", hairColor: $NPC, ImagePath: "Images/Castle/Dungon/Woman/" + $NPC + "/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <<button "Withdraw" "ForestExplore">><</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Knife Slash', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 6, effects: [], description: 'A wild slash' }, { name: 'Knife Stab', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 10, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/wooden_club.png', type: 'weapon', damage: 12, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/plain_dagger.png', type: 'weapon', damage: 8, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'defence', damage: 15, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Falchion Slash', image: 'Images/Items/Melee Weapons/falchion.png', type: 'weapon', damage: 12, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Hatchet Chop', image: 'Images/Items/Melee Weapons/hatchet.png', type: 'weapon', damage: 16, effects: [], description: 'A sharp small axe chop' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 20, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/gothic_plate_armor.png">> <</if>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/sallet.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set $VoidEnemy to true>> <<set _Int = random(1, 7)>> <<set $ImagePath to "Images/Crypt/Enemy/Ghoul/1.png">> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 70>> <<set $CurrentEnemy to "Ghoul">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Claws', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 8, effects: [], description: 'Sharp calws in rotting hands' } ], level2: [ { name: 'Claws', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 10, effects: [], description: 'Sharp calws in rotting hands' }, { name: 'Mace Bash', image: 'Images/Items/Melee Weapons/morningstar_mace.png', type: 'weapon', damage: 12, effects: [], description: 'A heady and spiked weapon' } ], level3: [ { name: 'Mace Bash', image: 'Images/Items/Melee Weapons/morningstar_mace.png', type: 'weapon', damage: 12, effects: [], description: 'A heady and spiked weapon' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 15, effects: [], description: 'A small, quick shield' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to ["unyielding", "stubborn"]>> <<set $CombatBleeding to true>> <<set $EnemyArmourValue to 0>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set _level to random(2, 3)>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/breastplate.png">> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/open_barbute.png">> <!-- Enemy setup --> <<set $Animal to false>> <<set $ImagePath to "Images/Forrest/Scarldale/guard.png">> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Guard">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <<button "Withdraw" "ForestExplore">><</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level2: [ { name: 'Halberd Chop', image: 'Images/Items/Melee Weapons/halberd.png', type: 'weapon', damage: 12, effects: [], description: 'A heavy chop from a long weapon' }, { name: 'Halberd Thrust', image: 'Images/Items/Melee Weapons/halberd.png', type: 'weapon', damage: 15, effects: [], description: 'A quick thrust' }, { name: 'Halberd Parry', image: 'Images/Items/Melee Weapons/halberd.png', type: 'defence', damage: 15, effects: [], description: 'A defensive block' } ], level3: [ { name: 'Halberd Chop', image: 'Images/Items/Melee Weapons/halberd.png', type: 'weapon', damage: 12, effects: [], description: 'A heavy chop from a long weapon' }, { name: 'Halberd Thrust', image: 'Images/Items/Melee Weapons/halberd.png', type: 'weapon', damage: 15, effects: [], description: 'A quick thrust' }, { name: 'Halberd Parry', image: 'Images/Items/Melee Weapons/halberd.png', type: 'defence', damage: 15, effects: [], description: 'A defensive block' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $EnemyArmourValue to 0>> <<set $CombatEnemyVenom to false>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set _level to random(2, 3)>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!--armor generation --> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/gothic_plate_armor.png">> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/sallet.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level2: [ { name: 'Claymore Swing', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 10, effects: [], description: 'Heavy swing from a sharp blade' }, { name: 'Claymore Thrust', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 15, effects: [], description: 'A quick thrust from a sharp weapon' } ], level3: [ { name: 'Claymore Swing', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 10, effects: [], description: 'Heavy swing from a sharp blade' }, { name: 'Claymore Thrust', image: 'Images/Items/Melee Weapons/two_handed_sword.png', type: 'weapon', damage: 15, effects: [], description: 'A quick thrust from a sharp weapon' }, { name: 'Shield Block', image: 'Images/Items/Melee Weapons/kite_shield_lion.png', type: 'defence', damage: 15, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 1>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Enemy setup --> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Villager">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Letter-opener Slash', image: 'Images/Items/Melee Weapons/poignard.png', type: 'weapon', damage: 10, effects: [], description: 'A wild slash' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<div class="text-box"> <<nobr>> You escape the cave with your life and stand there for a moment, breathing in the icy cold air<br><br> You turn slowly and look at the stanger who saved you<br><br> <div align="center"> <img src="Images/Mountains/Ida/1.png" width="700" height="700"> </div><br><br> <<You>>Thank you<</You>><br><br> <<say 'Stranger' 'Images/Mountains/Ida/1.png'>>Why would you go into the caves?!<</say>><br><br> <<You>>I was cold and lost in the blizzard, I needed to find safety<</You>><br><br> <<say 'Stranger' 'Images/Mountains/Ida/1.png'>>Safety? You're not from this area are you?<</say>><br><br> <<You>>How can you tell?<</You>><br><br> <<say 'Stranger' 'Images/Mountains/Ida/1.png'>>Everyone who lives in the mountains knows there is only death in the darkness, we only enter the caves when we have light and even then... Its dangerous<</say>><br><br> <<You>>Dangerous how?<</You>><br><br> The stanger pulls down the cloth covering her face, revealing a beautiful girl<br><br> <div align="center"> <img src="Images/Mountains/Ida/2.png" width="700" height="700"> </div><br><br> <<Ida>>Now is not the time, my name is Ida and I imagen you are still lost. We have a small mining outpost to the north come with me and we will find you something warm to wear<</Ida>><br><br> <<You>>Before we go, how did you cause that fire ball?<</You>><br><br> Ida produces a glass bottle of black liquid with a rag wrapped around the top<br><br> <<Ida>>Pitch, we fill these old mead bottles with it and light them. When the bottle breaks the pitch quikly catches fire and burns very well. Now hurry, these mountains are not safe at night<</Ida>><br><br> She turns and starts to walk away<br><br> [[Follow her|IronpeakFirstView]] <</nobr>> </div>
<div class="text-box"> <<nobr>> Yoo land face first and for a moment loose awareness of whats going on, things are fuzzy and you hear some sort of crashing sound and... Warmth again<br><br> Turinig over you see a great fire covering the walls and floor of the cave below you, the whispers have stopped and now all you can hear is some behind you shouting<br><br> <span style="color: #FF1493;">Voice: RUN!</span><br><br> Looking towards the cave entrance, you see the outline of a person, you scramble to your feet and run toward them escaping the [[cave|Encounter_Ida2]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $LucySeen to true>> You encounter a woman walking in the forest, you sense corruptuion in this girls heart which you could possibly exploit. <div align="center"> <img src="Images/Forrest/Encounters/Human/Female/5.png" width="700" height="700"> </div> <<if $Cloaked is true>> <<if $Quests.includes("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> <<Lucy>>Hello sir, did you find the flower?<</Lucy>><br> <<You>>Not yet, sorry<</You>><br> <<Lucy>>That's ok, they grow underground sometimes... and often by the river<</Lucy>><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> <<Lucy>>Hello, how are you?<</Lucy>><br> <<You>>Im well thank you, what is a young girl like yourself doing this deep in the forest?<</You>><br> <<Lucy>>I live on the outskirts of the forest with my father, I'm looking for flowers<</Lucy>><br> <<You>>This part of the forest is unsafe, you should go home<</You>><br> <<Lucy>>I cant go home until I have the flowers my father has asked for, he sells them in the local market<</Lucy>><br> <<You>>Perhaps I could help find the flower for you?<</You>><br> <<Lucy>>Oh if you could I would be so greatful! My name is Lucy by the way<</Lucy>><br> <<You>>What does the flower look like?<</You>><br> <<Lucy>>Its a small back flower with white petals<</Lucy>><br> <<You>>I will see what I can do<</You>><br> <<button "Leave">> <<script>> UI.alert("New Quest! <br>Find the black flower with white tips for Lucy"); <</script>> <<run $Quests.push("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> <<run Engine.play('ForestExplore')>> <<set $LucyMet to true>> <</button>> <<set $RiverUnlocked to true>> <</if>> <<else>> <<if $PlayerSpells.includes("Cloak")>> <i>Activate your cloak on the left hand panel to hide your identity (above the save button)</i><br><br> <<else>> <<You>>I should find away to hide my identity to not scare this girl<</You>><br><br> <</if>> <<button "Leave">> <<if $QuestCloak is false>> <<script>> UI.alert("New Quest! <br>Find a way to hide your identity"); <</script>> <<run $Quests.push("Find a way to hide your identity")>> <<set $QuestCloak to true>> <</if>> <<run Engine.play('ForestExplore')>> <</button>> <</if>> <<set $CurrentEnemy to "Lucy">> <</nobr>> </div> <<set $CloakDisabled to true>> <<set $LucyMetInt to $LucyMetInt + 1>>
<<nobr>> <<include "DialogueStorage">> <<startdialogue "_TutorialEncounterEnemy">> <<set $CombatTutorialComplete to true>> <<set $CombatTraining to true>> <<set $CombatTrainingRound to 1>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $CombatBleeding to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 1>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<run $enemyTraits.push("fleshless")>> <<run $enemyTraits.push("soulless")>> <!-- Enemy setup --> <<set _Int = random(1, 10)>> <<set $ImagePath to "Images/Castle/Defences/Guardian.png">> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Guardian">> <<set $EnemyMin to 15>> <<set $EnemyMax to 25>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeapons = [ { name: 'Longsword Slash', image: 'Images/Items/Melee Weapons/longsword.png', type: 'weapon', damage: 15, effects: [], description: 'A crude but effective slash attack' }, { name: 'Longsword Thrust', image: 'Images/Items/Melee Weapons/longsword.png', type: 'weapon', damage: 20, effects: [], description: 'A deadly thrust' }, { name: 'Longsword Parry', image: 'Images/Items/Melee Weapons/longsword.png', type: 'defence', damage: 10, effects: [], description: 'A crude but effective slash attack' }, ]; // Store the current selected cards window.currentBanditDeck = []; // Function to randomly select 4 cards window.selectRandomBanditCards = function() { const shuffled = [...BanditWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 4); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Function to create bandit card elements using combat CSS classes window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/studded_leather_coat.png">> <</if>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/studded_leather_hachi.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Knife Slash', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 6, effects: [], description: 'A wild slash' }, { name: 'Knife Stab', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 8, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/wooden_club.png', type: 'weapon', damage: 8, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/plain_dagger.png', type: 'weapon', damage: 8, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'weapon', damage: 14, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'defence', damage: 14, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Falchion Slash', image: 'Images/Items/Melee Weapons/falchion.png', type: 'weapon', damage: 18, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Hatchet Chop', image: 'Images/Items/Melee Weapons/hatchet.png', type: 'weapon', damage: 15, effects: [], description: 'A sharp small axe chop' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 18, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<run $enemyTraits.push("fleshless")>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/chain_shirt.png">> <</if>> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 1>> <<set $EnemyHelmet to true>> <<set $EnemyHelmetImgPath to "Images/Items/Armour/khula_khud.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set $VoidEnemy to true>> <<set _Int = random(1, 7)>> <<set $ImagePath to "Images/Crypt/Enemy/Skell/3.png">> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 40>> <<set $CurrentEnemy to "Skeleton">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'club bash', image: 'Images/Items/Melee Weapons/bone_club.png', type: 'weapon', damage: 8, effects: [], description: '' }, { name: 'club parry', image: 'Images/Items/Melee Weapons/bone_club.png', type: 'defence', damage: 10, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/bone_club.png', type: 'weapon', damage: 15, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/rusty_dagger.png', type: 'weapon', damage: 8, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/rusty_sword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/rusty_sword.png', type: 'defence', damage: 15, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Axe Swing', image: 'Images/Items/Melee Weapons/daneaxe.png', type: 'weapon', damage: 12, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Shield Bash', image: 'Images/Items/Melee Weapons/kite_shield.png', type: 'weapon', damage: 15, effects: [], description: 'A staggering hit with a shield' }, { name: 'Shield Block', image: 'Images/Items/Melee Weapons/kite_shield.png', type: 'defence', damage: 18, effects: [], description: 'A heavy shield defence' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $VoidEnemy to true>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $Animal to false>> <<set $enemyTraits to []>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to 1>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<run $enemyTraits.push("soulless")>> <<set $CurrentEnemy to "Lesser Succubus">> <<if $GlamSuccDisabled is true>> <<set $SuccInt to random(1, 5)>> <<else>> <<set $SuccInt to random(1, 7)>> <</if>> <<set $SuccState to 1>> <<if $Int lt 4>><<set $SuccubusHair to "Red">><<else>><<set $SuccubusHair to "Black">><</if>> <<set $ImagePath to "Images/Crypt/Enemy/Lesser Succubus/" + $SuccInt + "/" + $SuccState + ".png">> <<set $EnemyHealth to 50>> <<set $VoidEnemy to true>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Trance', image: 'Images/Items/Spells/Trance.png', type: 'spell', damage: 0, effects: [{name: 'Corruption', value: 20}], description: 'A corrupting spell' }, { name: 'Tease', image: 'Images/Items/Spells/Disrobe.png', type: 'spell', damage: 0, effects: [{name: 'Corruption', value: 30}], description: 'A corrupting spell' }, { name: 'Dominate', image: 'Images/Items/Spells/Dominate.png', type: 'spell', damage: 0, effects: [{name: 'Corruption', value: 20}], description: 'A corrupting spell' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Function to create bandit card elements using combat CSS classes window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Enemy setup --> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "bandit">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="scene-description"> A figure steps out from behind a gnarled oak tree, blade glinting in the dappled forest light. The bandit's eyes narrow as they size you up, clearly calculating the worth of your possessions. Their dagger twirls with practiced ease, leaving little doubt about their intentions. </div> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Knife Slash', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 6, effects: [], description: 'A wild slash' }, { name: 'Knife Stab', image: 'Images/Items/Melee Weapons/knife.png', type: 'weapon', damage: 8, effects: [], description: 'A quick jab' }, { name: 'Club Bludgeon', image: 'Images/Items/Melee Weapons/wooden_club.png', type: 'weapon', damage: 10, effects: [], description: 'An curde weapon, still capable of breaking bones' } ], level2: [ { name: 'Dagger Stab', image: 'Images/Items/Melee Weapons/plain_dagger.png', type: 'weapon', damage: 10, effects: [], description: 'An accurate thrust from a quick blade' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'weapon', damage: 15, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/shortsword.png', type: 'defence', damage: 15, effects: [], description: 'A medium weapon slash' } ], level3: [ { name: 'Falchion Slash', image: 'Images/Items/Melee Weapons/falchion.png', type: 'weapon', damage: 18, effects: ['block'], description: 'A sharp heavy swing' }, { name: 'Hatchet Chop', image: 'Images/Items/Melee Weapons/hatchet.png', type: 'weapon', damage: 10, effects: [], description: 'A sharp small axe chop' }, { name: 'Buckler Block', image: 'Images/Items/Melee Weapons/buckler2.png', type: 'defence', damage: 20, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set _rand to random(1, 100)>> <<if $Notoriety is 0>> <<if _rand lte 50>><<set _level to 1>> <<elseif _rand lte 85>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 1>> <<if _rand lte 35>><<set _level to 1>> <<elseif _rand lte 75>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety is 2>> <<if _rand lte 25>><<set _level to 1>> <<elseif _rand lte 65>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <<elseif $Notoriety gte 3>> <<if _rand lte 15>><<set _level to 1>> <<elseif _rand lte 45>><<set _level to 2>> <<else>><<set _level to 3>> <</if>> <</if>> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set $EnemyLevel to _level>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<set _traits to ["unyielding", "stubborn", "fast"]>> <<set _rand to random(0, $EnemyLevel)>> <<set _availableTraits to _traits.slice()>> <<for _i to 0; _i lt _rand; _i++>> <<if _availableTraits.length gt 0>> <<set _randomIndex to random(0, _availableTraits.length - 1)>> <<set _selectedTrait to _availableTraits[_randomIndex]>> <<run $enemyTraits.push(_selectedTrait)>> <<run _availableTraits.splice(_randomIndex, 1)>> <</if>> <</for>> <!-- Random armor generation --> <<set _rand to random(0, 1)>> <<if _rand is 0>> <<set $EnemyArmourValue to $EnemyArmourValue + 2>> <<set $EnemyChestArmour to true>> <<set $EnemyChestArmourImgPath to "Images/Items/Armour/studded_leather_coat.png">> <</if>> <!-- Enemy setup --> <<set $Animal to false>> <<set $VoidEnemy to true>> <<set _Int = random(1, 7)>> <<set $ImagePath to "Images/Crypt/Enemy/Zombie/4.png">> <<set $Animal to false>> <<set $EnemyCorruption to 0>> <<set $EnemySex to "Male">> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Undead">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> </div> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Bite', image: 'Images/Items/Melee Weapons/fangs.png', type: 'weapon', damage: 6, effects: [], description: 'sharp teeth in a snapping jaw' } ], level2: [ { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/rusty_sword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Bite', image: 'Images/Items/Melee Weapons/fangs.png', type: 'weapon', damage: 10, effects: [], description: 'sharp teeth in a snapping jaw' } ], level3: [ { name: 'Bite', image: 'Images/Items/Melee Weapons/fangs.png', type: 'weapon', damage: 10, effects: [], description: 'sharp teeth in a snapping jaw' }, { name: 'Shortsword Slash', image: 'Images/Items/Melee Weapons/rusty_sword.png', type: 'weapon', damage: 12, effects: [], description: 'A medium weapon slash' }, { name: 'Shortsword Parry', image: 'Images/Items/Melee Weapons/rusty_sword.png', type: 'defence', damage: 20, effects: [], description: 'A defensive maneuver' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Replace the createBanditCardElement function with this corrected version window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display - FIX: properly format effect objects const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.map(effect => typeof effect === 'object' ? `${effect.name}: ${effect.value}` : effect ).join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<<nobr>> <<set $CombatTraining to true>> <<set $CombatTrainingRound to 1>> <<include "WeaponEffectsPopup">> <<include "EnemyTraitsPopup">> <<set $enemyTraits to []>> <<set $PlayerVenom to false>> <<set $CombatBleeding to false>> <<set $CombatEnemyVenom to false>> <<set $EnemyArmourValue to 0>> <<set $EnemyChestArmour to false>> <<set $EnemyHelmet to false>> <<set _lvl to random(1, 2)>> <<set $EnemyLevel to _lvl>> <<set $CombatCardEffects to []>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $CombatBleedingValue to 0>> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <<run $enemyTraits.push("soulless")>> <<run $enemyTraits.push("Unyielding")>> <<run $enemyTraits.push("Stubborn")>> <!-- Enemy setup --> <<set $ImagePath to "Images/Forrest/Encounters/Animals/Wolf/1.png">> <<set $Animal to true>> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Wolf">> <<set $Tag = tags()[1]>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <!-- Include the main combat CSS --> <<include "CombatCSS">> <div class="encounter-container"> <div class="character-card"> <div class="character-image animated"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Bandit Image"> </div> <div class="character-info"> <div class="enemy-stats"> <p><span class="info-label">Threat:</span> <span class="enemy-type"><<print $CurrentEnemy>></span></p> <p><span class="info-label">Level:</span> <span class="enemy-level"><<print $EnemyLevel>></span></p> <p><span class="info-label">Traits:</span> <span class="weapon-type"><<print $enemyTraits>></span></p> <<if $EnemyChestArmour or $EnemyHelmet>> <p><span class="info-label">Armor:</span> <<if $EnemyChestArmour>> <img @src=$EnemyChestArmourImgPath alt="Chest Armor" class="armor-image"> <</if>> <<if $EnemyHelmet>> <img @src=$EnemyHelmetImgPath alt="Helmet" class="armor-image"> <</if>> <span class="armor-value">Protection: <<print $EnemyArmourValue>></span> </p> <<else>> <p><span class="info-label">Armor:</span> <span class="no-armor">Unarmored</span></p> <</if>> </div> </div> </div> <div class="bandit-weapons-section"> <div id="banditCards" class="card-hand"> <!-- Bandit attack cards will be displayed here --> </div> </div> </div> <div style="text-align: center"> <<if $CurrentPlayer is "LucyCloaked">> <<button "Try to run away">><<goto "LucyFlee">><</button>> <<set $Position to "Start">> <</if>> <<if $CurrentPlayer is "Overlord">> <div class="combat-actions"> <<button "Engage in Combat" "Combat" class="execute-combat-btn">> <<removeclass "#right-ui-bar" "stowed">> <</button>> </div> <div id="auto-combat-container"></div> <script> $(document).ready(function() { $('#auto-combat-container').html(window.AutoCombat.getPreviewHTML()); }); </script> <</if>> </div> <</nobr>> <<script>> // Bandit Weapons Configuration window.BanditWeaponsByLevel = { level1: [ { name: 'Claws Slash', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 8, effects: [], description: 'Sharp claws' } ], level2: [ { name: 'Claws Slash', image: 'Images/Items/Melee Weapons/claws.png', type: 'weapon', damage: 8, effects: [], description: 'Sharp claws' }, { name: 'Fangs Bite', image: 'Images/Items/Melee Weapons/fangs.png', type: 'weapon', damage: 15, effects: [], description: 'Sharp and hungry jaws of a beast' } ] }; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Store the current selected cards window.currentBanditDeck = []; // Function to get enemy level from Twine variable window.getEnemyLevel = function() { if (typeof State !== 'undefined' && State.variables && State.variables.EnemyLevel) { return State.variables.EnemyLevel; } return 1; }; // Modified function to randomly select 3 cards based on enemy level window.selectRandomBanditCards = function() { const enemyLevel = getEnemyLevel(); const levelKey = `level${Math.min(Math.max(enemyLevel, 1), 3)}`; const availableWeapons = BanditWeaponsByLevel[levelKey] || BanditWeaponsByLevel.level1; const shuffled = [...availableWeapons].sort(() => 0.5 - Math.random()); return shuffled.slice(0, 3); }; // Function to display bandit cards using the combat CSS styling window.displayBanditCards = function() { const selectedCards = selectRandomBanditCards(); currentBanditDeck = selectedCards; const cardsDiv = document.getElementById('banditCards'); if (!cardsDiv) { console.log('banditCards div not found'); return; } // Clear the container cardsDiv.innerHTML = ''; selectedCards.forEach(card => { const cardElement = createBanditCardElement(card); cardsDiv.appendChild(cardElement); }); // Auto-deploy the cards to combat system deployBanditCards(); }; // Function to create bandit card elements using combat CSS classes window.createBanditCardElement = function(card) { const cardDiv = document.createElement('div'); // Use the same classes as player cards, but add enemy-card for distinction cardDiv.className = 'card enemy-card'; // Build effects display const effectsDisplay = card.effects.length > 0 ? `<div class="card-effects">${card.effects.join(', ')}</div>` : ''; // Build costs display (hidden for enemy cards, but structure maintained) const costsDisplay = `<div class="card-costs hidden"></div>`; // Build damage/defense display const damageDisplay = card.damage > 0 ? `<div class="card-damage">⚔️ ${card.damage}</div>` : ''; cardDiv.innerHTML = ` <div class="card-content"> <div class="card-type ${card.type}">${card.type}</div> <div class="card-name">${card.name}</div> <div class="card-image"> <img src="${card.image}" alt="${card.name}" onerror="this.style.display='none'"> </div> ${costsDisplay} ${damageDisplay} ${effectsDisplay} <div class="card-description">${card.description}</div> </div> `; return cardDiv; }; // Function to reroll cards window.rerollBanditCards = function() { displayBanditCards(); console.log('Rerolled bandit cards'); }; // Function to deploy bandit cards to combat system window.deployBanditCards = function() { if (!window.CombatSystem) { console.log('CombatSystem not available - cards will be deployed when combat starts'); window.pendingBanditCards = currentBanditDeck; return; } let cardsToUse = currentBanditDeck; if (!cardsToUse || cardsToUse.length === 0) { cardsToUse = selectRandomBanditCards(); currentBanditDeck = cardsToUse; } // Validate cards before deployment const validCards = cardsToUse.filter(card => card && typeof card.name === 'string' && typeof card.damage === 'number' && typeof card.type === 'string' ); if (validCards.length === 0) { console.error('No valid cards to deploy'); return; } // Clear existing enemy inventory CombatSystem.enemyInventory = []; // Deploy validated cards validCards.forEach(card => { CombatSystem.addEnemyCard({ name: card.name, image: card.image, type: card.type, damage: card.damage, effects: card.effects || [], description: card.description }); }); // Update inventory count display if (typeof updateEnemyInventoryCount === 'function') { updateEnemyInventoryCount(); } console.log(`Successfully deployed ${validCards.length} bandit cards`); }; // Enhanced bandit encounter system window.BanditEncounter = { init: function() { this.setupBanditCards(); this.bindEvents(); }, setupBanditCards: function() { try { displayBanditCards(); } catch (error) { console.error('Error setting up bandit cards:', error); this.showErrorMessage(); } }, bindEvents: function() { $(document).on('click', '[data-action="start-combat"]', function() { if (window.currentBanditDeck && window.currentBanditDeck.length > 0) { deployBanditCards(); } }); }, showErrorMessage: function() { const cardsDiv = document.getElementById('banditCards'); if (cardsDiv) { cardsDiv.innerHTML = ` <div style="text-align: center; color: #ff6b6b; padding: 20px;"> <p>Unable to load bandit cards. Using default combat setup.</p> <button onclick="location.reload()">Retry</button> </div> `; } }, getCurrentDeck: function() { return window.currentBanditDeck || []; } }; // Initialize when ready $(document).ready(function() { setTimeout(() => { BanditEncounter.init(); }, 100); }); // Expose for debugging window.debugBandit = function() { console.log('Current Bandit Deck:', currentBanditDeck); console.log('Available Weapons:', BanditWeapons); console.log('Combat System:', window.CombatSystem); }; <</script>> <style> /* Additional styling specific to this encounter */ .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .encounter-container { display: flex; flex-direction: column; gap: 20px; } .character-card { display: flex; gap: 20px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; border: 1px solid #444; } .animated img { transition: all 0.3s ease; max-width: 200px; border-radius: 8px; } .animated img:hover { transform: scale(1.02); box-shadow: 0 0 20px rgba(255, 0, 0, 0.3); } .enemy-type, .weapon-type { color: #ff4444; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; } .enemy-level { color: #ffaa00; font-weight: bold; font-size: 1.1em; } .armor-image { width: 30px; height: 30px; object-fit: contain; margin: 0 5px; vertical-align: middle; } .armor-value { color: #4a90e2; font-weight: bold; } .no-armor { color: #888; font-style: italic; } .health-bar { width: 100%; height: 20px; background: #333; border: 2px solid #666; border-radius: 10px; overflow: hidden; margin-top: 10px; position: relative; } .health-fill { height: 100%; background: linear-gradient(to right, #ff4444, #ff6666); transition: width 0.3s ease; } .info-label { color: #ccc; font-weight: normal; } .bandit-weapons-section { margin-top: 20px; } /* Enemy card specific styling - inherits from combat CSS but with modifications */ .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%) !important; border-color: #8b0000 !important; color: #ff4444 !important; } .enemy-card .card-name { color: #ff6666 !important; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) !important; } .enemy-card .card-type { background: linear-gradient(to right, #600000, #800000) !important; color: #fff !important; } .enemy-card .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000) !important; } .enemy-card .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad) !important; } .enemy-card .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090) !important; } .enemy-card .card-damage { color: #ff6b6b !important; } .enemy-card .card-effects { color: #ffaa00 !important; } .enemy-card .card-description { color: #ccc !important; } .enemy-card:hover { transform: translateY(-5px) scale(1.02) !important; box-shadow: 0 8px 16px rgba(255, 68, 68, 0.4) !important; } /* Weapon controls styling */ .weapon-controls { text-align: center; padding-top: 15px; border-top: 1px solid #444; margin-top: 15px; } .weapon-controls button { padding: 8px 16px; background: linear-gradient(to bottom, #444, #333); color: #fff; border: 1px solid #666; border-radius: 4px; cursor: pointer; transition: all 0.3s ease; font-size: 0.9em; } .weapon-controls button:hover { background: linear-gradient(to bottom, #555, #444); border-color: #777; transform: translateY(-1px); } /* Action choices styling */ .action-choices { margin-top: 30px; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 8px; text-align: center; } .combat-actions { display: flex; gap: 15px; justify-content: center; flex-wrap: wrap; } /* Enhanced execute combat button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.2em !important; padding: 15px 30px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; border-radius: 8px !important; text-transform: uppercase !important; letter-spacing: 2px !important; font-weight: bold !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) translateY(-2px) !important; } /* Responsive design */ @media (max-width: 768px) { .encounter-container { padding: 10px; } .character-card { flex-direction: column; text-align: center; } .card-hand { flex-direction: column; align-items: center; } .combat-actions { flex-direction: column; align-items: center; } .enemy-card { min-width: 160px; max-width: 180px; } .animated img { max-width: 150px; } } /* Animation for card appearance */ @keyframes cardSlideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .enemy-card { animation: cardSlideIn 0.5s ease-out; } /* Loading state for card hand */ .card-hand.loading { opacity: 0.6; pointer-events: none; position: relative; } .card-hand.loading::after { content: "Loading bandit arsenal..."; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #fff; font-size: 1.1em; text-shadow: 0 0 10px rgba(255, 255, 255, 0.5); z-index: 10; } /* Enhanced card image styling for enemy cards */ .enemy-card .card-image { background: linear-gradient(to bottom, #333 0%, #222 100%) !important; border-color: #666 !important; } .enemy-card .card-image img { filter: brightness(0.9) contrast(1.1); } /* Special effects for different card types */ .enemy-card.card-type-weapon { border-left: 4px solid #ff4444; } .enemy-card.card-type-spell { border-left: 4px solid #9b59b6; } .enemy-card.card-type-defence { border-left: 4px solid #4a90e2; } /* Glow effect for high damage cards */ .enemy-card[data-damage="30"] { box-shadow: 0 0 15px rgba(255, 68, 68, 0.6) !important; } .enemy-card[data-damage="30"]:hover { box-shadow: 0 0 25px rgba(255, 68, 68, 0.8) !important; } /* Status indicators */ .enemy-stats p { margin: 8px 0; display: flex; align-items: center; gap: 10px; font-size: 1em; } .enemy-stats { flex: 1; min-width: 250px; } /* Card deployment success indicator */ .cards-deployed { position: relative; } .cards-deployed::after { content: "✓ Ready for Combat"; position: absolute; top: -10px; right: -10px; background: #228b22; color: white; padding: 4px 8px; border-radius: 12px; font-size: 0.7em; font-weight: bold; animation: fadeInOut 3s ease-in-out; } @keyframes fadeInOut { 0%, 100% { opacity: 0; } 20%, 80% { opacity: 1; } } /* Error state styling */ .error-message { background: rgba(139, 0, 0, 0.2); border: 2px solid #8b0000; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; margin: 20px 0; } .error-message button { background: #8b0000; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; margin-top: 10px; } .error-message button:hover { background: #a00000; } /* Debug information (hidden by default) */ .debug-info { display: none; background: rgba(0, 0, 0, 0.8); color: #0f0; font-family: monospace; font-size: 0.8em; padding: 10px; border-radius: 4px; margin-top: 20px; max-height: 200px; overflow-y: auto; } .debug-info.visible { display: block; } /* Tooltip styling for card effects */ .card-effects[title]:hover::after { content: attr(title); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 4px; font-size: 0.8em; white-space: nowrap; z-index: 1000; pointer-events: none; } /* Card stack effect for multiple similar cards */ .card-stack { position: relative; } .card-stack::before { content: ""; position: absolute; top: -3px; left: -3px; right: 3px; bottom: 3px; background: inherit; border: inherit; border-radius: inherit; z-index: -1; opacity: 0.7; } .card-stack::after { content: ""; position: absolute; top: -6px; left: -6px; right: 6px; bottom: 6px; background: inherit; border: inherit; border-radius: inherit; z-index: -2; opacity: 0.4; } </style>
<div class="text-box"> You find a fallen tree You take some wood <<set $Wood to $Wood + 100>> <div align="center"> <img src="Images/Forrest/Found Items/2.png" width="700" height="700"> </div> <<if $SearchingVillagers is true>> [[Return|Forrest Explore]] <<else>> <<return "Return">><</if>> </div> <<set $SearchingVillagers to false>>
<div class="text-box"> <<nobr>> <<if ($BarraksOccupance.length gt 3) and ($Notoriety gt 0)>> <<set _seigeChance to random(1, 12)>> <<if _seigeChance is 1>> <<set $BanditSeigeDay to true>> <</if>> <</if>> <<if $OakshadeFarmUnlocked is true>> <<include "FarmHarvest">> <<include "FarmBanditRaidSystem">> <</if>> <<if !$Notoriety>><<set $Notoriety to 0>><</if>> <<set $PlayerCorruption to Math.clamp(($PlayerCorruption - 25), 0, 100)>> <<include "UnitUpgrades">> <<set $VisitedBathHouse to false>> <<if $LucyQuest is true>> <<set $LucyCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">> You wake up in the middle of the night <<You>>Its time to go pay a visit to Lucy<</You>><br><br> You cast the cloak spell and set out<br><br> <<set $Cloaked to true>> <<addclass "#right-ui-bar" "stowed">> [[Go|LucyHouseNight]] <<else>> <<if $pendingRaid>> /* Store location and raid party */ <<set _location = $RaidLocationList.find(p => p.locationId === $raidTargetLocationId)>> <<set $currentRaidLocation = _location>> <<set $currentRaidParty = $RaidingParty.filter(raider => raider !== null)>> <<run console.log("Raid Location:", $currentRaidLocation)>> <<run console.log("Raid Party:", $currentRaidParty)>> <<if _location && (_location.type is "Bandit Camp" or _location.type is "BanditCamp")>> <<if $Strategy is "Raze">> <<goto "RaidResultsRaze">> <<else>> <<goto "PillageBanditResults">> <</if>> <</if>> <<if _location && _location.type is "Settlement">> <<if $Strategy is "Capture">> <<goto "RaidResultsCapture">> <<elseif $Strategy is "Pillage">> <<goto "RaidResultsPillage">> <</if>> <</if>> <<if _location && _location.type is "Caravan">> <<goto "RaidResultsPillageCaravan">> <</if>> <</if>> <<if ($pendingRaid isnot true) and ($FarmProtectionDaysRemaining <= 0)>> <<include "FarmBanditRaidSystem">> <</if>> <<if $AliceBrothel is true>><<set $Int = random(30, 60)>> Alice earns $Int gold working in the brothel <<set $Gold to $Gold + $Int>> <div align="centre">[img["Images/Town/Brothel/2.webp"]]</div><</if>> <<if $LucyBrothel is true>><<set $Int = random(30, 60)>> Lucy earns $Int gold working in the brothel <<set $Gold to $Gold + $Int>> <div align="centre">[img["Images/Town/Brothel/3.webp"]]</div><</if>> <<if ($MaraQuestFinished is true) and ($MaraAtBase is false)>><<set $Int = random(10, 20)>> Mara sends what little she made while working at the bath house: $Int gold<<set $Gold to $Gold + $Int>><</if>> <<if $LumberMillBuilt is true>> <<set $LumberMade to 20 * $LumberStaff>> Your lumber mill outputs $LumberMade wood. <<set $Wood to $Wood + $LumberMade>> <</if>> <<if $QuarryDiscovered is true>> <<set $StoneMade to 20 * $QuarryStaff>> Your quarry mill outputs $StoneMade stone. <<set $Stone to $Wood + $StoneMade>> <</if>> <<set _int to random(0, 2)>> <<if ($IronStock lt 3) and (_int is 2)>> <<set $IronStock to $IronStock + 1>> <</if>> <<set $Int = random(0, 2)>> <<if ($Notoriety is 0) or ($Int lt 2) and ($RaidTime lt 3)>> <<set $Day to $Day + 1>> <<set $Time to 1>> <<if $ExploreTeam && $ExploreTeam.length > 0>> <<for _i to 0; _i < $ExploreTeam.length; _i++>> <<capture _i>> <<set _explorer to $ExploreTeam[_i]>> <<set _explorer.daysremaining -= 1>> /* Combat chance check with Scouting bonus */ <<set _combatChance to random(1, 100)>> <<set _deathResistance to 0>> <<if _explorer.specialization === "Scouting">> <<set _deathResistance to _explorer.skill>> <</if>> <<if _combatChance <= 30>> <<if _explorer.armor>> <<if random(1, 100) <= (80 + _deathResistance/2)>> <<set _explorer.health -= random(10, 30)>> <<else>> <<set _explorer.health to 0>> <</if>> <<else>> <<if random(1, 100) <= (40 + _deathResistance)>> <<set _explorer.health -= random(20, 50)>> <<else>> <<set _explorer.health to 0>> <</if>> <</if>> <</if>> /* Check if explorer should return */ <<if _explorer.daysremaining <= 0>> <<if _explorer.health <= 0>> <<run UI.alert(_explorer.name + " has died during their exploration!")>> <<else>> <<run $BarraksOccupance.push(_explorer)>> <<goto "ExplorerReturn">> <</if>> <<run $ExploreTeam.deleteAt(_i)>> <<break>> <</if>> <</capture>> <</for>> <</if>> <<include "ProcessSettlements">> You wake up in your [[Chambers]] <<set $RaidTime to $RaidTime + 1>> <<set $Int = random(0, 3)>> <<if ($LucyCorrupt is true) and ($Int == 0) and ($LucyBrothel is false)>> Looking down to find Lucy sucking your cock<br><br> <<say 'Lucy' $LucyImg>>Morning $LucyName<</say>><br><br> <<set _rand to random(0, 1)>> <<if _rand is 0>> <video autoplay loop> <source src="Images/Castle/Chambers/sex/4.webm" type="video/webm"> </video> <<else>> <<set _bjImg to random(4, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Wakeup/" + _bjImg + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <</if>> <<if ($AliceCorrupt is true) and ($Int == 1) and ($AliceBrothel is false)>> Looking down you find Alice swallowing your cock Looking down you find Alice swallowing your cock<br><br> <<say 'Alice' $AliceImg>>Good morning, $AliceName<</say>><br><br> <<set _rand to random(0, 1)>> <<if _rand is 0>> <video autoplay loop> <source src="Images/Castle/Chambers/sex/3.webm" type="video/webm"> </video> <<else>> <<set _bjImg to random(7, 9)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Wakeup/" + _bjImg + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <</if>> <<if ($AliceCorrupt is true) and ($LucyCorrupt is true) and ($Int == 2)and ($LucyBrothel is false) and ($AliceBrothel is false)>> <<set _int to random(0, 1)>> <<if _int is 0>> As you wake up you enjoy the feeling of Alice and Lucy taking turns to suck you <<set _rand to random(0, 1)>> <<if _rand is 0>> <video autoplay loop> <source src="Images/Castle/Chambers/sex/5.webm" type="video/webm"> </video> <<else>> <<set _bjImg to random(1, 3)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Wakeup/" + _bjImg + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<else>> As you wake to find Alice and Lucy have started their fun already, you dont mine bing used for the fun. <video autoplay loop> <source src="Images/Castle/Chambers/sex/6.webm" type="video/webm"> </video> <</if>> <</if>> <<else>> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Raid!</p><br> Your castle is being [[RAIDED!|Raid]]<br> <<set $RaidersNumber to Math.floor($Notoriety / 10)>> <<if $TarotCardInvet.includes("Tower")>> <<set $RaidersNumber to $RaidersNumber + 1>><</if>> <<set $Raiders to []>> /* Create raiders based on $RaidersNumber */ <<for _i to 0; _i lt $RaidersNumber; _i++>> <<set _img to random(1, 6)>> <<set _hairColor to "Brown">> <<set _genders to ["Male", "Female"]>> <<set _int to random(0, 1)>> <<if $MaleRaidersDisabled isnot true>> <<set _gender to _genders[_int]>> <<else>> <<set _gender to "Female">> <</if>> <<set _types to ["Bandit", "Heavy Bandit", "Thief"]>> <<set _int to random(0, 2)>> <<set _type to _types[_int]>> <<if _type is "Bandit">> <<set $EnemyMin to 20>><<set $EnemyMax to 25>> <<set $EnemyWeapon to "sword">> <<elseif _type is "Heavy Bandit">> <<set $EnemyMin to 25>><<set $EnemyMax to 30>> <<set $EnemyWeapon to "axe">> <<elseif _type is "Thief">> <<set $EnemyMin to 15>><<set $EnemyMax to 20>> <<set $EnemyWeapon to "dagger">> <</if>> <<set $ImagePath to "Images/Castle/Raid/Raiders/" + _gender + "/" + _type + "/" + _img + ".png">> <<if $TarotCardInvet.includes("Tower")>> <<set $Raider = { gender: _gender, hairColor: _hairColor, type: _type, min: $EnemyMin, max: $EnemyMax, weapon: $EnemyWeapon, health: 80, corruption: 20, img: $ImagePath }>> <<else>> <<set $Raider = { gender: _gender, hairColor: _hairColor, type: _type, min: $EnemyMin, max: $EnemyMax, weapon: $EnemyWeapon, health: 100, corruption: 0, img: $ImagePath }>> <</if>> <<run State.variables.Raiders.push($Raider)>> <</for>> You are being attacked by $RaidersNumber raiders! <<set $BeingRaided to true>> <<set $RaiderStartCount to $RaidersNumber>> <</if>> <<if $TavQuestTime gt 0>> <<set $TavQuestTime to $TavQuestTime - 1>><</if>> <<set $PlayerHealth to 100>> <<set $PlayerEnergy to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $LucyHealth to 100>> <<set $AliceHealth to 100>> <<set $SpiderCaptire to false>> <<set $SpiderCaptives to []>> <<set $TrapdoorCaptives to []>> <<set $ThiefsLureCaptives to []>> <<for _i to 1; _i <= $DefenceCount; _i++>> <<if $Defences[_i]>> <<set $Defences[_i].currentTriggers to 0>> <</if>> <</for>> <<for _i to 1; _i <= $DefenceCount; _i++>> <<if $Defences[_i]>> <<set $Defences[_i].health to 100>> <</if>> <</for>> <</if>> <<if $TarotCardInvet.includes("Death") and ($BeingRaided is false)>> <<set $Int to random(0, 10)>> <<if $Int <= 2>> <br><br>The death card takes it tole, you loose $DeathCardDamage health<br><br> <<set $PlayerHealth to $PlayerHealth - $DeathCardDamage>> <<set $DeathCardDamage to $DeathCardDamage + 5>> <</if>> <</if>> <</nobr>> </div> <<set $HeatherCorrupted to false>> <<set $RoseCorrupted to false>> <<set $LenaCorrupted to false>>
<div class="text-box"> <<nobr>> <<set $EnemyDamage = random($EnemyMin, $EnemyMax)>> <<set $EnemyDamage to $EnemyDamage + 20>> <<set $Defences[$Room].health to $Defences[$Room].health - $EnemyDamage>> The $CurrentRaider.type strikes the guardian with their $EnemyWeapon causing $EnemyDamage [[Continue|RaidGuardian]] <div class="Random-image"> <<set _imagePath to $CurrentRaider.img>> <img @src=_imagePath alt="Guest Image"> </div> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<script>> if (typeof CombatSystem !== 'undefined') { CombatSystem.cleanupForNextFight(); } <</script>> <<set $enemyDominateSpellCast to false>> <<set $enemyTranceSpellCast to false>> <<set $PlayerEntangled to false>> <<set $FightOver to true>> <div style="text-align: center"> <h1>Victory</h1> <p2>The $CurrentEnemy Surrenders</p2> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $HouseVisit is true>> You knock the man back and stab him in the chest, he lets out a gasp before falling to his knees and then forward to the ground, face down<br> <<set _int to random(0, 2)>> <<if _int gt 0>> You listen for a moment, hoping the girl you had been following had not heard you, you pause holding your breath and you don't hear a sound. She must have not heard the short brawl which caused her husbands death<br><br> <<set _int to random(10, 40)>> <<set $Gold to $Gold + _int>> You loot the dead mans pockets, finding _int gold. He won't be needing it<br><br> <<set $HusbandHome to false>> <<set $ManLocation to "dead">> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> <<else>> You stop and listen, for a moment there is silence, then you hear foot steps running through the house, the girl you followed here must have heard the commotion and is now trying to escape<br><br> You should leave before the guards get here<br><br> <<link "Return">><<run Engine.play("Base Intro")>><</link>> <</if>><</if>> <<if $Crypt is true>> You defeat the $CurrentEnemy and its soul returns to the void<br> <<if ($TarotCardInvet.includes("Devil")) and ($VoidEnemy is true)>> Having the Devil tarot card, means you pull their soul back from the void<br><br> <<set $Souls to $Souls + 1>> <</if>> <<if ($CurrentEnemy is "Vampire") or ($CurrentEnemy is "Greater Succubus")>> Searching the ruined body of the now dead woman, you find a key<br><br> <<if $CurrentEnemy is "Vampire">> <<set $LeftPathComplete to true>> <<else>> <<set $RightPathComplete to true>> <</if>><</if>> <<if $NewCrypt is true>> <<link "Continue">><<run Engine.play($ReturnPassage)>><</link>> <<else>> <<if $CryptLevel == 1>>[[Fight over|Crypt1]]<</if>> <<if $CryptLevel == 2>>[[Fight over|Crypt2]]<</if>> <<if $CryptLevel == 3>>[[Fight over|Crypt3]]<</if>> <<if $CryptLevel == 4>>[[Fight over|Crypt4]]<</if>> <</if>> <<elseif $NewCrypt is true >> You defeat the $CurrentEnemy and its soul returns to the void<br> <<if ($TarotCardInvet.includes("Devil")) and ($VoidEnemy is true)>> Having the Devil tarot card, means you pull their soul back from the void<br><br> <<set $Souls to $Souls + 1>> <</if>> <<if $CryptAmbush is true>> <<link "Continue">><<set $CryptAmbush to false>><<goto "CryptExplore">><</link>> <<else>> <<button "Move on">> <<set $Position to $OldPosition>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> <</if>> <<else>> <<if $BeingRaided is false>>You defeat the $CurrentEnemy<br><br> <<if $Animal is true>> <<if $CurrentEnemy is "Arachness">> You slay the Arachness and her body comes crashing down.<br><br> Checking over her body, you are able to draw some venom from here which you bottle and take <<if def $VenomBottles>> <<set $VenomBottles to $VenomBottles + 1>> <<else>> <<set $VenomBottles to 1>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Items/Potions/Venon_potion.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> You skin the dead $CurrentEnemy [[continue|kill]] <</if>> <</if>><br> <<if ($CellsCount > $DungonOccupance.length) and ($Animal is false)>> <<if $CurrentEnemy is "female Bandit">> You can [[capture]] or [[kill]] the female bandit <<if $PlayerSpells.includes("Dominate")>> , or have fun with her [[first|ForrestFuck]] <<set $NPCCum to 0>> <</if>> <<elseif $CurrentEnemy is "guard">> You kill the guard by pushing your sword up into his armpit where he is not armored. The guard screams before falling to his knees and colapsing [[dead|GuardKill]] <<else>> <<button "capture">><<goto "capture">><</button>> OR <<button "Kill">><<goto "kill">><</button>> <</if>> <<elseif $Animal is false>> Your cells are full <br> <<button "Kill">><<goto "kill">><</button>> <</if>><br> <</if>> <<if $BeingRaided is true>> The $CurrentEnemy lays dead <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue Raid">><<goto "Raid">><</button>><</if>><</if>><br><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <<set $DeathCardPlayed to false>> <<set $MagicianCardPlayed to false>> <<set $VoidEnemy to false>> <<removeclass "#right-ui-bar" "stowed">> <</nobr>>
<<nobr>> <style> #enemy-traits-panel { position: fixed; bottom: 20px; right: calc(20em - 10px); /* 10px to the right of the UI bar */ z-index: 999; font-family: inherit; } #enemy-traits-toggle { display: none; } #enemy-traits-container { position: relative; transition: transform 0.4s ease-in-out; } #enemy-traits-tab { background: linear-gradient(to bottom, #001a00 0%, #003000 100%); border: 2px solid #003000; border-radius: 8px 8px 0 0; padding: 12px 20px; cursor: pointer; color: white; font-weight: bold; font-size: 14px; letter-spacing: 1px; transition: all 0.3s ease; user-select: none; text-align: center; box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.4); min-width: 150px; position: relative; z-index: 2; } #enemy-traits-tab:hover { background: linear-gradient(to bottom, #002200 0%, #004000 100%); transform: translateY(-2px); } #enemy-traits-content { background: linear-gradient(to bottom, #0a2a1a 0%, #001a0a 100%); border: 2px solid #003000; border-top: none; border-radius: 0 8px 8px 8px; padding: 20px; width: 400px; color: white; font-size: 13px; line-height: 1.5; position: relative; box-shadow: 0 -2px 15px rgba(0, 0, 0, 0.6); max-height: 0; opacity: 0; overflow: hidden; transition: max-height 0.4s ease-in-out, opacity 0.4s ease-in-out, padding 0.4s ease-in-out; padding: 0 20px; } #enemy-traits-toggle:checked + #enemy-traits-container { transform: translateY(-100px); } #enemy-traits-toggle:checked + #enemy-traits-container #enemy-traits-content { max-height: 280px; opacity: 1; padding: 20px; overflow-y: auto; } .enemy-trait { margin-bottom: 12px; padding: 10px; background: rgba(0, 48, 0, 0.3); border-radius: 6px; border-left: 4px solid #003000; transition: background 0.2s ease; } .enemy-trait:hover { background: rgba(0, 48, 0, 0.5); } .enemy-trait strong { color: #99ff99; display: inline-block; min-width: 100px; font-weight: bold; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } .enemy-trait-description { color: #cccccc; margin-left: 8px; } #enemy-traits-content::-webkit-scrollbar { width: 8px; } #enemy-traits-content::-webkit-scrollbar-track { background: #001a0a; border-radius: 4px; } #enemy-traits-content::-webkit-scrollbar-thumb { background: #003000; border-radius: 4px; } #enemy-traits-content::-webkit-scrollbar-thumb:hover { background: #004000; } @media (max-width: 1200px) { #enemy-traits-panel { right: calc(18em - 10px); } #enemy-traits-content { width: 350px; } #enemy-traits-toggle:checked + #enemy-traits-container { transform: translateY(-90px); } } @media (max-width: 900px) { #enemy-traits-panel { right: calc(16em - 10px); } #enemy-traits-content { width: 300px; font-size: 12px; } #enemy-traits-tab { font-size: 12px; padding: 10px 15px; min-width: 120px; } #enemy-traits-toggle:checked + #enemy-traits-container { transform: translateY(-80px); } } @media (max-width: 768px) { #enemy-traits-panel { right: calc(4em - 10px); } } </style> <div id="enemy-traits-panel"> <input type="checkbox" id="enemy-traits-toggle"> <div id="enemy-traits-container"> <label for="enemy-traits-toggle" id="enemy-traits-tab">ENEMY TRAITS</label> <div id="enemy-traits-content"> <h3 style="margin: 0 0 18px 0; color: #66ff66; font-size: 16px; text-align: center; border-bottom: 2px solid #003000; padding-bottom: 10px;">Enemy Traits Guide</h3> <div class="enemy-trait"> <strong>Unyielding</strong> <span class="enemy-trait-description">- resistant to Overwhelming effect</span> </div> <div class="enemy-trait"> <strong>Stubborn</strong> <span class="enemy-trait-description">- resistant to Dreadful effect</span> </div> <div class="enemy-trait"> <strong>Fleshless</strong> <span class="enemy-trait-description">- resistant to fire damage</span> </div> <div class="enemy-trait"> <strong>Soulless</strong> <span class="enemy-trait-description">- resistant to corruption, upon death you receive no soul</span> </div> <div class="enemy-trait"> <strong>Fast</strong> <span class="enemy-trait-description">- enemy always has priority in a fight</span> </div> </div> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> You approach the first coffin, where a plaque is nailed, reading:<br><br><br> <span style="font-style: italic"> "Hear lies $CoffinData[0]<br> Died on the year of our lord<br> $CoffinData[3], $CoffinData[2], $CoffinData[1]" </span> <br><br>[[Back|CryptPuzzle]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You approach the second coffin, where a plaque is nailed, reading:<br><br><br> <span style="font-style: italic"> "Hear lies $CoffinData[4]<br> Died on the year of our lord<br> $CoffinData[7], $CoffinData[6], $CoffinData[5]" </span> <br><br>[[Back|CryptPuzzle]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You approach the third coffin, where a plaque is nailed, reading:<br><br><br> <span style="font-style: italic"> "Hear lies $CoffinData[8]<br> Died on the year of our lord<br> $CoffinData[11], $CoffinData[10], $CoffinData[9]" </span> <br><br>[[Back|CryptPuzzle]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $PuzzleDay to $PuzzleDays[0]>> <<set $PuzzleMonth to $PuzzleMonths[0]>> <<set $PuzzleYear to $PuzzleYears[0]>> <<set _PuzzleRoom to 0>> <<set $StatueImg to "Images/Crypt/Puzzle/Statues/1/" + $Statue1 + ".png">> <div class="Random-image"> <<set _imagePath to $StatueImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="text-box"> An imposing statue stands before you, theres a small brass button in its chest<br><br> At the bottom of the statue there are some roman numberals<br><br> <hr> <<set $romanDate to setup.dateToRoman()>> The plaque reads:<br> $romanDate<br><br> <hr> <<link "Press the button">> <<if _PuzzleRoom == $PuzzleKey[$Button]>> <<set $Button to $Button + 1>> <<if $Button == 4>> <<script>> UI.alert("Thats it, you hear the door unlocking!"); <</script>> <<set $RomanDoorUnlocked to true>> <<else>> <<script>> UI.alert("You hear a click from the statue"); <</script>> <</if>> <<else>> <<script>> UI.alert("You hear a dull thud, the lock must have reset"); <</script>> <<set $Button to 0>> <</if>> <<run Engine.show()>> <</link>><br><br> <<if $PuzzleCheats is 1>> <<link "Clue">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 2>> <<You>>The roman numberals are a date, I need to translate them and order them<</You>> <<link "Answer">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 3>> <<You>>Translated, this reads $PuzzleMonth/$PuzzleDay/$PuzzleYear<</You>><br><br> <</if>><br><br> [[Back|CryptPuzzle2]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $PuzzleDay to $PuzzleDays[3]>> <<set $PuzzleMonth to $PuzzleMonths[3]>> <<set $PuzzleYear to $PuzzleYears[3]>> <<set _PuzzleRoom to 3>> <<set $StatueImg to "Images/Crypt/Puzzle/Statues/4/" + $Statue4 + ".png">> <div class="Random-image"> <<set _imagePath to $StatueImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="text-box"> An imposing statue stands before you, theres a small brass button in its chest<br><br> At the bottom of the statue there are some roman numberals<br><br> <hr> <<set $romanDate to setup.dateToRoman()>> The plaque reads:<br> $romanDate<br><br> <hr> <<link "Press the button">> <<if _PuzzleRoom == $PuzzleKey[$Button]>> <<set $Button to $Button + 1>> <<if $Button == 4>> <<script>> UI.alert("Thats it, you hear the door unlocking!"); <</script>> <<set $RomanDoorUnlocked to true>> <<else>> <<script>> UI.alert("You hear a click from the statue"); <</script>> <</if>> <<else>> <<script>> UI.alert("You hear a dull thud, the lock must have reset"); <</script>> <<set $Button to 0>> <</if>> <<run Engine.show()>> <</link>><br><br> <<if $PuzzleCheats is 1>> <<link "Clue">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 2>> <<You>>The roman numberals are a date, I need to translate them and order them<</You>> <<link "Answer">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 3>> <<You>>Translated, this reads $PuzzleMonth/$PuzzleDay/$PuzzleYear<</You>><br><br> <</if>><br><br> [[Back|CryptPuzzle2]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $PuzzleDay to $PuzzleDays[1]>> <<set $PuzzleMonth to $PuzzleMonths[1]>> <<set $PuzzleYear to $PuzzleYears[1]>> <<set _PuzzleRoom to 1>> <<set $StatueImg to "Images/Crypt/Puzzle/Statues/2/" + $Statue2 + ".png">> <div class="Random-image"> <<set _imagePath to $StatueImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="text-box"> An imposing statue stands before you, theres a small brass button in its chest<br><br> At the bottom of the statue there are some roman numberals<br><br> <hr> <<set $romanDate to setup.dateToRoman()>> The plaque reads:<br> $romanDate<br><br> <hr> <<link "Press the button">> <<if _PuzzleRoom == $PuzzleKey[$Button]>> <<set $Button to $Button + 1>> <<if $Button == 4>> <<script>> UI.alert("Thats it, you hear the door unlocking!"); <</script>> <<set $RomanDoorUnlocked to true>> <<else>> <<script>> UI.alert("You hear a click from the statue"); <</script>> <</if>> <<else>> <<script>> UI.alert("You hear a dull thud, the lock must have reset"); <</script>> <<set $Button to 0>> <</if>> <<run Engine.show()>> <</link>><br><br> <<if $PuzzleCheats is 1>> <<link "Clue">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 2>> <<You>>The roman numberals are a date, I need to translate them and order them<</You>> <<link "Answer">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 3>> <<You>>Translated, this reads $PuzzleMonth/$PuzzleDay/$PuzzleYear<</You>><br><br> <</if>><br><br> [[Back|CryptPuzzle2]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $PuzzleDay to $PuzzleDays[2]>> <<set $PuzzleMonth to $PuzzleMonths[2]>> <<set $PuzzleYear to $PuzzleYears[2]>> <<set _PuzzleRoom to 2>> <<set $StatueImg to "Images/Crypt/Puzzle/Statues/3/" + $Statue3 + ".png">> <div class="Random-image"> <<set _imagePath to $StatueImg>> <img @src=_imagePath alt="Guest Image"> </div> <div class="text-box"> An imposing statue stands before you, theres a small brass button in its chest<br><br> At the bottom of the statue there are some roman numberals<br><br> <hr> <<set $romanDate to setup.dateToRoman()>> The plaque reads:<br> $romanDate<br><br> <hr> <<link "Press the button">> <<if _PuzzleRoom == $PuzzleKey[$Button]>> <<set $Button to $Button + 1>> <<if $Button == 4>> <<script>> UI.alert("Thats it, you hear the door unlocking!"); <</script>> <<set $RomanDoorUnlocked to true>> <<else>> <<script>> UI.alert("You hear a click from the statue"); <</script>> <</if>> <<else>> <<script>> UI.alert("You hear a dull thud, the lock must have reset"); <</script>> <<set $Button to 0>> <</if>> <<run Engine.show()>> <</link>><br><br> <<if $PuzzleCheats is 1>> <<link "Clue">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 2>> <<You>>The roman numberals are a date, I need to translate them and order them<</You>> <<link "Answer">><<set $PuzzleCheats to $PuzzleCheats + 1>><<run Engine.show()>><</link>> <</if>> <<if $PuzzleCheats is 3>> <<You>>Translated, this reads $PuzzleMonth/$PuzzleDay/$PuzzleYear<</You>><br><br> <</if>><br><br> [[Back|CryptPuzzle2]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _returnedExplorer to $BarraksOccupance.last()>> <<if $FirstSettlement isnot true>> <<set $FirstSettlement to true>> <<set _RaidType to "Settlement">> <<set _RaidSize to "Medium">> <<set _NPCCount to random(15, 20)>> <<set _img to $MediumSettlementRaid>> <<set $MediumSettlementRaid += 1>> <</if>> <h1>Explorer Has Returned!</h1> <div class="explorer-return"> <p><strong>_returnedExplorer.name</strong> has returned from their expedition!</p> <<set $RewardName to _returnedExplorer.name>> <<set $ImagePath to _returnedExplorer.ImagePath>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div class="health-display"> <p>Health: <<print _returnedExplorer.health>>/100</p> <div class="health-bar" style="width: <<print _returnedExplorer.health>>%; background-color: <<if _returnedExplorer.health > 70>>green<<elseif _returnedExplorer.health > 30>>yellow<<else>>red<</if>>;"> </div> </div> <<if _returnedExplorer.health < 50>> <p>They appear wounded from their journey.</p> <</if>> <<set $RaidLocations to ["Forest"]>> <<set $RaidTypes to ["Settlement", "Caravan", "BanditCamp"]>> <<set $RaidSizes to ["Small", "Medium"]>> <<set $RaidTimes to ["Day", "Night"]>> <<set _RaidLocation to $RaidLocations[0]>> <<set _discoveryType to random(0, 100)>> <<if _discoveryType < 20>> <<set _RaidType to "Caravan">> <<set _caravanImg to random(1, 3)>> <<set _caravanCarts to random(1, 5)>> <<set _caravanGuards to random(1, 6)>> <<set _caravanDaysRemaining to 3>> <<set _resources = ["gold", "wood", "stone", "food", "grain"]>> <<set _caravanResources = []>> <<for _i to 0; _i < _caravanCarts; _i++>> <<set _randomResource = _resources[random(0, _resources.length - 1)]>> <<run _caravanResources.push(_randomResource)>> <</for>> <<set _explorerKnowledge = { cartsVisible: true, resourcesVisible: false, guardsVisible: false, daysRemainingVisible: true }>> <<if _returnedExplorer.specialization === "Scouting">> <<if _returnedExplorer.skill >= 30>> <<set _explorerKnowledge.guardsVisible = true>> <</if>> <<if _returnedExplorer.skill >= 60>> <<set _explorerKnowledge.resourcesVisible = true>> <</if>> <</if>> <<elseif _discoveryType < 40>> <<set _RaidType to "BanditCamp">> <<set _int to random(0, 1)>> <<set _RaidSize to $RaidSizes[_int]>> <<set _RaidTime to "Night">> <<set _img to random(1, 15)>> <<set _banditCampGuards = (_RaidSize === "Small") ? random(10, 15) : random(15, 20)>> <<set _banditCampPrisoners = (_RaidSize === "Small") ? random(1, 2) : random(3, 4)>> <<set _resourceTypes = ["Gold", "Food", "Wood", "Stone", "Grain"]>> <<set _banditCampResources = {}>> <<set _resourceCount = random(1, 3)>> <<for _i = 0; _i < _resourceCount; _i++>> <<set _resourceType = _resourceTypes[random(0, _resourceTypes.length - 1)]>> <<if _RaidSize === "Small">> <<if _resourceType === "Wood" || _resourceType === "Stone">> <<set _banditCampResources[_resourceType] = random(200, 300)>> <<else>> <<set _banditCampResources[_resourceType] = random(50, 100)>> <</if>> <<else>> <<if _resourceType === "Wood" || _resourceType === "Stone">> <<set _banditCampResources[_resourceType] = random(400, 500)>> <<else>> <<set _banditCampResources[_resourceType] = random(150, 300)>> <</if>> <</if>> <</for>> <<set _explorerBanditKnowledge = { guardsVisible: false, prisonersVisible: false, resourcesVisible: false }>> <<if _returnedExplorer.specialization === "Scouting">> <<if _returnedExplorer.skill >= 50>> <<set _explorerBanditKnowledge.guardsVisible = true>> <<set _explorerBanditKnowledge.prisonersVisible = true>> <</if>> <<if _returnedExplorer.skill >= 70>> <<set _explorerBanditKnowledge.resourcesVisible = true>> <</if>> <</if>> <<else>> <<set _RaidType to "Settlement">> <<set _int to random(0, 1)>> <<set _RaidSize to $RaidSizes[_int]>> <<set _int to random(0, 1)>> <<set _RaidTime to $RaidTimes[_int]>> <</if>> <<if _RaidType is "Settlement">> <<if _RaidSize is "Small">> <<set _NPCCount to random(8, 12)>> <<set _img to $SmallSettlementRaid>> <<set $SmallSettlementRaid = $SmallSettlementRaid + 1>> <</if>> <<if _RaidSize is "Medium">> <<set _NPCCount to random(15, 20)>> <<set _img to $MediumSettlementRaid>> <<set $MediumSettlementRaid = $MediumSettlementRaid + 1>> <</if>> <<set $names = Story.get("ForestSettlementNamesList").text.split("\n").filter(name => name.trim() !== "")>> <</if>> <<if _RaidType is "BanditCamp">> <<set $names = Story.get("ForestBanditCampNames").text.split("\n").filter(name => name.trim() !== "")>> <</if>> <<if _RaidType is "Caravan">> <<set $names = ["Merchant Caravan", "Traveling Traders", "Supply Convoy", "Wandering Merchants", "Trade Caravan"]>> <</if>> <<set _randomName = $names[random(0, $names.length - 1)]>> <<if !$locationIdCounter>><<set $locationIdCounter to 0>><</if>> <<if _RaidType is "Caravan">> <<set $RaidLocationDetails = { locationId: $locationIdCounter++, name: _randomName, location: _RaidLocation, type: _RaidType, scouted: false, caravanCarts: _caravanCarts, caravanGuards: _caravanGuards, caravanResources: _caravanResources, daysRemaining: _caravanDaysRemaining, explorerKnowledge: _explorerKnowledge, imagePath: "Images/Raids/Forest/Caravan/" + _caravanImg + ".png" }>> <<elseif _RaidType is "BanditCamp">> <<set $RaidLocationDetails = { locationId: $locationIdCounter++, name: _randomName, location: _RaidLocation, type: _RaidType, size: _RaidSize, scouted: false, banditGuards: _banditCampGuards, prisoners: _banditCampPrisoners, resources: _banditCampResources, explorerKnowledge: _explorerBanditKnowledge, attacksCount: 0, campStrength: 100, imagePath: "Images/Raids/Forest/BanditCamp/" + _RaidSize + "/Night/" + _img + ".jpg" }>> <<else>> <<set $RaidLocationDetails = { locationId: $locationIdCounter++, NPCCount: _NPCCount, name: _randomName, location: _RaidLocation, type: _RaidType, size: _RaidSize, scouted: false, keys: 0, raidBuildingCount: "Unknown", raidGuardCount: "Unknown", raidVillagersCount: "Unknown", imagePath: "Images/Raids" + "/" + _RaidLocation + "/" + _RaidType + "/" + _RaidSize + "/" + _RaidTime + "/" + _img + ".png" }>> <</if>> <<run State.variables.RaidLocationList.push($RaidLocationDetails)>> <h2>They have discovered a new location:<br> $RaidLocationDetails.name</h2> <hr> <<set $ImagePath to $RaidLocationDetails.imagePath>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Location: <<= $RaidLocationDetails.location>><br> <<if _RaidType is "Caravan">> Type: Traveling Caravan<br> <<if $RaidLocationDetails.explorerKnowledge.cartsVisible>> Number of Carts: <<= $RaidLocationDetails.caravanCarts>><br> <</if>> <<if $RaidLocationDetails.explorerKnowledge.guardsVisible>> Number of Guards: <<= $RaidLocationDetails.caravanGuards>><br> <<else>> Number of Guards: Unknown<br> <</if>> <<if $RaidLocationDetails.explorerKnowledge.resourcesVisible>> Resources: <ul> <<for _i to 0; _i < $RaidLocationDetails.caravanResources.length; _i++>> <li>Cart <<= _i + 1>>: <<= $RaidLocationDetails.caravanResources[_i]>></li> <</for>> </ul> <<else>> Resources: Unknown<br> <</if>> <<if $RaidLocationDetails.explorerKnowledge.daysRemainingVisible>> Days Until Departure: <<= $RaidLocationDetails.daysRemaining>><br> <</if>> <<if _returnedExplorer.specialization === "Scouting">> <p><em><<= _returnedExplorer.name>> was able to gather <<if _returnedExplorer.skill >= 60>>detailed<<elseif _returnedExplorer.skill >= 30>>some<<else>>limited<</if>> information about this caravan due to their scouting skills.</em></p> <<else>> <p><em><<= _returnedExplorer.name>> was only able to gather basic information about this caravan.</em></p> <</if>> <<elseif _RaidType is "BanditCamp">> Type: Bandit Camp<br> Size: <<= $RaidLocationDetails.size>><br> Camp Strength: <<= $RaidLocationDetails.campStrength>>%<br> <<if $RaidLocationDetails.explorerKnowledge.guardsVisible>> Number of Bandits: <<= $RaidLocationDetails.banditGuards>><br> <<else>> Number of Bandits: Unknown<br> <</if>> <<if $RaidLocationDetails.explorerKnowledge.prisonersVisible>> Prisoners: <<= $RaidLocationDetails.prisoners>><br> <<else>> Prisoners: Unknown<br> <</if>> <<if $RaidLocationDetails.explorerKnowledge.resourcesVisible>> Resources: <ul> <<for _resourceType, _amount range $RaidLocationDetails.resources>> <li><<= _resourceType>>: <<= _amount>></li> <</for>> </ul> <<else>> Resources: Unknown<br> <</if>> <<if _returnedExplorer.specialization === "Scouting">> <p><em><<= _returnedExplorer.name>> was able to gather <<if _returnedExplorer.skill >= 70>>detailed<<elseif _returnedExplorer.skill >= 50>>some<<else>>limited<</if>> information about this bandit camp due to their scouting skills.</em></p> <<else>> <p><em><<= _returnedExplorer.name>> was only able to gather basic information about this bandit camp.</em></p> <</if>> <<else>> Size: $RaidLocationDetails.size<br> Number of buildings: $RaidLocationDetails.raidBuildingCount<br> <<if _RaidType is "Settlement">> Number of Guards: $RaidLocationDetails.raidGuardCount<br> Number of Villagers: $RaidLocationDetails.raidVillagersCount<br> <<else>> Number of Bandits: $RaidLocationDetails.raidGuardCount<br> <</if>> <</if>> <br> This location has been added to the list in the map room<br><br> <<if _returnedExplorer.sex is "Male">> <<button "Reward him">> <<set $Position to "Male">> <<goto "ExplorerReward">> <</button>> <<else>> <<button "Reward her">> <<set $Position to "Female">> <<goto "ExplorerReward">> <</button>> <</if>> <br> <<button "Continue">> <<if $ExploreTeam.length > 0>> <<goto "End Day">> <<else>> <<goto "End Day">> <</if>> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _int to random(0, 2)>> <<if $Position is "Male">> <<if _int is 0>> You send him to see Mara who helps him relax as a reward for his three day mission<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/1.webm" type="video/webm"></video><br><br> After helping him bathe, she lays him on the table and helps him unwind<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/2.webm" type="video/webm"></video><br><br> Once satified, she rolls him over and begins to stroke his cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/3.webm" type="video/webm"></video><br><br> Once hard she undresses<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/5.webm" type="video/webm"></video><br><br> And slides onto his oil slick cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/4.webm" type="video/webm"></video><br><br> <</if>> <<if _int is 1>> You send the man over to Lucy's chamber as a reward for his findings. She starts by sitting him down and toying with him<br><br> <video autoplay loop> <source src="Images/MiniGame/Bj/Stroke/1.webm" type="video/webm"></video><br><br> Wanting to draw it out, she steps back and shows off her body<br><br> <video autoplay loop> <source src="Images/MiniGame/Bj/Strip/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/MiniGame/Bj/Strip/3.webm" type="video/webm"></video><br><br> Once naked, she kneels before him and wraps her lips around his cock<br><br> <video autoplay loop> <source src="Images/MiniGame/Bj/SuckS/3.webm" type="video/webm"></video><br><br> Unable to handle the succubus's tallents, he stands and finishs on her face before catching his breath on the bed<br><br> <video autoplay loop> <source src="Images/MiniGame/Bj/Finish/1.webm" type="video/webm"></video><br><br> <</if>> <<if _int is 2>> As a reward for his efforts, you allow the man to visit Alice to help him unwind after 3 days of exploring and fighting<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/13.webm" type="video/webm"></video><br><br> His unease of her power soon vanishes as she begins his reward by sucking his cock<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/14.webm" type="video/webm"></video><br><br> Before lock he is fucking her from behind, enjoying his prise to the full extent<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/15.webm" type="video/webm"></video><br><br> <</if>> <</if>> <<if $Position is "Female">> As a reward for her hard work, you offer $RewardName anything she likes, but her twisted and possessed mined only want you<br><br> You give her time to bathe and clean herself before she joins you in your chamber. Wanting to reward her, you push her back and lick her cunt<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/6.webm" type="video/webm"></video><br><br> <span style="color: #FF1493;">Oh, lord... Fuck!</span><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/7.webm" type="video/webm"></video><br><br> Before long, her body tightens as a wave of extacy rushs over her. She grips you as you bring her to a screaming climax<br><br> You step back and wipe your chin watching her chest rise and fall as she tries to catch her breath<br><br> <<You>>Is there anything else you would like<</You>><br><br> She gasps for a moment sucking in air, before replying<br><br> <<if _int is 0>> <span style="color: #FF1493;">Please lord, let me return the favor</span><br><br> Granting her wish, you lay down and alow her to pleasure you<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/1.webm" type="video/webm"></video><br><br> She starts moaning as she sucks you, clearly enjoying this as much as you are<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/3.webm" type="video/webm"></video><br><br> Before long, you feel yourself cumming into her mouth, $RewardName responds by sucking harder as you pulse in her mouth. Once you're spent, she releases you from her mouth with a 'pop' and relaxes next to you<br><br> <</if>> <<if _int is 1>> <span style="color: #FF1493;">I-I want to feel you take my ass... I want you to break me lord</span><br><br> Not needing to be asked twice, you bring up the crazy bitches knees and line yourself up with her ass<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/8.webm" type="video/webm"></video><br><br> <span style="color: #FF1493;">Ah, ooo f-fuck!</span><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/9.webm" type="video/webm"></video><br><br> You thrust faster, breaking in her tight asshole<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/12.webm" type="video/webm"></video><br><br> Before long, you finish, flooding her with cum before pulling away and leaving her broken and panting on your bed<br><br> <</if>> <<if _int is 2>> <span style="color: #FF1493;">No my lord... Thank you, I should go</span><br><br> <</if>> <</if>> <<button "Continue">> <<goto "End Day">> <</button>> </div> <</nobr>>
<<nobr>> <<set $NewFastTravelUnlocked to false>> <div class="text-box"> <h1>Departure from Grimshade</h1> Where would you like to venture, my lord?<br><br> <<if ($VisitedVault is false) or ($VisitedDungeon is false) or ($VisitedChambers is false) or ($VisitedDefences is false)>> <<You>>I should explore the rest of the castle before exploring<</You>><br> <<button "Return">> <<goto "Base Intro">> <</button>> <<elseif $CombatTutorialComplete isnot true>> <<Gnarlak>>Erh, master? Before you venture out into the forest... Prehapse we should practice combat in the courtyard?<</Gnarlak>> <<button "Go to the courtyard">> <<goto "Encounter_Practice">> <</button>><br> <<button "Skip combat training">> <<goto "East">> <<set $CombatTutorialComplete to true>> <</button>> <<else>> <<set $Time to $Time + 2>> <<button "Enter the forest">> <<set $CruptMapFound to false>> <<set $NewCrypt to false>> <<set $ForestLocation to "Images/Forrest/Maps/Centre.jpg">> <<set $OldPosition to "Centre">> <<addclass "#right-ui-bar" "stowed">> <<goto "ForestExplore">> <</button>><br> <br> <<button "Return to Castle">> <<goto "Base Intro">> <</button>> <</if>> <<addclass "#right-ui-bar" "stowed">> </div> <</nobr>>
Aeliana Isolde Rosalind Seraphina Elspeth Evelyne Aurelia Cressida Vivienne Clarisse Amara Genevieve Lysandra Marceline Cassandra Gwendolyn Ophelia Evangeline Sabine Isabeau Celestine Lavinia Helene Theodora Marguerite Arabelle Rowena Felicity Cordelia Daphne Adelina Juliette Camille Henriette Anastasia Emilienne Sylvana Corisande Amelina Leontine Violetta Lucienne Melisande Althea Idony Rosamund Eulalia Calista Francesca Antonia Mirabelle Ottilie Jessamine Philippa Cecily Iolanthe Verena Arianwen Cosima Beatrix Anwen Ismeria Liora Delphine Eleanora Rhiannon Ameliora Clarimond Theresia Artemisia Selene Aveline Marion Lucinda Odette Petronilla Helena Estella Yolande Edeline Zenobia Leocadia Adeline Floriane Brigida Carina Emmeline Sibylla Valeria Honoria
<<nobr>> <div class="text-box"> <<set $FightOver to true>> <<if $BeingRaided is true>> With the $CurrentEnemy's mind broken. You lock them away to be sorted later<br><br> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <<else>> <<if $CurrentCaptive.sex is "Female">> In her corrupted state, you can:<br> [[Kill her|kill]]<br> [[Fuck her|ForrestFuck]]<br> <<if $CellsCount > $DungonOccupance.length>> [[Capture her|capture]]<br> <<else>> Your dungeons are too full to capture her<br> <</if>> [[Leave her|Forrest Explore]] <<else>> With his mind broken, you think about what to do with this man, you could:<br> [[Kill him|kill]]<br> <<if $LucyCorrupt is true>> <<link "Give to Lucy (increase Lucy's power)">><<run $DungonOccupance.splice($Int, 1)>><<set $CurrentEnemy is "Bandit">><<run Engine.play('LucyDungeonFuck')>><</link>> <</if>><br> <<if $AliceCorrupt is true>> <<link "Give to Alice (increase Alice's power)">><<run $DungonOccupance.splice($Int, 1)>><<set $CurrentEnemy to "Bandit">><<run Engine.play('AliceDungeonFuck')>><</link>> <</if>><br> [[Leave him|Forrest Explore]] <</if>> <</if>> </div> <</nobr>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>>
<div class="text-box"> <<nobr>> <<set $Time to $Time + 2>> <<if $CurrentEnemy is "Armored Bandit">> <<goto "BanditQuestWon">> <</if>> <<script>> if (typeof CombatSystem !== 'undefined') { CombatSystem.cleanupForNextFight(); } <</script>> <<set $enemyDominateSpellCast to false>> <<set $enemyTranceSpellCast to false>> <<set $PlayerEntangled to false>> <<set $FightOver to true>> <div style="text-align: center"> <h1>Victory</h1> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $HouseVisit is true>> You knock the man back and stab him in the chest, he lets out a gasp before falling to his knees and then forward to the ground, face down<br> <<set _int to random(0, 2)>> <<if _int gt 0>> You listen for a moment, hoping the girl you had been following had not heard you, you pause holding your breath and you don't hear a sound. She must have not heard the short brawl which caused her husbands death<br><br> <<set _int to random(10, 40)>> <<set $Gold to $Gold + _int>> You loot the dead mans pockets, finding _int gold. He won't be needing it<br><br> <<set $HusbandHome to false>> <<set $ManLocation to "dead">> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> <<else>> You stop and listen, for a moment there is silence, then you hear foot steps running through the house, the girl you followed here must have heard the commotion and is now trying to escape<br><br> You should leave before the guards get here<br><br> <<link "Return">><<run Engine.play("Base Intro")>><</link>> <</if>><</if>> <<if $HouseVisit isnot true>> <<if $Crypt is true>> <<if ($CaptureSuccubi is true) and ($CurrentEnemy is "Succbus")>> You defeat the succubut and capture her twisted soul<br> <<set $CapturedSuccubiSouls to $CapturedSuccubiSouls + 1>> <<else>> You defeat the $CurrentEnemy and its soul returns to the void<br> <</if>> <<if ($TarotCardInvet.includes("Devil")) and ($VoidEnemy is true)>> Having the Devil tarot card, means you pull their soul back from the void<br><br> <<set $Souls to $Souls + 1>> <</if>> <<if ($CurrentEnemy is "Vampire") or ($CurrentEnemy is "Greater Succubus")>> Searching the ruined body of the now dead woman, you find a key<br><br> <<if $CurrentEnemy is "Vampire">> <<set $LeftPathComplete to true>> <<else>> <<set $RightPathComplete to true>> <</if>><</if>> <<if $NewCrypt is true>> <<link "Continue">><<run Engine.play($ReturnPassage)>><</link>> <<else>> <<if $CryptLevel == 1>>[[Fight over|Crypt1]]<</if>> <<if $CryptLevel == 2>>[[Fight over|Crypt2]]<</if>> <<if $CryptLevel == 3>>[[Fight over|Crypt3]]<</if>> <<if $CryptLevel == 4>>[[Fight over|Crypt4]]<</if>> <</if>> <<elseif $NewCrypt is true >> You defeat the $CurrentEnemy and its soul returns to the void<br> <<if ($TarotCardInvet.includes("Devil")) and ($VoidEnemy is true)>> Having the Devil tarot card, means you pull their soul back from the void<br><br> <<set $Souls to $Souls + 1>> <</if>> <<if $CryptAmbush is true>> <<link "Continue">><<set $CryptAmbush to false>><<goto "CryptExplore">><</link>> <<else>> <<button "Move on">> <<set $Position to $OldPosition>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> <</if>> <<else>> <<if $BeingRaided is false>>You defeat the $CurrentEnemy<br><br> <<if $Animal is true>> <<if $CurrentEnemy is "Arachness">> You slay the Arachness and her body comes crashing down.<br><br> Checking over her body, you are able to draw some venom from here which you bottle and take <<if def $VenomBottles>> <<set $VenomBottles to $VenomBottles + 1>> <<else>> <<set $VenomBottles to 1>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Items/Potions/Venon_potion.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> You skin the dead $CurrentEnemy [[continue|kill]] <</if>> <</if>><br> <<if ($CellsCount > $DungonOccupance.length) and ($Animal is false)>> <<if $CurrentEnemy is "female Bandit">> You can [[capture]] or [[kill]] the female bandit <<if $PlayerSpells.includes("Dominate")>> , or have fun with her [[first|ForrestFuck]] <<set $NPCCum to 0>> <</if>> <<elseif $CurrentEnemy is "Guard">> You kill the guard by pushing your sword up into his armpit where he is not armored. The guard screams before falling to his knees and colapsing [[dead|GuardKill]] <<elseif $CurrentEnemy is "Armored Bandit">> <<button "Kill him">><<goto "BanditQuestWon">><</button>> <<else>> <<button "capture">><<goto "capture">><</button>> OR <<button "Kill">><<goto "kill">><</button>> <</if>> <<elseif $Animal is false>> Your cells are full <br> <<button "Kill">><<goto "kill">><</button>> <</if>><br> <</if>> <<if $BeingRaided is true>> <<set _raidProgress = ($RaiderStartCount - $RaidersNumber) / $RaiderStartCount>> <div class="raid-victory"> <hr style="border-color: #8B0000;"> <<if _raidProgress < 0.25>> <span style="color: #FFD700;"><strong>The raid has just begun!</strong></span><br> The $CurrentEnemy falls easily to your blade. Their overconfidence was their undoing. You rip the soul from their still-warm corpse with casual brutality.<br> <<elseif _raidProgress < 0.5>> <span style="color: #FFA500;"><strong>The battle intensifies!</strong></span><br> Bodies begin to pile in your halls. Another $CurrentEnemy joins the growing collection of corpses. Their soul tears free with a satisfying shriek.<br> <<elseif _raidProgress < 0.75>> <span style="color: #FF4500;"><strong>Blood soaks the ancient stones!</strong></span><br> Your castle runs red with raider blood. The $CurrentEnemy dies screaming, adding their voice to the chorus of the dying. Their soul is consumed by your dark hunger.<br> <<else>> <span style="color: #8B0000;"><strong>The raid nears its bloody end!</strong></span><br> Nearly finished now. The $CurrentEnemy's death brings you closer to total victory. Their companions' corpses surround them as you tear out their soul with vicious finality.<br> <</if>> <div style="margin: 10px 0; padding: 5px; border-left: 3px solid #8B0000;"> <span style="color: #9370DB;">💀 Soul Harvested: +1</span><br> <span style="color: #DC143C;">⚔️ Raiders Remaining: $RaidersNumber</span><br> <<if $RaidersNumber == 0>> <span style="color: #32CD32;"><strong>🏰 RAID REPELLED! Victory is yours!</strong></span> <</if>> </div> <hr style="border-color: #8B0000;"> </div> <<set $Souls to $Souls + 1>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<if $RaidersNumber > 0>> <<button "Continue Defense →">><<goto "Raid">><</button>> <<else>> <<button "Victory! →">><<goto "Raid">><</button>> <</if>> <</if>><</if>><br><br> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <<set $DeathCardPlayed to false>> <<set $MagicianCardPlayed to false>> <<set $VoidEnemy to false>> <<removeclass "#right-ui-bar" "stowed">> <</nobr>>
<<nobr>> <<if $Position is "null">> <<Lucy>>Cum for me!<</Lucy>><br><br> <<Guard>>Swallow it!<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Finish/1.webm" type="video/webm"></video><br><br> <<link "Steal his soul">><<set $Position to "Kill">><<set $HallGuardStatus to "Dead">><<run Engine.play('FinishGuardHome')>><</link>><br> Or <<link "Possess Him">><<set $Position to "Possessed">><<set $HallGuardStatus to "Possessed">><<run Engine.play('FinishGuardHome')>><</link>> Or <<link "Leave">><<set $Position to "Left">><<set $HallGuardStatus to "Possessed">><<run Engine.play('FinishGuardHome')>><</link>> <</if>> <<if $Position is "Left">> The guard turns silent and his eyes glase over, you stand up and wipe your lips <<Lucy>>Well that was fun, till next time?<</Lucy>><br><br> <<Guard>>sure, see you slut<</Guard>><br><br> Scarldale's corruption has increased<br><br> <<if $scarldale.corruption >= 90>> <<set $scarldale.corruption to 100>> <<else>><<set $scarldale.corruption += 10>><</if>> <<link "Go back to the Castle">><<<<set $NPCCum to 0>><<goto "Inside Castle">><</link>> <</if>> <<if $Position is "Kill">> <<set $Souls to $Souls +1>> The guard drops dead as his soul passes into Lucy <<Lucy>>I hope you had as much fun as I did<</Lucy>><br><br> You leave the guards lifeless body<br><br> Villagers will find this body and they will blame you, your influence over Scarldale slips...<br><Br> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <</if>> [[Leave|Scarldale]] <</if>> <<if $Position is "Possessed">> The guard turns silent and his eyes glase over, you stand up and wipe your lips <<Lucy>>Well that was fun, but now your going back to the hall and letting anyone though who ask, do you understand?<</Lucy>><br><br> <<Guard>>Yes, mistress<</Guard>><br><br> Scarldale's corruption has increased<br><br> <<if $scarldale.corruption >= 90>> <<set $scarldale.corruption to 100>> <<else>><<set $scarldale.corruption -= 10>><</if>> [[Leave|Scarldale]] <</if>> <</nobr>>
<div class="text-box"> <<script>> UI.alert("Quest Complete! <br>You have found the black flower for Lucy"); <</script>> <<run $Quests.delete("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> <div align="center"> <img src="Images/Crypt/1.png" width="700" height="700"> </div> [[Corrupt the flower]] </div>
<div class="text-box"> <<nobr>> <<set $EncounterHappen to random(0, 9)>> <<set $WhichEncounter to random(0, 7)>> <<if $CurrentPlayer is "Overlord">> <<if $EncounterHappen <= 4>> <<switch $WhichEncounter>> <<case 0>> You find [[Treasure]] <<case 1>> <<if $LucyMet is false>> You encounter [[a woman|Encounter_Lucy]] <<else>> [[Continue|Forest Shack]] <</if>> <<case 2>> You encounter [[a wolf|Encounter_Wolf]] <<case 3>> You encounter [[a fallen tree|Encounter_Wood]] <<case 4>> You encounter [[a bandit|Encounter_Bandit]] <<case 5>> You encounter [[a bandit|Encounter_Female Bandit]] <<case 6>> You encounter [[a wolf|Encounter_Wolf]] <<case 7>> You encounter [[a bear|Encounter_Bear]] <<case 8>> You encounter [[a woman|StalkForest]] <</switch>> <<else>> <<if ($LucyMetInt gt 4) and ($LucyMet is false)>> <<if $Quests.includes("Find a way to hide your identity")>> [[Continue|Forrest Explore]] <<else>> You encounter [[a woman|Encounter_Lucy]]<</if>> <<else>> You find nothing and return to the forest edge<br><br> [[Continue|Forrest Explore]] <</if>> <</if>> <<elseif $CurrentPlayer is "LucyCloaked">> <<if $EncounterHappen <= 3>> [[A bandit stands in your way|Encounter_Bandit]] <<else>> There's nothing of interest around here... You should head [[Back|Forrest Explore]] <</if>> <<else>> There's nothing of interest around here... You should head [[Back|Forrest Explore]] <</if>> <</nobr>> </div> <<set $LucyMetInt to $LucyMetInt + 1>> <<set $ReturnPassage to passage()>>
Thornsnare Camp Brackenhide Den Shadowfang Hollow Briarcliff Encampment Mosswood Lair Foxden Outpost Thistlethorn Hideout Darkbranch Refuge Pinefang Encampment Wyrmwood Stockade Thornheart Camp Shadowgrove Lair Wolfsnare Refuge Ravenwood Hideout Timberclaw Encampment Darkgrove Outpost Whisperpine Camp Hollowbranch Hideaway Greenfang Lair Duskwatch Camp Tanglethorn Refuge Briarbane Encampment Sylvanfang Hideout Mistwood Camp Oakspire Lair Crowsong Refuge Deepwood Den Rustleaf Encampment Gladefang Camp Emberpine Hideout
<<nobr>> <div class="text-box"> <<if $Position is "Camp1">> <<set $ForestCamp1Quest to true>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.png">> <<You>>Maybe I could help?<</You>> <<say 'Huntress' _img>>Y-You could help me? Gods, that would be so kind! If you can bring me 3 pelts, I could buy a new bow and get back to work<</say>> <<say 'Huntress' _img>>I can't pay you, but maybe we could work something out?<</say>> <<if $Pelts >= 3>> <<button "Give her 3 pelts">><<set $Pelts to $Pelts -= 3>> <<goto "ForestCampSite3">> <</button>><br> <</if>> <<button "Leave her for now">> <<goto "ForestExplore">> <</button>> <<elseif $Position is "Camp2">> <<elseif $Position is "Camp3">> <<elseif $Position is "Camp4">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<if $OldPosition is "bet">> <<You>>I'll take your bet<</You>> <<else>> <<You>>How about 100?<</You>> <<say 'Huntress' _img>>You feel like loosing all your coin today?<</say>> <<You>>Maybe<</You>> <</if>> <<say 'Huntress' _img>>Ha, good. Its simple, we will take it in turns. One shot at a time. The outering is worthless, the black ring is worth 10 and the center is woth 20. Got it?<</say>> <<You>>Yes, simple<</You>> <<say 'Huntress' _img>>Alright, you go first, line up and take aim<</say>> <<set $PlayerArcheryScore to 0>> <<set $NPCArcheryScore to 0>> <<set $Int to 0>> <<button "Take aim">> <<goto "BowGame">> <</button>> <<elseif $Position is "Camp5">> <<elseif $Position is "Camp6">> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "Camp1">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.png">> You take three animal pelts from your bag and hand them too her<br><br> <<say 'Huntress' _img>>God's you've saved me! I need to make it up to you! Humm, I don't normally do this... but why don't you join me in my tent? wait here a moment, then come in ok?<</say>> You do as she says, waiting by the fire. You hear rustling in the tent before she calls you<br><br> <<say 'Huntress' _img>>Come on in!<</say>> <<button "Enter the tent">> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/6.png">> <<set $PlayerCum to 0>> <<goto "ForestTentSex">> <</button>> <<elseif $Position is "Camp2">> <<elseif $Position is "Camp3">> <<elseif $Position is "Camp4">> <<elseif $Position is "Camp5">> <<elseif $Position is "Camp6">> <</if>> </div> <</nobr>>
<<nobr>> <<if !$VistedForestLocations>> <<set $VistedForestLocations = []>> <</if>> <<if $Position isnot "null">> <<if $VistedForestLocations.includes($Position)>> <<goto "ForestLocationVisited">> <<else>> <<run $VistedForestLocations.push($Position)>> <</if>> <</if>> <div class="text-box"> /* Camp 1 - Huntress with Pelts Quest */ <<if $Position is "Camp1">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.png">> <<if $ForestCamp1Quest isnot true>> You approach the camp site carefully, sat by a fire is a young huntress<br><br> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Huntress' _img>>Stay back, I'm not looking for any more trouble<</say>> <<You>>Easy, I'm not here to cause you trouble<</You>> <<say 'Huntress' _img>>That's what the bandits said before they took my bow, and pelts...<</say>> <<say 'Huntress' _img>>Without pelts to sell I have nothing<</say>> <<button "Offer to help">><<goto "ForestCampSite2">><</button>><br> <<button "Leave her alone">><<goto "ForestExplore">><</button>><br> <<else>> You enter the small campsite and find the young huntress you met before <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Huntress' _img>>Your back! Did you get the pelts I need?<</say>> <<if $Pelts >= 3>> <<button "Give her 3 pelts">><<set $Pelts to $Pelts -= 3>><<goto "ForestCampSite3">><</button>><br> <<else>> <<You>>No, sorry<</You>> <<say 'Huntress' _img>>Please, I need your help if you find any pelts bring them to me, I'll make it up to you<</say>> <<button "Leave her for now">><<goto "ForestExplore">><</button>> <</if>> <</if>> /* Searchable Camps (2, 3, 5, 6) */ <<elseif ["Camp2", "Camp3", "Camp5", "Camp6"].includes($Position)>> <<set _int to random(0, 5)>> You approach a campsite and find it's abandoned<br><br> <<if _int == 0>><<set _item to "nothing">> <<elseif _int == 1>><<set _item to "pelt">><<set $Pelts to $Pelts += 1>> <<elseif _int == 2>><<set _item to "20 gold">><<set $Gold to $Gold + 20>> <<elseif _int == 3>><<set _item to "minor healing potion">><<set $MinorHealingPotion to $MinorHealingPotion + 1>> <<elseif _int == 4>><<set _item to "nothing">> <<elseif _int == 5>><<set _item to "nothing">> <</if>> You search the place and find _item...<br><br> <<button "Leave">><<goto "ForestExplore">><</button>> /* Camp 4 - Archer Challenge */ <<elseif $Position is "Camp4">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<if $ForestCamp4Quest isnot true>> <<set $ForestCamp4Quest to true>> You approach a camp, and see a female hunter practicing her aim with a bow<br><br> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Huntress' _img>>Who are you?<</say>> <<You>>Just someone passing by, you seem to handle that bow well<</You>> <<say 'Huntress' _img>>I'm the best in the kingdom<</say>> <<You>>Is that so?<</You>> <<say 'Huntress' _img>>Aye, are you a betting man? I bet you 50 gold you can't best me<</say>> <<else>> <<say 'Huntress' _img>>You're back... Fancy a bet? 50 gold says I can land better hits than you<</say>> <</if>> <<if $ForestCampGameComplete is true>> <<say 'Huntress' _img>>Or, maybe your board of our last game and fancy something different?<</say>> <</if>> <<if $Gold >= 50>> <<button "Take her bet">><<set $OldPosition to "bet">><<goto "ForestCampSite2">><</button>><br> <<else>> You cant afford to take the bet <</if>> <<if $Gold >= 100>> <<button "Double her bet">><<set $OldPosition to "betDouble">><<goto "ForestCampSite2">><</button>><br> <</if>> <<if $ForestCampGameComplete is true>> <<button "Play her other "game"">><<goto "BowStripGame">><</button>><br> <</if>> <<button "Decline and leave">><<goto "ForestExplore">><</button>> <</if>> </div> <</nobr>>
<div class="text-box"> <<set $EishethSoulsSell to 1>> You find a cave.. <<if $EishethMet is false>> <<if $Souls gt 0>> <<button "Explore the cave">> <<goto "InsideCave">> <</button>> <<else>> You sense a darkness in this cave and worry it may not be safe. You should return when you have more souls in case something goes wrong<br> <</if>> <<else>> <<button "Visit Eisheth">> <<goto "Eisheth">> <</button>> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <div align="center"> <img src="Images/Forrest/Encounters/Cave/2.png" width="700" height="700"> </div>
<div class="text-box blur"> <<nobr>> You continue trying to stagger your way back home until you see a figure blocking your path...<br><br> <<You>>W-Who aare you?<</You>><br><br> The figure doesn't move<br><br> <<You>>Whatever, stranger.... get out of my way<</You>><br><br> You begin to walk past the figure, but after a few steps you trip and fall into the mud<br><br> After laying there for a moment, looking at the stars, the figure steps back into view, looking down on you<br><br> <<You>>Ah... fuck<</You>><br><br> <<link "You pass out">><<fadeToPassage "CultIntro">><</link>> <</nobr>> </div>
<<nobr>> <<set $HouseVisit to false>> <<set $Animal to false>> <<set $Position to "null">> <div class="text-box"> <<include "ForestLocationDataNight">> <<if $VampireHunt is true>> <div id="vampire-timer" class="vampire-timer">Time remaining: <<print $Time>> seconds</div> <</if>> <div class="image-container repair-mode"> <<set _imagePath to $ForestLocation>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ForestLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<if $VampireHunt isnot true>> <<button "Return to the castle">> <<goto "Base Intro">> <</button>> <<button "Fast Travel Menu">> <<goto "ForestFastTravel">> <</button>><br> <</if>> <<if $NavigationButtons isnot true>> <<button "Show nav buttons (better for phones)">> <<goto "ForestExplore">> <<set $NavigationButtons to true>> <</button>> <</if>> <<if $NavigationButtons is true>> <<button "Hide nav buttons">> <<goto "ForestExplore">> <<set $NavigationButtons to false>> <</button>> <</if>> </div> <<if $NavigationButtons is true>> <div class="text-box"> <!-- Dynamic Hotspot Buttons --> <<set _currentData = setup.buildingData.get($ForestLocation)>> <<if _currentData and _currentData.hotspots.length > 0>> <div class="hotspot-button-list"> <<for _hotspot range _currentData.hotspots>> <<capture _hotspot>> <<button _hotspot.tooltip>> <<set $Position to _hotspot.position>> <<goto _hotspot.passage>> <</button>> <</capture>> <</for>> </div> <</if>> </div> <</if>> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ForestLocation;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: rgba(255, 255, 255, 0.2) !important; border-radius: 50% !important; border: 2px solid white !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .hotspot:hover { border-color: white !important; } .repair-mode .hotspot:hover .tooltip { color: white !important; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
ForestExploreRelayNight <<if $Position is "Centre">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Centre.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "East">> <<set $ForestLocation to "Images/Forrest/Maps/Night/East.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "River1">> <<set $ForestLocation to "Images/Forrest/Maps/Night/River1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South1">> <<set $ForestLocation to "Images/Forrest/Maps/Night/South1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South2">> <<set $ForestLocation to "Images/Forrest/Maps/Night/South2.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "BanditCamp">> <<set $ForestLocation to "Images/Forrest/Maps/Night/BanditCamp.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Horizontal1">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Horizontal1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "LeftEnd1">> <<set $ForestLocation to "Images/Forrest/Maps/Night/LeftEnd1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Cave">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Cave.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Crypt">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Crypt.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Scarldale">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Scarldale.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "SouthScarldale">> <<set $ForestLocation to "Images/Forrest/Maps/Night/SouthScarldale.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp1">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Swamp1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp2">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Swamp2.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "LucyHouse">> <<set $ForestLocation to "Images/Forrest/Maps/Night/LucyHouse.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "MerchantPath">> <<set $ForestLocation to "Images/Forrest/Maps/Night/MerchantPath.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Merchant">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Merchant.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp3">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Swamp3.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "SwampLake">> <<set $ForestLocation to "Images/Forrest/Maps/Night/SwampLake.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South3">> <<set $ForestLocation to "Images/Forrest/Maps/Night/South3.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "RockyPath">> <<set $ForestLocation to "Images/Forrest/Maps/Night/RockyPath.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "ForestShack">> <<set $ForestLocation to "Images/Forrest/Maps/Night/ForestShack.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Tower">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Tower.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Market">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Market.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Creak">> <<set $ForestLocation to "Images/Forrest/Maps/Night/Creak.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "AbandonedSettlement">> <<set $ForestLocation to "Images/Forrest/Maps/Night/AbandonedSettlement.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "BanditMine">> <<set $ForestLocation to "Images/Forrest/Maps/Night/BanditMine.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $VampireHunt is true>> <<if $Time <= 0>> <<goto "VampireHuntCaught">> <<else>> <<goto "ForestExploreNight">> <</if>> <<else>> <<set _int to random(0, 5)>> <<if _int is 5>> <<set _encounters to ["Encounter_Bandit", "Encounter_Female Bandit", "Encounter_Wolf", "Encounter_Bear"]>> <<set _encounter = either(_encounters)>> <<goto _encounter>> <<else>> <<goto "ForestExploreNight">> <</if>> <</if>>
<<set $NewFastTravelUnlocked to false>> <<if $Position is "Centre">> <<set $ForestLocation to "Images/Forrest/Maps/Centre.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "East">> <<set $ForestLocation to "Images/Forrest/Maps/East.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "River1">> <<set $ForestLocation to "Images/Forrest/Maps/River1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South1">> <<set $ForestLocation to "Images/Forrest/Maps/South1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South2">> <<set $ForestLocation to "Images/Forrest/Maps/South2.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "BanditCamp">> <<set $ForestLocation to "Images/Forrest/Maps/BanditCamp.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Horizontal1">> <<set $ForestLocation to "Images/Forrest/Maps/Horizontal1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "LeftEnd1">> <<set $ForestLocation to "Images/Forrest/Maps/LeftEnd1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Cave">> <<if $CaveFastTravel isnot true>> <<set $NewFastTravelUnlocked to true>> <<set $CaveFastTravel to true>><</if>> <<set $ForestLocation to "Images/Forrest/Maps/Cave.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Crypt">> <<set $ForestLocation to "Images/Forrest/Maps/Crypt.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Scarldale">> <<if $ScarldaleFastTravel isnot true>> <<set $NewFastTravelUnlocked to true>> <<set $ScarldaleFastTravel to true>><</if>> <<set $ForestLocation to "Images/Forrest/Maps/Scarldale.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "SouthScarldale">> <<set $ForestLocation to "Images/Forrest/Maps/SouthScarldale.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp1">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp1.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp2">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp2.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "LucyHouse">> <<set $ForestLocation to "Images/Forrest/Maps/LucyHouse.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "MerchantPath">> <<set $ForestLocation to "Images/Forrest/Maps/MerchantPath.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Merchant">> <<if $MerchantFastTravel isnot true>> <<set $NewFastTravelUnlocked to true>> <<set $MerchantFastTravel to true>><</if>> <<set $ForestLocation to "Images/Forrest/Maps/Merchant.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp3">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp3.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "SwampLake">> <<set $ForestLocation to "Images/Forrest/Maps/SwampLake.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "SwampLake2">> <<set $ForestLocation to "Images/Forrest/Maps/SwampLake2.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "South3">> <<set $ForestLocation to "Images/Forrest/Maps/South3.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "RockyPath">> <<set $ForestLocation to "Images/Forrest/Maps/RockyPath.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "ForestShack">> <<if $ShackFastTravel isnot true>> <<set $NewFastTravelUnlocked to true>> <<set $ShackFastTravel to true>><</if>> <<set $ForestLocation to "Images/Forrest/Maps/ForestShack.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Tower">> <<set $ForestLocation to "Images/Forrest/Maps/Tower.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Market">> <<set $ForestLocation to "Images/Forrest/Maps/Market.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Creak">> <<set $ForestLocation to "Images/Forrest/Maps/Creak.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "AbandonedSettlement">> <<set $ForestLocation to "Images/Forrest/Maps/AbandonedSettlement.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp4">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp4.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp5">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp5.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Swamp6">> <<set $ForestLocation to "Images/Forrest/Maps/Swamp6.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "BanditMine">> <<if $BanditMineFastTravel isnot true>> <<set $NewFastTravelUnlocked to true>> <<set $BanditMineFastTravel to true>><</if>> <<set $ForestLocation to "Images/Forrest/Maps/BanditMine.jpg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Mill">> <<set $ForestLocation to "Images/Forrest/Maps/Mill.jpg">> <<set $OldPosition to $Position>> <</if>> <<set _int to random(0, 9)>> <<if _int is 9>> <<if $MaleRaidersDisabled isnot true>> <<set _encounters to ["Encounter_Bandit", "Encounter_Female Bandit", "Encounter_Wolf", "Encounter_Bear", "StalkForest"]>> <<else>> <<set _encounters to ["Encounter_Female Bandit", "Encounter_Wolf", "Encounter_Bear", "StalkForest"]>> <</if>> <<set _encounter = either(_encounters)>> <<goto _encounter>> <<else>> <<goto "ForestExplore">> <</if>>
<<nobr>> <<set $HouseVisit to false>> <<set $Position to "null">> <<set $Animal to false>> <<if ($LucySeen isnot true) and ($ForestLocation is "Images/Forrest/Maps/LucyHouse.jpg")>> <<goto "Encounter_Lucy">> <</if>> <<if $Time gt 6>> <<set $Position to $OldPosition>> <<goto "ForestExploreRelayNight">> <</if>> <div class="text-box"> <<include "ForestLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ForestLocation>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ForestLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<if $NewFastTravelUnlocked>> <div class="alert-banner"> New fast travel point unlocked </div> <</if>> <<button "Retrun to the castle">> <<goto "Base Intro">> <</button>> <<button "Fast Travel Menu">> <<goto "ForestFastTravel">> <</button>><br> <<if $NavigationButtons isnot true>> <<button "Show nav buttons (better for phones)">> <<goto "ForestExplore">> <<set $NavigationButtons to true>> <</button>> <</if>> <<if $NavigationButtons is true>> <<button "Hide nav buttons">> <<goto "ForestExplore">> <<set $NavigationButtons to false>> <</button>> <</if>> </div> <<if $NavigationButtons is true>> <div class="text-box"> <!-- Dynamic Hotspot Buttons --> <<set _currentData = setup.buildingData.get($ForestLocation)>> <<if _currentData and _currentData.hotspots.length > 0>> <div class="hotspot-button-list"> <<for _hotspot range _currentData.hotspots>> <<capture _hotspot>> <<button _hotspot.tooltip>> <<set $Position to _hotspot.position>> <<goto _hotspot.passage>> <</button>> <</capture>> <</for>> </div> <</if>> </div> <</if>> <<if $ForestExplorewTip isnot false>> <div class="text-box"> <h2>Tip:<br></h2> <i>You've heard of someone living in the swamp in the north east of the forest selling tools to increase your power. You should find him soon and see if he can help find s way to hide who you are</i><br> <<link "Do not show this again">> <<set $ForestExplorewTip to false>> <<goto "ForestExplore">> <</link>> </div> <</if>> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ForestLocation;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: rgba(255, 255, 255, 0.2) !important; border-radius: 50% !important; border: 2px solid white !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .hotspot:hover { border-color: white !important; } .repair-mode .hotspot:hover .tooltip { color: white !important; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } /* Simplified alert banner (no animation) */ .alert-banner { background: #208336; border: 1px solid #44cf63; padding: .85rem 1.25rem; margin: 0 0 1rem; color: #fff; font-size: 1.05rem; font-weight: 600; border-radius: 8px; text-align: center; box-shadow: 0 4px 12px -3px rgba(0,0,0,.45), inset 0 0 0 1px rgba(255,255,255,.08); display: block; } /* Remove old animated banner rules & keyframes below if desired @keyframes bannerIn { 0% { opacity:0; transform: translateY(-12px) scale(.96); } 70% { opacity:1; transform: translateY(2px) scale(1.01); } 100% { opacity:1; transform: translateY(0) scale(1); } } @keyframes bannerStay { 0%,85% { opacity:1; } 100% { opacity:0; height:0; margin:0; padding:0; } } @keyframes bannerOut { to { opacity:0; transform: translateY(-8px); height:0; margin:0; padding:0; } } @media (max-width: 900px) { .alert-banner { font-size:.95rem; padding:.65rem 2.25rem .65rem 2rem; } }*/ </style> <</nobr>>
<<nobr>> <div class="text-box"> <h2>Choose an unlocked location to fast travel</h2> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<if ($ShackFastTravel is false) and ($MerchantFastTravel is false) and ($ScarldaleFastTravel is false) and ($BanditMineFastTravel is false) and ($CaveFastTravel is false)>> <h1>You haven't found any fast travel points yet, explore the forest to find more</h1> <</if>> <<if $ShackFastTravel is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Forrest/Maps/ForestShack.jpg" style="width: 220px; height: 220px; object-fit: cover;"> <h3>The Shack</h3> <<button "Travel">> <<set $ForestLocation to "Images/Forrest/Maps/ForestShack.jpg">> <<goto "ForestExplore">> <</button>> </div> <</if>> <<if $MerchantFastTravel is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Forrest/Maps/Merchant.jpg" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Merchant</h3> <<button "Travel">> <<set $ForestLocation to "Images/Forrest/Maps/Merchant.jpg">> <<goto "ForestExplore">> <</button>> </div> <</if>> <<if $ScarldaleFastTravel is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Forrest/Maps/Scarldale.jpg" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Scarldale</h3> <<button "Travel">> <<set $ForestLocation to "Images/Forrest/Maps/Scarldale.jpg">> <<goto "ForestExplore">> <</button>> </div> <</if>> <<if $BanditMineFastTravel is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Forrest/Maps/BanditMine.jpg" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Bandit Mine</h3> <<button "Travel">> <<set $ForestLocation to "Images/Forrest/Maps/BanditMine.jpg">> <<goto "ForestExplore">> <</button>> </div> <</if>> <<if $CaveFastTravel is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Forrest/Maps/Cave.jpg" style="width: 220px; height: 220px; object-fit: cover;"> <h3>The Cave</h3> <<button "Travel">> <<set $ForestLocation to "Images/Forrest/Maps/Cave.jpg">> <<goto "ForestExplore">> <</button>> </div> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Cancel">> <<goto "ForestExplore">> <</button>> </div> </div> <</nobr>>
<<nobr>> <<set _int to random(0, 2)>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<if _int is 0>> Climbing the stairs, you hear noises from the inside of the tower and get closer<br> <<Guard>>Fuck<</Guard>> You poke you head over one of the windows and see whats going on<br> <<Guard>>Having you here helps these shifts go faster<</Guard>> <<set _int to (3, 4)>> <<set _imgPath to "Images/Forrest/Encounters/Guard Tower/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Girl' _imgPath>>Mph, your paying me by the hour remember<</say>> <<Guard>>We'll talk about that later slut<</Guard>> <<elseif _int is 1>> <<set _int to random(15, 25)>> Climbing the stairs you hear nothing... Some watchtower you think to yourself guards are probably out getting drunk<br><br> Entering the small watch tower, you find a chair, table and a chest<br><br> <i>click on the chest to open it</i> <div id="chest-container"> <img id="chest-image" src="Images/Forrest/Encounters/Guard Tower/5.jpg"> </div> <div id="treasure-text" style="display: none"> You found _int gold! <br> <<set $Gold to $Gold + _int>> </div> <<script>> $(document).ready(function() { $("#chest-image").one("click", function() { $("#chest-image").attr("src", "Images/Forrest/Encounters/Guard Tower/6.jpg"); $("#treasure-text").fadeIn(1000); }); }); <</script>> <style> #chest-container { cursor: pointer; text-align: center; } #chest-image { max-width: 300px; } #treasure-text { margin-top: 20px; font-size: 1.2em; color: #gold; } </style> <<else>> You find nothing in the watchtower and leave disapointed <br><br> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if !$VistedForestLocations>> <<set $VistedForestLocations = []>> <</if>> <<if $Position isnot "null">> <<if $VistedForestLocations.includes($Position)>> <<goto "ForestLocationVisited">> <<else>> <<run $VistedForestLocations.push($Position)>> <</if>> <</if>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<if $Position is "watchtower1">> <<set _imgPath to "Images/Forrest/Encounters/Guard Tower/1.png">> <</if>> <<if $Position is "watchtower2">> <<set _imgPath to "Images/Forrest/Encounters/Guard Tower/2.png">> <</if>> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "climb the tower">> <<goto "ForestGuardWatchTowerInside">> <</button>><br> <<button "Leave">> <<run $VistedForestLocations.delete($Position)>> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> Sound comes back to you first, you keep your eyes closed and listen <<say 'Voice'>>We should just kill him<</say>> <<say 'Second Voice'>>Wait... He was kind to me<</say>> <<say 'Voice'>>So? Mortals are pray... Food<</say>> <<say 'Second Voice'>>He wasn't like the others, he wanted to give me the gold besides we fed recently...<</say>> <<say 'Voice'>>Ugh... So you think hes different? Fine how about a little game when he wakes up, Ill show you he just wants our bodys if he doesnt cum, I'll let him live<</say>> <<say 'Second Voice'>>And if you make him cum?<</say>> <<say 'Voice'>>Then the blood will be flowing when I bite his throat<</say>> </div> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<set _charPath to "Images/Forrest/Encounters/Abandond House/Vampire Trap/1.png">> You take some gold from your pouch and go to hand it to her<br><br> <<say 'Woman' _charPath>>Oh your too kind<</say>> You lean down to hand her the coin... Then... Everything goes back <<button "Next">> <<goto "ForestHouseVampireTrap2">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<if $VampireHunt is true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Centre.jpg", { hotspots: [ { x: 389, y: 289, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp1" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "VampireHuntEscape", position: "null" }, { x: 5, y: 274, tooltip: "North West", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "East towards the cost", passage: "ForestExploreRelayNight", position: "BanditCamp" } ] })>> <<elseif $LucyMet isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Centre.jpg", { hotspots: [ { x: 389, y: 289, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp1" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "Base Intro", position: "null" }, { x: 5, y: 274, tooltip: "North West", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "East towards the cost", passage: "ForestExploreRelayNight", position: "BanditCamp" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Centre.jpg", { hotspots: [ { x: 389, y: 289, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp1" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "Base Intro", position: "null" }, { x: 10, y: 561, tooltip: "East to the river", passage: "ForestExploreRelayNight", position: "Horizontal1" }, { x: 5, y: 274, tooltip: "North West", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "East towards the cost", passage: "ForestExploreRelayNight", position: "BanditCamp" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/River1.jpg", { hotspots: [ { x: 784, y: 169, tooltip: "Return to the forest entrance", passage: "ForestExploreRelayNight", position: "Centre" }, { x: 570, y: 203, tooltip: "House", passage: "RandomForestHome", position: "null" }, { x: 654, y: 775, tooltip: "South", passage: "ForestExploreRelayNight", position: "Cave" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Crypt.jpg", { hotspots: [ { x: 769, y: 5, tooltip: "Back up the river", passage: "ForestExploreRelayNight", position: "Cave" }, { x: 401, y: 133, tooltip: "Crypt", passage: "CryptEnterence", position: "position" } ] })>> <<if $Quests.includes("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Horizontal1.jpg", { hotspots: [ { x: 773, y: 309, tooltip: "Return to the Forest Edge", passage: "ForestExploreRelayNight", position: "Centre" }, { x: 472, y: 263, tooltip: "Abandoned Tower", passage: "Abandoned Tower", position: "tower1" }, { x: 208, y: 448, tooltip: "Abandoned Church", passage: "WolvesQuestSetup", position: "null" }, { x: 2, y: 325, tooltip: "River", passage: "ForestExploreRelayNight", position: "River1" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Horizontal1.jpg", { hotspots: [ { x: 773, y: 309, tooltip: "Return to the Forest Edge", passage: "ForestExploreRelayNight", position: "Centre" }, { x: 472, y: 263, tooltip: "Abandoned Tower", passage: "Abandoned Tower", position: "tower1" }, { x: 208, y: 448, tooltip: "Abandoned Church", passage: "Abandoned Church", position: "church1" }, { x: 2, y: 325, tooltip: "River", passage: "ForestExploreRelayNight", position: "River1" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/LeftEnd1.jpg", { hotspots: [ { x: 496, y: 416, tooltip: "House 1", passage: "RandomForestHome", position: "position" }, { x: 339, y: 233, tooltip: "House 2", passage: "RandomForestHome", position: "position" }, { x: 211, y: 536, tooltip: "House 3", passage: "RandomForestHome", position: "position" }, { x: 777, y: 423, tooltip: "Return West", passage: "ForestExploreRelayNight", position: "South2" } ] })>> <<if $OakshadeFarmUnlocked is true>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South East", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" }, { x: 240, y: 340, tooltip: "Visit the Farm", passage: "Oakshade Farm", position: "Centre" } ] })>> <<elseif $CapturedLocations>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South East", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" }, { x: 240, y: 340, tooltip: "Visit the Farm", passage: "ForestFarm", position: "Centre" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South East", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" } ] })>> <</if>> <<if $EishethMet is false>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Cave.jpg", { hotspots: [ { x: 603, y: 0, tooltip: "Back up the river", passage: "ForestExploreRelayNight", position: "River1" }, { x: 701, y: 566, tooltip: "Cave", passage: "ForestCave", position: "position" }, { x: 5, y: 758, tooltip: "Cemetery", passage: "ForestExploreRelayNight", position: "Crypt" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Cave.jpg", { hotspots: [ { x: 603, y: 0, tooltip: "Back up the river", passage: "ForestExploreRelayNight", position: "River1" }, { x: 701, y: 566, tooltip: "Eisheth's Cave", passage: "Eisheth", position: "position" }, { x: 5, y: 758, tooltip: "Cemetery", passage: "ForestExploreRelayNight", position: "Crypt" } ] })>> <</if>> <<if $LucyCorrupt is true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/South1.jpg", { hotspots: [ { x: 51, y: 76, tooltip: "Lumber Mill", passage: "LumberMill", position: "null" }, { x: 489, y: 554, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp2" }, { x: 361, y: 771, tooltip: "Scarldale", passage: "ScarldaleEntrance", position: "Scarldale" }, { x: 771, y: 265, tooltip: "Swampland", passage: "ForestExploreRelayNight", position: "Swamp2" }, { x: 5, y: 474, tooltip: "South", passage: "ForestExploreRelayNight", position: "LucyHouse" }, { x: 255, y: 9, tooltip: "Back to the forest entrance", passage: "ForestExploreRelayNight", position: "Centre" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/South1.jpg", { hotspots: [ { x: 51, y: 76, tooltip: "Lumber Mill", passage: "LumberMill", position: "null" }, { x: 489, y: 554, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp2" }, { x: 361, y: 771, tooltip: "Scarldale", passage: "ScarldaleEntrance", position: "null" }, { x: 771, y: 265, tooltip: "Swampland", passage: "ForestExploreRelayNight", position: "Swamp2" }, { x: 5, y: 474, tooltip: "South", passage: "ForestExploreRelay", position: "LucyHouse" }, { x: 255, y: 9, tooltip: "Back to the forest entrance", passage: "ForestExploreRelayNight", position: "Centre" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Scarldale.jpg", { hotspots: [ { x: 565, y: 137, tooltip: "Blacksmith", passage: "ScarldaleBlacksmith", position: "position" }, { x: 235, y: 363, tooltip: "Tavern", passage: "ScarldaleTavern", position: "position" }, { x: 343, y: 573, tooltip: "Village Shop", passage: "ScarldaleShop", position: "position" }, { x: 186, y: 448, tooltip: "Village Hall", passage: "ScarldaleHall", position: "position" }, { x: 479, y: 66, tooltip: "Watch tower", passage: "ForestGuardWatchTower", position: "watchtower2" }, { x: 178, y: 222, tooltip: "Housing area", passage: "ScarldaleHouses", position: "position" }, { x: 51, y: 387, tooltip: "The church is closed", passage: "ForestExplore", position: "null" }, { x: 421, y: 4, tooltip: "Leave", passage: "ForestExploreRelayNight", position: "South1" }, { x: 663, y: 738, tooltip: "South", passage: "ForestExploreRelayNight", position: "SouthScarldale" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp1.jpg", { hotspots: [ { x: 577, y: 561, tooltip: "Ruined Watchtower", passage: "Abandoned Tower", position: "tower2" }, { x: 776, y: 745, tooltip: "Continue South", passage: "ForestExploreRelayNight", position: "ForestShack" }, { x: 3, y: 6, tooltip: "North", passage: "ForestExploreRelayNight", position: "BanditCamp" } ] })>> <<if $LucyCorrupt is true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp2.jpg", { hotspots: [ { x: 506, y: 281, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp3" }, { x: 6, y: 147, tooltip: "North", passage: "ForestExploreRelayNight", position: "South1" }, { x: 775, y: 395, tooltip: "West", passage: "ForestExploreRelayNight", position: "Swamp4" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp2.jpg", { hotspots: [ { x: 506, y: 281, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp3" }, { x: 6, y: 147, tooltip: "North", passage: "ForestExploreRelayNight", position: "South1" }, { x: 775, y: 395, tooltip: "West", passage: "SwampEntrance", position: "Swamp4" } ] })>> <</if>> <<if $LucyMet isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Small house", passage: "Encounter_Lucy", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "SwampEntrance", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelayNight", position: "South1" } ] })>> <<elseif $LucyCorrupt isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Lucy's House", passage: "LucyHouse", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "SwampEntrance", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelayNight", position: "South1" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Lucy's House", passage: "LucyHouse", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "ForestExploreRelayNight", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelayNight", position: "South1" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/MerchantPath.jpg", { hotspots: [ { x: 480, y: 303, tooltip: "Abandoned Houses", passage: "Abandoned House", position: "house3" }, { x: 743, y: 367, tooltip: "West", passage: "ForestExploreRelayNight", position: "Centre" }, { x: 9, y: 380, tooltip: "East towards the river", passage: "ForestExploreRelayNight", position: "Merchant" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Merchant.jpg", { hotspots: [ { x: 426, y: 204, tooltip: "Merchant", passage: "Merchant", position: "Null" }, { x: 750, y: 381, tooltip: "West", passage: "ForestExploreRelayNight", position: "MerchantPath" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/SouthScarldale.jpg", { hotspots: [ { x: 39, y: 3, tooltip: "Scarldale", passage: "ForestExploreRelayNight", position: "Scarldale" }, { x: 270, y: 171, tooltip: "House", passage: "RandomForestHome", position: "position" }, { x: 488, y: 325, tooltip: "Guard Watchtower", passage: "ForestGuardWatchTower", position: "watchtower1" }, { x: 235, y: 501, tooltip: "Farm", passage: "RandomForestHome", position: "position" }, { x: 5, y: 395, tooltip: "East", passage: "ForestExploreRelayNight", position: "South2" }, { x: 764, y: 382, tooltip: "West", passage: "ForestExploreRelayNight", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/South2.jpg", { hotspots: [ { x: 760, y: 305, tooltip: "West", passage: "ForestExploreRelayNight", position: "SouthScarldale" }, { x: 427, y: 571, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp4" }, { x: 13, y: 510, tooltip: "East", passage: "ForestExploreRelayNight", position: "LeftEnd1" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp3.jpg", { hotspots: [ { x: 197, y: 5, tooltip: "North", passage: "ForestExploreRelayNight", position: "Mill" }, { x: 753, y: 559, tooltip: "East", passage: "ForestExploreRelayNight", position: "Swamp6" }, { x: 310, y: 755, tooltip: "South", passage: "ForestExploreRelayNight", position: "South3" }, { x: 59, y: 577, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp5" }, { x: 4, y: 304, tooltip: "North to Scarldale", passage: "ForestExploreRelayNight", position: "SouthScarldale" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/South3.jpg", { hotspots: [ { x: 98, y: 541, tooltip: "Overgrown Path", passage: "ForestExploreRelayNight", position: "AbandonedSettlement" }, { x: 656, y: 691, tooltip: "South", passage: "ForestExploreRelayNight", position: "SwampLake" }, { x: 275, y: 4, tooltip: "North", passage: "ForestExploreRelayNight", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/SwampLake.jpg", { hotspots: [ { x: 676, y: 673, tooltip: "Lake crossing", passage: "ForestExploreRelayNight", position: "SwampLake2" }, { x: 24, y: 254, tooltip: "North", passage: "ForestExploreRelayNight", position: "South3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/SwampLake2.jpg", { hotspots: [ { x: 7, y: 24, tooltip: "North West", passage: "ForestExploreRelayNight", position: "SwampLake" }, { x: 517, y: 589, tooltip: "Cemetery", passage: "GhoulQuestCheck", position: "position" }, { x: 760, y: 352, tooltip: "East", passage: "EdgeOfForest", position: "position" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/RockyPath.jpg", { hotspots: [ { x: 764, y: 5, tooltip: "North", passage: "ForestExploreRelayNight", position: "LucyHouse" }, { x: 451, y: 655, tooltip: "WatchTower", passage: "ForestGuardWatchTower", position: "watchtower2" }, { x: 367, y: 760, tooltip: "South", passage: "ForestExploreRelayNight", position: "Tower" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/ForestShack.jpg", { hotspots: [ { x: 13, y: 53, tooltip: "Leave", passage: "ForestExploreRelayNight", position: "Swamp1" }, { x: 369, y: 334, tooltip: "Creepy Shack", passage: "Forest Shack", position: "null" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Tower.jpg", { hotspots: [ { x: 398, y: 12, tooltip: "North", passage: "ForestExploreRelayNight", position: "RockyPath" }, { x: 756, y: 347, tooltip: "East", passage: "ForestExploreRelayNight", position: "Market" }, { x: 634, y: 520, tooltip: "Tower", passage: "Abandoned Tower", position: "tower3" }, { x: 422, y: 766, tooltip: "South", passage: "EdgeOfForest", position: "position" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Market.jpg", { hotspots: [ { x: 7, y: 308, tooltip: "East", passage: "ForestExploreRelayNight", position: "Tower" }, { x: 763, y: 315, tooltip: "West", passage: "ForestExploreRelayNight", position: "Creak" }, { x: 329, y: 219, tooltip: "The market is closed", passage: "ForestExploreRelayNight", position: "Market" }, { x: 249, y: 550, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp6" } ] })>> <<if $Quests.includes("deal with the bandits attacking caravans near the creek")>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Creak.jpg", { hotspots: [ { x: 27, y: 340, tooltip: "East", passage: "BanditsQuest", position: "null" }, { x: 768, y: 461, tooltip: "West", passage: "BanditsQuest", position: "null" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Creak.jpg", { hotspots: [ { x: 27, y: 340, tooltip: "West", passage: "ForestExploreRelayNight", position: "Market" }, { x: 768, y: 461, tooltip: "East", passage: "ForestExploreRelayNight", position: "AbandonedSettlement" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/AbandonedSettlement.jpg", { hotspots: [ { x: 24, y: 414, tooltip: "West", passage: "ForestExploreRelayNight", position: "Creak" }, { x: 763, y: 601, tooltip: "East", passage: "ForestExploreRelayNight", position: "South3" }, { x: 278, y: 406, tooltip: "Abandoned Settlement", passage: "Abandoned House", position: "house4" } ] })>> <<if $Quests.includes("Find Alice's father")>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/BanditMine.jpg", { hotspots: [ { x: 170, y: 275, tooltip: "Cave", passage: "CryptGeneration", position: "null" }, { x: 574, y: 201, tooltip: "Bandit Camp", passage: "AliceQuest", position: "position" }, { x: 11, y: 569, tooltip: "East", passage: "ForestExploreRelayNight", position: "position" }, { x: 757, y: 548, tooltip: "West", passage: "ForestExploreRelayNight", position: "position" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/BanditMine.jpg", { hotspots: [ { x: 170, y: 275, tooltip: "Cave", passage: "CryptGeneration", position: "null" }, { x: 574, y: 201, tooltip: "Bandit Camp", passage: "BanditMine", position: "position" }, { x: 11, y: 569, tooltip: "West", passage: "ForestExploreRelayNight", position: "Swamp6" }, { x: 757, y: 548, tooltip: "East", passage: "MannorQuest1", position: "null" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp4.jpg", { hotspots: [ { x: 10, y: 338, tooltip: "West", passage: "ForestExploreRelayNight", position: "Swamp2" }, { x: 370, y: 401, tooltip: "Abandond House", passage: "Abandoned House", position: "house5" }, { x: 429, y: 764, tooltip: "South", passage: "ForestExploreRelayNight", position: "Swamp5" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp5.jpg", { hotspots: [ { x: 508, y: 12, tooltip: "North", passage: "ForestExploreRelayNight", position: "Swamp4" }, { x: 9, y: 372, tooltip: "West", passage: "ForestExploreRelayNight", position: "Mill" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Mill.jpg", { hotspots: [ { x: 162, y: 138, tooltip: "Mill", passage: "ScarldaleMill", position: "null" }, { x: 766, y: 343, tooltip: "East", passage: "ForestExploreRelayNight", position: "Swamp4" }, { x: 760, y: 747, tooltip: "South East", passage: "ForestExploreRelayNight", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/Swamp6.jpg", { hotspots: [ { x: 7, y: 538, tooltip: "West", passage: "ForestExploreRelayNight", position: "Swamp3" }, { x: 755, y: 571, tooltip: "East", passage: "ForestExploreRelayNight", position: "BanditMine" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<if $LucyMet isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/Centre.jpg", { hotspots: [ { x: 389, y: 289, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp1", key: "S" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "Base Intro", position: "null", key: "A" }, { x: 5, y: 274, tooltip: "North West", passage: "ForestExploreRelay", position: "MerchantPath", key: "Q" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelay", position: "South1", key: "X" }, { x: 777, y: 161, tooltip: "West towards the cost", passage: "ForestExploreRelay", position: "BanditCamp", key: "E" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Centre.jpg", { hotspots: [ { x: 389, y: 289, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp1" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "Base Intro", position: "null" }, { x: 10, y: 561, tooltip: "West to the river", passage: "ForestExploreRelay", position: "Horizontal1" }, { x: 5, y: 274, tooltip: "North West", passage: "ForestExploreRelay", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelay", position: "South1" }, { x: 777, y: 161, tooltip: "East towards the cost", passage: "ForestExploreRelay", position: "BanditCamp" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/River1.jpg", { hotspots: [ { x: 784, y: 169, tooltip: "Return to the forest entrance", passage: "ForestExploreRelay", position: "Centre" }, { x: 570, y: 203, tooltip: "House", passage: "RandomForestHome", position: "null" }, { x: 654, y: 775, tooltip: "South", passage: "ForestExploreRelay", position: "Cave" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Crypt.jpg", { hotspots: [ { x: 769, y: 5, tooltip: "Back up the river", passage: "ForestExploreRelay", position: "Cave" }, { x: 401, y: 133, tooltip: "Crypt", passage: "CryptEnterence", position: "position" } ] })>> <<if $Quests.includes("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run setup.buildingData.set("Images/Forrest/Maps/Horizontal1.jpg", { hotspots: [ { x: 773, y: 309, tooltip: "Return to the Forest Edge", passage: "ForestExploreRelay", position: "Centre" }, { x: 472, y: 263, tooltip: "Abandoned Tower", passage: "Abandoned Tower", position: "tower1" }, { x: 208, y: 448, tooltip: "Abandoned Church", passage: "WolvesQuestSetup", position: "null" }, { x: 2, y: 325, tooltip: "River", passage: "ForestExploreRelay", position: "River1" } ] })>> <<else>> <<if $CultDiscovered is false>> <<run setup.buildingData.set("Images/Forrest/Maps/Horizontal1.jpg", { hotspots: [ { x: 773, y: 309, tooltip: "Return to the Forest Edge", passage: "ForestExploreRelay", position: "Centre" }, { x: 472, y: 263, tooltip: "Abandoned Tower", passage: "Abandoned Tower", position: "tower1" }, { x: 208, y: 448, tooltip: "Abandoned Church", passage: "Abandoned Church", position: "church1" }, { x: 2, y: 325, tooltip: "River", passage: "ForestExploreRelay", position: "River1" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Horizontal1.jpg", { hotspots: [ { x: 773, y: 309, tooltip: "Return to the Forest Edge", passage: "ForestExploreRelay", position: "Centre" }, { x: 472, y: 263, tooltip: "Abandoned Tower", passage: "Abandoned Tower", position: "tower1" }, { x: 208, y: 448, tooltip: "Abandoned Church", passage: "Abandoned Church", position: "church1" }, { x: 2, y: 325, tooltip: "River", passage: "ForestExploreRelay", position: "River1" } ] })>> <</if>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/LeftEnd1.jpg", { hotspots: [ { x: 496, y: 416, tooltip: "House 1", passage: "RandomForestHome", position: "position" }, { x: 339, y: 233, tooltip: "House 2", passage: "RandomForestHome", position: "position" }, { x: 211, y: 536, tooltip: "House 3", passage: "RandomForestHome", position: "position" }, { x: 777, y: 423, tooltip: "Return East", passage: "ForestExploreRelay", position: "South2" } ] })>> <<if $OakshadeFarmUnlocked is true>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South West", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" }, { x: 240, y: 340, tooltip: "Visit the Farm", passage: "Oakshade Farm", position: "Centre" } ] })>> <<elseif $CapturedLocations.length >= 1>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South West", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" }, { x: 240, y: 340, tooltip: "Visit the Farm", passage: "ForestFarm", position: "Centre" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South East", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelay", position: "Centre" } ] })>> <</if>> <<if $EishethMet is false>> <<run setup.buildingData.set("Images/Forrest/Maps/Cave.jpg", { hotspots: [ { x: 603, y: 0, tooltip: "Back up the river", passage: "ForestExploreRelay", position: "River1" }, { x: 701, y: 566, tooltip: "Cave", passage: "ForestCave", position: "position" }, { x: 5, y: 758, tooltip: "Cemetery", passage: "ForestExploreRelay", position: "Crypt" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Cave.jpg", { hotspots: [ { x: 603, y: 0, tooltip: "Back up the river", passage: "ForestExploreRelay", position: "River1" }, { x: 701, y: 566, tooltip: "Eisheth's Cave", passage: "Eisheth", position: "position" }, { x: 5, y: 758, tooltip: "Cemetery", passage: "ForestExploreRelay", position: "Crypt" } ] })>> <</if>> <<if $LucyCorrupt is true>> <<run setup.buildingData.set("Images/Forrest/Maps/South1.jpg", { hotspots: [ { x: 51, y: 76, tooltip: "Lumber Mill", passage: "LumberMill", position: "null" }, { x: 489, y: 554, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp2" }, { x: 361, y: 771, tooltip: "Scarldale", passage: "ForestExploreRelay", position: "Scarldale" }, { x: 771, y: 265, tooltip: "Swampland", passage: "ForestExploreRelay", position: "Swamp2" }, { x: 5, y: 474, tooltip: "South", passage: "ForestExploreRelay", position: "LucyHouse" }, { x: 255, y: 9, tooltip: "Back to the forest entrance", passage: "ForestExploreRelay", position: "Centre" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/South1.jpg", { hotspots: [ { x: 51, y: 76, tooltip: "Lumber Mill", passage: "LumberMill", position: "null" }, { x: 489, y: 554, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp2" }, { x: 361, y: 771, tooltip: "Scarldale", passage: "ScarldaleEntrance", position: "null" }, { x: 771, y: 265, tooltip: "Swampland", passage: "ForestExploreRelay", position: "Swamp2" }, { x: 5, y: 474, tooltip: "South", passage: "ForestExploreRelay", position: "LucyHouse" }, { x: 255, y: 9, tooltip: "Back to the forest entrance", passage: "ForestExploreRelay", position: "Centre" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Scarldale.jpg", { hotspots: [ { x: 565, y: 137, tooltip: "Blacksmith", passage: "ScarldaleBlacksmith", position: "position" }, { x: 235, y: 363, tooltip: "Tavern", passage: "ScarldaleTavern", position: "position" }, { x: 343, y: 573, tooltip: "Village Shop", passage: "ScarldaleShop", position: "position" }, { x: 186, y: 448, tooltip: "Village Hall", passage: "ScarldaleHall", position: "position" }, { x: 479, y: 66, tooltip: "Watch tower", passage: "ForestGuardWatchTower", position: "watchtower2" }, { x: 178, y: 222, tooltip: "Housing area", passage: "ScarldaleHouses", position: "position" }, { x: 51, y: 387, tooltip: "The church is closed", passage: "ForestExplore", position: "null" }, { x: 421, y: 4, tooltip: "Leave", passage: "ForestExploreRelay", position: "South1" }, { x: 663, y: 738, tooltip: "South", passage: "ForestExploreRelay", position: "SouthScarldale" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp1.jpg", { hotspots: [ { x: 577, y: 561, tooltip: "Ruined Watchtower", passage: "Abandoned Tower", position: "tower2" }, { x: 776, y: 745, tooltip: "Continue South", passage: "ForestExploreRelay", position: "ForestShack" }, { x: 3, y: 6, tooltip: "North", passage: "ForestExploreRelay", position: "BanditCamp" } ] })>> <<if $LucyCorrupt is true>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp2.jpg", { hotspots: [ { x: 506, y: 281, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp3" }, { x: 6, y: 147, tooltip: "North", passage: "ForestExploreRelay", position: "South1" }, { x: 775, y: 395, tooltip: "West", passage: "ForestExploreRelay", position: "Swamp4" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp2.jpg", { hotspots: [ { x: 506, y: 281, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp3" }, { x: 6, y: 147, tooltip: "North", passage: "ForestExploreRelay", position: "South1" }, { x: 775, y: 395, tooltip: "West", passage: "SwampEntrance", position: "Swamp4" } ] })>> <</if>> <<if $LucyMet isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Small house", passage: "Encounter_Lucy", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "SwampEntrance", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelay", position: "South1" } ] })>> <<elseif $LucyCorrupt isnot true>> <<run setup.buildingData.set("Images/Forrest/Maps/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Lucy's House", passage: "LucyHouse", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "SwampEntrance", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelay", position: "South1" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/LucyHouse.jpg", { hotspots: [ { x: 428, y: 237, tooltip: "Lucy's House", passage: "LucyHouse", position: "null" }, { x: 580, y: 569, tooltip: "Ruins", passage: "Abandoned House", position: "house1" }, { x: 124, y: 461, tooltip: "Narrow Rocky Path", passage: "ForestExploreRelay", position: "RockyPath" }, { x: 764, y: 228, tooltip: "North", passage: "ForestExploreRelay", position: "South1" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/MerchantPath.jpg", { hotspots: [ { x: 480, y: 303, tooltip: "Abandoned Houses", passage: "Abandoned House", position: "house3" }, { x: 743, y: 367, tooltip: "East", passage: "ForestExploreRelay", position: "Centre" }, { x: 9, y: 380, tooltip: "West towards the river", passage: "ForestExploreRelay", position: "Merchant" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Merchant.jpg", { hotspots: [ { x: 426, y: 204, tooltip: "Marchant", passage: "Merchant", position: "Null" }, { x: 750, y: 381, tooltip: "East", passage: "ForestExploreRelay", position: "MerchantPath" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/SouthScarldale.jpg", { hotspots: [ { x: 39, y: 3, tooltip: "Scarldale", passage: "ForestExploreRelay", position: "Scarldale" }, { x: 270, y: 171, tooltip: "House", passage: "RandomForestHome", position: "position" }, { x: 488, y: 325, tooltip: "Guard Watchtower", passage: "ForestGuardWatchTower", position: "watchtower1" }, { x: 235, y: 501, tooltip: "Farm", passage: "RandomForestHome", position: "position" }, { x: 5, y: 395, tooltip: "West", passage: "ForestExploreRelay", position: "South2" }, { x: 764, y: 382, tooltip: "East", passage: "ForestExploreRelay", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/South2.jpg", { hotspots: [ { x: 760, y: 305, tooltip: "East", passage: "ForestExploreRelay", position: "SouthScarldale" }, { x: 427, y: 571, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp4" }, { x: 13, y: 510, tooltip: "West", passage: "ForestExploreRelay", position: "LeftEnd1" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp3.jpg", { hotspots: [ { x: 197, y: 5, tooltip: "North", passage: "ForestExploreRelay", position: "Mill" }, { x: 753, y: 559, tooltip: "West", passage: "ForestExploreRelay", position: "Swamp6" }, { x: 310, y: 755, tooltip: "South", passage: "ForestExploreRelay", position: "South3" }, { x: 59, y: 577, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp5" }, { x: 4, y: 304, tooltip: "North to Scarldale", passage: "ForestExploreRelay", position: "SouthScarldale" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/South3.jpg", { hotspots: [ { x: 98, y: 541, tooltip: "Overgrown Path", passage: "ForestExploreRelay", position: "AbandonedSettlement" }, { x: 656, y: 691, tooltip: "South", passage: "ForestExploreRelay", position: "SwampLake" }, { x: 275, y: 4, tooltip: "North", passage: "ForestExploreRelay", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/SwampLake.jpg", { hotspots: [ { x: 676, y: 673, tooltip: "Lake crossing", passage: "ForestExploreRelay", position: "SwampLake2" }, { x: 24, y: 254, tooltip: "North", passage: "ForestExploreRelay", position: "South3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/SwampLake2.jpg", { hotspots: [ { x: 7, y: 24, tooltip: "North East", passage: "ForestExploreRelay", position: "SwampLake" }, { x: 517, y: 589, tooltip: "Cemetery", passage: "GhoulQuestCheck", position: "position" }, { x: 760, y: 352, tooltip: "West", passage: "EdgeOfForest", position: "position" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/RockyPath.jpg", { hotspots: [ { x: 764, y: 5, tooltip: "North", passage: "ForestExploreRelay", position: "LucyHouse" }, { x: 451, y: 655, tooltip: "WatchTower", passage: "ForestGuardWatchTower", position: "watchtower2" }, { x: 367, y: 760, tooltip: "South", passage: "ForestExploreRelay", position: "Tower" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/ForestShack.jpg", { hotspots: [ { x: 13, y: 53, tooltip: "Leave", passage: "ForestExploreRelay", position: "Swamp1" }, { x: 369, y: 334, tooltip: "Creepy Shack", passage: "Forest Shack", position: "null" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Tower.jpg", { hotspots: [ { x: 398, y: 12, tooltip: "North", passage: "ForestExploreRelay", position: "RockyPath" }, { x: 756, y: 347, tooltip: "West", passage: "ForestExploreRelay", position: "Market" }, { x: 634, y: 520, tooltip: "Tower", passage: "Abandoned Tower", position: "tower3" }, { x: 422, y: 766, tooltip: "South", passage: "EdgeOfForest", position: "position" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Market.jpg", { hotspots: [ { x: 7, y: 308, tooltip: "West", passage: "ForestExploreRelay", position: "Tower" }, { x: 763, y: 315, tooltip: "East", passage: "ForestExploreRelay", position: "Creak" }, { x: 329, y: 219, tooltip: "The market is closed", passage: "ForestExploreRelay", position: "Market" }, { x: 249, y: 550, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp6" } ] })>> <<if $Quests.includes("deal with the bandits attacking caravans near the creek")>> <<run setup.buildingData.set("Images/Forrest/Maps/Creak.jpg", { hotspots: [ { x: 27, y: 340, tooltip: "West", passage: "BanditsQuest", position: "null" }, { x: 768, y: 461, tooltip: "East", passage: "BanditsQuest", position: "null" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/Creak.jpg", { hotspots: [ { x: 27, y: 340, tooltip: "East", passage: "ForestExploreRelay", position: "Market" }, { x: 768, y: 461, tooltip: "West", passage: "ForestExploreRelay", position: "AbandonedSettlement" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/AbandonedSettlement.jpg", { hotspots: [ { x: 24, y: 414, tooltip: "East", passage: "ForestExploreRelay", position: "Creak" }, { x: 763, y: 601, tooltip: "West", passage: "ForestExploreRelay", position: "South3" }, { x: 278, y: 406, tooltip: "Abandoned Settlement", passage: "Abandoned House", position: "house4" } ] })>> <<if $Quests.includes("Find Alice's father")>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditMine.jpg", { hotspots: [ { x: 170, y: 275, tooltip: "Cave", passage: "CryptGeneration", position: "null" }, { x: 574, y: 201, tooltip: "Bandit Camp", passage: "AliceQuest", position: "position" }, { x: 11, y: 569, tooltip: "West", passage: "ForestExploreRelay", position: "position" }, { x: 757, y: 548, tooltip: "East", passage: "ForestExploreRelay", position: "position" } ] })>> <<else>> <<run setup.buildingData.set("Images/Forrest/Maps/BanditMine.jpg", { hotspots: [ { x: 170, y: 275, tooltip: "Cave", passage: "CryptGeneration", position: "null" }, { x: 574, y: 201, tooltip: "Bandit Camp", passage: "BanditMine", position: "position" }, { x: 11, y: 569, tooltip: "East", passage: "ForestExploreRelay", position: "Swamp6" }, { x: 757, y: 548, tooltip: "West", passage: "MannorQuest1", position: "null" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp4.jpg", { hotspots: [ { x: 10, y: 338, tooltip: "East", passage: "ForestExploreRelay", position: "Swamp2" }, { x: 370, y: 401, tooltip: "Abandond House", passage: "Abandoned House", position: "house5" }, { x: 429, y: 764, tooltip: "South", passage: "ForestExploreRelay", position: "Swamp5" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp5.jpg", { hotspots: [ { x: 508, y: 12, tooltip: "North", passage: "ForestExploreRelay", position: "Swamp4" }, { x: 9, y: 372, tooltip: "East", passage: "ForestExploreRelay", position: "Mill" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Mill.jpg", { hotspots: [ { x: 162, y: 138, tooltip: "Mill", passage: "ScarldaleMill", position: "null" }, { x: 766, y: 343, tooltip: "West", passage: "ForestExploreRelay", position: "Swamp4" }, { x: 760, y: 747, tooltip: "South West", passage: "ForestExploreRelay", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp6.jpg", { hotspots: [ { x: 7, y: 538, tooltip: "East", passage: "ForestExploreRelay", position: "Swamp3" }, { x: 755, y: 571, tooltip: "West", passage: "ForestExploreRelay", position: "BanditMine" } ] })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> <<You>>I've already been here today... Theres no point visiting again today<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/8.png">> <div class="text-box"> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<set $EncounterHappen to random(0, 9)>> <<set $WhichEncounter to random(0, 7)>> <<if $CurrentPlayer is "Overlord">> <<if $EncounterHappen <= 4>> <<switch $WhichEncounter>> <<case 0>> You find [[Treasure]] <<case 1>> <<if $LucyMet is false>> You encounter [[a woman|Encounter_Lucy]] <<else>> [[Continue|Forest 4]] <</if>> <<case 2>> You encounter [[a merchant|Merchant]] <<case 3>> You encounter [[a fallen tree|Encounter_Wood]] <<case 4>> You encounter [[a bandit|Encounter_Bandit]] <<case 5>> You encounter [[a bandit|Encounter_Female Bandit]] <<case 6>> You encounter [[a wolf|Encounter_Wolf]] <<case 7>> You encounter [[a bear|Encounter_Bear]] <<case 8>> You encounter [[a woman|StalkForest]] <</switch>> <<else>> <<if ($LucyMetInt gt 4) and ($LucyMet is false)>> <<if $Quests.includes("Find a way to hide your identity")>> [[Continue|Forest 4]] <<else>> You encounter [[a woman|Encounter_Lucy]]<</if>> <<else>> [[Continue|Forest 4]] <</if>> <</if>> <<elseif $CurrentPlayer is "LucyCloaked">> <<if $EncounterHappen <= 3>> [[A bandit stands in your way|Encounter_Bandit]] <<else>> [[Continue|Forest 4]] <</if>> <<else>> [[Continue|Forest 4]] <</if>> <</nobr>> </div> <<set $LucyMetInt to $LucyMetInt + 1>> <<set $ReturnPassage to passage()>>
Thornhollow Oakshade Mossmere Briarwood Sylverspring Cedarfall Willowfen Brackenhearth Elmshade Hawthorn Hollow Fernbrook Ashenvale Pineshadow Larkspur Grove Foxglove Dell Rowanmere Hearthwood Birch Hollow Tanglebriar Hazelwick Wolfpine Meadowshade Ravenbough Amberglade Hollowbirch Driftwood Glade Thistlebrook Copperbranch Violetwood Greenshade
<div class="text-box"> <<nobr>> <<if $FirstShackVisit is true>> You open the door and hear a voice, deeper than any mortal could produce<br><br> <<Worlock>>What do you seek?<</Worlock>><br><br> <<You>>Are you the one I am looking for? The being who deals in scrolls of power?<</You>><br><br> <<Worlock>>What is it that you desire?<</Worlock>><br><br> <<You>>I seek the power to control my subjects and crush my enemies<</You>><br><br> <<Worlock>>I create many scrolls and tomes, each containing great power. Some can grant you what you seek.<</Worlock>><br><br> Gathering your courage, you look toward the source of the voice. But it is not a man before you—not even something you can call living. Still, the voice continues, resonating in your mind. The creature’s lips never move<br><br> <<Worlock>>Examine my scrolls. If you can comprehend the power they hold, perhaps you may learn to wield it<</Worlock>><br><br> <<set $FirstShackVisit to false>> <</if>> <<if $SoulStoneKnow is false>> [[Ask about the stone you found]]<br><br> <</if>> <<button "Look at the scrolls">><<goto "Spells Shop">><</button>><br> <<button "Leave">> <<set $ForestLocation to "Images/Forrest/Maps/ForestShack.jpg">> <<run Engine.play("ForestExplore")>> <</button>> <div align="center"> <img src="Images/Forrest/Exploring/Shack/2.png" width="700" height="700"> </div> <</nobr>> </div>
<div class="text-box"> <nobr> You walk through the forest, searching for the strange presence you feel.<br><br> As you continue, the area grows increasingly misty, the dense fog obscuring your surroundings.<br><br> After some exploration, you stumble upon an old, weathered shack nestled among the trees.<br><br> <<button "Continue">> <<goto "Forest Shack">> <</button>> </nobr> </div>
<<nobr>> <div class="text-box"> <<set $Time to $Time + 1>> <div align="center"> <img src="Images/Forrest/Exploring/Shack/1.png" width="700" height="700"> </div> <<button "Enter">> <<goto "Forest Shack Inside">> <</button>><br><br> <<button "Leave">> <<set $ForestLocation to "Images/Forrest/Maps/ForestShack.jpg">> <<goto "ForestExplore">> <</button>><br><br> <<set $ForestShackDiscovered to true>> <<if $ShackTear isnot true>> <<if ($PlayerSpells.includes("Tear")) and ($PortalVisited is true)>> <<button "Create tear">> <<run setup.addPortalDestination('Shack', 'Forest Shack', 'ForestShack.png')>> <<set $ShackTear to true>> <<run Engine.show()>> <</button>><br><br> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <<set $Sneak to true>> <<set _Room to "Bedroom">> <div class="text-box"> You press your ear to the door<br><br> <<if ($WomanLocation == _Room) or ($ManLocation == _Room)>> You hear the sound of someone making a bed or folding clothes, it could be her... Or someone else?<br><br> <audio autoplay> <source src="Audio/BedMaking.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<else>> You hear nothing<br><br> <</if>> [[Enter|ForestStalkBed]]<br> [[Back|ForestStalkUpperHall]] </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _Room to "Bedroom">> <<set _line to random(0, 2)>> <div class="text-box"> You step into the bedroom and look around<br><br> <<if $WomanLocation is _Room>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the woman hasn't seen you yet<br><br> <<if $PlayerSpells.includes("Dominate")>> <<link "Dominate her mind">><<run Engine.play('StalkBedroomFuckSetup')>><</link>><br><br> <<else>> You don't have the right spell to dominate her mind<br><br> <</if>> <<else>> You enter the room, the woman turns and looks at you with shock, having given away your intent you cannot attempt to dominate her mind<br><br> <span style="color: #FF1493;">Woman: $FemaleDetectedLines[_line]</span><br><br> <</if>> <<link "Kill her">><<run Engine.play('StalkKill')>><</link>><br><br> <<if $CellsCount > $DungonOccupance.length>> <<link "Kidnap her">><<run Engine.play('StalkKidnap')>><</link>><br><br> <<else>> Your cells are too full for another prisoner<</if>><</if>> <<if $ManLocation is _Room>> <<set _int to random(1, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Male/NPC/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the man hasn't seen you yet<br><br> <<link "Knock him out">><<run Engine.play('StalkKnockOut')>><</link>><br><br> <<link "Kill him">><<run Engine.play('StalkKill')>><</link>><br><br> <<else>> You enter the room, the man turns and looks at you with shock, having given away your presence, you cannot easilly knock him out<br><br> <span style="color: #8CC5F3;">Man: $MaleDetectedLines[_line]</span><br><br> <<link "Attack him">><<run Engine.play('Encounter_HouseMale')>><</link>><br><br> <</if>><</if>> <<if $ItemLocation is _Room>> The room is empty besides a cabinate, you can search<br><br> <<set _int to random(2, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/House/Items/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<link "Search it">><<run Engine.play('StalkItem')>><</link>><br><br> <</if>> [[Back|ForestStalkUpperHall]] </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $Sneak to false>> <div class="text-box"> <hr> Livingroom<br> [[Open the door|ForestStalkLiving]]<br> [[Listen at the door|ForestStalkLivingListen]] <hr> Kitchen<br> [[Open the door|ForestStalkKitchen]]<br> [[Listen at the door|ForestStalkKitchenListen]] <hr> [[Upstairs|ForestStalkUpperHall]]<br> [[Return to the castle|Base Intro]] </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $Sneak to true>> <<set _Room to "Kitchen">> <div class="text-box"> You press your ear to the door<br><br> <<if ($WomanLocation == _Room) or ($ManLocation == _Room)>> You hear the sound of someone walking around in the livingroom, it could be her... Or someone else?<br><br> <audio autoplay> <source src="Audio/KitchenPrep.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<else>> You hear nothing<br><br> <</if>> [[Enter|ForestStalkKitchen]]<br> [[Back|ForestStalkHall]] </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _Room to "Kitchen">> <<set _line to random(0, 2)>> <div class="text-box"> You step into the kitchen and look around<br><br> <<if $WomanLocation is _Room>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the woman hasn't seen you yet<br><br> <<if $PlayerSpells.includes("Dominate")>> <<link "Dominate her mind">><<run Engine.play('StalkBedroomFuckSetup')>><</link>><br><br> <<else>> You don't have the right spell to dominate her mind<br><br> <</if>> <<else>> You enter the room, the woman turns and looks at you with shock, having given away your intent you cannot attempt to dominate her mind<br><br> <span style="color: #FF1493;">Woman: $FemaleDetectedLines[_line]</span><br><br> <</if>> <<link "Kill her">><<run Engine.play('StalkKill')>><</link>><br><br> <<if $CellsCount > $DungonOccupance.length>> <<link "Kidnap her">><<run Engine.play('StalkKidnap')>><</link>><br><br> <<else>> Your cells are too full for another prisoner <</if>><</if>> <<if $ManLocation is _Room>> <<set $EnemyWeapon to "kitchen knife">> <<set _int to random(1, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Male/NPC/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the man hasn't seen you yet<br><br> <<link "Knock him out">><<run Engine.play('StalkKnockOut')>><</link>><br><br> <<link "Kill him">><<run Engine.play('StalkKill')>><</link>><br><br> <<else>> You enter the room, the man turns and looks at you with shock, having given away your presence, you cannot easilly knock him out<br><br> <span style="color: #8CC5F3;">Man: $MaleDetectedLines[_line]</span><br><br> <<link "Attack him">><<run Engine.play('Encounter_HouseMale')>><</link>><br><br> <</if>><</if>> <<if $ItemLocation is _Room>> The room is empty besides a cabinate, you can search<br><br> <<set _int to random(2, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/House/Items/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<link "Search it">><<run Engine.play('StalkItem')>><</link>><br><br> <<else>> [[Back|ForestStalkHall]] <</if>> </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Kitchen/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $Sneak to true>> <<set _Room to "Livingroom">> <div class="text-box"> You press your ear to the door<br><br> <<if ($WomanLocation == _Room) or ($ManLocation == _Room)>> You hear the sound of someone preparing food in the kitchen, it could be her... Or someone else?<br><br> <audio autoplay> <source src="Audio/WoodenFoor.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<else>> You hear nothing<br><br> <</if>> [[Enter|ForestStalkLiving]]<br> [[Back|ForestStalkHall]] </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _Room to "Livingroom">> <<set _line to random(0, 2)>> <div class="text-box"> You step into the livnigroom and look around<br><br> <<if $WomanLocation is _Room>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the woman hasn't seen you yet<br><br> <<if $PlayerSpells.includes("Dominate")>> <<link "Dominate her mind">><<run Engine.play('StalkBedroomFuckSetup')>><</link>><br><br> <<else>> You don't have the right spell to dominate her mind<br><br> <</if>> <<else>> You enter the room, the woman turns and looks at you with shock, having given away your intent you cannot attempt to dominate her mind<br><br> <span style="color: #FF1493;">Woman: $FemaleDetectedLines[_line]</span><br><br> <</if>> <<link "Kill her">><<run Engine.play('StalkKill')>><</link>><br><br> <<if $CellsCount > $DungonOccupance.length>> <<link "Kidnap her">><<run Engine.play('StalkKidnap')>><</link>><br><br> <<else>> Your cells are too full for another prisoner <</if>><</if>> <<if $ManLocation is _Room>> <<set $EnemyWeapon to "letter opener">> <<set _int to random(1, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Male/NPC/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Sneak is true>> You sneak into the room, the man hasn't seen you yet<br><br> <<link "Knock him out">><<run Engine.play('StalkKnockOut')>><</link>><br><br> <<link "Kill him">><<run Engine.play('StalkKill')>><</link>><br><br> <<else>> You enter the room, the man turns and looks at you with shock, having given away your presence, you cannot easilly knock him out<br><br> <span style="color: #8CC5F3;">Man: $MaleDetectedLines[_line]</span><br><br> <<link "Attack him">><<run Engine.play('Encounter_HouseMale')>><</link>><br><br> <</if>><</if>> <<if $ItemLocation is _Room>> The room is empty besides a cabinate, you can search<br><br> <<set _int to random(2, 5)>> <<set $ImagePath to "Images/Forrest/Encounters/House/Items/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<link "Search it">><<run Engine.play('StalkItem')>><</link>><br><br> <<else>> [[Back|ForestStalkHall]] <</if>> </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $Sneak to false>> <div class="text-box"> You are on the upper floor of the house<br> <hr> Bedroom<br> <<if ($WomanLocation is "Dominated") and ($HusbandHome is false)>> [[Open the door|StalkBedroomFuck]]<br> <<elseif ($WomanLocation is "Dominated") and ($HusbandHome is true)>> <<Thoughts>>I should make sure the house is empty before seeing her<</Thoughts>> [[Open the door|StalkBedroomFuck]]<br> <<else>> [[Open the door|ForestStalkBed]]<br> [[Listen at the door|ForestStalkBedListen]] <</if>> <hr> [[Downstairs|ForestStalkHall]]<br> </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/UpperHall/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _charImg to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.png">> <div class="text-box"> <<if $Position is "Behind">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/8.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> <<say 'Huntress' _charImg>>Oh.... Fuc...<</say>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/7.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/8.webm" type="video/webm"> </video><br><br> </div><br><br> <</if>> <<if $Position is "Bj">> <<say 'Huntress' _charImg>>Get comfortable<</say>> You sitdown and relax as she gets to work <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/3.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/1.webm" type="video/webm"> </video><br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/4.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/5.webm" type="video/webm"> </video><br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/11.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <</if>> <<if $Position is "CG">> <<say 'Huntress' _charImg>>Oh.... Fuc...<</say>> <video autoplay loop> <source src="Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.webm" type="video/webm"> </video><br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/9.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <</if>> <<if $Position is "Tits">> <<say 'Huntress' _charImg>>I thought you liked my tits...<</say>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/7.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/2.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Huntress' _charImg>>Is that good?<</say>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/10.png">> <div class="Random-image"> <<set _imagePath to _img>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <</if>> <<say 'Huntress' _charImg>>Umm, that was fun... How about you come back soon and bring me a few more pelts?<</say>> The thought of taking this woman back to your castle crosses your mind... But you let it pass, shes possibly more useful to you here and she will be around for more fun later<br><br> <<button "Finish and leave">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/1.png">> <div class="text-box"> <<say 'Huntress' _img>>So... How can I show you my gratitude<</say>> <<include "Interactable images code">> <<set _image1 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/6.png">> <<set _image2 to "Images/Forrest/Encounters/Human/Female/Huntress/Camp1/12.png">> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _hotspotData to [ { x: 220, y: 200, tooltip: "Open her shirt" } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle dynamic-image-hidden"></div> </div> <</for>> </div> </div> <<if $DynamicImages isnot true>> <div style="text-align: center"> <i>Images with red border have hidden interactions to find<br> <<link "Don't show thing again">><<set $DynamicImages to true>><</link>></i><br><br> </div> <</if>><br><br> <div style="text-align: center"> <<button "Take her from behind">> <<set $Position to "Behind">> <<goto "ForestTentSex2">> <</button>> <<button "Tell her to suck you">> <<set $Position to "Bj">> <<goto "ForestTentSex2">> <</button>> <<button "Fuck her tits">> <<set $Position to "Tits">> <<goto "ForestTentSex2">> <</button>> <<button "Ask her to ride you">> <<set $Position to "CG">> <<goto "ForestTentSex2">> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $ArmouryLongbows>><<else>>set $ArmouryLongbows to 0>><</if>> <<if $ArmouryVisisted isnot true>> <<set $ArmouryBlacksmith to false>> <<set $ArmouryArmour to 0>> <<set $ArmourySwords to 0>> <<Gnarlak>>Greetings lord, the forge is looking a little empty wouldn't you say?<</Gnarlak>><br><br> <<You>>Where can I get weapons and armour?<</You>><br><br> <<Gnarlak>>Humm, it's no use taking from bandits their weapons are barely serviceable... We will need iron and someone who can craft sharp wepons and strong armour<</Gnarlak>><br><br> <<You>>Where can we get iron?<</You>><br><br> <<Gnarlak>>Most is imported from the docks in harbours end, we would stuggle to get there... There are mines in the mountains which yeald some. It's a hard ride at this time of year, but if you can get there we can get some servicable metal<</Gnarlak>><br><br> <<if $PortalVisited is false>> <<Gnarlak>>I recomend building a portal for safe and quick visits... Once you reach the mountains<</Gnarlak>><br><br><</if>> <<Gnarlak>>We also need someone who can work the forge, I am too busy tending to the traps. Maybe you can find somone in a settlement? There will be a blacksmith out there somewhere<</Gnarlak>><br><br> <<button "Leave">> <<goto "Inside Castle">> <<script>> UI.alert("New Quest! <br>Vist the mountains and purchase iron"); <</script>> <<run $Quests.push("Vist the mountains and purchase iron")>> <</button>> <<set $ArmouryVisisted to true>> <<else>> <h1>Forge</h1> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Armour/breastplate.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Armour</h3> <p>Gives unit 25 extra health</p> <p>Current Armour: $ArmouryArmour</p> <p>Iron Required: 2</p> <<if $Iron >= 2>> <<button "Order contruction">> <<if !$ArmouryArmour>> <<set $ArmouryArmour to 0>> <</if>> <<set $ArmouryArmour to $ArmouryArmour + 1>> <<set $Iron to $Iron - 2>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Melee Weapons/shortsword.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Sword</h3> <p>Damage 30 - 35</p> <p>Current Swords: $ArmourySwords</p> <p>Iron Required: 1</p> <<if $Iron >= 1>> <<button "Order contruction">> <<set $Iron to $Iron - 1>> <<if !$ArmourySwords>> <<set $ArmourySwords to 0>> <</if>> <<set $ArmourySwords to $ArmourySwords + 1>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Melee Weapons/longbow.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Longbow</h3> <p>Ranged Weapon for Defending your castle</p> <p>Current Lowbows: $ArmouryLongbows</p> <p>Wood Required: 10</p> <<if $Wood gt 10>> <<button "Order contruction">> <<if !$ArmouryLongbows>> <<set $ArmouryLongbows to 0>> <</if>> <<set $ArmouryLongbows to $ArmouryLongbows + 1>> <<set $Wood to $Wood - 10>>>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Wood</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Melee Weapons/Piercing Arrow.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>50 Arrows</h3> <p>Arrows for defence</p> <p>Current Arrows: $ArmouryArrows</p> <p>Wood Required: 50</p> <<if $Wood >= 50>> <<button "Order contruction">> <<if !$ArmouryArrows>> <<set $ArmouryArrows to 0>> <</if>> <<set $ArmouryArrows to $ArmouryArrows + 50>> <<set $Wood to $Wood - 50>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Wood</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Melee Weapons/arrows.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>50 Corrupted Arrows</h3> <p>Arrows for defence which can corrupt enemy</p> <p>Current Corrupted Arrows: $ArmouryCorruptedArrows</p> <p>Wood Required: 50</p> <p>Souls Required: 1</p> <<if $Wood >= 50 and $Souls gt 0>> <<button "Order contruction">> <<if !$ArmouryCorruptedArrows>> <<set $ArmouryCorruptedArrows to 0>> <</if>> <<set $ArmouryCorruptedArrows to $ArmouryCorruptedArrows + 50>> <<set $Wood to $Wood - 50>> <<set $Souls to $Souls - 1>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient resources</button> <</if>> </div> <<if $AliceCorrupt is true and $AliceArmour isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Armour/gothic_plate_armor.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Alice's Armour</h3> <p>Gives Alice 25 extra health</p> <p>Iron Required: 2</p> <<if $Iron >= 2>> <<button "Order contruction">> <<set $LucyArmor to true>> <<set $Iron to $Iron - 2>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <</if>> <<if $LucyCorrupt is true and $LucyArmor isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Armour/gothic_plate_armor.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Lucy's Armour</h3> <p>Gives Lucy 25 extra health</p> <p>Iron Required: 2</p> <<if $Iron >= 2>> <<button "Order contruction">> <<set $LucyArmor to true>> <<set $Iron to $Iron - 2>> <<goto "Forge">> <</button>> <<else>> <button disabled>Insufficient Iron</button> <</if>> </div> <</if>> </div> <<button "Leave">> <<goto "Inside Castle">> <</button>> <</if>> <</nobr>>
<div class="text-box"> <<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/4.png">> <<if $Time >= 9>>Its too late, I need to go back to the [[castle|Base Intro]] <<else>> You see a path leading further into the [[woods|Forrest Path 2]] and a river<br><br> <<if $CurrentPlayer is "Overlord">> <<if $RiverUnlocked is false>><<You>>I should explore the forrest before I go down the river<</You>><<else>>Follow the [[River]]<</if>><br> <<if ($Gold >= 400) and ($Wood >= 300) and ($Stone >= 200) and ($LumberMillBuilt is false)>> <<You>>I could build a lumbermill here for wood production<</You>><br> <<if $Quests.includes("Build a Lumbermill")>> <<else>> <<script>> UI.alert("New Quest! <br>Build a Lumbermill"); <</script>> <<set $Quest1 to true>> <<run $Quests.push("Build a Lumbermill")>> <</if>> <<link "Build a lumber mill (costs 400 Gold, 300 Wood and 200 Stone)">> <<set $Gold to $Gold - 400>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<set $LumberMillBuilt to true>> <<script>> UI.alert("Quest complete! <br>You have constructed a lumbermill, you and post subjects here to work on wood production"); <</script>> <<run $Quests.delete("Build a Lumbermill")>> <<run Engine.play('LumberMill')>> <</link>><br><br> <<elseif $LumberMillBuilt is false>> <<if $Quests.includes("Build a Lumbermill")>> <<else>> <<script>> UI.alert("New Quest! <br>Build a Lumbermill"); <</script>> <<run $Quests.push("Build a Lumbermill")>> <</if>> <<You>>I could build a lumbermill here for wood production<</You>><br> You cannot afford to build a lumber mill (costs 400 Gold, 300 Wood and 200 Stone)<br><br><</if>> <<if $LumberMillBuilt is true>> Visit [[Lumber Mill|LumberMill]]<br><br><</if>> <br> <<if $VampireGameUnlocked is true>> <<link "Go back to the manor">> <<goto "ManorRevisit">> <</link>><br><br> <</if>> <<if $LockPicksUnlocked is true>> [[Search for villagers]]<br><br> <</if>> <<if $CultUnlocked is true>> [[Visit Vaelora's Coven|Cult]]<br><br> <</if>> <<if $EishethMet is true>> [[Visit Eisheth's cave|Eisheth]]<br><br> <</if>> <<if $ForestShackDiscovered is true>>Go to [[Forest Shack]]<br><br><<else>> There is a a dark force somewhere around here you should look for [[Search for it|ForestShackSearch]]<br><</if>> <<if $ForestMerchantDiscovered is true>>Go to [[Merchant]]<br><br><<else>> You know a travaling merchant has set up shop somewhere in the forest <<if $LucyCorrupt is true>> [[Find him|Merchant]]<br><br> <<else>><br><br> <</if>><</if>> <<if ($LucyMet is true) and ($LucQuestFinished is false)>>Vist Lucy's [[house|LucyHouse]]<br><br><</if>> <</if>> <<if $LucyCorrupt is true>> [[Scarldale]] village<br><br> <</if>> <<if $TavQuest is "Wolves">> <<if ($WolfQuestStatus is "FirstEncounter") or ($WolfQuestStatus is "Blacksmith") or ($WolfQuestStatus is "Weapon")>> You're not going near that wolf again without a better weapon<br><br> <<else>> <<if $WolfDead is true>><<else>> Search for those [[wolves Alexander told you about|WolvesQuest]]<br><br><</if>><</if>><</if>> <<if ($Quests.includes("deal with the bandits attacking caravans")) and ($CurrentPlayer is "Overlord")>> Search for those [[bandits Alexander told you about|BanditsQuest]]<br><br><</if>> <<if ($Quests.includes("Search for the thing near the crypts")) and ($CurrentPlayer is "Overlord")>>Search for the [[creature Alexander told you about|GhoulQuest]]<br><br><</if>> <<if $Quests.includes("Find Alice's father")>> [[Look for Alice's farther|AliceQuest]]<br><br> <</if>> <<button "Leave the forest">> <<goto "LucyBase">> <</button>> <</if>> <<set $Encounters to ["Treasure", "Encounter_Woman", "Encounter_Deer", "Encounter_Wood", "Encounter_Hunter", "Encounter_Huntress", "Encounter_Wolf", "Encounter_Bear"]>> <</nobr>> </div> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <<set $CloakDisabled to false>> <<addclass "#right-ui-bar" "stowed">> <<set $DeathCardPlayed to false>> <<set $ReturnPassage to passage()>>
<div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Bandits orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if $NPCCum >= 100>> The Bandits <video autoplay loop> <source src="Images/Forrest/Fuck/Finish/fcum.webm" type="video/webm"> <<set $NPCCum to 0>> </video> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Face") and ($Position != "Outside") and ($Position != "Inside")>> Your about to cum<br> <<link "Face">><<set $Position to "Face">><<run Engine.play('ForrestFuck')>><</link>><br> <<link "Outside">><<set $Position to "Outside">><<run Engine.play('ForrestFuck')>><</link>><br> <<link "Inside">><<set $Position to "Inside">><<run Engine.play('ForrestFuck')>><</link>><br> <</if>> <<if $Position is "Face">> <br>You pull out and cum on the woman's face<br><br> <video autoplay loop> <source src="Images/Forrest/Fuck/Finish/face.webm" type="video/webm"> </video> <<if $CellsCount > $DungonOccupance.length>> You finish with the Huntress, you can either [[kill]] or [[capture]] her <<else>> With no space in the dungeons, you [[kill]] the woman <</if>> <</if>> <<if $Position is "Outside">> <br>You pull out and cum on the woman's chest<br><br> <video autoplay loop> <source src="Images/Forrest/Fuck/Finish/outside.webm" type="video/webm"> </video> <<if $CellsCount > $DungonOccupance.length>> You finish with the Bandit, you can either [[kill]] or [[capture]] her <<else>> With no space in the dungeons, you [[kill]] the woman <</if>> <</if>> <<if $Position is "Inside">> <br>You push your cock deep inside and cum in her<br><br> <video autoplay loop> <source src="Images/Forrest/Fuck/Finish/inside.webm" type="video/webm"> </video> <<if $CellsCount > $DungonOccupance.length>> You finish with the Huntress, you can either [[kill]] or [[capture]] her <<else>> With no space in the dungeons, you [[kill]] the woman <</if>> <</if>> <<if ($PlayerCum lt 100) and ($NPCCum lt 100)>> <<if $Position == "Seduce">> <br><br>The bandit gives in to the domination spell and starts stripping <video autoplay loop> <source src="Images/Forrest/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Position == "BJ">> The bandit obediently sucks your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/bj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/bj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Fuck/bj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> You bend the bandit over and fuck her from behind <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Fuck/Behind/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> The bandit gets on top and rides your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Fuck/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Cul">> You go down on the bandit, enjoying both her holes <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/Cul/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/Cul/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Fuck/Cul/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Miss">> You push the bandit onto her back and fuck her <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/Miss/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/Miss/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Fuck/Miss/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Anal">> You push yourself into her tight ass <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Fuck/Anal/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Fuck/Anal/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src= "Images/Forrest/Fuck/Anal/2.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $PlayerCum lt 100>> <<link "Blowjob">><<set $Position to "BJ">><<set $PlayerCum to $PlayerCum + 8>> <<run Engine.play('ForrestFuck')>> <</link>><br> <<link "Cunnilingus">><<set $NPCCum to $NPCCum + 10>><<set $Position to "Cul">> <<run Engine.play('ForrestFuck')>> <</link>><br> <<link "Doggy Style">><<set $NPCCum to $NPCCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('ForrestFuck')>> <</link>><br> <<link "Missionary">><<set $NPCCum to $NPCCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Miss">> <<run Engine.play('ForrestFuck')>> <</link>><br> <<link "Cowgirl">><<set $NPCCum to $NPCCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('ForrestFuck')>> <</link>><br> <<link "Anal">><<set $NPCCum to $NPCCum + 15>><<set $PlayerCum to $PlayerCum + 20>> <<set $Position to "Anal">> <<run Engine.play('ForrestFuck')>> <</link>> <</if>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<div class="text-box"> <div id="game-container"> <div id="lock-image"> <svg width="300" height="300" viewBox="0 0 300 300"> <defs> <linearGradient id="lockGradient" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" style="stop-color:#666;stop-opacity:1" /> <stop offset="100%" style="stop-color:#333;stop-opacity:1" /> </linearGradient> </defs> <circle cx="150" cy="150" r="140" fill="url(#lockGradient)" /> <circle cx="150" cy="150" r="120" fill="#222" stroke="#444" stroke-width="5"/> <circle cx="150" cy="150" r="15" fill="#888" /> <rect id="pin" x="145" y="30" width="10" height="90" fill="gold" transform="rotate(0 150 150)" /> <circle cx="150" cy="150" r="20" fill="#444" stroke="#555" stroke-width="5"/> </svg> </div> <div id="controls"> <button id="rotate-left">↺ Rotate Left</button> <button id="rotate-right">↻ Rotate Right</button> <button id="try-unlock">Try to Unlock</button> </div> <div id="message"></div> <div id="hint"></div> <div id="attempts-left">Attempts Remaining: <span id="attempts-count">3</span></div> <div id="picks-left">Lock Picks Remaining: <span id="picks-count">$LockPicks</span></div> </div> <div id="retry-container" style="display: none;"> <button id="retry">Try with a new lock pick</button> </div> <div id="give-up"> <<link "Give up">><<goto "ForestExplore">><</link>> </div> <style> body { background-color: #2c3e50; color: #ecf0f1; } #game-container { text-align: center; font-family: Arial, sans-serif; padding: 20px; border-radius: 10px; } #lock-image { margin: 20px auto; } #controls { margin-top: 20px; } button { margin: 0 10px; padding: 10px 20px; font-size: 16px; background-color: #2980b9; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } button:hover { background-color: #3498db; } #message, #hint, #attempts-left, #picks-left { margin-top: 20px; font-size: 18px; font-weight: bold; } #hint { color: #bdc3c7; font-style: italic; } #attempts-left, #picks-left { color: #e74c3c; } #give-up, #retry-container { margin-top: 20px; font-size: 16px; } #give-up a { color: #e74c3c; text-decoration: none; } #give-up a:hover { text-decoration: underline; } </style> <<script>> $(document).ready(function() { let currentRotation = 0; let correctRotation = Math.floor(Math.random() * 360); let tolerance = 45; // Increased tolerance for much easier gameplay let attemptsLeft = 3; let picksLeft = Number(State.variables.LockPicks); function rotatePin(degrees) { currentRotation = (currentRotation + degrees + 360) % 360; $('#pin').attr('transform', `rotate(${currentRotation} 150 150)`); } function getHint() { const difference = (correctRotation - currentRotation + 360) % 360; if (difference > 180) { return "Try rotating left a bit."; } else { return "Try rotating right a bit."; } } function updateDisplays() { $('#attempts-count').text(attemptsLeft); $('#picks-count').text(picksLeft); } function resetLock() { currentRotation = 0; correctRotation = Math.floor(Math.random() * 360); attemptsLeft = 3; $('#pin').attr('transform', 'rotate(0 150 150)'); $('#controls').show(); $('#message').text(''); $('#hint').text(''); $('#retry-container').hide(); updateDisplays(); } $('#rotate-left').on('click', function() { rotatePin(-15); $('#hint').text(''); }); $('#rotate-right').on('click', function() { rotatePin(15); $('#hint').text(''); }); $('#try-unlock').on('click', function() { const difference = Math.abs(currentRotation - correctRotation); if (difference <= tolerance || difference >= 360 - tolerance) { $('#message').text('Success! You picked the lock and entered the home.'); $('#message').css('color', '#2ecc71'); $('#controls').hide(); $('#hint').hide(); $('#attempts-left').hide(); $('#picks-left').hide(); $('#give-up').hide(); setTimeout(function() { Engine.play("ForestStalkHall"); }, 2000); } else { attemptsLeft--; updateDisplays(); if (attemptsLeft > 0) { $('#message').text(`The lock didn't open. Try again.`); $('#message').css('color', '#e74c3c'); $('#hint').text(getHint()); } else { picksLeft--; State.variables.LockPicks = picksLeft; $('#message').text('Your lock pick broke!'); $('#message').css('color', '#e74c3c'); $('#controls').hide(); $('#hint').hide(); if (picksLeft > 0) { $('#retry-container').show(); } else { $('#message').text('You have no more lock picks left. You failed to open the lock.'); } } } updateDisplays(); }); $('#retry').on('click', function() { resetLock(); }); updateDisplays(); }); <</script>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>>
<div class="text-box"> <<nobr>> <<set $EncounterHappen to random(0, 9)>> <<set $WhichEncounter to random(0, 8)>> <<if $CurrentPlayer is "Overlord">> <<if $EncounterHappen <= 4>> <<switch $WhichEncounter>> <<case 0>> You find [[Treasure]] <<case 1>> <<if $LucyMet is false>> You encounter [[a woman|Encounter_Lucy]] <<else>> [[Continue|Forest Path 3]] <</if>> <<case 2>> You encounter [[a merchant|Merchant]] <<case 3>> You encounter [[a fallen tree|Encounter_Wood]] <<case 4>> You encounter [[a bandit|Encounter_Bandit]] <<case 5>> You encounter [[a bandit|Encounter_Female Bandit]] <<case 6>> You encounter [[a wolf|Encounter_Wolf]] <<case 7>> You encounter [[a bear|Encounter_Bear]] <<case 8>> You encounter [[a woman|StalkForest]] <</switch>> <<else>> <<if ($LucyMetInt gt 4) and ($LucyMet is false)>> <<if $Quests.includes("Find a way to hide your identity")>> [[Continue|Forest Path 3]] <<else>> You encounter [[a woman|Encounter_Lucy]]<</if>> <<else>> [[Continue|Forest Path 3]] <</if>> <</if>> <<elseif $CurrentPlayer is "LucyCloaked">> <<if $EncounterHappen <= 3>> [[A bandit stands in your way|Encounter_Bandit]] <<else>> [[Continue|Forest Path 3]] <</if>> <<else>> [[Continue|Forest Path 3]] <</if>> <</nobr>> </div> <<set $LucyMetInt to $LucyMetInt + 1>> <<set $ReturnPassage to passage()>>
<<nobr>> <<if $Position is "Lick">> <<set _Vid to 1>> <<set _Img to 1>> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "Finger">> <<set _Vid to 1>> <<set _Img to 1>> <<set $NPCCum to $NPCCum + 8>> <</if>> <<if $Position is "Miss">> <<set _Vid to random(1, 3)>> <<set _Img to random(1, 3)>> <<set $NPCCum to $NPCCum + 15>> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Cg">> <<set _Vid to random(1, 3)>> <<set _Img to random(1, 3)>> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Bj">> <<set _Vid to 1>> <<set _Img to 1>> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Hj">> <<set _Vid to 1>> <<set _Img to 1>> <<set $PlayerCum to $PlayerCum + 8>> <</if>> <<set $ImagePath to "Images/Forrest/Cult/Elizabeth/" + $Position + "/" + _Img + ".png">> <<set $VidPath to "Images/Forrest/Cult/Elizabeth/" + $Position + "/" + _Vid + ".webm">> <<if $Position is "Fcum">> <<set $VidPath to "Images/Forrest/Cult/Elizabeth/" + $Position + "/1.webm">> <</if>> <div class="text-box"> <<if $Position isnot "Fcum">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<else>> <<set $Position to $OldPosition>> <</if>> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br> <<if $NPCCum >= 100>> <<set $OldPosition to $Position>> <<set $Position to "Fcum">> <<link "She cums">><<set $NPCCum to 0>><<run Engine.show()>><</link>> <<elseif $PlayerCum >= 100>> <<if $PlayerCum lt 200>> <<set $HouseVisit to false>> You feel yourself getting close, you choose to cum: <br><br> <<set _Vid to 1>> <<set _Img to 1>> On her <<link "outside">><<set $Position to "Outside">><<set $PlayerCum to 200>> <<run Engine.show()>><</link>><br> In her <<link "mouth">><<set $Position to "Mouth">><<set $PlayerCum to 200>> <<run Engine.show()>><</link>><br> <<else>> [[Leave|Cult]] <</if>> <<else>> <<link "Keep going">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Change position">><<run Engine.play('Fuck Elizabeth')>><</link>> <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <<set _Img to random(1, 2)>> <<set $ImagePath to "Images/Forrest/Cult/Elizabeth/Ready/" + _Img + ".png">> <div class="text-box"> <<Elizabeth>>I'm all yours<</Elizabeth>><br><br> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <hr> Pleasure her<br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Finger her">><<set $Position to "Finger">><<run Engine.play('Fuck Elizabeth2')>><</link>> <hr> Fuck her<br> <<link "Get on top">><<set $Position to "Miss">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Let her ride you">><<set $Position to "Cg">><<run Engine.play('Fuck Elizabeth2')>><</link>> <hr> Pleasure Yourself<br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('Fuck Elizabeth2')>><</link>><br> <<link "Let her stroke you">><<set $Position to "Hj">><<run Engine.play('Fuck Elizabeth2')>><</link>> <hr> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Int <= 15>> You lay back and watch as she rides your cock, giving you view of her ass <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/1.webm" type="video/webm"><br> </video> Push her [[off|BossCrypt]] <br> <<link "Enjoy it">><<set $Int to 16>><<run Engine.play('FuckSuccubus')>><</link>> <</if>> <<if $Int == 16>> The succubus spins around and continues riding you <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/2.webm" type="video/webm"><br> </video> Push her [[off|BossCrypt]] <br> <<link "KEEP GOING">><<set $Int ++>><<run Engine.play('FuckSuccubus')>><</link>><br> Get on top and <<link "fuck her">><<set $Int to 19>><<run Engine.play('FuckSuccubus')>><</link>> <</if>> <<if $Int == 17>> You feel yourself getting close. <<Succubus>>Cum for me<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/3.webm" type="video/webm"><br> </video> Push her [[off|BossCrypt]] <br> <<link "CUM">><<set $Int ++>><<run Engine.play('FuckSuccubus')>><</link>> <</if>> <<if $Int == 18>> You cum deep inside her pussy <<Succubus>>Sooo Good<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/4.webm" type="video/webm"><br> </video> Your vision turns back as the succubus keep [[riding|SuccubusFightWin]] <</if>> <<if $Int == 19>> Pushing her back, you pin the succubus down and push yourself inside her <<Lucy>>Fuck yess<</Lucy>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Miss/1.webm" type="video/webm"><br> </video> You give up resisting as push yourself <<link "deeper">><<set $Int ++>><<run Engine.play('FuckSuccubus')>><</link>> <</if>> <<if $Int == 20>> You continue fucking the succubus as she pushes her breasts together, ready for you to cover her with your cum <<Succubus>>Cum on me!<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Miss/3.webm" type="video/webm"><br> </video> Unable to hold in any longer, you pull out and cum on the succubus's breasts <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Miss/4.webm" type="video/webm"><br> </video> <<Succubus>>Good Boy!<</Succubus>><br> You roll off the succubus and pass out while she plays with your cum [[black out|SuccubusFightWin]] <</if>> <</nobr>> </div>
<<if not def $playerX>> <<set $playerX to 0>> <<set $playerY to 0>> <<set _startCell to $dungeon[0][0]>> <<set $CryptLocation to $dungeonPaths['0-0']>> <<set $CryptSearchLogs to []>> <</if>> <<goto "CryptExplore">>
<div class="text-box"> <<nobr>> You drag yourself over to a pillar and pull yourself up.<br><br> The Succubus is gone<br><br> You look around, the crypt is empty except one thing...<br><br> [[a flower|Flower]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You charge at the figure, drawing your sword and raising it high, ready to deal the death blow<br><br> Sprinting at your target you close ground quickly but the target still doesn't move...<br><br> You get closer and your ready to strike<br><br> You put all your power into your blow, aiming for the neck of the figure<br><br> But, as soon as you swing you realise your only cutting air...<br><br> Your thrown off blance and stumble, rolling over <<link "Continue">><<run Engine.play('GhoulQuest2')>><</link>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You blink and look back at where your target was, except it is no longer there<br><br> looking around you realise you're alone...<br><br> You can hear whispers in the distance<br><br> <<link "Search for the ghoul">><<run Engine.play('GhoulQuest3')>><</link>><br><br> <<link "Flee">><<run Engine.play('Forrest Explore')>><</link>> <</nobr>> </div> <<set $Int to random(0, 1)>> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.2; audio.play(); }); <</script>>
<div class="text-box"> <<nobr>> You continue walking through the cemetery the whispers are getting louder<br><br> You get to a fork in the path<br><br> <<link "Go left">><<run Engine.play('GhoulQuestLeft')>><</link>><br><br> <<link "Go right">><<run Engine.play('GhoulQuestRight')>><</link>> <</nobr>> </div> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.4; audio.play(); }); <</script>>
<<nobr>> <div class="text-box"> Lilura hops onto the alter and straddles you, looking down at you<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/10.png" width="700" height="700"> </div><br><br> You try breaking free of your bonds, and they loosen slighly<br><br> <<Lilura>>Don't struggle, enjoy this... Relax... Give in to me<</Lilura>><br><br> Lilura lowers herself onto your face and everything turns <<link "black">><<fadeToPassage "GhoulQuestAlter3">><</link>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You slowly come back around and find the young woman facing away from you as she rides you<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Rcg/1.webm" type="video/webm"> </video><br><br> <<Lilura>>Fu- Yes!<</Lilura>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Rcg/2.webm" type="video/webm"> </video><br><br> <<Lilura>>Give it to me, give me everything you have<</Lilura>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Rcg/3.webm" type="video/webm"> </video><br><br> <<Lilura>>I'm going to drain you!<</Lilura>><br><br> [[Let her keep going|GhoulQuestAlter4]]<br><br> [[Snap out of it|GhoulQuestAlterResist]] </div> <</nobr>>
<<nobr>> <div class="text-box"> Lilura spins around and looks into your eyes as she slids back down your cock<br><br> You realise your now thrusting into her<br><br> <<Lilura>>That's it, let go<</Lilura>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cg/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cg/2.webm" type="video/webm"> </video><br><br> [[Push her back and fuck her|GhoulQuestAlter5]]<br><br> [[Push her back and try to run|GhoulQuestAlterResist]]<br><br> </div> <</nobr>>
<<nobr>> <div class="text-box"> With your remaining strength you grab the succubus and push her off you<br><br> <<Lilura>>Wait, what are yo...<</Lilura>><br><br> You stand over her and press the head of your cock into her, you push in deep into her and pull back out, savoring the feeling<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Miss/1.webm" type="video/webm"> </video><br><br> <<Lilura>>Oh-h such a good pet<</Lilura>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Miss/2.webm" type="video/webm"> </video><br><br> You slowly slide in and out of her wet cunt, unable to resist the feeling, you pick up the pace...<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Miss/3.webm" type="video/webm"> </video><br><br> You watch as the beautiful demons eyes rolls back as she orgasms<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/fcum.webm" type="video/webm"> </video><br><br> Your usual powers over woman have no effect on the demon, but she still loses herself to extacy for a few moments... Give you time to<br><br> [[You try to snap out of the trance|GhoulQuestAlterResist]]<br><br> [[Cum inside her|GhoulQuestAlterCum]] </div> <</nobr>>
<<nobr>> <div class="text-box"> Pushing deep into her, you feel yourself start to cum. You push deep and flood her with your seed<br><br> <<Lilura>>Yes cum inside me!<</Lilura>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Miss1.webm" type="video/webm"> </video><br><br> As your cum flows into her, you also feel your strength leave your body... You fight to keep strength, but its not enough<br><br> You stumble backward and fall over, watching as Lilura plays with the cum overflowing from her cunt<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Miss2.webm" type="video/webm"> </video><br><br> One last time... <<link "Everything turns black">><<fadeToPassage "GhoulQuestFailed">><</link>> <<set $Souls to 1>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You snap out of your trance and see your back in the crypt<br><br> Struggling at the robe keeping your arms and legs bound you try to slip one hand out of the bindings<br><br> Looking up you see the succubus riding your cock<br><br> <<Lilura>>Stop!<</Lilura>><br><br> You continue fighting to free your hands, remebering the dagger close to your head <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/15.png" width="700" height="700"> </div><br><br> <<Lilura>>Give in to me!<</Lilura>><br><br> She shouts, her voice now raspy and deep unlike her high pitched seductive voice from before...<br><br> You pull your hand free and reach for the blade, grabbing it and cutting your other hand free<br><br> <<Lilura>>No!<</Lilura>><br><br> [[Push her away|GhoulQuestPush]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You open your eye you feel cold<br><br> Looking around you realise you're back in the dark open room, except this time, you are laying on the cold floor in the centre of the roo,...<br><br> Looking towards your feet, you realise you're naked and your hands and feet are chained<br><br> You hear a giggle behind your head, you turn as best you can to look for whoever made the noise<br><br> Then you see her... the woman<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/4.png" width="700" height="700"> </div><br><br> <<Lilura>>Did you have a nice dream?<</Lilura>><br><br> She slowly starts to walk over to you<br><br> <<Lilura>>My name is Lilura... I've been waiting for you for soooo long<</Lilura>><br><br> She reaches the stone alter and stands over you<br><br> <<Lilura>>I've been luring mortal men down here for year's, one at a time they come and I show them a vision of what they want to see...<</Lilura>><br><br> <<Lilura>>Then I devour their souls<</Lilura>><br><br> She smiles and touches your cheek<br><br> <<Lilura>>They never fill me... I always want more and more... But you, you are the gift which keeps on giving<</Lilura>><br><br> She runs a finger down your chest and down to your cock<br><br> <<Lilura>>I must admit... I thought you would put up a bit more of a fight<</Lilura>><br><br> Your cock stiffens in her hand<br><br> <<Lilura>>But thats ok, you were delicious and you have so much more to give me!<</Lilura>><br><br> She leans down and runs her toung up your shaft<br><br> You look arround and see a rusted blade next to your head<br><br> <<Lilura>>Don't worry about that, right now... Relax and enjoy this while you can<</Lilura>><br><br> [[Try to break free|GhoulQuestAlter2]]<br><br> [[Let her continue|GhoulQuestAlter2]] </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Int lt 2>> <span style="color: red">Woman: Do you like getting your balls licked?</span><br><br> She doesn't wait for an answer and begins to expertly tease your balls<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Balls/1.webm" type="video/webm"> </video><br><br> You're eager to feel her sucking your cock, but this feels too good to pass on<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Balls/2.webm" type="video/webm"> </video><br><br> <<You>>Oh fuck<</You>><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Balls/3.webm" type="video/webm"> </video><br><br> <span style="color: red">Woman: I'm going to drain you</span><br><br> <<link "Continue">><<set $Int to 3>><<run Engine.show()>><</link>><br><br> [[Try to leave|GhoulQuestDoor]]<br><br> <</if>> <<if $Int is 3>> The young woman wastes no time<br><br> She allows you to stand before dropping to her knees and wrapping her lips around your cock<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Bj/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Bj/2.webm" type="video/webm"> </video><br><br> She pulls her mouth away from your cock with a satisfying pop sound, before playing with your balls again<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Balls/4.webm" type="video/webm"> </video><br><br> <span style="color: red">Woman: Are you going to cum for me?</span><br><br> [[Let her drain you|GhoulQuestCumMouth]]<br><br> [[Leave|GhoulQuestDoor]] <</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Quests.includes("Search for the thing near the cemetery in the swamp")>> <<goto "GhoulQuest">> <<else>> <<You>>I have no need to be here for now<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You entre the crypt as you do, you hear the door close behind you<br><br> Ahead of you there is a staircase, leading into darkness<br><br> [[Descend the staircase|GhoulQuestTunnel]] <audio autoplay> <source src="Audio/CryptDoor.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Int is 0>> <span style="color: red">Woman: Oh, hehe it's all yours</span><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cul/1.webm" type="video/webm"> </video> You burry your toung in her, the taste is unlike anything you have experienced before<br><br> You know something seems off but shes so good<br><br> <<link "Continue">><<set $Int to $Int + 1>><<run Engine.show()>><</link>><br><br> [[Let her suck you|GhoulQuestBlow]]<br><br> [[Go do the door|GhoulQuestDoor]] <</if>> <<if $Int is 1>> The girl turns over quickly and grabs your head, pulling you into her<br><br> <div align="centre">[img["Images/Forrest/Exploring/Cemetery/Lilura/Cul/3.webp"]]</div><br><br> <span style="color: red">Woman: Yesss, thats sooo good</span><br><br> <<link "Continue">><<set $Int to $Int + 1>><<run Engine.show()>><</link>><br><br> [[Let her suck you|GhoulQuestBlow]]<br><br> [[Go do the door|GhoulQuestDoor]] <</if>> <<if $Int is 2>> Without realising whats happend, you find yourself under her lapping up as much of her juices as possible<br><br> <div align="centre">[img["Images/Forrest/Exploring/Cemetery/Lilura/Cul/2.webp"]]</div><br> You can hear her moaning louder as she starts to cum, and you realise you are now moaning into her pussy<br><br> She screams and her body shakes and you tast her juices flow into your open mouth<br><br> She takes a moment to recover, before looking down at you<br><br> <span style="color: red">Woman: Very good, now its your turn</span><br><br> She gets off you and lowers herself to your cock, running a finger from the tip of your cock to the base<br><br> [[Run for the door|GhoulQuestDoor]]<br><br> [[Let it happen|GhoulQuestBlow]] <<set $Int to 0>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> Unable to resist... you look down at the woman as she returns to sucking your cock<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth1.webm" type="video/webm"> </video><br><br> You pull your cock from her mouth and stroke your self as she looks up at you, hungrily waiting<br><br> <span style="color: red">Woman: Yes thats it</span><br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth2.webm" type="video/webm"> </video><br><br> <<You>>Oh gods<</You>><br><br> You cum in her mouth, and feel your knees get weaker<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth3.webm" type="video/webm"> </video><br><br> The girl swallows your cum and goes back to sucking the head of your cock<br><br> You feel her draining you, taking more than just your seed<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth4.webm" type="video/webm"> </video><br><br> <span style="color: red">Woman: Thats it, good boy</span><br><br> Your knees give way and you fall to the ground...<br><br> <span style="color: red">Woman: The gods cant save you now</span><br><br> <<link "Everything turns black">><<fadeToPassage "GhoulQuestAlter">><</link>> <<if $Souls gt 1>><<set $Souls to $Souls - 1>><</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> You turn away from the woman and make a break for the door <span style="color: red">Woman: Wait, come back!</span><br><br> You reach the door and turn to look back at her<br><br> <span style="color: red">Woman: Please stay, Ill do anything</span><br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/9.png" width="700" height="700"> </div><br><br> <span style="color: red">Woman: We can do anything you like</span><br><br> [[Leave|GhoulQuestSuccubus1]]<br><br> <<link "Go back">><<set $Position to "GoBack">><<run Engine.show()>><</link>> <</if>> <<if $Position is "GoBack">> Unable to take a step closer to the door... You turn back to her<br><br> <span style="color: red">Woman: Yes, come over here</span><br><br> You walk back to her and lay on the [[Bed|GhoulQuestBlow]] <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You come back around and look up, seeing the succubus kneeling next to you<br><br> She has transformed, looking more demonic and powerful than before<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/14.png" width="700" height="700"> </div><br><br> <<Lilura>>Did you have fun? I did<</Lilura>><br><br> <<Lilura>>Thank you, you have given me everything I wanted... And now...<</Lilura>><br><br> She takes the rusty dagger laying next to you<br><br> <<Lilura>>Don't worry, I'll leave you with one soul, so you can refrom... That way, you can bring me more next time we meet...<</Lilura>><br><br> <<Lilura>>I'll also leave this area so you can tell those stupid mortals in the willage they are safe<</Lilura>><br><br> And with that, she runs the blade over your throat... blood flows from your kneck and mouth and you watch as the image of Lilura gets smaller, and darker... <<set $PlayerHealth to 0>> <<set $TavQuest to 3>> <<set $TavQuestName to "null">> <<set $ReplayQuestActive to false>> <<link "Die">> <<script>> UI.alert("Quest complete! <br>That didn't go the way you thought... but at least Lilura is gone, for now"); <</script>> <<run $Quests.delete("Search for the thing near the cemetery in the swamp")>> <<run Engine.play('Resporn')>> <</link>> </div> <</nobr>> <<set $TavQuestComplete to true>>
<<nobr>> <div class="text-box"> You continue through the gravestones before finding the enterance to a crypt...<br><br> You walk over to the crypt, realing the whispering has stopped<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/3.png" width="700" height="700"> </div> [[Enter|GhoulQuestCrypt]] </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to 0>> <span style="color: red">Woman: Yess, come closer</span><br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/9.png" width="700" height="700"> </div><br><br> She kneels on the bed givng you a full view of her lingerie before rolling over and presenting her glistening pussy<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Strip/1.webm" type="video/webm"> </video><br><br> [[Kneel and lick her|GhoulQuestCul]]<br><br> [[Let her suck you|GhoulQuestBlow]]<br><br> [[Go do the door|GhoulQuestDoor]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You entre a large open room, its dark but you can make something out...<br><br> Approaching the shape, you realise what it is... The same runes which summoned Eisheth<br><br> <div align="center"> <img src="Images/Forrest/Encounters/Cave/7.png" width="700" height="700"> </div> <<set $ScarldaleTavQuestCompleted to true>> <<link "You Pass Out">><<fadeToPassage "GhoulQuestSeduce">><</link>> </div> <</nobr>> <<set $Position to "null">>
<div class="text-box"> <<nobr>> <<if $Int == 0>> You take the left path continuing through the cemetery, but you notice the whispers are getting quieter... <<link "Go back">><<run Engine.play('GhoulQuest3')>><</link>> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.2; audio.play(); }); <</script>> <<else>> You get think you're getting closer and notice the whispers are getting louder... <<link "Continue">><<run Engine.play('GhoulQuestFind')>><</link>> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.6; audio.play(); }); <</script>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You push the demon away from you and cut the cord around your legs, scramberling to your feet<br><br> You turn to look at her, she stands before you in all her anger showing her true demonic self<br><br> <<Lilura>>Stupid fucking mortal!<</Lilura>><br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/16.png" width="700" height="700"> </div><br><br> <<Lilura>>You will submit to me!<</Lilura>><br><br> You feel Lilura try to invade your mind, showing you visions, trying to corrupt you to her [[will|slider mini game]] </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Int == 1>> You take the left path continuing through the cemetery, but you notice the whispers are getting quieter... <<link "Go back">><<run Engine.play('GhoulQuest3')>><</link>> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.2; audio.play(); }); <</script>> <<else>> You get think you're getting closer and notice the whispers are getting louder... <<link "Continue">><<run Engine.play('GhoulQuestFind')>><</link>> <audio id="myAudio" src="Audio/GhoulWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.6; audio.play(); }); <</script>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You come around, and find yourself sat in front of a beautiful woman<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/5.png" width="700" height="700"> </div> <span style="color: red">Woman: Hi</span><br><br> <<You>>Where am I?<</You>><br><br> <span style="color: red">Woman: You're in by bedroom sir</span> <br><br> <<You>>How did I get here?<</You>><br><br> <span class="red-text">Woman: Does it matter... You're here now, with me. Why don't you come over here you can keep me company</span><br><br> You look around the room, seeing a door behind you<br><br> <span style="color: red">Woman: Don't worry about the door, come to mey</span><br><br> [[Walk over to the door|GhoulQuestDoor]]<br><br> [[Walk over to her|GhoulQuestFuck1]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You open the door and step through... [[Step through the door|GhoulQuestAlterResist]] </div> <</nobr>>
<<nobr>> <div class="text-box"> At the bottom of the stairs, you find a tunnel, its just tall enough for you to walk through, you peer into the darkness and for a moment, you swear you can hear a girl laughing<br><br> [[Continue|GhoulQuestHall]] <audio autoplay> <source src="Audio/GirlLaugh.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> <</nobr>>
<div class="text-box"> <<nobr>> <audio id="backgroundAudio" loop> <source src="Audio/WalkingInForest.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> You explore the forest for a while, searching for your target... After some time, you realize you're now searching in the dark... Continuing in what you "think" is an easterly direction, you come across a cemetery <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/1.png" width="700" height="700"> </div> Creeping through the forest, eventually you see it... <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/2.png" width="700" height="700"> </div> <<set $CurrentEnemy to "Ghoul">> [[Attack with sword|GhoulMelee]] <<if $PlayerRangedWeapon is "Bow">>[[Attack with bow|Bow]]<</if>> <<set $Time to $Time + 9>> <</nobr>> </div>
<div class="text-box"> <<nobr>> Succubus Health: <progress @value=" $EnemyHealth" max="100"></progress><br> Your corruption: <progress @value=" $PlayerHealth" max="100"></progress><br> <<if ($PlayerHealth lt 100) and ($PlayerHealth gt 89)>> Unable to resist, you touch the succubus <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/2.webm" type="video/webm"> </video> [[Continue|SuccubusAttack]] <</if>> <<if $PlayerHealth lt 88>> Without knowing what your even doing, you push your fingers into her wet pussy <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/4.webm" type="video/webm"> </video> [[Continue|SuccubusAttack]] <</if>> <<set $PlayerHealth to $PlayerHealth - 10>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<Gnarlak>>My Lord?<</Gnarlak>> <<if $Quests.includes("Speak to Gnarlak about the farm")>> <<You>>I need you to come with me, to the forest<</You>> You both set out to the farm <<button "The farm">> <<goto "ForestFarmIntro">> <</button>> <<else>> <<You>>I found something in the forest<</You>> <<Gnarlak>>What was it?<</Gnarlak>> <<You>>I am not sure... It was like a wolf, but much larger and it stood like a man<</You>> <<Gnarlak>>Did it stand taller than you?<</Gnarlak>> <<You>>Yes<</You>> <<Gnarlak>>And it had the face of a wolf and the body of a man?<</Gnarlak>> <<You>>Yes<</You>><br><br> <<Gnarlak>>You're lucky to be alive lord, prehaps the werewolf was not hunting<</Gnarlak>> <<You>>A Werewolf?<</You>> <<Gnarlak>>Yes, Lord. An ancient curse which causes men to turn into beasts during the full moon<</Gnarlak>> <<You>>My sword glanced off, I didn't see it scratch the beast, how do I kill it?<</You>> <<Gnarlak>>They are weak to silver, we don't have a forge yet, but maybe you can find a black smith who can make you a weapon out of silver<</Gnarlak>> <<set $WolfQuestStatus to "Blacksmith">> <<link "Leave">> <<script>> UI.alert("New Quest!<br>Obtain a silver weapon"); <</script>> <<run $Quests.push("Obtain a silver weapon")>> <<run Engine.play('Inside Castle')>> <<set $SilverNeed to 5>> <</link>> <</if>> <</nobr>> </div>
<<nobr>> <<if $Question is "null">> <div class="intro-container"> <div class="intro-header"> <h1 class="intro-title">Return to Grimshade</h1> <div class="title-divider"></div> </div> <div class="intro-content"> <div class="intro-section prologue"> <p class="intro-text first-paragraph"> <span class="drop-cap">T</span>he gates of Grimshade Castle groan open at your touch, rust flaking from ancient hinges like dried blood. You step into what was once your mighty fortress, now a monument to decay. Twisted vines strangle the battlements, their thorns as long as daggers. The courtyard stones, once polished obsidian, lie cracked and overgrown with sickly moss that glows faintly in the gloom. </p> <p class="intro-text"> Wind howls through shattered windows, carrying the stench of rot and abandonment. Every shadow seems to whisper of the mob that dared defile your sanctum—peasants with their pitchforks and torches, thinking you defeated. </p> <p class="intro-text dramatic"> How wrong they were. </p> </div> <div align="center" style="margin: 20px 0;"> <img src="Images/Castle/Gnarlak/1.png" width="500" height="500" style="border: 3px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.6);"> </div> <div class="intro-section your-path"> <h2 class="section-title">Your Faithful Servant</h2> <p class="intro-text"> Through the rubble and ruin, a hunched figure emerges from the shadows, moving with surprising agility despite its gnarled appearance. </p> <<Gnarlak>>Lord! By the dark gods, you have returned! I knew this day would come!<</Gnarlak>><br> <p class="intro-text"> The creature drops to one knee, its voice cracking with emotion. Yellow eyes gleam with feverish devotion from beneath a tattered hood. </p> <<You>>Who are you, creature? And why do you linger in this tomb?<</You>><br> <<Gnarlak>>I am Gnarlak, my lord—your most faithful servant! For decades I have haunted these halls, keeping the vermin at bay, preserving what I could of your legacy. I never doubted... never lost faith that you would rise again!<</Gnarlak>><br> <p class="intro-text"> The goblin's clawed hands gesture desperately at the devastation around you. </p> <<You>>This place is a mockery of what it once was. My throne room is rubble, my towers have fallen...<</You>><br> <<Gnarlak>>Forgive me, master! I am but one old goblin against the ravages of time and those cursed villagers. Without gold, without workers... I could only watch as nature and looters claimed piece after piece.<</Gnarlak>><br> </div> <div class="intro-section the-challenge"> <p class="intro-text"> His eyes suddenly blaze with renewed purpose. </p> <<Gnarlak>>But now—NOW we can reclaim everything! Your return changes all! The old alliances can be reforged, the dark powers summoned once more!<</Gnarlak>><br> <<You>>Speak plainly, goblin. How do we restore my dominion?<</You>><br> <<Gnarlak>>Leave the logistics to me, dread lord! I know every stone of this castle, every secret passage. Bring me gold for bribes and workers, wood for scaffolding, stone for walls—and I shall orchestrate our resurrection! Your will made manifest through my humble claws!<</Gnarlak>><br> <p class="intro-text"> The goblin's enthusiasm is almost manic as he continues. </p> <<Gnarlak>>Some chambers yet endure, master! Your personal sanctum remains sealed—I've killed seventeen thieves who tried to breach it. The dungeons below still hunger for prisoners, and our defensive positions, while weakened, can be restored to their former terror!<</Gnarlak>><br> </div> </div> <div class="dialogue-options"> <<button "Tell me about the dungeons">><<set $Question to "Dungeon">><<run Engine.play('GnarlakEncounter')>><</button>> <<button "Tell me about the defences">><<set $Question to "Defences">><<run Engine.play('GnarlakEncounter')>><</button>> </div> </div> <</if>> <<if $Question is "Dungeon">> <div class="intro-container"> <div class="intro-content"> <div class="intro-section"> <h2 class="section-title">The Dark Dungeons</h2> <p class="intro-text"> Gnarlak's eyes light up with wicked glee, rubbing his gnarled hands together. </p> <<Gnarlak>>Ah, the dungeons! The cells still function, master—their walls seep with the dark corruption that breaks even the strongest wills. We have space for prisoners now, though we can expand to hold many more captives.<</Gnarlak>><br> <p class="intro-text"> He leans in conspiratorially, his voice dropping to a whisper. </p> <<Gnarlak>>The corruption of your castle still works its magic, my lord. Prisoners held within slowly bend to your will—their minds twisting, their loyalties shifting. Find the ancient Corruption Runes hidden in crypts to accelerate the process. Soon, captured villagers become devoted servants, enemy soldiers turn into loyal guards, and even noble maidens... well, they learn to serve in their own special ways.<</Gnarlak>><br> <p class="intro-text"> The goblin grins wickedly. </p> <<Gnarlak>>We can upgrade the dungeons, master—add more cells, build corruption chambers for faster breaking, even construct special rooms for your... personal attention to certain prisoners. Lucy and Alice, should you capture them, will require your direct involvement in their conversion.<</Gnarlak>><br> </div> </div> <div class="dialogue-options"> <<button "What about the defences">><<set $Question to "Defences">><<run Engine.play('GnarlakEncounter')>><</button>> <<button "We are done for now">><<set $Question to "Done">><<run Engine.play('GnarlakEncounter')>><</button>> </div> </div> <</if>> <<if $Question is "Defences">> <div class="intro-container"> <div class="intro-content"> <div class="intro-section"> <h2 class="section-title">Castle Defences</h2> <p class="intro-text"> Gnarlak's expression turns grim as he gestures toward the crumbling walls. </p> <<Gnarlak>>Word of your resurrection will spread like wildfire, master. Already, ravens carry whispers to nearby villages. Soon, the fools will come—zealous knights seeking glory, greedy thieves hunting treasure, virgin heroes thinking themselves destined to end your reign.<</Gnarlak>><br> <p class="intro-text"> He points a crooked finger at strategic positions around the courtyard. </p> <<Gnarlak>>We can build defences, my lord—up to five defensive positions when fully upgraded. Trap doors that drop invaders into spike-filled pits, arrow traps that pierce multiple enemies, even summon Guardians to defend our halls. The tentacle trap is particularly... effective against female intruders.<</Gnarlak>><br> <p class="intro-text"> The goblin's eyes gleam with anticipation. </p> <<Gnarlak>>Each defence room can be customized to your needs. Place Lucy or Alice there once corrupted, and they'll use their succubus powers to seduce and drain attackers. Build standard traps for quick kills, or more elaborate ones to capture enemies alive for your dungeons. The choice is yours, master.<</Gnarlak>><br> </div> </div> <div class="dialogue-options"> <<button "Tell me about the dungeons">><<set $Question to "Dungeon">><<run Engine.play('GnarlakEncounter')>><</button>> <<button "We are done for now">><<set $Question to "Done">><<run Engine.play('GnarlakEncounter')>><</button>> </div> </div> <</if>> <<if $Question is "Done">> <div class="intro-container"> <div class="intro-content"> <div class="intro-section"> <h2 class="section-title">Your Dark Domain Awaits</h2> <p class="intro-text"> Gnarlak bows deeply, his joints creaking like old door hinges. </p> <<Gnarlak>>Of course, dread lord. Reacquaint yourself with your domain—walk the halls that once trembled at your footsteps. I shall lurk in the shadows, ready to serve. Though these old bones can no longer wield sword or spell, my mind remains sharp for strategy and my knowledge of every secret passage and hidden cache remains yours to command.<</Gnarlak>><br> <p class="intro-text"> He gestures toward the castle's dark interior with reverent enthusiasm. </p> <<Gnarlak>>Each chamber holds memories of your former glory, master. Visit them all—let the stones remember their true lord. The throne room may be rubble, but power is not found in chairs... it lives in the one who dares to take it.<</Gnarlak>><br> </div> </div> <div class="intro-footer"> <<button "Begin exploring the castle">> <<script>> UI.alert("New Quest! <br>Visit each area of the castle to assess the damage and plan your dark resurrection"); <</script>> <<set $Quest1 to true>> <<run $Quests.push("Visit each area of the castle")>> <<run Engine.play('Base Intro')>> <</button>> </div> </div> <</if>> <</nobr>> <style> .intro-container { max-width: 900px; margin: 0 auto; padding: 30px; background: linear-gradient(180deg, rgba(0,0,0,0.95) 0%, rgba(139,0,0,0.2) 100%); border: 3px solid #8B0000; border-radius: 15px; box-shadow: 0 0 30px rgba(139,0,0,0.6), inset 0 0 50px rgba(0,0,0,0.8); color: #E0E0E0; font-family: 'Georgia', serif; } .intro-header { text-align: center; margin-bottom: 40px; } .intro-title { font-size: 48px; color: #8B0000; text-shadow: 0 0 20px #8B0000, 3px 3px 6px #000; letter-spacing: 4px; margin-bottom: 20px; animation: titleGlow 3s infinite; } @keyframes titleGlow { 0%, 100% { text-shadow: 0 0 20px #8B0000, 3px 3px 6px #000; } 50% { text-shadow: 0 0 40px #DC143C, 5px 5px 10px #000; } } .title-divider { width: 200px; height: 3px; background: linear-gradient(90deg, transparent 0%, #8B0000 50%, transparent 100%); margin: 0 auto; } .intro-content { line-height: 1.8; } .intro-section { margin-bottom: 35px; padding: 20px; background: rgba(0,0,0,0.3); border-radius: 10px; border-left: 3px solid #8B0000; } .section-title { font-size: 28px; color: #FFD700; text-shadow: 2px 2px 4px #000; margin-bottom: 15px; text-align: center; } .intro-text { font-size: 16px; margin-bottom: 15px; text-align: justify; } .first-paragraph { font-size: 18px; } .drop-cap { float: left; font-size: 72px; line-height: 60px; padding-right: 8px; margin-top: -3px; color: #8B0000; text-shadow: 3px 3px 6px #000; font-weight: bold; } .dramatic { font-style: italic; color: #CD853F; font-size: 17px; } .intro-footer { text-align: center; margin-top: 40px; padding-top: 30px; border-top: 2px solid #8B0000; } .footer-text { color: #CD853F; font-style: italic; font-size: 20px; margin-bottom: 20px; text-shadow: 2px 2px 4px #000; } .intro-footer button { padding: 15px 40px; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700; border: 2px solid #8B0000; border-radius: 5px; font-size: 20px; font-weight: bold; cursor: pointer; transition: all 0.3s; text-shadow: 1px 1px 2px #000; text-transform: uppercase; letter-spacing: 2px; margin: 0 10px; } .intro-footer button:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000; box-shadow: 0 0 30px rgba(255,215,0,0.8); transform: scale(1.05); } .dialogue-options { text-align: center; margin-top: 20px; padding-top: 20px; border-top: 1px solid #8B0000; } .dialogue-options button { padding: 10px 20px; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700; border: 2px solid #8B0000; border-radius: 5px; font-size: 15px; font-weight: bold; cursor: pointer; transition: all 0.3s; text-shadow: 1px 1px 2px #000; margin: 0 5px; } .dialogue-options button:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000; box-shadow: 0 0 15px rgba(255,215,0,0.6); transform: scale(1.05); } </style>
<div class="text-box"> <<nobr>> You look around and see that you had an audiance for this fight. Villagers are stairing at you in horror<br><br> The people of Scaldale will remeber what you have done here, your influence over scarldale is slipping<br><br> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> [[return to the castle|Base Intro]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<include "GuardSeduceLines">> <<set _imagePath to $ImagePath>> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <div class="text-box"> <<set _int to random(0, 1)>> <<if $Int is 2>> <<if _int is 0>> With a grin, the guard kneels down and burrys his face in your ass<br><br> <<set _img to random(1, 3)>> <<set $path to "Images/Raids/Lucy/Rim/" + _img + ".png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div> <br><br> <<Lucy>>Oh, such a gentleman<</Lucy>><br><br> You feel him moan into you and you bend over to give him better access<br><br> A moment later, the second guard stands before you and presents his manhood, you take it in your mouth<br><br> You focus on his pleasure and don't notice the man behind you stopping and pressing his hard cock into your waiting cunt<br><br> <<set _path to "Images/Raids/Lucy/Spit/4.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> Enjoying the feeling of bring used by two strangers for nothing more than their own enjoyment, you wriggle out of your dress while being used at both end <</if>> <<if _int is 1>> Both men approach you and help you out of your clothing, you feel them enjoy your body before they gently guide you to your knees. You get on all fours and excitedly wait as one man moves behind you and the other steps infront<br><br> <<set _img to random(1, 3)>> <<set $path to "Images/Raids/Lucy/Spit/" + _img + ".png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div><br><br> You moan onto one cock as another enters you, for a moment you are lost in the sensations and you forget why you are here in the first place. The feeling of two rough men using you exciting your corrupt mind<br><br> <</if>> After some time, of being lost in pleasure. You hear the men walking<br><br> <<say 'Guard 2' _imagePath>>Want a go with her mouth?<</say>><br><br> <<say 'Guard 1' _imagePath>>No, but you can use her cunt if you like, I'm going to break in her ass<</say>><br><br> Although being vulger, the though of both your holes being fills excites you, and you feel the cock in your throat slid out with a pop<br><br> You catch your breath, and a moment later yous small naked frame if lifted into the air by the powerful man behind you, and he slides your ass onto his cock<br><br> You gasp, sucking in air just as the first guard positions himself and pushes into your cunt<br><br> <<Lucy>>Fu..<</Lucy>><br><br> <<set _path to "Images/Raids/Lucy/2.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> Unable to speak, unable to think, you let out a low gutteral moan<br><br> <<else>> <<if _int is 0>> <<say 'Guard 2' _imagePath>>Why don't you get down on your knees for us<</say>><br><br> <<Lucy>>Umm ok, anything for the hard working guards<</Lucy>><br><br> You sink to your knees and quickly get to work enjoying both the men<br><br> <<set _path to "Images/Raids/Lucy/2BJ/1.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<say 'Guard 1' _imagePath>>F-Fuck even the whores at Harbours End can't suck like you<</say>><br><br> You wriggle out of your dress, letting it drop to the floor<br><br> <<else>> The men surround you and run their hands over your body, they both seem more nervous than you<br><br> <<say 'Guard 1' _imagePath>>Have you ever been with two men before?<</say>><br><br> You pause, legitimately needing to think as your new life has been filled with pleasure<br><br> <<Lucy>>No, never<</Lucy>><br><br> They both help you out of your dress, almost tearing at it in their excitement<br><br> You drop to your knees and look up at them, ready to service them, and fool them<br><br> <<set _path to "Images/Raids/Lucy/1.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<Lucy>>So, who's first?<</Lucy>><br><br> <</if>> The men take turns using your mouth and you hungrly service them, giving them the illusion that they are in control <<set _path to "Images/Raids/Lucy/2BJ/2.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<set _int to random(0, 1)>> <<if _int is 0>> While focusing your attention on one of the guards, you feel the other slightly lift your ass, as he positions himself below you<br><br> You realise what he is doing as he pulls you back down onto his cock<br><br> <<set _img to random(5, 6)>> <<set $path to "Images/Raids/Lucy/" + _img + ".png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div><br><br> <<set _act = either(_threesomeCGBJLines)>> _act<br><br> <<set _line = either(_menDialogue)>> <<say 'Guard 1' _imagePath>>_line<</say>><br><br> <<else>> <<set _act = either(_doublePenetrationLines)>> _act<br><br> <<set _img to random(7, 8)>> <<set $path to "Images/Raids/Lucy/" + _img + ".png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div><br><br> <<set _line = either(_menDialogue)>> <<say 'Guard 2' _imagePath>>_line<</say>><br><br> <</if>> The men both start to grunt and moan...<br><br> <<button "Take their souls">> <<set $Position to "2men">> <<goto "GuardNPCKill">> <</button>><br><br> <<button "Spare them">> <<set $Position to "2men">> <<goto "GuardNPCSpare">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> Both men use you until they are spent, not realing your corrpting influence has taken its tole... <<Lucy>>Thanks boys... You were amazing. Now, leave this place and do not return, my master will be sending forces here soon and I don't want my new favorate toys getting hurt<</Lucy>><br><br> <<say 'Guard 2' _imagePath>>Yes... Mistress<</say>><br><br> <<button "Leave">> <<goto "LucyScout">> <</button>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _guardsRemoved to 0>> /* First check buildings for guards */ <<for _buildingId, _building range _location.populatedBuildings>> <<for _npc range _building>> <<if _npc.armor === "Light Armor" && _guardsRemoved < 2>> <<set _index = _building.findIndex(n => n.NPCID === _npc.NPCID)>> <<run _building.splice(_index, 1)>> <<set _guardsRemoved++>> <</if>> <</for>> <</for>> /* Then check outdoor NPCs if we still need to remove guards */ <<if _location.outdoorNPCs && _guardsRemoved < 2>> <<for _npc range _location.outdoorNPCs>> <<if _npc.armor === "Light Armor" && _guardsRemoved < 2>> <<set _index = _location.outdoorNPCs.findIndex(n => n.NPCID === _npc.NPCID)>> <<run _location.outdoorNPCs.splice(_index, 1)>> <<set _guardsRemoved++>> <</if>> <</for>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<include "GuardSeduceLines">> <<set _imagePath to $ImagePath>> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> /* Get the NPC's building */ <<set _buildingId = $currentNPC.building>> /* Get all NPCs living in that building with safety checks */ <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<set _housemates = _location.populatedBuildings[_buildingId]>> <<set _totalResidents = _housemates.length>> <</if>> <div class="text-box"> <<if _totalResidents is 1>> You enter a small room, theres a fire and small iron cell, other than that you are alone with the guard<br><br> The guard wastes no time, and begins to enjoy your body, lifting yourt dress and feeling your ass<br><br> <<set $path to "Images/Raids/Lucy/Strip/5.png">> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div> <br><br> <<button "Continue">> <<goto "GuardNPCSolo">> <</button>> <<else>> <<if $Int is 0>> You enter a small room, theres a fire and small iron cell. You hear a voice call out<br><br> <<say 'Guard 2' _imagePath>>What did this one do?<</say>><br><br> Another guard stands in the middle of the room<br><br> <<say 'Guard 1' _imagePath>>Nothing, we were chatting outside<</say>><br><br> <<say 'Guard 2' _imagePath>>So? Why is she in here, this is off limts to the villagers<</say>><br><br> <<say 'Guard 1' _imagePath>>She says she want's to show her... appreciation<</say>><br><br> <<say 'Guard 2' _imagePath>>Is that so?<</say>><br><br> He walks over to you and takes in the view of your body<br><br> <<button "Slip your dress of your sholder">> <<set $Int to 1>> <<set _img to random(1, 2)>> <<set $path to "Images/Raids/Lucy/Strip/" + _img + ".png">> <<goto "GuardNPCSeduce">> <</button>><br> <<button "Bend over and show him whats under your dress">> <<set $Int to 2>> <<set _img to random(3, 4)>> <<set $path to "Images/Raids/Lucy/Strip/" + _img + ".png">> <<goto "GuardNPCSeduce">> <</button>><br><br> <</if>> <<if $Int is 1>> <<set _act = either(_exposeBreast)>> <<set _line = either(_LucyStrip)>> _act<br><br> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div> <br><br> <<Lucy>>_line<</Lucy>><br><br> <</if>> <<if $Int is 2>> <<set _act = either(_exposeAss)>> <<set _line = either(_LucyBendOver)>> _act<br><br> <div class="Random-image"> <<set _path to $path>> <img @src=_path alt="Guest Image"> </div> <br><br> <<Lucy>>_line<</Lucy>><br><br> <</if>> <<if $Int isnot 0>> The second guard reaches a hand out to you and the first guard, who you met outside protests<br><br> <<say 'Guard 1' _imagePath>>Oi, she's here for me. You want some action, visit the whore house<</say>><br><br> The second guard looks frustrated<br><br> <<say 'Guard 2' _imagePath>>I am sure, the young lady won't mind entertaining both of us?<</say>><br><br> They both look at you<br><br> <<button "Say he can stay">> <<goto "GuardNPC3Sum">> <</button>><br> <<button "Decline and focus on first guard">> <<set $Position to "Decline">> <<goto "GuardNPCSolo">> <</button>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _imagePath to $ImagePath>> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <div class="text-box"> <<if $Position is "Throat">> You watch his powerful body strip out of his armor and clothes<br><br> <<Lucy>>I want you to start with my throat<</Lucy>><br><br> He gives you a dark grin and steps over to you, lifting you into the air and laying you over a table, before walking around to your head<br><br> He lifts one knee onto the tabe and you see his huge cock line up with your head. You lift your chin to line your mouth up with him and stick out your tounge<br><br> <<Lucy>>Feed m...<</Lucy>><br><br> his cock slides into your mouth cutting you off. You jaw streches and you cough and splutter, smeering more fluid around his cock and your face<br><br> <<set _path to "Images/Raids/Lucy/TF/2.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<Lucy>>Mph!<</Lucy>><br><br> <<say 'Guard' _imagePath>>Moan for me slut, it feels great<</say>><br><br> <<Lucy>>mmm mmm<</Lucy>><br><br> <<say 'Guard' _imagePath>>Ha, fucking whore...<</say>><br><br> He rips open your dress to play with your breasts, giving them a squeese before going back to filling your throat. Lost in the pleasure, you touch your soaking wet cunt<br><br> <<set _path to "Images/Raids/Lucy/TF/1.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> After a few minuets of getting very little air, he pulls away from you. You protest to this and suck hard on his cock, it pops out of your mouth and you let out a moan of disappointment<br><br> <<Lucy>>Oh come on, I was getting close!<</Lucy>><br><br> You stand up, ready to protest but he places a finger over your lips, the surprising delicacy of it, silences you<br><br> <<set $Position to "Pussy">> <</if>> <<if $Position is "Slow">> You step closer, and place your hand on his crotch and look up at him, whispering softly<br><br> <<Lucy>>Slow down big boy<</Lucy>><br><br> You squeeze his crotch gently, feeling something swell beneath his clothes<br><br> <<Lucy>>We've got a lot of time to get to know each other, why don't we take it slow first?<</Lucy>><br><br> Taking his silence as acceptance, you begin slowly unfastening his armor and stripping him of his clothes, he watches you do this<br><br> After a few minues, you stand before the huge man and take in his impresive naked form, before sinking your knees and taking his cock between your lips<br><br> <<set _int to random(1, 4)>> <<set _path to "Images/Raids/Lucy/BJ/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> He watches, you silently for a few minuets, judging your skills. You take this as a challenge and use your new powers to push things further. This comes as a shock to the man and he lets out a moan<br><br> Enjoying yourself a little too much, you start to make a mess, fluid from both of you runs down your chin and throat. You slip your dress off your sholders to avoid ruining it<br><br> <<set _path to "Images/Raids/Lucy/BJ/5.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> The man takes the back of your head and pulls you in till your nose touches his torso... Clearly he's loosing control of himself. After a moment held there, cock streaching open your mouth and throat, he lets you go. <br><br> <<say 'Guard' _imagePath>>Im impressed... None of these local girls suck like you<</say>><br><br> <<Lucy>>Well... "cough* It's not every day - *gasp* - I get such a big strong toy like you to play with<</Lucy>><br><br> <<say 'Guard' _imagePath>>You have this the wrong way round... You're my little play thing today and I plan to break you. Come, see how strong I am<</say>><br><br> With that, he lifts you off the floor, your dress falls away as he spins you around and pulls you in tight<br><br> <<set _path to "Images/Raids/Lucy/3.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> You don't have time to get your barings before his cock is back in your mouth, you feel his hips start to thrust as he fucks your face and you moan onto him<br><br> Fighting to keep focus, you continue servicing him as his huge arms clamp around your waist, pulling you to his mouth and he roughly laps at your mound<br><br> After a few minuets of blood (and pre-cum) rushing to your head, he flips you back around and lets you go. For a moment, you stumble - legs feeling numb<br><br> <<set $Position to "Pussy">> <</if>> <<if $Position is "Pussy">> <<say 'Guard' _imagePath>>I'd say you're ready, he says walking behind you<</say>><br><br> <<Lucy>>For wh...<</Lucy>><br><br> A strong arm presses to your back while another hand takes your hip, forcing you to bend over chest pressing down onto a rough wooden table. You feel the head of his large cock at the entrance to your pussy<br><br> <<Lucy>>Break me<</Lucy>><br><br> You say as his pushes deep into you<br><br> <<set _path to "Images/Raids/Lucy/Behind/4.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> The force of being hammered from behind causes the large wooden table to creak and shift. To keep you from moving, the guard grabs your hair and pulls back, lifting you up slightly and allowing your sluttly moans to be even louder<br><br> <<set _int to random(5, 6)>> <<set _path to "Images/Raids/Lucy/Behind/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<Lucy>>F-F... GOD's!<</Lucy>><br><br> The room is filled with the sounds of him hammering into you, your high pitches moans mix with the deep grunts coming from the beast of a man behind you<br><br> <<say 'Guard' _imagePath>>Get ready slut, I-I'm cumming<</say>><br><br> He manhood somehow pushes even deeper and you both moan out as it starts to throb, in the bluriness of this extacy, you try to make a desition<br><br> <<button "Spare him">> <<set $Position to "Spare">> <<goto "GuardNPCSolo2">> <</button>><br><br> <<button "Feed on his soul">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$currentNPC.building]>> /* Remove NPC from their building */ <<if _building>> <<set _index = _building.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _index !== -1>> <<run _building.splice(_index, 1)>> <</if>> <</if>> /* Remove from outdoor NPCs if they're outside */ <<if _location.outdoorNPCs>> <<set _outdoorIndex = _location.outdoorNPCs.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _outdoorIndex !== -1>> <<run _location.outdoorNPCs.splice(_outdoorIndex, 1)>> <</if>> <</if>> <<set $currentNPC to null>> <<set $Position to "Kill">> <<goto "GuardNPCSolo2">> <</button>><br><br> <</if>> <<if $Position is "Spare">> You allow the man to live for another day and focus on the pleasure as you cum together<br><br> After the longest moment, his cock pulsing inside you, and your pussy returning the pleasure, squeezing around him, he slide out of you and takes a step back<br><br> <<set _path to "Images/Raids/Lucy/10.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> The man is silent, letting you fall to your knees as you loose feeling. He walks over to a chair, sits down and pours himself a clear grain sprits which he sips while watching you, sprawled on the floor<br><br> Having caught your breath, you crawl towards him. He watches you, curiously as you move over to him on your hands and knees<br><br> <<say 'Guard' _imagePath>>What are you doing?<</say>><br><br> You crawl up to him till your head is by his crotch, you breath deeply, taking in the sent of both you and him, before you run your tounge over his balls, and then suck then into your mouth<br><br> <<set _path to "Images/Raids/Lucy/BJ/6.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<say 'Guard' _imagePath>>Ahh fuck thats goood<</say>><br><br> You suck on his balls, rolling them in your warm wet mouth, enjoying his taste and sent while his cock rests on your face<br><br> <<Lucy>>I just needed to thank these big balls for all the cum they gave me<</Lucy>><br><br> He sips at his drink and watches you, as you lap up the fluid around his cock, tasting both your juices<br><br> <<say 'Guard' _imagePath>>God's you're a slut<</say>><br><br> <<Lucy>>You have no idea, but I should be going now, Thanks<</Lucy>><br><br> You stand slowly, and dress yourself before leaving the man<br><br> <<button "Back to the settlement">> <<goto "LucyScout">> <</button>> <</if>> <<if $Position is "Kill">> The guard floods your cunt with his seed, you moan together as you both cum<br><br> You take his moment of weekness to take everything you can from him, draining his souls. Behind you, you hear him sigh and then a crash as his huge form falls backwards onto the floor<br><br> <<set _path to "Images/Raids/Lucy/10.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> You sink to the floor and sit there, enjoying the pleasure you just experianced<br><br> <<set _int to random(11, 12)>> <<set _path to "Images/Raids/Lucy/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> <<button "Back to the settlement">> <<goto "LucyScout">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/1.png">> <<include "GuardSeduceLines">> <<set _imagePath to $ImagePath>> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <div class="text-box"> <<set _int to random(0, 1)>> <<Lucy>>Now we're alone, what would you like to do?<</Lucy>> The man drops to his knees before you and brings his face to your cunt<br><br> <<if _int is 0>> <<set _path to "Images/Raids/Lucy/4.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<else>> The man drops to his knees and pushes is face into your ass, exploring both your holes with his tounge<br><br> <<set _int to random(1, 3)>> <<set _path to "Images/Raids/Lucy/Rim/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <</if>> <<Lucy>>Oh, you're such a gentleman<</Lucy>> The man pulls away from you<br><br> <<say 'Guard' _imagePath>>Oh... Im no gentleman, Im just warming you up<</say>><br><br> He stands, towering over you<br><br> <<say 'Guard' _imagePath>>I'll show you how the guard use sluts like you... What would you like me to break first? Your throat or your cunt?<</say>><br><br> You look at him, sensing his physical strength, the power to snap your mortal form like dry firewood, and it excites you<br><br> With a rye smile, you:<br> <<button "Let him fuck your pussy">> <<set $Position to "Pussy">> <<goto "GuardNPCSolo2">> <</button>><br> <<button "Let him fuck your throat">> <<set $Position to "Throat">> <<goto "GuardNPCSolo2">> <</button>><br> <<button "Slow things down a bit">> <<set $Position to "Slow">> <<goto "GuardNPCSolo2">> <</button>><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You are caught between them, bodies colliding in a desperate, primal rhythm. They groan your name, their hands gripping your hips, driving deep inside you, their pleasure overwhelming. You feel their pulses quicken, their releases building, their souls laying bare before you. The hunger stirs, whispering for you to take everything. But, you do not. Instead, you let them spill inside you, their bodies shuddering against yours as they collapse, drained but alive, left with nothing but pleasure and the memory of you<br><br> <<say 'Guard 2' _imagePath>>...Gods<</say>><br><br> <<Lucy>>Yeah... Anyway, good bye gentlement!<</Lucy>><br><br> <<if $Position is "Kill">> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> <<button "Leave">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _exposeBreast = [ "You let out a soft, breathy sigh as the silky fabric slips from your shoulder, baring the soft curve of your breast to their hungry eyes", "With a slow, teasing motion, you allow the strap of your dress to slide down your arm, exposing one perfect, supple breast to the air, your nipple already tightening under their gaze", "The delicate fabric slides from your shoulder, inch by inch, until one breast is completely exposed—soft, inviting, and begging to be touched", "The dress falls just enough to expose one perfect breast, your fingers ghosting over the sensitive skin as if daring them to do the same", "A coy little giggle escapes your lips as you adjust your dress, letting it dip just enough to bare one soft, inviting breast. your eyes gleaming with mischief as you watch their reactions", "You sigh dramatically, letting the dress slip down just a little further, your bare skin glowing under the dim light, your nipple hardening as if begging for attention" ]>> <<set _LucyStrip = [ "Oops… I guess it’s too late to be modest now, isn’t it?", "You two look so… tense. Maybe I can help you relax?", "Mmm, you’re both so strong… Do you ever wonder what it would feel like to have a woman completely at your mercy?", "It’s so warm in here… or is it just the way you’re both looking at me?", "You’re staring… Do you like what you see?", "I’m all alone with two powerful men… I wonder what you’ll do to me?", "I shouldn’t be here, should I? But something tells me neither of you wants me to leave…", "You can touch me, you know. I won’t tell if you won’t~", "I feel so exposed… Maybe you should help me out of the rest?" ]>> <<set _exposeAss = [ "With a teasing hum, you lift the hem of your skirt, just enough to expose the round, perfect shape of your ass, the soft flesh begging to be grabbed.", "Your movements are slow and deliberate as you bend over, your skirt riding up to reveal the sinful curve of your ass", "You glance over your shoulder, biting your lip as you lift your skirt, showing them the tantalizing sight of your bare ass", "With a mischievous smirk, you arch your back, lifting the fabric just enough to expose your round, perky ass, your hips swaying ever so slightly as if daring them to touch", "Your fingers trail up your thigh as you lift your skirt, the sight of your bare, flawless ass making it impossible for them to look anywhere else", "Your back arches as you bend forward, the skirt slipping higher until the full, delicious curve of your ass is revealed", "You hum innocently as you adjust your skirt, but instead of fixing it, you lift it higher, exposing the round, perfect shape of your ass, as if inviting them to do something about it" ]>> <<set _LucyBendOver = [ "Do you like watching, or would you rather use your hands?", "I hope you don’t mind a naughty girl showing off a little skin", "You’re both staring so hard. Should I give you a closer look?", "Mmm, I bet you’re imagining all the things you could do to me right now", "Would you prefer if I got on my knees instead?" ]>> <<set _threesomeCGBJLines = [ "You moan around his cock as your hips grind down, your body caught between the two men, taking them both like you were made for it.", "The man beneath you grips your hips, thrusting up into your soaked heat while you bob your head, your tongue teasing along the length of the cock filling your mouth.", "Your moans vibrate around the thick shaft between your lips as the man beneath you groans, his hands gripping your ass, helping you ride him harder.", "Your tongue swirls around the swollen tip in your mouth while your hips roll down onto the cock buried inside you, the pleasure overwhelming every inch of your body.", "One man's cock stretches you deliciously as you sink down onto him, your mouth working the other in slow, teasing strokes, making them both groan in pleasure.", "The grip on your hair tightens as you take him deeper, your body shuddering as the man beneath you thrusts up, filling you over and over again.", "Saliva drips from your lips as you suck him greedily, your pussy tightening around the cock inside you, desperate for more.", "Your nails dig into his thighs as you take him to the back of your throat, moaning around his length while the man beneath you pounds into you from below.", "You're lost in sensation, your mouth stretched around thick, throbbing heat while your hips slam down, feeling utterly consumed by the pleasure of being filled at both ends." ]>> <<set _doublePenetrationLines = [ "Strong hands grip your arms and thighs, pulling you up from your knees with effortless strength. Your body leaves the ground, legs spreading instinctively as you're lifted between them. One man presses his cock against your dripping slit while the other grips your hips, guiding himself against your tightest hole, both of them claiming you in one overwhelming moment.", "You're suddenly hoisted into the air, your legs wrapping around one man’s waist as his cock presses into your aching heat. Behind you, another pair of hands grips your ass, spreading you open before pushing inside, filling you completely as they begin to move, using your weightless body for their pleasure.", "A gasp leaves your lips as they lift you easily, one gripping your thighs while the other slides behind you. Suspended between them, you feel the first hard length push into your wetness before another presses against the last untouched part of you, stretching you wide as they take you in tandem.", "Your small body is lifted effortlessly, their hands roaming possessively over your skin as your feet leave the floor. One man lines himself up with your drenched pussy, the other guiding his thick cock against your ass, the teasing pressure making your breath hitch before they push inside, filling you completely.", "A deep moan escapes you as strong hands wrap around your waist, pulling you off your knees. Your legs dangle helplessly before one man spears into your soaked core, stretching you open. Behind you, another presses against your tightest hole, forcing you to take him as your body is rocked between them.", "You barely have time to react before they grab you, lifting you easily into the air. Your thighs are spread wide, one cock slipping into your dripping heat while the other teases against your ass. Their arms hold you firmly, keeping you completely suspended as they push inside, taking you at the same time.", "You're weightless in their grasp, your body lifted as one man pulls you onto his cock, the stretch making you shudder. Before you can even catch your breath, another thick length presses against your ass, pushing past the resistance as they both claim you in a deep, unrelenting rhythm.", "They move as one, hands gripping your thighs and ass as they lift you up, your body weightless in their hold. You feel the thick head of one cock sliding into your soaked pussy before another presses against your ass, both men groaning as they push inside, stretching you wide in perfect sync.", "A sudden yelp escapes you as they grab you, lifting you without effort. Your legs wrap instinctively around one man’s waist as his cock slides into your wetness, stretching you open. Before you can adjust, the second man presses against your ass, his hands gripping your hips as he forces himself inside, completely filling you.", "You're lifted, gasping as one man lines himself up with your dripping entrance while the other spreads your ass. Your body trembles in anticipation, legs dangling as they push inside you together, stretching you to the limit as they start to move, using you between them." ]>> <<set _menDialogue = [ "Fuck… and here we thought you were some innocent little thing. Look at you now—taking us both like a starved whore.", "Shit, you’re tight… Not like those whores at the brothel. No, you’re something special.", "You say you’re not a whore, but look at you stuffed full, dripping, begging for more. What does that make you, then?", "Didn’t think you had it in you, but fuck… you were made for this. Such a good little slut.", "Those whores at the brothel don’t even come close to you. Tight, eager, and so fucking hungry for cock.", "You’re not fooling anyone. That innocent act was just bait, wasn’t it? You wanted this all along.", "I can’t believe we ever thought you were pure. Sweet little thing like you, letting us fuck you like this? You’re dirtier than any brothel girl.", "Fuck, you’re talented. That mouth, that body… You could make a fortune on your back.", "You’re so fucking perfect. Tight, wet, and eager—like you were waiting your whole life for this moment.", "Such a perfect little whore. You were made to be used, weren’t you?", "You keep squeezing me like that, and I’m gonna start thinking you don’t want me to pull out.", "Didn’t know innocent little girls could be this talented. Who taught you how to suck cock like that?", "Fuck, look at you, taking every inch like a good little slut. And to think we almost believed you were shy.", "Mmm, I bet you’d take the whole damn village if we let you. Would you like that? Bent over, dripping, begging for more?" ]>> <</nobr>>
<div class="text-box"> <<nobr>> You go behind the trees and the guard wastes no time pulling his cock out <<Guard>>Get on your knees<</Guard>><br><br> You kneel and take his cock in your mouth<br><br> <video loop> <source src="Images/Forrest/Scarldale/VillageHall/Pursuade/1.webm" type="video/webm"></video><br><br> <<Guard>>Thats it, slut<</Guard>><br><br> <video loop> <source src="Images/Forrest/Scarldale/VillageHall/Pursuade/2.webm" type="video/webm"></video><br><br> <video loop> <source src="Images/Forrest/Scarldale/VillageHall/Pursuade/3.webm" type="video/webm"></video><br><br> <<Guard>>I'm going to cum in that pretty little mouth of yours<</Guard>><br><br> <video loop> <source src="Images/Forrest/Scarldale/VillageHall/Pursuade/4.webm" type="video/webm"></video><br><br> The guard cums and you swallow his seed<br><br> <<link "Steal his soul">><<set $Position to "Kill">><<set $HallGuardStatus to "Dead">><<run Engine.play('HallGuardConvo')>><</link>><br> Or <<link "Possess Him">><<set $Position to "Possessed">><<set $HallGuardStatus to "Possessed">><<run Engine.play('HallGuardConvo')>><</link>> or <<link "Leave">><<set $Position to "Finish">><<set $HallGuardStatus to "Normal">><<run Engine.play('HallGuardConvo')>><</link>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Position is "Finish">> <<Guard>>now move along Slut, iam done with you<</Guard>><br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <<if $Position is "Seduce">> <<Lucy>>I just wanted to talk to you<</Lucy>><br><br> Even through his maks, you can see the guards eyes light up<br><br> <<Guard>>Oh, is that so?<</Guard>><br><br> <<Lucy>>Yes, a tall handsom guard protecting the village, which girl wouldn't want to talk to you<</Lucy>><br><br> <<Guard>>I know what your trying to do, your not getting in<</Guard>><br><br> <<link "Act innocent">><<set $Position to "Persuade">><<run Engine.play('HallGuardConvo')>><</link>><br> <<link "Act like a slut">><<set $Position to "Seduce2">><<run Engine.play('HallGuardConvo')>><</link>> <</if>> <<if $Position is "Persuade">> <<Lucy>>I really need to speak to the lord, is there anything I can do?<</Lucy>><br><br> <<Guard>>We can go behind those trees over there and you can show me how badly you need a meeting with lord Jon<</Guard>><br><br> [[Go|HallGuardBJ]] <</if>> <<if $Position is "Seduce2">> <<Lucy>>I'm not trying to get in anyway, well besides maybe your bed<</Lucy>><br><br> You can tell the guard is excited by that<br><br> <<Guard>>In that case, come to my house later, I'll show you how the guard take care of women<</Guard>><br><br> <<set $HallGuardStatus to "Interested">> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <<if $Position is "Kill">> The guard collapses, you wipe your lips and stand up. <<Lucy>>I hope you had as much fun as I did<</Lucy>><br><br> You leave the guards lifeless body<br><br> Villagers will find this body and they will blame you, your influence over Scarldale slips...<br><Br> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <</if>> <<button "Leave">> <<goto "Scarldale">> <</button>> <<set $Souls to $Souls +1>> <<set $HallGuard to "done">> <</if>> <<if $Position is "Possessed">> The guard turns silent and his eyes glase over, you stand up and wipe your lips <<Lucy>>Well that was fun, but now your going back to the hall and letting anyone though who ask, do you understand?<</Lucy>><br><br> <<Guard>>Yes, mistress<</Guard>><br><br> Scarldale's corruption has increased<br><br> <<if $scarldale.corruption >= 90>> <<set $scarldale.corruption to 100>> <<else>><<set $scarldale.corruption += 10>><</if>> <<button "Leave">> <<goto "Scarldale">> <</button>> <<set $HallGuard to "done">> You entre the hall with no resitance<br><br> Looking around, you see rooms to your left and a staircase leading up stairs<br><br> [[Head upstairs|HallLord]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>How has your shift been<</You>><br><br> You ask to distract the guard, you engage in ideal chatter for a minute, making the guard more complancent<br><br> You slowly remove your blade from your pocket while he is taking<br><br> Then you thrust the blade into the side of the guards throat, this catches him off guard and he starts to panic, you push yourself up against him pinning him to the wall, but he's strong and starts trying to swing at you<br><br> In a panic, you pull your dagger from his throat and blood sprays out, you stab the blade into his unprotected eye, he lets out what should be a scream but its stifled by blood<br><br> You hit the back of the dagger, driving it deeper and the guard goes limp, the weight of him pulls you both to the ground and you scrabble back to your feet<br><br> <<You>>Well that could have gone better<</You>><br><br> You look around and realise theres far too much blood for you to cover this up<br><br> Villagers will find this body and they will blame you, your influence over Scarldale slips...<br><Br> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <</if>> [[Go see the lord|HallLord]] <<set $HallGuard to "done">> <</nobr>> </div>
<div class="text-box"> <<nobr>> You push the door open an entre<br><br> In front of you stands the lord of Scarldale<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/VillageHall/1.png" width="700" height="700"> </div><br><br> <<Jon>>Who the fuc...<</Jon>><br><br> The words don't leave his mouth, as you see his anger turn to shock<br><br> <<Jon>>Y-You! Guards! Guards!<</Jon>><br><br> <<You>>No ones coming<</You>><br><br> <<Jon>>You're from the castle... What do you want?<</Jon>><br><br> <<if $scarldale.influence >= 9>> <<Jon>>You've turned my people against me. They love you for what you have done for them, but I see through you. I know you are using us<</Jon>><br><br> <<elseif $scarldale.influence >= 7>> <<Jon>>You pretend to help my people, assisting with issues around here. But I know you, I know you are using them for somthing<</Jon>><br><br> <<elseif $scarldale.influence >= 4>> <<Jon>>You should fuck off back to your castle, get out of my village<</Jon>><br><br> <<elseif $scarldale.influence >= 2>> <<Jon>>My people hate you they know you take people and they never return, why can't you leave this village alone<</Jon>><br><br> <<else>> <<Jon>>You bastard, you have murdered my people, I'll watch you swing by the neck for this!<</Jon>><br><br> <</if>> [[Let him live|HallLordLive]]<br><br> [[Kill him|HallLordKill]] <<set $JonMet to true>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>This is my village now, everything and everyone in it is mine<</You>><br><br> <<Jon>>What do you want with me?<</Jon>><br><br> <<You>>With you? Nothing... I have no need for a puppet in my plans...<</You>><br><br> You walk over to the lord of scarldale<br><br> You give him a short moment to consider his situation, before drawing your blade and killing the man<br><br> With the lord of the village dead, it will now be easier to spread your contol over the village...<br><br> Scarldale's corruption has increased<br><br> This is the end of this plot line for now<br><br> [[Leave|ForestExplore]] <<if $scarldale.corruption >= 90>> <<set $scarldale.corruption to 100>> <<else>><<set $scarldale.corruption -= 10>><</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>This is my village now, I've already shown I can get close to you whenever I want<</You>><br><br> <<Jon>>What do you want?<</Jon>><br><br> <<You>>I will allow you to live for now, but know that if you want to keep your life, you will work for me ensuring your people love me<</You>><br><br> <<Jon>>Fine, just let me live and I'll do whatever you ask<</Jon>><br><br> Having the lord of Scarldale serving you will go a long way to ensuring its people love you... Your power over Scarldale grows<br><br> <<if $scarldale.influence != 9>> <<set $scarldale.influence += 1>> This is the end of this plot line for now<br><br> [[Leave|ForestExplore]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $JonMet is true>> <<You>>Their is nothing more to do here yet<</You>> <</if>> You walk upstairs and move towards a door which as shut, on the door their is a sign reading "Office of his Lordship"<br><br> <<if $Cloaked is false>> <<Thoughts>>Time to see the lord of Scarldale...<</Thoughts>><br><br> [[Entre|HallLord2]] <</if>> <<if $Cloaked is true>> <<Thoughts>>I should show my true self to this lord<</Thoughts>><br><br> <<link "Remove Cloak">><<set $Cloaked to false>><<run Engine.show()>><</link>><br><br> [[Leave|ForestExplore]] <</if>> <<if $CurrentPlayer is "LucyCloaked">> <<Lucy>>I should let $LucyName deal with this<</Lucy>><br><br> [[Leave|Scarldale]] <</if>> <</nobr>> </div>
<div class="text-box" style="text-align: center;"> A big thanks to my Patreons:<br><br> <style> .supporters-table { width: 100%; margin: 0 auto; } .supporters-table td { width: 50%; text-align: center; padding: 0.2rem; } </style> <<set _supportersList = Story.get("Supporters").text.split('\n').map(line => line.trim()).filter(line => line)>> <table class="supporters-table"> <<for _i to 0; _i < _supportersList.length; _i += 2>> <tr> <td><<print _supportersList[_i]>></td> <td><<print _supportersList[_i + 1] || "">></td> </tr> <</for>> </table> Please feel free to join my patreon where I add updates coming to the game which free members can see and additional content and cheat codes for paid members!<br><br> <<button "Patreon">> <<run window.open("https://www.patreon.com/user/posts?u=136709338", "_blank")>> <</button>> <<button "Leave">> <<goto "Chambers">> <</button>> </div>
<<nobr>> <div class="town-menu"> <h1>The Harbor</h1> <div class="town-image"> <img src="Images/Town/Harbor/2.png" alt="Town Image"> </div> <<if ($Time lt 9) and ($Quests.includes("Obtain a silver weapon"))>> <<You>>I should wait till dark to sneak into people's homes<</You>> <</if>> <<if $Time >= 9>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[It's too late, I need to go back to the castle|Base Intro]] </div> <<else>> <div class="menu-item" data-image="Images/Town/Tavern/3.png"> [[Tavern]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Return to the gates|TownOLD]] </div> <</if>> </div> <<set $CloakDisabled to true>> <style> .town-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .town-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .town-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } .menu-item.disabled { opacity: 0.5; cursor: not-allowed; } .menu-item.disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .town-image { text-align: center; margin-top: 20px; } .town-image img { max-width: 100%; height: auto; border-radius: 5px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>>
<<nobr>> <<button "Break Glass (Return to castle)">> <<goto "Base Intro">> <</button>><br><br> <h1>Basics</h1> <h2>Souls</h2> One of your starting abilitys is the power to take the soul of a defeated enemy. If you fall in combat, you can use a soul to keep you from dying. However, there are other entities in the world who collect souls. They may be willing to traid some of their power in exchange for your souls, like a currency, or they may try to take your souls by force. Try to keep at lease one soul at all times otherwise death is permanent.<br><br> <h2>Power</h2> Your power starts of low and will effect how much damage you can do to your opponent. Damage is the total of your power combined with your weapons damage.<br><br> <h2>Magic</h2> Spells and shit! As with power you start with a limited amount of magic, which can be raised by doing certain acts with a character. At this time, only spells cast during combat can drain your magic.<br><br> <h2>Notoriety</h2> This shows how well known you are in the surrounding area, doing evil acts will raise this, however there is a cap depending on the size of your castle.<br><br> <h1>Raids</h1> <h2>Bandits</h2> If your notoriety is above 0, bandits may raid your castle at night looking for gold, wood, stone or just to simply kill you. You can combat this by setting up defenses, but if these fail. Be prepared to defend yourself and your vault.<br><br> <h2>Defences</h2> In your castles courtyard, you can construct traps and summon monsters to defend your castle. Different defences have different outcome, and are better at deturing different enemy types. Traps can be upgraded using resources like wood and stone. Monsters can be upgraded by giving them captives from the raid for... Practice<br><br> <h2>Captives</h2> At the end of the raid, any attackers who are captured by yourself or the defences are presented to you. You can choose to release them, put them to work, send them to a monster or send them to the dungeon<br><br> <h2>Your Vault</h2> If an attacker gets past your defences and you have not been killed, you can fight them. Dying will lead to the attackers taking some of your resources<br><br> <h1>Dungeon</h1> <h2>Captives</h2> Your dungeon starts with the capacity for 2 captives, but you can increase this (see page 3). Having a captive gives you a number of choices depending on what you have unlocked. To start with you can take their soul (kills them) or sell them, keep in mind the more corrupt they are, the higher value they hold<br><br> <h2>Corruption (as the Overlord)</h2> Playing as the Overlord, you have the power to dominate the minds of your prisoners, and use them. You can choose what position you want them in, then navigate over their bodies to find locations you can interact with. Selecting the chech box at the bottom if the prisoners image, will show these spots<br><br> <h2>Corruption (as Lucy)</h2> As a succubus, your powers are similar, but different to that of your master. Like him, if you can seduce a person and make them orgasm, they are yours either to steal their soul or possess. However, unlike your master you cannot cast a spell tricking them into willingly submitting to you. So, you must convince them. Learn what they like and turn them on enough to make them cum for you willingly. <br><br> To help you with this, you have the succubus's eye, a power allowing you to see into their soul and understand their desire. The more lust you build in them, the more you can see.<br><br> But be careful, if they cum without their lust being full you won't be able to possess them... But you could always just take their sould and be done with them. <h1>The Castle</h1> <h2>Upgrading Defences</h2> Adding another defence room, alows you to buid another trap room. However, it also means your maximum notoriaty increases by 1. You can build up to 5 defence rooms<br><br> <h2>Barracks</h2> Adding a barracks allows you to send corrupted prisoners to it, building your milita. See page 4 for more info<br><br> <h2>Portal Room</h2> Your portal room also requires the "tear", this allows you to set up portals in the following locations: Scarldale houses, Forest Shack, Forest starting point, Town Inn (Patreon only) and Ironpeak houses. You can only travel to the location from the portal room and you cannot return from the location<br><br> <h2>Infirmary</h2> Requires Mara to be posessed and at the castle. Sending units to the infirmary will cause them to heal over time (25 health per day)<br><br> <h2>Map Room</h2> The map room is for tracking discovered and captured locations. You can aslo see your influence over other areas (no real function in this update)<br><br> <h1>Capturing Settlements</h1> <h2>Scouting</h2> Sending your foces out to scout means they may return with a new location discovered. These include:<br><br> Settlements<br> Bandit Camps<br> Caravans<br><br> Once a settlement is discovered, you can send Lucy to scout them to learn more about the location. You can speak to people inside and outside their homes. Sneaking into homes, or taking your way inside, allows you to look around and search for the key. Finding the key will make pillage raids easier. You can also seduce the locals and use your powers on them, or identify them as key targets for your forces to capture during a pillage<br><br> <h2>Your Raiders</h2> Providing your milita with swords and armor increase their chances of survival, you can also train their skills to help them specialise:<br> Combat - higher combat skill will make the unit better at killing<br> Scouting - Increases the chances of the unit surviving when send out to scout<br> Lockpicking - Increases the chance of accessing houses during a pillage, without the key<br> Subduing - increases the chance of capturing targets<br> Defense - increase the units defencive skill against raids on the settlement<br><br> <h2>Pillaging Locations</h2> Pillaging a location can be done with a small team, they will try to access every home and take any loot and targets you have identified. If your dungeon is full, captured targets will be killed<br><br> <h2>Capturing Location</h2> Capturing a location is harder, the villagers are more likely to fight back (70% chance). If all guards and defending villagers are slain, you capture the location. Any surving raiders are added to the garrison to defend the location<br><br> <h1>Captured Locations</h1> <h2>Exports</h2> All locations have an export: Grain, Mead, Bread, Meat, Jewelry, Tools. Meat and grain are essential for keeping your villagers fed, meat will count as 3 food and grain is 2, each villager will consume 1 food per day. Other exports may be randomly required by the settlement. Exports are stored in your vault and (at the moment) need manually assigning to the locations<br><br> <h2>Happiness</h2> The settlements happiness meater is affected primarily by food, but it can also go down if needs are not met, low happiness can lead to revolts or other outcomes depending on corruption. You can boost happiness<br><br> <h2>Corruption</h2> Corrpution naturally spreads in a location and as of V0.2 doesn't have any major impact in a settlment, as long as you keep the happiness up<br><br> <h2>Devotion/Fear</h2> <h2>Garrison</h2> Once a location is captured, surviving milita are moved to the garrison. It's recommended to recall anyone who is injured and send new forces, ideally with the defence skill. Bandits may raid the location, if your garrison is all killed, they can take a villager. If happiness is too low and the villagers revolt, your forces will be attacked. If they are all killed, you will loose control of the settlement<br><br> <</nobr>>
<div class="text-box"> <<nobr>> <<set $arrows to true>> <<if $WolfWeapon is "Arrows">> <<You>>Hello sir, I'm here for my arrows<</You>><br><br> <<Henry>>Yes, let me go get them<</Henry>><br><br> Henry leaves to collect 5 arrows from a shelf, you look over them... He has done an excellent job dispite their basic look, the arrow heads are very sharp<br><br> <<Henry>>Im not sure why you need these... but good luck<</Henry>><br><br> <<You>>Thank you<</You>><br><br> <<if $PlayerRangedWeapon is "null">> <<Thoughts>>I need to remeber to purchase a bow from Henry<</Thoughts>><br><br> <</if>> <<set $WolfQuestStatus to "HaveArrows">> <<if !$havearrows>> <<set $havearrows = true>> <</if>> <<link "Leave">> <<script>> UI.alert("Quest complete! <br>You now have a weapon strong enough to kill the werewolf"); <</script>> <<run $Quests.delete("Obtain a silver weapon")>> <<run Engine.play('ForestExplore')>> <</link>> <<else>> <<You>>Make 5 arrow heads they will help<</You>><br><br> <<Henry>>Sure, whatever you want... Give me two days<</Henry>><br><br> <<if $PlayerRangedWeapon is "null">> <<Thoughts>>I need to remeber to purchase a bow from Henry<</Thoughts>><br><br> <</if>> <<set $DayWait to $Day + 2>> <<set $WolfWeapon to "Arrows">> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $dagger to true>> <<if $WolfWeapon is "Dagger">> <<You>>Hello sir, I'm here for my dagger<</You>><br><br> <<Henry>>Yes, let me go get it<</Henry>><br><br> Henry leaves to collect a small dagger from a shelf, you look over it... He has done an excellent job dispite their basic look, the dagger is very sharp<br><br> <<Henry>>Im not sure why you need it... but good luck<</Henry>><br><br> <<You>>Thank you<</You>><br><br> <<set $WolfQuestStatus to "HaveDagger">> <<if !$havedagger>> <<set $havedagger = true>> <</if>> <<link "Leave">> <<script>> UI.alert("Quest complete! <br>You now have a weapon strong enough to kill the werewolf"); <</script>> <<run $Quests.delete("Obtain a silver weapon")>> <<run Engine.play('ForestExplore')>> <</link>> <<else>> <<You>>Please make me a dagger, to be sage<</You>><br><br> <<Henry>>Sure, whatever you want... Give me two days<</Henry>><br><br> <<set $DayWait to $Day + 2>> <<set $WolfWeapon to "Dagger">> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>There doesn't seem to be many people around the village?<</You>><br><br> <<Henry>>Folk haven't been to active due to the bandits raiding the village<</Henry>><br><br> <<You>>Yes, I've encountered some of them<</You>><br><br> <<Henry>>Well, seeing as your still alive, you must be able to hold youself in a fight<</Henry>><br><br> <<Henry>>The head of this village, Jon doesn't seem to care and his guards are almost as bad as the raiders<</Henry>><br><br> <<You>>What can be done about the raiders?<</You>><br><br> <<Henry>>I was working on weapons to help arm the villagers, but my last cart or iron never arrived. Probably taken by some raiders<</Henry>><br><br> <<Thoughts>>Maybe I could help this guy by finding his iron... Or I could speak to this leader... Jon<</Thoughts>><br><br> <<You>>I'm sorry about your issues, I will see if I can help<</You>><br><br> <<Henry>>Any assistance would go a long way towards helping the village, and myself... The iron is produced north of here, towards the mountains where its mined. That may be a good place to start<</Henry>><br><br> [[Leave|Scarldale]] <<link "Leave">> <<script>> UI.alert("New Quest!<br>Find Henry's missing shipment of iron)"); <</script>> <<run $Quests.push("Find Henry's missing shipment of iron")>> <<run Engine.play('ForestExplore')>> <</link>> <<set $HenryQuestStatus to "FindIronWorks">> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if ($WolfQuestStatus is "Blacksmith") and ($SilverNeed gt 0)>> <<You>>Hi, I need some help... do you think you could forge a weapon out of silver for me?<</You>><br><br> <<Henry>>Why would you want a silver weapon? It won't hold up against steel at all<</Henry>><br><br> <<You>>I just need a weapon made from silver... Can you make one?<</You>><br><br> <<Henry>>I suppose so, but I don't recommend using it. However, I make tools and weapons not jewlery, I stock iron and steel not silver and gold<</Henry>><br><br> <<You>>I see... What if I brought you some silver could you make it then?<</You>><br><br> <<Henry>>I suppose, no one around here has the coin for silver, maybe you can find some in shops in Harbor’s End, a town near the coast, but you should know silver is very expensive<</Henry>><br><br> <<You>>Thank you, do you have anything which can help me get past locked doors?<</You>><br><br> <<Henry>>I'm not helping you steal silver from people<</Henry>><br><br> <<You>>This is for another issue, I'm locked out of a room in my home<</You>><br><br> <<Henry>>Whatever, theres some lock picks over by the other items I have for sale, but you better be using them for honest reasons, and if you aren't you did't get them from me<</Henry>><br><br> <<Henry>>You'll also need a horse if you dont have one already, to get to the town<</Henry>><br><br> <<set $LockPicksUnlocked to true>> [[Leave|ScarldaleBlacksmith]] <</if>> <<if $SilverNeed <= 0>> <<You>>I have the silver you asked for...<</You>><br><br> You place the silver trinkets infront of the blacksmith, he studies each item<br><br> <<Henry>>I can see that... a womans ring... a religious necklace... a spoon... where did you get this?<</Henry>><br><br> <<You>>Does it matter Im doing this to help your village<</You>><br><br> <<Henry>>I consider myself an honorable man, but if you say this can help our village then I'll help you<</Henry>><br><br> Henry takes the trinkets to his scales adding led weights to the other side to figure out how much you have<br><br> <<Henry>>There is not much here friend... I coud make you a small dagger, or maybe 5 or so arrow heads, what would you like?<</Henry>><br><br> [[Ask for arrow heads|HenryArrowHeads]]<br><br> [[Ask for a dagger|HenryDagger]]<br><br> <<set $WolfQuestStatus to "Weapon">> <</if>> <</nobr>> </div>
<h2>Hermit Card</h2> The Hermit are you truly sure you want this... A soul bound to solitude and deep reflection. With this card, you gain the power to look inward, to seek wisdom in the quiet recesses of your mind. Yet be wary... The path to growth is narrow, and in the silence, it’s all too easy to lose yourself.<br><br> Effects of carrying this card: -Unlocks meditation in your castle, boosting your power by 5 and magic by 10 for the day<br> -Meditating can have side effects<br><br> Effects of buring the card:<br> Unknown<br><br>
<<nobr>> <div class="text-box"> Before you can react, the girl pushes you backward off your chair and jumps onto you. She's far more powerful than you expected<br><br> <span style="color: red">Vampire: Don't stuggle</span><br><br> She tairs off your clothes and slides onto your cock<br><br> This catches you off guard and you let her continue<br><br> <<set $VidPath to "Images/Crypt/VampireGame/Loose/1.webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br><br><br> You feel yourself getting closer<br><br> <span style="color: red">Vampire: Yes, cum for me</span><br><br> <<set $VidPath to "Images/Crypt/VampireGame/Loose/2.webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br><br><br> You buck your hips and push deep into her as you cum together, you holed eachother in the moment before she leans in to kiss your neck<br><br> For a moment you feel her kiss you lightly, and then you feel her fangs bight into your throat<br><br> You try to struggle but she holds you down and continues fucking you while she drinks from your open neck<br><br> After a moment she pulls back to look at you<br><br> <<set $ImagePath to "Images/Crypt/VampireGame/Loose/1.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Vampire: Thank you</span><br><br> She returns to gorging on your open throat as you slowly <<link "die">> <<run Engine.play("Resporn")>> <</link>> <<set $PlayerHealth to 0>> <<set $Souls to $Souls - 1>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to random(0, 2)>> <<set $PlayerScore to $PlayerScore + 1>> <<set $ImagePath to "Images/Crypt/VampireGame/" + $PlayerScore + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<if $PlayerScore == 2>> <span style="color: red">Vampire: Here's a peek at your reward</span><br><br> <</if>> <<if $PlayerScore lt 5>> <span style="color: red">Vampire: $RightLines[$Int]. You've got $PlayerScore right...</span><br><br> <span style="color: red">Vampire: And $NPCScore wrong... So gets keep going </span><br><br> [[Continue|HLGame]] <<else>> <span style="color: red">Vampire: I suppose you have won fairly</span><br><br> [[Continue|HLGameWon]] <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _faceUpCard = Math.floor(Math.random() * 13) + 1>> <<set $faceDownCard = Math.floor(Math.random() * 13) + 1>> <<set $faceUpCard = _faceUpCard>> <<if _faceUpCard === 11>> <<set _cardFileName = "j">> <<elseif _faceUpCard === 12>> <<set _cardFileName = "q">> <<elseif _faceUpCard === 13>> <<set _cardFileName = "k">> <<elseif _faceUpCard === 1>> <<set _cardFileName = "a">> <<else>> <<set _cardFileName = String(_faceUpCard)>> <</if>> <div class="cards-container"> <div class="card-wrapper"> <div class="card shown-card"> <div class="card-face front"> <<print '<img src="Images/Cards/Playing/' + _cardFileName + '.jpg">'>> </div> </div> </div> <div class="card-wrapper"> <div class="card hidden-card"> <div class="card-face front"> [img[Images/Cards/Playing/back.jpg]] </div> <div class="card-face back"> <!-- Will be set dynamically --> </div> </div> </div> </div> <div class="choice-buttons"> <<button "Higher">> <<run makeGuess('higher')>> <</button>> <<button "Lower">> <<run makeGuess('lower')>> <</button>> </div> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> She kneels in front of you<br><br> <span style="color: red">Vampire: Relax, I won't bite</span><br><br> You allow the girl to take out your cock and service you<br><br> <<set $VidPath to "Images/Crypt/VampireGame/Win/1.webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br><br><br> <<set $VidPath to "Images/Crypt/VampireGame/Win/2.webm">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br><br><br> <<set $ImagePath to "Images/Crypt/VampireGame/6.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Vampire: Ah, thank you... Come back any time</span><br><br> And with that she hands you the key<br><br> <<set $ImagePath to "Images/Crypt/key.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> <br> <<link "Take the key and leave">> <<set $LeftPathComplete to true>> <<run Engine.play("Down")>> <<script>> UI.alert("You take your prize and leave, returning to the start of the crypt, with the left lock key"); <</script>> <</link>><br><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<set $Int to random(0, 2)>> <<set $NPCScore to $NPCScore + 1>> <span style="color: red">Vampire: $WrongLines[$Int]. You've got $NPCScore Wrong...</span><br><br> <<if $NPCScore lt 3>> <span style="color: red">Vampire: Let's keep playing</span><br><br> [[Continue|HLGame]] <<else>> [[Continue|HLGameLost]] <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Position is "Blow">> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Of course sir!<</say>><br><br> She drops to her knee's and you sit on the bed<br><br> You watch her crawl over and lean in beween your legs<br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/2.webm" type="video/webm"> </video><br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Can we get you more comfortable?<</say>><br><br> You lift your hips and allow her to remove your underwear<br><br> She goes back to work, toying with you<br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/3.webm" type="video/webm"> </video><br><br><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/4.webm" type="video/webm"> </video><br><br><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/5.webm" type="video/webm"> </video><br><br> Your getting close, so you stand<br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Cum for me!<</say>><br><br> You flood her open mouth with cum, you can tell shes actually enjoying herself<br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Bj/6.webm" type="video/webm"> </video><br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Thank you sir, sleep well<</say>><br><br> And with that, she leaves and you go back to bed <<button "Sleep">> <<set $Day to $Day + 1>> <<set $Time to 1>> <<set $PlayerHealth to 100>> <<set $PlayerEnergy to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $IronPeakFirstNight to true>> <<set $HostelRoom to false>> <<set $HostelVisitFirst to false>> <<run Engine.play('HostelYourRoom')>> <</button>><br> <</if>> <<if $Position is "Sex">> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Ummm, let me get ready for you<</say>><br><br> She lays down and opens her legs showing you her already moist cunt<br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>I'm all yours<</say>><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/1.webm" type="video/webm"> </video><br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Oh, fuck<</say>><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/2.webm" type="video/webm"> </video><br><br> You fuck the young girl harder than she was expecting<br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/3.webm" type="video/webm"> </video><br><br><br><br> <<You>>Turn around<</You>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/7.webm" type="video/webm"> </video><br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Oh gods, fuck me!<</say>><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/8.webm" type="video/webm"> </video><br><br> <<You>>Come here and taste yourself on my cock<</You>><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/9.webm" type="video/webm"> </video><br><br><br><br> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Hostel/Girl/Miss/10.webm" type="video/webm"> </video><br><br> You spray on the girls face<br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Thank you sir, sleep well<</say>><br><br> And with that, she leaves and you go back to bed <<button "Sleep">> <<set $Day to $Day + 1>> <<set $Time to 1>> <<set $PlayerHealth to 100>> <<set $PlayerEnergy to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $IronPeakFirstNight to true>> <<set $HostelRoom to false>> <<set $HostelVisitFirst to false>> <<run Engine.play('HostelYourRoom')>> <</button>><br> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You hear a knock at the door<br><br> <<You>>Come in<</You>> A young woman enters, shes small but seems happy to see you<br><br> <div align="center"> <img src="Images/Mountains/Ironpeak/Hostel/Girl/1.png" width="700" height="700"> </div><br><br> <<say 'Girl' 'Images/Mountains/Ironpeak/Hostel/Girl/1.png'>>Good evening sir, I was told you needed some, company?<</say>><br><br> Ask her for:<br> <<link "A blowjob">><<set $Position to "Blow">><<run Engine.play('HostelGirlVisitSex')>><</link>><br> <<link "Sex">><<set $Position to "Sex">><<run Engine.play('HostelGirlVisitSex')>><</link>><br> <</nobr>> </div> <audio autoplay> <source src="Audio/Knock.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<set $HostelGirlVisit to false>>
<div class="text-box"> <<nobr>> You entre the hostel and find a woman at the reception<br><br> <div align="center"> <img src="Images/Mountains/Ironpeak/Hostel/Diana/1.png" width="700" height="700"> </div><br><br> <<if $HostelVisitFirst is true>> <<if $Position is "null">> <<Diana>>Hello, welcome to the Ironpeak hostel<</Diana>><br><br> Ask Diana a question:<br><br> <<link "Were you expecting me?">><<set $Position to "Expecting">><<run Engine.show()>><</link>><br> <<link "How much is a room">><<set $Position to "Room">><<run Engine.show()>><</link>><br> <<link "Can I have a room please?">><<set $Position to "Leave">><<run Engine.show()>><</link>><br> <</if>> <<if $Position is "Expecting">> <<You>>You sound like you were expecting me?<</You>><br><br> <<Diana>>I'ts not every day we have a new person visting our hostel, most of our rooms are taken by miners who can't afford a home. But when someone told me Ida returned with a tall handsome man, well lets just say I have a room ready for you<</Diana>><br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>> <</if>> <<if ($Position is "Room") and ($HostelRoom isnot true)>> <<You>>So, how much is a room going to cost me?<</You>><br><br> <<Diana>>A room for tonight is free, it sounds like you had a rough jurney here and we like to take... good care of our guests<</Diana>><br><br> <<Diana>>If you stay for a few nights then it will be 40 gold a night for a basic services<</Diana>><br><br> <<You>>Basic service?<</You>><br><br> <<Diana>>Most of our guests are miners, covered in dirt and stink... But an outsider like you draws a few eyes, I'm sure we can find a nice girl willing to keep your bed warm, for a small fee<</Diana>><br><br> She winks at you<br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>> <</if>> <<if $Position is "Drink">> <<You>>Where can I get a drink?<</You>><br><br> <<Diana>>If your looking to unwind, the bar is to the left. Its not much but I'm sure we have something you like<</Diana>><br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position is "Leave">> <<You>>Can I please have a room?<</You>><br><br> <<Diana>>Of course, here is a key, the room is up the stairs and to the right, let me know if theres anything else I can do for you<</Diana>><br><br> <<button "Go to your room">> <<run Engine.play('HostelYourRoom')>> <</button>> <<set $HostelGirlVisit to false>> <<set $FirstNightHostel to true>> <<set $HostelVisitFirst is false>> <<set $HostelRoom to true>> <</if>> <<if $Position is "Girl">> <<You>>I could do with some company tonight, can you send a girl over later?<</You>><br><br> <<Diana>>Of course, I'll send my best girl to give you company<</Diana>><br><br> <<button "Go to your room">> <<run Engine.play('HostelYourRoom')>> <</button>> <</if>> <</if>> <<if ($IronPeakFirstNight is true) and ($HostelRoom is false)>> <<if $Gold >= 30>> <<button "Book a room (30 gold)">> <<set $Gold to $Gold - 30>> <<set $HostelRoom to true>> <<goto "Hostel">> <</button>> <<else>> You cannot afford a room (30 gold) <</if>> <br><br> <</if>> <<if ($IronPeakFirstNight is true) and ($HostelRoom is true) and ($HostelGirlVisit is false)>> <<if $Gold >= 30>> <<button "Ask Diana to send a girl up to you tonight - 30 gold">> <<set $Gold to $Gold - 30>> <<set $HostelGirlVisit to true>> <<set $Position to "Repeat">> <<run Engine.show()>> <</button>> <<else>> Ask Diana to send a girl up to you tonight - 30 gold (You cant afford this) <</if>><br><br> <</if>> <<if $Position is "Repeat">> <<You>>I could do with some company tonight, can you send a girl over later?<</You>><br><br> <<Diana>>Of course, I'll send my best girl to give you company<</Diana>><br><br> <</if>> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>> <<if ($IronPeakFirstNight is true) and ($HostelRoom is true)>> <<button "Go to your room">> <<run Engine.play('HostelYourRoom')>> <</button>> <</if>> <</nobr>> </div> <<stopblizzard>>
<div class="text-box"> <<nobr>> You are in a room in the hostel<br><br> <<if $HostelGirlVisit is true>> <<button "Wait for the girl">> <<run Engine.play('HostelGirlVisit')>> <</button>><br><br> <</if>> <<button "Sleep">> <<set $IronPeakFirstNight to true>> <<set $Time to 1>> <<set $Day to $Day + 1>> <<set $HostelVisitFirst to false>> <<fadeToPassage "HostelYourRoom">> <<set $HostelRoom to false>> <</button>><br><br> <<button "Leave">> <<goto "IronpeakHostelUpstairs">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Time lt 5>> Ida is not home, she will be back later<br><br> <<else>> Ida is home<br><br> <div align="center"> <img src="Images/Mountains/Ida/3.png" width="700" height="700"> </div><br><br> <<Ida>>Good evening<</Ida>><br><br> [[Ask her a question|IdaQuestions2]] <</if>> <</nobr>> </div> [[Leave|IronpeakHomes]] <<stopblizzard>>
<div class="text-box"> <<nobr>> <<if $Position is "null">> <<if $IdaDeerQuest isnot true>> <<button "Where do you go during the day">><<set $Position to "WhereGo">> <<run Engine.show()>><</button>><br><br> <</if>> <<button "How to I purchase iron">><<set $Position to "Iron">> <<run Engine.show()>><</button>><br><br> <</if>> <<if $Position is "WhereGo">> <<You>>Where do you go during the day?<</You>><br><br> <<Ida>>I hunt for animals, its my trade<</Ida>><br><br> <<You>>Is what what you were doing when you found me in the cave<</You>><br><br> <<Ida>>Aye, I need to catch something soon to keep my rent comming in<</Ida>><br><br> <<You>>Having trubble hunting?<</You>><br><br> She give's you a defencive look<br><br> <<Ida>>No! I... Yes, I haven't caught anything since... Well it doesn't matter I can't hit shit with my bow<</Ida>><br><br> You look at the girl, even you aren't numb to her look of pain<br><br> <<You>>Can I help?<</You>><br><br> <<Ida>>It's fine, I'm a good shot, its just hard this time of year<</Ida>><br><br> <<You>>Come on, I can help you... Afterall, you did save my life<</You>><br><br> She pauses for a moment, thinking<br><br> <<Ida>>Ok, we will start simple, I have some traps to the North West, search them and reset them if they need it, bring whatever you find back to me<</Ida>><br><br> <<You>>Of course<</You>><br><br> <<set $IdaDeerQuest to true>> <<button "Leave">> <<goto "Ironpeak Outpost">> <<script>> UI.alert("New Quest<br>Help Ida by checking her traps to the North West"); <</script>> <<run $Quests.delete("Help Ida by checking her traps to the North West")>> <</button>> <</if>> <<if $Position is "Iron">> <<You>>Where can I buy iron?<</You>><br><br> <<Ida>>What do you need iron for?<</Ida>><br><br> <<You>>It's why I'm here, I need iron for my forge<</You>><br><br> <<Ida>>Well, the name has decieved you... We may be called ironpeak, but we haven't exported iron for years it's too dangerous<</Ida>><br><br> <<You>>Dangerous?<</You>><br><br> <<Ida>>Iron is... Was found on the lower levels of the mine, we don't go down there now, not since the curse<</Ida>><br><br> <<You>>Shit... What do you smelt in your forge?<</You>><br><br> <<Ida>>Silver, mostly... Its found in the upper levels... Safer<</Ida>><br><br> <<You>>Fuck<</You>><br><br> <<button "back">> <<goto "IdaHome">> <</button>> <</if>> <</nobr>> </div> <<Ida>>Do you have a bow?<</Ida>><br><br> <<if $PlayerRangedWeapon is "Bow">> <<You>>Yes<</You>><br><br> <<Ida>>Good<</Ida>><br><br> <<else>> <<You>>No<</You>><br><br> <<Ida>>Thats fine, you can borrow mine<</Ida>><br><br> <</if>> <<Ida>>Go North West, along the top of the mountain, you'll find some traps, check them and clear the ice off them, if you see a deer... Shoot it, bring it back<</Ida>><br><br>
<div class="text-box"> <<nobr>> <div align="center"> <img src="Images/Mountains/Ida/3.png" width="700" height="700"> </div><br><br> <<if $Position is "null">> <<link "What was in the cave">><<set $Position to "InCave">><<run Engine.show()>><</link>><br> <<link "What are the building around here">><<set $Position to "AroundHere">><<run Engine.show()>><</link>><br> <<link "How do I get home?">><<set $Position to "GetHome">><<run Engine.show()>><</link>><br> <<link "I have no more questions">><<set $Position to "Leave">><<run Engine.show()>><</link>><br> <</if>> <<if $Position is "InCave">> <<You>>What was in that cave?<</You>><br><br> <<Ida>>Okay, here's the short version: A long time ago, my ancestors came here in search of iron. They founded the outpost of Ironpeak and mined the mountain, but as the years went by, they turned to parents, then grandparents, and eventually died. We set up a crypt in the mine to bury our dead and for a long time, all was fine. Until one day, we don't know what happened but we believe a grief-stricken widow went into the crypt and tried to make a deal with the dark powers to summon her husband from the void..<br><br> There's a demon down there, which appears to people and tries to lure them away. If they resist, the void will take them away. That's what those whispers are: the souls of the dammed in the void trying to break through. <</Ida>><br><br> <<You>>And the light stops them<</You>><br><br> <<Ida>>It won't stop the demon if it's near... but it keeps the void at bay<</Ida>><br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>> <</if>> <<if $Position is "AroundHere">> <<You>>What facilities do you have around here?<</You>><br><br> <<Ida>>Not much, we have a shop where you can get torches or bottles of pitch. Theres also a hostle near by where you can sleep, the mine itself and of course our forge in the centre of the town<</Ida>><br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>> <</if>> <<if $Position is "GetHome">> <<You>>I need to get home soon, whats the best way to get to the forest to the south east?<</You>><br><br> <<Ida>>You came over the mountains, but the blizzard will have made that route unavailable, You can hike around, but it will take you a few day's. Ill mark the path on your map<</Ida>><br><br> <<Thoughts>>A few days? Fuck moving around here will be impossible... l'll have to find a way to travel quicker<</Thoughts>><br><br> <<link "Next question">><<set $Position to "null">><<run Engine.show()>><</link>> <</if>> <<if $Position is "Leave">> <<You>>I don't have any more question other than where should I sleep?<</You>><br><br> <<Ida>>You can go to the hostel it's close and they don't charge much for a room<</Ida>><br><br> [[Leave|Ironpeak Outpost]] <</if>> <</nobr>> </div> <<set $IronPeakVisited to true>> <<set $IronPeakShopFirst to true>> <<set $MineVisitFirst to true>> <<set $HostelVisitFirst to true>> <<set $IronStock to 2>> <<set $Candles to 0>> <<set $PitchBottles to 0>> <<set $IronPeakFirstNight to false>>
<div class="text-box"> <<nobr>> Ida takes you to her home and sits you down near the fire<br><br> <<Ida>>Here, drink this<</Ida>><br><br> She hads you a warm drink<br><br> <<Ida>>I need to get changed, I don't have another room so you'll have to just face away, Ill try to find you something warm aswell<</Ida>><br><br> She walks behind you toward a dresser and you hear her opening draws<br><br> <<if $Position is "null">> <<link "Peak">><<set $Position to "Peak">><<run Engine.show()>><</link>><br><br> <<link "Don't peak">><<set $Position to "NoPeak">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position is "Peak">> You turn to catch a view of Ida changing<br><br> <div align="center"> <img src="Images/Mountains/Ironpeak/Ida Home/2.png" width="700" height="700"> </div><br><br> <<Ida>>See something you like? I thought I told you to face away?<</Ida>><br><br> <<You>>I...<</You>><br><br> <<Ida>>Forget it, just don't get any ideas, us northen girls are tough<</Ida>><br><br> You turn away<br><br> <<Thoughts>>I'm sure<</Thoughts>><br><br> <</if>> <<if ($Position is "Peak") or ($Position is "NoPeak")>> After a few minuets, Ida walks back over to you and sits at a chair across from you<br><br> <div align="center"> <img src="Images/Mountains/Ida/3.png" width="700" height="700"> </div><br><br> <<Ida>>Here, take this jacket<</Ida>><br><br> She hands you a jacket which you wrap yourself in<br><br> <<You>>Is this your husbands?<</You>><br><br> <<Ida>>Ha, no theres not much time for that in Ironpeak, anyway I'm sure you have questions?<</Ida>><br><br> <<set $Position to "null">> [[Ask Ida Questions|IdaQuestions]] <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> <<if $Position is "null">> You follow the path for a while, searching for a while before you come across a small wooden box, with a wire and some veg inside<br><br> <div align="center"> <img src="Images/Mountains/Ida/Trap/1.png" width="700" height="700"> </div><br><br> <<You>>This must be one of Ida's traps<</You>><br><br> Examining it, you find it hasn't been triggered, but the springs are covered in ice, you rub them for a moment to warm them.<br><br> <<You>>I should keep looking<</You>><br><br> <<button "Continue">> <<goto "IdaTrap2">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> Continuing, you stumble through the snow, at this point it comes to your shins<br><br> The snow is coming down now, making your task even harder<br><br> Pressing on, you find something new...<br><br> <div align="center"> <img src="Images/Mountains/Ida/Trap/2.png" width="700" height="700"> </div><br><br> One of Ida's traps, but whatever was caught in it has been torn appart. Theres fresh blood on the snow<br><br> <<You>>Did another animal get to this before me?<</You>><br><br> You reset the trap as best you can and move onwards<br><br> <<button "Continue">> <<goto "IdaTrap3">> <</button>> <<startblizzard>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You continue searching, eventually you find something which somehow makes your bones feel even colder...<br><br> <div align="center"> <img src="Images/Mountains/Ida/Trap/3.jpg" width="700" height="700"> </div><br><br> A bear trap... too powerful for any game Ida was hunting... Why is this here, and why has it been set off?<br><br> <<You>>Why is this here?<</You>><br><br> <<button "Continue">> <<goto "IdaTrap3">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $InfirmaryVisited isnot true>> <<Gnarlak>>An infirmary? You are too kind Lord!<</Gnarlak>><br><br> <<You>>No, I am practical, my forces are time consuming to 'convince' to join my cause... Keeping them alive will help us make greater strides<</You>><br><br> <<Gnarlak>>Of course Lord, but who will care for the sick?<</Gnarlak>><br><br> <<You>>I assumed you would?<</You>><br><br> <<Gnarlak>>Please, my Lord I know how to work with wood a stone. Humans are such delecate things I would do more harm then good<</Gnarlak>><br><br> <<You>>Then who do you suggest?<</You>><br><br> <<if $MaraQuestFinished is true>> <<Gnarlak>>You will struggle to find anyone willing to help you here, what about Mara? She is no doctor but she knows the human body well enough<</Gnarlak>><br><br> <<You>>And she is talented with her hands... I will ask her<</You>><br><br> <<button "Leave">> <<set $AskMara to false>> <<goto "Inside Castle">> <</button>> <<else>> <<Gnarlak>>I don't know anyone in the area with such skills... Maybe you can find someone in Harbour's end?<</Gnarlak>><br><br> <<You>>I shall take a look<</You>><br><br> <<button "Leave">> <<set $AskMara to false>> <<goto "Inside Castle">> <</button>> <</if>> <<set $MaraAsk to false>> <<set $InfirmaryVisited to true>> <<else>> <<if ($MaraAsk is true) and ($Time gt 4) and ($Time lt 10)>> Mara is here<br><br> <<set _rand to random(1, 10)>> <<if _rand >= 4>> <<set _rand to random(1, 10)>> <<set _maraImg to "Images/Casltle/Hospital/" + _rand + ".png">> <<else>> <<set _maraImg to "Images/Town/BathHouse/Mara.png">> <</if>> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <h1>Infirmary</h1> <<if !$InfrimaryOccupance>><<set $InfrimaryOccupance = []>><</if>> You currently have $InfrimaryOccupance.length units recovering<br><br> <<if $InfrimaryOccupance.length === 0>> <p>The infirmary is empty</p> <<else>> <<for _room to 0; _room < Math.ceil($InfrimaryOccupance.length / 3); _room++>> <h3>Ward <<print _room + 1>></h3> <div id="patient-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to _room * 3; _i < Math.min((_room + 1) * 3, $InfrimaryOccupance.length); _i++>> <<capture _patient>> <<set _patient to $InfrimaryOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_patient.ImagePath" alt="<<_patient.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _patient.name>></h3> <p style="margin: 2px 0;">Armor: <<print _patient.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _patient.weapon>></p> <p style="margin: 2px 0;">Duty: <<print _patient.duty>></p> <p style="margin: 2px 0;">Specialization: <<if _patient.specialization>><<print _patient.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value=" _patient.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value=" _patient.skill" max="100" style="width: 100%;"></progress> </div> </div> <<button "Return to Duty">> <<run $BarraksOccupance.push(_patient)>> <<run $InfrimaryOccupance.delete(_patient)>> <<goto "Infirmary">> <</button>> </div> <</capture>> <</for>> </div> <<if _room < Math.ceil($InfrimaryOccupance.length / 3) - 1>> <hr> <</if>> <</for>> <</if>> <div style="text-align: center; margin-top: 20px;"> <<button "Return to Castle">> <<goto "Base Intro">> <</button>> </div> <</if>> </div> <</nobr>>
<<script>> window.getUnlockedWeaponCount = function() { if (!window.weaponSlots) { return 0; } let totalUnlocked = 0; // Count weapons available in each slot Object.keys(window.weaponSlots).forEach(slot => { if (window.weaponSlots[slot].weapons) { totalUnlocked += window.weaponSlots[slot].weapons.length; } }); return totalUnlocked; }; const unlockedCount = window.getUnlockedWeaponCount(); State.temporary.totalWeapons = unlockedCount; <</script>><<nobr>> <<set _totalWeapons to State.temporary.totalWeapons>> <div class="castle-menu"> <h1>Castle Ground Floor</h1> <<if $HideMainHallImage isnot true>> <div class="castle-map"> <img src="Images/Castle/Maps/1.jpeg" alt="Castle Interior" class="castle-base"> <<if $ArmoryUnlocked>> <img src="Images/Castle/Maps/forge.png" alt="Forge" class="room-overlay"> <</if>> <<if $LucyCorrupt>> <img src="Images/Castle/Maps/mapRoom.png" alt="Map Room" class="room-overlay"> <</if>> <<if $LibraryUnlocked>> <img src="Images/Castle/Maps/library.png" alt="Library" class="room-overlay"> <</if>> <<if _totalWeapons lt 4>> <img src="Images/Castle/Maps/armory 1.png" alt="Library" class="room-overlay"> <</if>> <<if (_totalWeapons >= 4) and (_totalWeapons lt 8)>> <img src="Images/Castle/Maps/armory 2.png" alt="Library" class="room-overlay"> <</if>> <<if (_totalWeapons >= 8) and (_totalWeapons lt 12)>> <img src="Images/Castle/Maps/armory 3.png" alt="Library" class="room-overlay"> <</if>> <<if _totalWeapons >= 12>> <img src="Images/Castle/Maps/armory 4.png" alt="Library" class="room-overlay"> <</if>> </div> <<button "Hide map">> <<set $HideMainHallImage to true>> <<goto "Inside Castle">> <</button>> <<else>> <<button "Show map">> <<set $HideMainHallImage to false>> <<goto "Inside Castle">> <</button>> <</if>> <br><br> <<if ($LucyCorrupt is true) or ($AliceCorrupt is true)>> <<if $VisitedMapRoom is false>> <<Gnarlak>>Lord, the renovations to the map room are complete, I will meet you there when you are ready<</Gnarlak>><br><br> <div class="menu-item" data-image="Images/Castle/MapRoom/1.png"> [[Map Room|Map Room Intro]] <span class="menu-description">Visit the newly renovated war room</span> </div> <</if>><</if>> <<if $Time < 9>> <div class="menu-item" data-image="Images/Castle/Dungon/1.png"> [[The Dungeons|Dungeon2]] <span class="menu-description">Descend to your dark dungeons</span> </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Dungon/1.png"> <span style="color: #808080;">The Dungeons</span> <span class="menu-description" style="color: #666;">Too late to visit the dungeons</span> </div> <</if>> <<if $VisitedMapRoom is true>> <div class="menu-item" data-image="Images/Castle/MapRoom/1.png"> [[The Map Room|Map Room]] <span class="menu-description">Plan your conquests</span> </div> <</if>> <<if $ArmoryUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Armory/1.png"> [[The Forge|Forge]] <span class="menu-description">Craft weapons of war</span> </div> <</if>> <<if $LibraryUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Library/1.png"> [[The Library|Library]] <span class="menu-description">Study ancient knowledge</span> </div> <</if>> <div class="menu-item" data-image="Images/Castle/Armory/1.png"> [[The Armory|Armory]] <span class="menu-description">View your weapon collection</span> </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Go to the left wing|Left Wing]] <span class="menu-description">Explore the western tower</span> </div> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Go upstairs|Castle Chambers]] <span class="menu-description">Ascend to the upper floors</span> </div> <<set _seigeChance to random(0, 1)>> <<if ($BanditSeigeDay is true) and (_seigeChance is 0)>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> <<link "Go outside">> <<set $BeingSeiged to false>> <<goto "BanditSiegeStart">> <</link>> <span class="menu-description">Exit to the courtyard</span> </div> <<else>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Go outside|Base Intro]] <span class="menu-description">Exit to the courtyard</span> </div> <</if>> </div> <<set $CloakDisabled to false>> <<set $CurrentPlayer to "Overlord">> <<set $Cloaked to false>> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <style> .castle-map { position: relative; width: 600px; height: 600px; margin: 0 auto; } .castle-base { position: absolute; top: 0; left: 0; width: 600px; height: 600px; display: block; } .room-overlay { position: absolute; top: 0; left: 0; width: 600px; height: 600px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>>
<div class="text-box"> <<Eisheth>>Yes, come to me<</Eisheth>> [[Continue|Cave2]] [[Leave|ForestCave]] </div>
<<script>> jQuery(document).ready(function() { jQuery('.dynamic-image-hotspot').hover( function() { if (!jQuery(this).hasClass('dynamic-image-clicked')) { jQuery(this).find('.dynamic-image-tooltip').fadeIn(200); } }, function() { jQuery(this).find('.dynamic-image-tooltip').fadeOut(200); } ); jQuery('.dynamic-image-hotspot').on('click', function(e) { e.preventDefault(); e.stopPropagation(); if (jQuery(this).hasClass('dynamic-image-clicked')) { return; } const images = jQuery('.dynamic-image-wrapper img'); const firstImage = images.first(); const secondImage = images.last(); if (firstImage.css('opacity') === '1') { firstImage.css('opacity', '0'); secondImage.css('opacity', '1'); } else { firstImage.css('opacity', '1'); secondImage.css('opacity', '0'); } jQuery(this).addClass('dynamic-image-clicked'); jQuery(this).find('.dynamic-image-tooltip').fadeOut(200); jQuery(this).css('pointer-events', 'none'); }); }); <</script>> <style> .dynamic-text-box { text-align: center !important; } .dynamic-image-container { position: relative !important; display: inline-block !important; width: 500px !important; height: 500px !important; border: 2px solid #600000 !important; } .dynamic-image-wrapper { position: relative; width: 100%; height: 100%; } .dynamic-image-wrapper img { position: absolute; top: 0; left: 0; transition: opacity 0.5s ease-in-out; } .dynamic-image-repair-mode .dynamic-image-hotspot { position: absolute !important; width: 60px !important; height: 60px !important; cursor: pointer !important; z-index: 100 !important; } .dynamic-image-repair-mode .dynamic-image-tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 240px !important; text-align: center !important; background: rgba(0, 0, 0, 0.7) !important; padding: 10px !important; border-radius: 10px !important; top: -45px !important; left: 50% !important; transform: translateX(-50%) !important; z-index: 101 !important; font-size: 24px !important; display: none; pointer-events: none; } .dynamic-image-repair-mode .dynamic-image-hotspot:hover .dynamic-image-tooltip { display: block; } .dynamic-image-repair-mode .dynamic-image-circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .dynamic-image-repair-mode .dynamic-image-circle.dynamic-image-hidden { opacity: 0 !important; } .dynamic-image-repair-mode .dynamic-image-hotspot:hover .dynamic-image-circle.dynamic-image-hidden { opacity: 1 !important; } </style>
<<nobr>> <div class="intro-container"> <div class="intro-header"> <h1 class="intro-title">The Awakening</h1> <div class="title-divider"></div> </div> <div class="intro-content"> <div class="intro-section prologue"> <p class="intro-text first-paragraph"> <span class="drop-cap">D</span>ecades have passed since you last cast your shadow across these lands. Your name, once whispered in terror by brave knights and cunning thieves alike, has faded into legend—a cautionary tale told to frightened children in the dark of night. </p> <p class="intro-text"> But legends never truly die. </p> <p class="intro-text dramatic"> Tonight, the earth trembles. Ancient wards shatter like glass. The very air crackles with dark energy as you claw your way back from the abyss. Death could not hold you. Time could not erase you. You have returned, and with your resurrection comes the promise of renewed terror and untold power. </p> </div> <div class="intro-section your-path"> <h2 class="section-title">Your Dark Powers Awaken</h2> <p class="intro-text"> You are no mere mortal—you are a <strong>Dark Overlord</strong>, master of forbidden arts, corruptor of souls, and architect of desire and despair. Your unholy powers grant you dominion over both body and mind: </p> <ul class="power-list"> <li><strong>Soul Harvest:</strong> Claim the life essence of defeated foes, growing stronger with each conquest</li> <li><strong>Dark Corruption:</strong> Twist the pure-hearted into devoted thralls who crave your touch and command</li> <li><strong>Carnal Dominion:</strong> Bend others to your will through seduction, subjugation, and dark pleasure</li> <li><strong>Empire of Sin:</strong> Transform your castle into a den of debauchery where cultists, slaves, and succubi serve your every desire</li> </ul> </div> <div class="intro-section the-challenge"> <h2 class="section-title">The Path to Dark Ascension</h2> <p class="intro-text"> Your castle lies in ruins, your harem scattered, your dungeons empty. The world has grown soft and innocent in your absence—ripe for corruption. They will soon remember why they both feared and secretly desired the darkness you bring. </p> <div class="objectives"> <div class="objective-item"> <div class="obj-text"> <strong>Rebuild Your Dark Fortress</strong><br> Restore your castle's dungeons for breaking prisoners, private chambers for your pleasures, and ritual rooms for dark magic </div> </div> <div class="objective-item"> <div class="obj-text"> <strong>Corrupt and Enslave</strong><br> Seduce innocent villagers, break captured heroes, and transform pure maidens into eager servants of your dark desires </div> </div> <div class="objective-item"> <div class="obj-text"> <strong>Dominate Through Pleasure and Pain</strong><br> Use seduction as a weapon, corruption as a tool, and carnal conquest to expand your influence </div> </div> <div class="objective-item"> <div class="obj-text"> <strong>Harvest Souls and Submission</strong><br> Every conquered foe, every corrupted innocent, every broken will feeds your growing power </div> </div> </div> </div> <div class="intro-section warning"> <div class="warning-box"> <p class="warning-text"> <strong>A Word of Warning, Master...</strong><br> You are not the only predator stalking these lands. Seductive succubi seek to drain your essence, rival overlords covet your conquered thralls, and ancient vampiresses hunger for more than just blood. Even the most innocent-seeming maiden may harbor dark desires that rival your own. In this game of corruption and conquest, you must dominate or be dominated... </p> </div> </div> </div> <div class="intro-footer"> <p class="footer-text">Let the corruption begin... Let none resist your dark embrace...</p> </div> <div style="text-align: center"> <<button "Claim Your Dark Throne">> <<goto "PlayerCreation2">> <</button>> </div> </div> <</nobr>> <style> .intro-container { max-width: 900px; margin: 0 auto; padding: 30px; background: linear-gradient(180deg, rgba(0,0,0,0.95) 0%, rgba(139,0,0,0.2) 100%); border: 3px solid #8B0000; border-radius: 15px; box-shadow: 0 0 30px rgba(139,0,0,0.6), inset 0 0 50px rgba(0,0,0,0.8); color: #E0E0E0; font-family: 'Georgia', serif; } .intro-header { text-align: center; margin-bottom: 40px; } .intro-title { font-size: 48px; color: #8B0000; text-shadow: 0 0 20px #8B0000, 3px 3px 6px #000; letter-spacing: 4px; margin-bottom: 20px; animation: titleGlow 3s infinite; } @keyframes titleGlow { 0%, 100% { text-shadow: 0 0 20px #8B0000, 3px 3px 6px #000; } 50% { text-shadow: 0 0 40px #DC143C, 5px 5px 10px #000; } } .title-divider { width: 200px; height: 3px; background: linear-gradient(90deg, transparent 0%, #8B0000 50%, transparent 100%); margin: 0 auto; } .intro-content { line-height: 1.8; } .intro-section { margin-bottom: 35px; padding: 20px; background: rgba(0,0,0,0.3); border-radius: 10px; border-left: 3px solid #8B0000; } .section-title { font-size: 28px; color: #FFD700; text-shadow: 2px 2px 4px #000; margin-bottom: 15px; text-align: center; } .intro-text { font-size: 16px; margin-bottom: 15px; text-align: justify; } .first-paragraph { font-size: 18px; } .drop-cap { float: left; font-size: 72px; line-height: 60px; padding-right: 8px; margin-top: -3px; color: #8B0000; text-shadow: 3px 3px 6px #000; font-weight: bold; } .dramatic { font-style: italic; color: #CD853F; font-size: 17px; } .power-list { list-style: none; padding: 0; margin: 20px 0; } .power-list li { padding: 12px; margin-bottom: 10px; background: rgba(139,0,0,0.1); border-radius: 5px; display: flex; align-items: center; transition: all 0.3s; } .power-list li:hover { background: rgba(139,0,0,0.3); transform: translateX(10px); } .power-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; } .power-list strong { color: #FFD700; } .objectives { margin: 20px 0; } .objective-item { display: flex; align-items: flex-start; margin-bottom: 20px; padding: 15px; background: rgba(0,0,0,0.5); border-radius: 5px; transition: all 0.3s; } .objective-item:hover { background: rgba(139,0,0,0.2); border-left: 3px solid #FFD700; } .obj-icon { font-size: 32px; margin-right: 20px; color: #8B0000; } .obj-text { flex: 1; } .obj-text strong { color: #FFD700; font-size: 18px; } .warning-box { background: linear-gradient(135deg, rgba(139,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%); border: 2px solid #DC143C; border-radius: 10px; padding: 20px; text-align: center; box-shadow: 0 0 20px rgba(220,20,60,0.5); } .warning-text { color: #FFD700; font-size: 16px; line-height: 1.6; } .warning-text strong { color: #FF6B6B; font-size: 20px; display: block; margin-bottom: 10px; } .intro-footer { text-align: center; margin-top: 40px; padding-top: 30px; border-top: 2px solid #8B0000; } .footer-text { color: #CD853F; font-style: italic; font-size: 20px; margin-bottom: 20px; text-shadow: 2px 2px 4px #000; } .intro-footer button { padding: 15px 40px; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700; border: 2px solid #8B0000; border-radius: 5px; font-size: 20px; font-weight: bold; cursor: pointer; transition: all 0.3s; text-shadow: 1px 1px 2px #000; text-transform: uppercase; letter-spacing: 2px; } .intro-footer button:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000; box-shadow: 0 0 30px rgba(255,215,0,0.8); transform: scale(1.05); } </style>
<<nobr>> <h2>Current Weapon: $PlayerMeleeWeapon</h2><br> <h2>Minor Healing Potions: $MinorHealingPotion</h2><br> <<if $MinorHealingPotion gt 0>> <<if $PlayerHealth + 20 <= 100>> <<button "drink">> <<set $PlayerHealth to $PlayerHealth + 20>> <<set $MinorHealingPotion to $MinorHealingPotion - 1>> <<run Engine.show()>><</button>> <<else>> <<button "drink">> <<set $PlayerHealth to 100>> <<set $MinorHealingPotion to $MinorHealingPotion - 1>> <<run Engine.show()>><<<</button>> <</if>><</if>><br> <h2>Normal Healing Potions: $HealingPotion</h2><br> <<if $HealingPotion gt 0>> <<if $PlayerHealth + 50 <= 100>><<button "drink">> <<set $PlayerHealth to $PlayerHealth + 50>> <<set $HealingPotion to $HealingPotion - 1>> <<run Engine.show()>><</button>> <<else>> <<button "drink">> <<set $PlayerHealth to 100>> <<set $HealingPotion to $HealingPotion - 1>> <<run Engine.show()>><<<</button>> <</if>><</if>><br> <h2>Magic Boosting Potions: $MagicPotion</h2><br> <<if $MagicPotion gt 0>> <<if $PlayerMagic + 50 <= $PlayerMaxMagic>> <<button "drink">> <<set $PlayerMagic to $PlayerMagic + 50>> <<set $MagicPotion to $MagicPotion - 1>> <<run Engine.show()>><</button>> <<else>> <<button "drink">> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $MagicPotion to $MagicPotion - 1>> <<run Engine.show()>> <<<</button>> <</if>><</if>><br> <h2>Energy Potions: $EnergyPotion</h2><br> <<if $EnergyPotion gt 0>> <<if $PlayerEnergy + 50 <= 100>> <<button "drink">> <<set $PlayerEnergy to $PlayerEnergy + 50>> <<set $EnergyPotion to $EnergyPotion - 1>> <<run Engine.show()>><</button>> <<else>> <<button "drink">> <<set $PlayerEnergy to 100>> <<set $EnergyPotion to $EnergyPotion - 1>> <<run Engine.show()>><<<</button>> <</if>><</if>><br> <h2>Pelts: $Pelts</h2><br><br> <h2>Lock Picks: $LockPicks</h2><br><br> <<if $Flower is false>> <<else>><h2> You have a flower for Lucy</h2><</if>> <h2>Tarot Cards:</h2> <div id="tarot-inventory"> <<for _i to 0; _i < $TarotCardInvet.length; _i++>> <<capture _i>> <div class="tarot-card"> <h3><<print $TarotCardInvet[_i]>></h3> <img @src="'Images/Cards/Tarot/' + $TarotCardInvet[_i] + '.png'" @alt="$TarotCardInvet[_i]"> <div class="card-buttons"> <<button "Burn">> <<set _currentBurnCard to $TarotCardInvet[_i]>> <<if $TarotCardInvet[_i] is "Death">> <<script>> UI.alert("Death card burned"); <</script>> <<set $EnemyHealth to 0>> <<set $Souls to $Souls + 5>> <<elseif $TarotCardInvet[_i] is "Devil">> <<script>> UI.alert("Devil card burned, you gain 5 souls"); <</script>> <<set $Souls to $Souls + 5>> <<elseif $TarotCardInvet[_i] is "Magician">> <<script>> UI.alert("Magician card burned, your magic strength is maxed"); <</script>> <<set $PlayerMagic to $PlayerMaxMagic>> <<elseif $TarotCardInvet[_i] is "Strength">> <<script>> UI.alert("Strength card burned, your energy is maxed"); <</script>> <<set $PlayerEnergy to 100>> <<elseif $TarotCardInvet[_i] is "Sun">> <<script>> UI.alert("Sun card burned"); <</script>> <<set _int to random(0, 1)>> <<if _int is 0>><<set $Gold to $Gold + 200>><<else>> <<if $Gold >= 200>><<set $Gold to $Gold - 200>><<else>> <<set $Gold to 200>><</if>><</if>> <<elseif $TarotCardInvet[_i] is "Tower">> <<script>> UI.alert("Tower card played"); <</script>> <<if $RaidersNumber gt 0>> <<for _i to 0; _i < $Raiders.length; _i++>> <<run $RaidCaptives.push($Raiders[_i])>> <</for>> <<set $RaidersNumber to 0>> <<goto "RaidCell">> <</if>> <</if>> <<run $TarotCardInvet.splice(_i, 1)>> <<run $('#main-menu-buttons').detach()>> <<run $('#back-btn').show()>> <<run showMenuPage(Story.get("Inventory").text)>> <<run Engine.show()>> <</button>> <<capture _currentCard>> <<set _currentCard to $TarotCardInvet[_i]>> <<button "Info">> <<run $('#main-menu-buttons').detach()>> <<run $('#back-btn').show()>> <<run showMenuPage(Story.get(_currentCard + "_Card_Info").text)>> <</button>> <</capture>> </div> </div> <</capture>> <</for>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You are in your newly aquired home in Ironpeak. There is nothing to do here for the moment<br><br> <<button "Sleep">> <<set $Time to 1>> <<set $Day to $Day + 1>> <<fadeToPassage "IronpeakBase">> <</button>><br><br> <<if $IronpeakPortalHouseChecked isnot true>> <<button "Look around">> <<goto "IronpeakPortalHouseCheck">> <</button>><br><br> <</if>> <<if $IronpeakReturnPortal is true>> <<button "Portal home">> <<if $Quests.includes("Vist the mountains and purchase iron")>> <<run $Quests.delete("Vist the mountains and purchase iron")>> <</if>> <<goto "Portal">> <</button>><br><br> <</if>> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>><br><br> <i>The game autosaves in this location</i> </div> <</nobr>>
<div class="text-box"> <<nobr>> You follow Ida further up the mountain, into the fog, she moves quickly and you struggle to keep up with the girl<br><br> Before long, its getting dark, but once you get to the top of a ridge, you see the village of Ironpeak<br><br> <<Ida>>My home is near, follow me<</Ida>><br><br> [[Go to Ida's home|IdasHomeFirst]] <<set $Position to "null">> <</nobr>> </div>
<<nobr>> <div class="text-box"> You enter the force, an impresive building which could rival your own castle in scale. Compared to the dry frozen air of Ironpeak, the forges air is thick, and hot.<br><br> You walk past men and woman working, smelting ore, feeding fernices and other task's which seem back breaking, endless and most of all dangerous.<br><br> <audio autoplay> <source src="Audio/Forge.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> </div> <</nobr>> <<link "Leave">> <<set $MineVisitFirst to false>> <<script>> UI.alert("Quest Complete<br>You can now access Ironpeak Mine"); <</script>> <<run $Quests.delete("Gain access to the mine")>> <<run Engine.play('Ironpeak Outpost')>> <</link>>
<<nobr>> <div class="text-box"> Approaching the forge, you can see the large building at the center of our outpost.<br><br> It's clear this structure was built with purpose, while the surrounding wooden shacks were hastily constructed by miners seeking work.<br><br> The forge itself is an immense building, perched upon a jagged part of the mountain, towering above the surrounding structures.<br><br> <<if $Quests.includes("Gain access to the mine")>> There are too many doors, hatches, and vents to count, so you approach the nearest one and step inside.<br><br> <<button "Enter">> <<goto "IronpeakForgeInside">> <</button>><br><br> <<else>> <<You>>I don't need anything from here, yet<</You>> <</if>> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> You return to the house, check in on the owner and see she is still tied up in the wardobe.<br><br> Happy with the current situation, you lay on the bed and go to sleep waiting for your loyal servant to hopefully appear.<br><br> <<button "Sleep">> <<set $Position to "Wake">> <<fadeToPassage "IronpeakGnarlack">> <</button>> <<else>> You wake the sudden sounds of gasping and coughing<br><br> <<Gnarlak>>God's that was awful<</Gnarlak>><br><br> Gnarlack has hunched over by the tear you had made, upon your orders he had traveled through the portal to Ironpeak<br><br> <<You>>Not what you were expecting<</You>><br><br> <<Gnarlak>>No lord... Not at all<</Gnarlak>><br><br> <<You>>Catch your breath, we have much to do<</You>><br><br> <<Gnarlak>>I... will be fine, Lord. Now, how may I serve?<</Gnarlak>><br><br> <<You>>In order to secure the resources of this mountain, I need a way to travel between the castle and here, the paths are blocked with snow. Can you build another portal here, in this house?<</You>><br><br> <<Gnarlak>>Goblin's can build anything Lord, I will have one build for you<</Gnarlak>><br><br> <<You>>Good, I am going to secure some resources for us to take back, do you need anything?<</You>><br><br> <<Gnarlak>>No, Lord. I will build the portal as you command and wait her for you<</Gnarlak>><br><br> <<button "Return">> <<set $IronpeakReturnPortal to true>> <<goto "IronpeakBase">> <<script>> UI.alert("Quest Complete!<br>Gnarlack is working on the portal and you should be able to get home soon.<br><br> It's time to purchase Iron from the shop and head home for now"); <</script>> <<run $Quests.delete("Send a letter to Gnarlak from Ironpeak store")>> <</button>> <</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Quests.includes("Clear out a house and find create a tear for your portal")>> <<button "Search for a house to build your portal">> <<goto "IronpeakPortalHouse">> <</button>><br><br> <</if>> <<if $IronpeakBase is true>> <<button "Go to your house">> <<goto "IronpeakBase">> <</button>><br><br> <</if>> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Time <= 7>> There is no one here, but it is early, maybe you sould come back later...<br><br> [[Leave|IronpeakHostelUpstairs]] <</if>> <</nobr>> </div>
<div class="keyhole-view"> <div class="passage-content"> <<if $Event[$EventInt1] is "M">> Man alone <<elseif $Event[$EventInt1] is "F">> Woman alone <<if $Sceen is 1>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/1.webm" type="video/webm"></video> <<elseif $Sceen is 2>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/2.webm" type="video/webm"></video> <<elseif $Sceen is 3>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/3.webm" type="video/webm"></video> <<elseif $Sceen is 4>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/4.webm" type="video/webm"></video> <</if>> <<elseif $Event[$EventInt1] is "MF">> Man with woman <<if $Sceen is 1>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/MF/1.webm" type="video/webm"></video> <<elseif $Sceen is 2>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/MF/2.webm" type="video/webm"></video> <<elseif $Sceen is 3>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/MF/3.webm" type="video/webm"></video> <<elseif $Sceen is 4>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/MF/4.webm" type="video/webm"></video> <</if>> <<elseif $Event[$EventInt1] is "FF">> Woman with Woman <<elseif $Event[$EventInt1] is "N">> No one <</if>> </div> <div class="keyhole-overlay"></div> </div> [[Leave|IronpeakHostelUpstairs]]
<div class="text-box"> <<nobr>> <<if $Time <= 7>> There is no one here, but it is early, maybe you sould come back later...<br><br> [[Leave|IronpeakHostelUpstairs]] <</if>> <</nobr>> </div>
<div class="keyhole-view"> <div class="passage-content"> <<if $Event[$EventInt2] is "M">> Man alone <<elseif $Event[$EventInt2] is "F">> Woman alone <<if $Sceen is 1>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/1.webm" type="video/webm"></video> <<elseif $Sceen is 2>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/2.webm" type="video/webm"></video> <<elseif $Sceen is 3>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/3.webm" type="video/webm"></video> <<elseif $Sceen is 4>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/4.webm" type="video/webm"></video> <</if>> <<elseif $Event[$EventInt2] is "MF">> <<if $Sceen is 1>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/1.webm" type="video/webm"></video> <<elseif $Sceen is 2>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/2.webm" type="video/webm"></video> <<elseif $Sceen is 3>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/3.webm" type="video/webm"></video> <<elseif $Sceen is 4>> <video autoplay loop> <source src="Images/Mountains/Ironpeak/Homes/Sex/Solo/4.webm" type="video/webm"></video> <</if>> <<elseif $Event[$EventInt2] is "FF">> Woman with Woman <<elseif $Event[$EventInt2] is "N">> No one <</if>> </div> <div class="keyhole-overlay"></div> </div> [[Leave|IronpeakHostelUpstairs]]
<div class="text-box"> <<nobr>> <<if $HostelRoom is true>> [[Enter your room|HostelYourRoom]]<br><br> <</if>> [[Go downstairs|Hostel]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You approach a house on the outskirts<br><br> <<if $House is 1>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/1.png" width="700" height="700"></div> <<elseif $House is 2>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/2.png" width="700" height="700"></div> <<elseif $House is 3>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/3.png" width="700" height="700"></div> <<elseif $House is 4>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/4.png" width="700" height="700"></div> <<elseif $House is 5>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/5.png" width="700" height="700"></div> <<elseif $House is 6>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/6.png" width="700" height="700"></div> <<elseif $House is 7>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/7.png" width="700" height="700"></div> <</if>><br><br> Pick the [[Lock|Pick the lock (north)]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You approach a house on the outskirts<br><br> <<if $House is 1>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/1.png" width="700" height="700"></div> <<elseif $House is 2>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/2.png" width="700" height="700"></div> <<elseif $House is 3>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/3.png" width="700" height="700"></div> <<elseif $House is 4>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/4.png" width="700" height="700"></div> <<elseif $House is 5>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/5.png" width="700" height="700"></div> <<elseif $House is 6>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/6.png" width="700" height="700"></div> <<elseif $House is 7>> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Night/Houses/7.png" width="700" height="700"></div> <</if>><br><br> Pick the [[Lock|Pick the lock (north)]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You approach the mine entrance, as you get closer a man stands in your way<br><br> <div align="center"> <img src="Images/Mountains/Ironpeak/Mine/Miners/1.png" width="700" height="700"> </div><br><br> <<if $Quests.includes("Find iron")>> <<if $MineVisitFirst is true>> <span style="color: #8CC5F3;">Miner: Hold where you are. I've not seen you here before, if you're looking for work then you'll need to see the forman</span><br><br> <<Thoughts>>I need to get in here... I must learn more about this place...<</Thoughts>><br><br> <<You>>Yes, I need work. Where can I find the forman?<</You>> <span style="color: #8CC5F3;">Miner: Try the forge, he will put you to work</span><br><br> <<You>>Thank you<</You>> <<button "Leave">> <<script>> UI.alert("New Quest!<br>Gain access to the mine)"); <</script>> <<run $Quests.push("Gain access to the mine")>> <<run Engine.play('Ironpeak Outpost')>> <</button>> <<else>> <span style="color: #8CC5F3;">Welcome to the mines, board the elevator and we will lower you down, remeber keep the fire birning</span><br><br> You thank the man, and bord the wooden elevator suspended above a drop so deep you couldn't see the bottom. The ride down is long but eventually you reach the bottom<br><br> [[Enter the mine|Mine1]] <</if>> <<else>> <<You>>I have no need to go in there, yet<</You>><br><br> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>> <</if>> <</nobr>> </div>
<<nobr>> <div class="village-menu"> <h1>Ironpeak Outpost</h1> <p class="description">You enter the mining outpost of Ironpeak<br> <i>There isn't much to do here at the moment</i></p> <div class="menu-item" data-image="Images/Mountains/Ironpeak/Store/1.png"> [[Store|IronpeakStore]] </div> <div class="menu-item" data-image="Images/Mountains/Ironpeak/Hostel/1.png"> [[Hostel|Hostel]] </div> <div class="menu-item" data-image="Images/Mountains/Ironpeak/Forge/1.png"> [[Forge|IronpeakForge]] </div> <div class="menu-item" data-image="Images/Mountains/Ironpeak/Mine/1.png"> [[Mine|IronpeakMine]] </div> <div class="menu-item" data-image="Images/Mountains/Ironpeak/Homes/1.png"> [[Homes|IronpeakHomes]] </div> <div class="menu-item" data-image="Images/Mountains/Start/3.png"> [[Explore the area|NorthExploreStart]] </div> <<if $IronPeakFirstNight is false>> <<You>>I should stay the night at the hostel before trying to get home<</You>> <<else>> <<if $TiredToLeaveIronPeak is true>> <<else>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Return to the castle|LeaveIronPeak]] </div> <</if>><</if>> <style> .village-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .village-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .village-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <<script>> if (window.gameAudio) { window.gameAudio.pause(); window.gameAudio.currentTime = 0; } <</script>> <<set $Position to "null">> <<if $Blizzard is true>> <<startblizzard>> <<else>> <<stopblizzard>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> <audio autoplay> <source src="Audio/Knock.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> There's a pause, for a moment you assume no one is home, Until you hear foot steps.<br><br> A small blonde haired woman opens the door<br><br> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png" width="700" height="700"> </div><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>May I help you?<</say>><br><br> <<button "Tell her you're lost">> <<set $Position to "Lost">> <<goto "IronPeakPortalHouse2">> <</button>><br><br> <<button "Tell her you're injured">> <<set $Position to "Injured">> <<goto "IronPeakPortalHouse2">> <</button>><br><br> <<button "Force your way inside">> <<set $Position to "Force">> <<goto "IronPeakPortalHouse2">> <</button>><br><br> <</if>> <<if $Position is "Lost">> <<You>>Sorry to bother you ma'am, I'm not from around here and I've gotten lost<</You>><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Oh, well the hostel is about a quater mile that way<</say>><br><br> She gestures in a direction while remaining mostly behind the door<br><br> <<You>>Please ma'am I'm quite cold... Could I enter for a short time?<</You>><br><br> She seems to ponder on this for a moment before closing and locking the door. You hear her voice from behind the door<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>I'm sorry but it isn't safe for me to let strangers in like this... It's only a short walk to the hostel, they can help you<</say>><br><br> <<Thoughts>>That didn't go as expected, I should have told her I was hurt... I'll have to wait till dark to break in<</Thoughts>><br><br> <<button "Wait for dark">> <<set $Time to 10>> <<goto "IronpeakPortalHouse">> <</button>> <<set $PortalHouseEntryTried to true>> <</if>> <<if $Position is "Injured">> <<You>>Ma'am, please I was out hunting and a wolf... It got me by the leg<</You>><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Oh my, I think we have a doctor in the outpost... Prehapse he could...<</say>><br><br> <<You>>No, I-I can't walk any further. Please can you help me?<</You>><br><br> She thinks for a moment, before stepping aside and gesturing you into the house<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>You had best come in<</say>><br><br> <<button "Enter">> <<set $Position to "null">> <<goto "IronpeakPortalInjured">> <</button>> <</if>> <<if $Position is "Force">> You kick the door as hard as you can, sending the woman flying backward, you enter and close the door behind you.<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Please... I<</say>><br><br> You look at the woman, unsure what to do with her, she's a problem now... But with the right persuasion, she could help you<br><br> Without much time to think, you knock the woman out and tie her up<br><br> With that sorted you create a tear in the house<br><br> <<button "Create tear">> <<run setup.addPortalDestination('Ironpeak Home', 'IronpeakBase', 'Ironpeak.png')>> <<set $IronpeakBase to true>> <<script>> UI.alert("Quest Complete!<br>With the house secured for now, you create a tear so that you can travel to Ironpeak from your castle quickly<br><br> New Quest:<br> You need to summon Gnarlak, You may be able to send a letter from the store"); <</script>> <<run $Quests.push("Send a letter to Gnarlak from Ironpeak store")>> <<run $Quests.delete("Clear out a house and find create a tear for your portal")>> <<goto "IronpeakBase">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You spend some time looking around the small house, reading letters, searching through draws.<br><br> After some time reading through letters, you find the young woman who lives here is called Eva.<br><br> You also find 120 gold, Eva won't be needing that now...<br><br> <<set $Gold to $Gold + 120>> <<set $IronpeakPortalHouseChecked to true>> <<button "Return">> <<goto "IronpeakBase">> <</button>> </div> <</nobr>>
<div class="text-box"> <div id="game-container"> <div id="lock-image"> <svg width="300" height="300" viewBox="0 0 300 300"> <defs> <linearGradient id="lockGradient" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" style="stop-color:#666;stop-opacity:1" /> <stop offset="100%" style="stop-color:#333;stop-opacity:1" /> </linearGradient> </defs> <circle cx="150" cy="150" r="140" fill="url(#lockGradient)" /> <circle cx="150" cy="150" r="120" fill="#222" stroke="#444" stroke-width="5"/> <circle cx="150" cy="150" r="15" fill="#888" /> <rect id="pin" x="145" y="30" width="10" height="90" fill="gold" transform="rotate(0 150 150)" /> <circle cx="150" cy="150" r="20" fill="#444" stroke="#555" stroke-width="5"/> </svg> </div> <div id="controls"> <button id="rotate-left">↺ Rotate Left</button> <button id="rotate-right">↻ Rotate Right</button> <button id="try-unlock">Try to Unlock</button> </div> <div id="message"></div> <div id="hint"></div> <div id="attempts-left">Attempts Remaining: <span id="attempts-count">3</span></div> <div id="picks-left">Lock Picks Remaining: <span id="picks-count">$LockPicks</span></div> </div> <div id="retry-container" style="display: none;"> <button id="retry">Try with a new lock pick</button> </div> <div id="give-up"> <<link "Give up">><<goto "town">><</link>> </div> <style> body { background-color: #2c3e50; color: #ecf0f1; } #game-container { text-align: center; font-family: Arial, sans-serif; padding: 20px; border-radius: 10px; } #lock-image { margin: 20px auto; } #controls { margin-top: 20px; } button { margin: 0 10px; padding: 10px 20px; font-size: 16px; background-color: #2980b9; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } button:hover { background-color: #3498db; } #message, #hint, #attempts-left, #picks-left { margin-top: 20px; font-size: 18px; font-weight: bold; } #hint { color: #bdc3c7; font-style: italic; } #attempts-left, #picks-left { color: #e74c3c; } #give-up, #retry-container { margin-top: 20px; font-size: 16px; } #give-up a { color: #e74c3c; text-decoration: none; } #give-up a:hover { text-decoration: underline; } </style> <<script>> $(document).ready(function() { let currentRotation = 0; let correctRotation = Math.floor(Math.random() * 360); let tolerance = 45; // Increased tolerance for much easier gameplay let attemptsLeft = 3; let picksLeft = Number(State.variables.LockPicks); function rotatePin(degrees) { currentRotation = (currentRotation + degrees + 360) % 360; $('#pin').attr('transform', `rotate(${currentRotation} 150 150)`); } function getHint() { const difference = (correctRotation - currentRotation + 360) % 360; if (difference > 180) { return "Try rotating left a bit."; } else { return "Try rotating right a bit."; } } function updateDisplays() { $('#attempts-count').text(attemptsLeft); $('#picks-count').text(picksLeft); } function resetLock() { currentRotation = 0; correctRotation = Math.floor(Math.random() * 360); attemptsLeft = 3; $('#pin').attr('transform', 'rotate(0 150 150)'); $('#controls').show(); $('#message').text(''); $('#hint').text(''); $('#retry-container').hide(); updateDisplays(); } $('#rotate-left').on('click', function() { rotatePin(-15); $('#hint').text(''); }); $('#rotate-right').on('click', function() { rotatePin(15); $('#hint').text(''); }); $('#try-unlock').on('click', function() { const difference = Math.abs(currentRotation - correctRotation); if (difference <= tolerance || difference >= 360 - tolerance) { $('#message').text('Success! You picked the lock and entered the home.'); $('#message').css('color', '#2ecc71'); $('#controls').hide(); $('#hint').hide(); $('#attempts-left').hide(); $('#picks-left').hide(); $('#give-up').hide(); setTimeout(function() { Engine.play("IronpeakPortalInsideNight"); }, 2000); } else { attemptsLeft--; updateDisplays(); if (attemptsLeft > 0) { $('#message').text(`The lock didn't open. Try again.`); $('#message').css('color', '#e74c3c'); $('#hint').text(getHint()); } else { picksLeft--; State.variables.LockPicks = picksLeft; $('#message').text('Your lock pick broke!'); $('#message').css('color', '#e74c3c'); $('#controls').hide(); $('#hint').hide(); if (picksLeft > 0) { $('#retry-container').show(); } else { $('#message').text('You have no more lock picks left. You failed to open the lock.'); } } } updateDisplays(); }); $('#retry').on('click', function() { resetLock(); }); updateDisplays(); }); <</script>> </div>
<<nobr>> <div class="text-box"> <div align="center"> <img src="Images/Mountains/Ironpeak/Homes/Houses/6.png" width="700" height="700"> </div><br><br> <<if $PortalHouseEntryTried isnot true>> You wander through the jumble of crooked wooden houses, hunting for the perfect spot to set up your portal. After a bit of a scavenger hunt, you finally spot one house, standing all lonely and proud, just a little apart from the rest... <br><br> <<You>>I need to be careful here, I don't know who is in there... I could try the direct approach and knock on the door. Or wait till dark and sneak in. Either way I need the occupance of this house dead or working for me<</You>><br><br> <<if $Time lt 9>> <<button "Knock at the door">> <<set $Position to "null">> <<goto "IronPeakPortalHouse2">> <</button>><br><br> <<else>> Its too late to knock, shes probably asleep. You can come back tomorrow or break in<br><br> <</if>> <</if>> <<if $LockPicks is 0>> You have no lock picks left, prehapse you could purchase some at the local shop<br><br> <</if>> <<if $Time lt 10>> <<button "Wait for dark">> <<set $Time to 10>> <<goto "IronpeakPortalHouse">> <</button>><br><br> <</if>> <<if ($Time gt 9) and ($LockPicks gt 0)>> <<button "Pick the lock">> <<set $Position to "null">> <<goto "IronPeakPortalHouseNight">> <</button>><br><br> <</if>> <<button "Leave for now">> <<goto "IronpeakHomes">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> You enter the small home, there isn't much, just a bed, table, wardrobe and some cooking supplies<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Lay on the bed, I'll get some rags and water<</say>><br><br> You pretend to limp over to a chair and sit down<br><br> After a moment, she returns and kneels before you<br><br> You allow her to remove your trousers and she checks your leg<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>I can't she any injury...<</say>><br><br> She looks up at you confused<br><br> <<if $PlayerSpells.includes("Dominate")>> <<button "Dominate her mind">> <<set $Position to "Dom">> <<goto "IronpeakPortalInjured">> <</button>><br><br> <<else>> <i>You don't have the right spell to dominate her mind</i><br><br> <</if>> <<button "Knock her out">> <<set $Position to "KO">> <<goto "IronpeakPortalInjured">> <</button>> <</if>> <<if $Position is "KO">> You quickly knock the woman out, it's painless and she won't remeber it.<br><br> She has done nothing to you and there's no use killing her, so instead you tie her up and place her in the wardrobe, there will be uses for her later<br><br> <</if>> <<if $Position is "Dom">> In her moment of confusion, it is easy for you to possess her mind and take control of her thoughts. You see the look of confusion turn to lust in her eyes as she temporally becomes under you're control.<br><br> <<You>>That's better isn't it?<</You>><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Yes...<</say>><br><br> <<You>>Good, I'm going to need you going forward... But for now undess and lay on the bed, I've had a long day and you can help me relax<</You>><br><br> She does as you say and you enjoy her company for a while<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/5.webm" type="video/webm"> </video><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>God's fuck me please!<</say>><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/6.webm" type="video/webm"> </video><br><br> <<You>>Fuck, I think I'll keep you<</You>><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/7.webm" type="video/webm"> </video><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Yess, keep me as your toy<</say>><br><br> That pushes you over the edge and you finish inside her, you decide to keep her for later. But knowing the spell will wear off soon, you tie her up and place her in the wardobe<br><br> <</if>> <<if $Position isnot "null">> <<button "Create tear">> <<run setup.addPortalDestination('Ironpeak Home', 'IronpeakBase', 'Ironpeak.png')>> <<set $IronpeakBase to true>> <<script>> UI.alert("Quest Complete!<br>With the house secured for now, you create a tear so that you can travel to Ironpeak from your castle quickly<br><br> New Quest:<br> You need to summon Gnarlak, You may be able to send a letter from the store"); <</script>> <<run $Quests.push("Send a letter to Gnarlak from Ironpeak store")>> <<run $Quests.delete("Clear out a house and find create a tear for your portal")>> <<goto "IronpeakBase">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "null">> You enter the the building as quietly as you can, there isn't much to the house, its a single room shack, with a bed, table, fire and kitchen area. On the other side of the room you see the woman sleeping<br><br> <div align="center"><img src="Images/Town/Houses/Bedroom/People/3.png" width="700" height="700"></div><br><br> You look at her for a moment, it would be ideal to keep her alive, you could have a loyal servant in Ironpeak and no one will ask questions about the house...<br><br> You think about what to do with her for now<br><br> <<if $PlayerSpells.includes("Dominate")>> <<button "Dominate her mind">> <<set $Position to "Dom">> <<goto "IronpeakPortalInsideNight">> <</button>><br><br> <<else>> <i>You don't have the right spell to dominate her mind</i><br><br> <</if>> <<button "Tie her up for now">> <<goto "IronpeakPortalInsideNight">> <<set $Position to "KO">> <</button>> <</if>> <<if $Position is "KO">> You creep over to a wardrobe and take some of her clothes. Then, silently you cut them with your sword into lenghts so you can bind her<br><br> Once that is done, you creep closer to the woman and cast a spell to ensure she won't wake up soon.<br><br> With her unconsious. You gag and bind her, before locking her in the wardrobe to be delt with later<br><br> With that sorted, you can do what you came here for...<br><br> <</if>> <<if $Position is "Dom">> In her sleeping state, she is defenceless against your mental attack. You whisper in her ear and dominate her mind, corrupting her to your will for a short time<br><br> She opens her eyes and looks at you<br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>It's you<</say>><br><br> She smiles up at you<br><br> <<You>>I'm going to need you going forward... But for now we can keep eachother company, undess for me<</You>><br><br> She does as you say and you take your time enjoying her willing body<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/5.webm" type="video/webm"> </video><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>God's fuck me please!<</say>><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/6.webm" type="video/webm"> </video><br><br> <<You>>Fuck, I think I'll keep you<</You>><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/7.webm" type="video/webm"> </video><br><br> <<say 'Woman' 'Images/Mountains/Ironpeak/Homes/Houses/Portal/1.png'>>Yess, keep me as your toy<</say>><br><br> That pushes you over the edge and you finish inside her, you decide to keep her for later. But knowing the spell will wear off soon, you tie her up and place her in the wardobe<br><br> <</if>> <<if $Position isnot "null">> <<button "Create tear">> <<run setup.addPortalDestination('Ironpeak Home', 'IronpeakBase', 'Ironpeak.png')>> <<set $IronpeakBase to true>> <<script>> UI.alert("Quest Complete!<br>With the house secured for now, you create a tear so that you can travel to Ironpeak from your castle quickly<br><br> New Quest:<br> You need to summon Gnarlak, You may be able to send a letter from the store"); <</script>> <<run $Quests.push("Send a letter to Gnarlak from Ironpeak store")>> <<run $Quests.delete("Clear out a house and find create a tear for your portal")>> <<goto "IronpeakBase">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<You>>Hello sir, I need to send a letter, can you do this for me?<</You>><br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>Yes, we have a few ravens which can deliver in these conditions, where do you need the later to go?<</say>><br><br> <<You>>Grimshade Castle<</You>><br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>I can't say I have heard of the castle, I don't get off this mountain often... Do you work there?<</say>><br><br> <<You>>In a way, yes<</You>><br><br> The man hands you a small scroll and quill<br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>Write your message here, I'll sort out getting it sent out<</say>><br><br> <div align="center"> <img src="Images/Items/Misc/PortalLetter.png" width="700" height="700"> </div><br><br> You scribble down a letter and seal it with wax before handing it to the man<br><br> <<You>>Thank you<</You>><br><br> <<Thoughts>>I should return to the house to rest and wait for him<</Thoughts>><br><br> <<button "Return to the house">> <<set $Position to "null">> <<goto "IronpeakGnarlack">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $IronPeakShopFirst is true>> <div align="center"> <img src="Images/Mountains/Ironpeak/Store/2.png" width="700" height="700"> </div><br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>Hello, welcome, my stock is slightly short at the moment<</say>><br><br> <<You>>Hello, what do you have for sale?<</You>><br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>Not much with the mine being closed... I get an ingot or two of iron evey few days... <</say>><br><br> <<You>>You can get iron?<</You>><br><br> <<say 'Shopkeeper' 'Images/Mountains/Ironpeak/Store/2.png'>>Aye, take a look. But I warn you... Despite our name, iron is hard to come by<</say>><br><br> <<button "See what's for sale">> <<set $IronPeakShopFirst to false>> <<goto "IronpeakStore">> <</button>> <<else>> <h1>Ironpeak Store</h1> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Iron.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Iron Ingots</h3> <p>Current Ingots: $Iron</p> <p>In stock: $IronStock</p> <p>Cost: 150 Gold</p> <<if $IronStock >= 1>> <<if $Gold >= 150>> <<button "Purchase">> <<set $Iron to $Iron + 1>> <<set $Gold to $Gold - 150>> <<set $IronStock to $IronStock - 1>> <<goto "IronpeakStore">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> <<else>> <button disabled>Out of stock, check back in a few days</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Candle.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Candle</h3> <p>Current Candles: $Candles / 3</p> <p>Cost: 30 Gold</p> <<if $Candles lt 3>> <<if $Gold >= 50>> Unavilable<br> <i>Coming in the next update</i> <<else>> <button disabled>Insufficient Gold</button> <</if>> <<else>> <button disabled>Max Item Capacity</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Pitch.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Pitch Bottle</h3> <p>Cost: 50 Gold</p> <p>Current Pitch Bottles: $PitchBottles / 3</p> <<if $PitchBottles lt 3>> <<if $Gold >= 50>> Unavilable<br> <i>Coming in the next update</i> <<else>> <button disabled>Insufficient Gold</button> <</if>> <<else>> <button disabled>Max Item Capacity</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/LockPicks.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Three Lock Picks</h3> <p>Cost: 75 Gold</p> <p>Current lock picks: $LockPicks</p> <<if $Gold >= 50>> <<button "Purchase">> <<set $Gold to $Gold - 75>> <<set $LockPicks to $LockPicks + 3>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> </div> <hr> <<if $Quests.includes("Send a letter to Gnarlak from Ironpeak store")>> <<button "Ask about sending a letter">> <<goto "IronpeakStoreLetter">> <</button>><br><br> <</if>> <<button "Leave">> <<goto "Ironpeak Outpost">> <</button>> <</if>> <</nobr>> </div> <<stopblizzard>>
<<nobr>> <div class="text-box"> <<if $Animal is true>> You take a Pelt from the body. <<if $CurrentEnemy is "Wolf">><<set $Pelts++>><</if>> <<if $CurrentEnemy is "Bear">><<set $Pelts to $Pelts += 2>><</if>> You can [[return to the castle|Base Intro]] OR [[continue exploring the forrest|ForestExplore]] <</if>> <<if ($CurrentEnemy is "Bandit") or ($CurrentEnemy is "female Bandit")>> You drain the $CurrentEnemy soul. <<set $Int to random(0, 10)>> <<if ($TarotCardInvet.includes("Devil")) and ($Int gt 5)>> The devil card takes its toll, you cannot take the $CurrentEnemy's soul <br><br> <<else>> <<set $Souls to $Souls + 1>> <</if>> <<if $Notoriety lt $MaxNotoriety>><<set $Notoriety to $Notoriety + 10>><</if>> You can [[return to the castle|Base Intro]] OR [[continue exploring the forrest|ForestExplore]] <</if>> <<if $CurrentEnemy is "guard">> You kill the guard and leave his lifeless body on the ground for the villagers to see [[leave|Scarldale]] <</if>> <<if $CurrentEnemy is "Bandit">> The bandit collapses to his knees, blood pooling beneath him. His eyes glaze over as you reach out with dark magic, drawing his life essence into yourself. The soul tears free with a faint whisper, adding to your collection.<br> <<set _soulInt to random(0, 10)>> <<if ($TarotCardInvet.includes("Devil")) and (_soulInt gt 5)>> The devil card's curse activates - the soul slips through your grasp, returning to the void.<br><br> <<else>> <<set $Souls to $Souls + 1>> <</if>> <<elseif $CurrentEnemy is "female Bandit">> The female bandit staggers backward, her weapon clattering to the ground. As life fades from her eyes, you extend your hand and pull her soul into your dark embrace. Another essence to fuel your power.<br> <<set _soulInt to random(0, 10)>> <<if ($TarotCardInvet.includes("Devil")) and (_soulInt gt 5)>> The devil card's curse activates - the soul slips through your grasp, returning to the void.<br><br> <<else>> <<set $Souls to $Souls + 1>> <</if>> <<elseif $CurrentEnemy is "Heavy Bandit">> The heavily armored bandit crashes to the ground with a thunderous clang. Despite his impressive armor, his soul is just as vulnerable as any other. You wrench it from his dying body, adding his strength to your own.<br> <<set _soulInt to random(0, 10)>> <<if ($TarotCardInvet.includes("Devil")) and (_soulInt gt 5)>> The devil card's curse activates - the soul slips through your grasp, returning to the void.<br><br> <<else>> <<set $Souls to $Souls + 1>> <</if>> <<elseif $CurrentEnemy is "Armored Bandit">> The armored bandit's defenses have failed him. As he lies defeated, you place your hand over his chest and draw out his essence. His soul struggles briefly before submitting to your dark will.<br> <<set _soulInt to random(0, 10)>> <<if ($TarotCardInvet.includes("Devil")) and (_soulInt gt 5)>> The devil card's curse activates - the soul slips through your grasp, returning to the void.<br><br> <<else>> <<set $Souls to $Souls + 1>> <</if>> <</if>> <<if $Animal is false>> <<set $Int to random(0,4)>> <<if $Int is 0>> <<set $Int to random(5, 50)>> Searching the $CurrentEnemy, you find $Int gold... <<set $Gold to $Gold + $Int>> <</if>><</if>> <<if $Animal is false>> <<if $Int is 1>> Searching the $CurrentEnemy, you find a minor healing potion... <<set $MinorHealingPotion to $MinorHealingPotion + 1>><</if>> <<if $Int is 2>> Searching the $CurrentEnemy, you find an energy boost potion... <<set $EnergyPotion to $EnergyPotion + 1>><</if>> <<if $Int is 3>> Searching the $CurrentEnemy, you find a magic boost potion... <<set $MagicPotion to $MagicPotion + 1>><</if>> <<if $Int is 4>> You find nothing of use on the $CurrentEnemy's body... <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <<set $NPCCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">> <</nobr>>
<<nobr>> <div class="text-box"> You entre a kitchen<br><br> <div align="center"> <img src="Images/Town/Houses/Kitchen/3.png" width="700" height="700"> </div><br><br> <<if $Kitchen1 is false>> <div id="options"> <<linkreplace "search the drawers">> <div id="inner-options"> You slowly open the drawer and look through it... <<set $Kitchen1 to true>> <<if $SilverLocation[$Location] is "Kitchen">> Looking through the drawers you find a ring...<br><br> <<set $silverfound to true>> <div align="center"> <img src="Images/Town/Houses/Jewelry/2.png" width="700" height="700"> </div><br><br> <<if $SilverNeed gt 0>> You need $SilverNeed more silver<br><br> <<set $SilverNeed to $SilverNeed - 1>> <<elseif $Quests.includes("Obtain a silver weapon")>> You have all the silver Henry needs<br><br> <</if>> <<else>> <<set $Int to random(0, 4)>> <<if ($Int gt 2) and ($GoldFound is false)>> <<set $GoldFound to true>> You find a small pouch containing 20 gold<br><br> <<set $Gold to $Gold + 20>> <<else>> Theres nothing here... <br><br><</if>> <<set $Searching to false>> <</if>> </div> <</linkreplace>> </div> <br><br> <</if>> <<if $Searching is false>> <<if $silverfound is false>> [[Try the livingroom|LivingRoom1]]<br><br> [[Try the bedroom|BedroomOne]]<br><br> [[Leave|TownHouses]] <<else>> [[Leave|TownHouses]] <</if>><</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You entre a kitchen<br><br> <div align="center"> <img src="Images/Town/Houses/Kitchen/3.png" width="700" height="700"> </div><br><br> <<if $Kitchen2 is false>> <div id="options"> <<linkreplace "search the drawers">> <div id="inner-options"> You slowly open the drawer and look through it... <<set $Kitchen2 to true>> <<if $SilverLocation[$Location] is "Kitchen">> While searching the drawer you find a silver spoon...<br><br> <<set $silverfound to true>> <div align="center"> <img src="Images/Town/Houses/Jewelry/6.png" width="700" height="700"> </div><br><br> <<if $SilverNeed gt 0>> You need $SilverNeed more silver<br><br> <<set $SilverNeed to $SilverNeed - 1>> <<elseif $Quests.includes("Obtain a silver weapon")>> You have all the silver Henry needs<br><br> <</if>> <<else>> <<set $Int to random(0, 4)>> <<if ($Int gt 2) and ($GoldFound is false)>> <<set $GoldFound to true>> You find a small pouch containing 20 gold<br><br> <<set $Gold to $Gold + 20>> <<else>> Theres nothing here... <br><br><</if>> <<set $Searching to false>> <</if>> </div> <</linkreplace>> </div> <br><br> <</if>> <<if $Searching is false>> <<if $silverfound is false>> [[Try the livingroom|LivingRoom2]]<br><br> [[Try the bedroom|BedroomOne]]<br><br> [[Leave|TownHouses]] <<else>> [[Leave|TownHouses]] <</if>><</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Tip is false>> You return to the bath house reception, the receptionist is still there. <div align="center"> <img src="Images/Town/BathHouse/1.png" width="700" height="700"> </div> <<Receptionist>>I hope you had a relaxing time<</Receptionist>><br><br> <<You>>Yes, thank you<</You>><br><br> <<Receptionist>>Some of our patrons like to leave a tip for the masseuse who serviced them, would you like too?<</Receptionist>><br><br> <<Thoughts>>I cant believe I'm falling in to such tricks, but I do like the way this is going...<</Thoughts>> <<if $Gold >= 100>> <<link "Give tip (100 gold)">><<set $Gold to $Gold - 100>><<set $Tip to true>><<run Engine.play('LeaveBathhouse')>><</link>><br><<else>>You cant afford to tip<</if>> <<link "Dont tip">><<run Engine.play('Town')>><</link>> <<else>> <<You>>Sure, please give her this<</You>><br><br> <<Receptionist>>Thank you sir! I'm sure she will be very greatful. See you soon<</Receptionist>><br><br> The receptionist winks at you, and you turn to [[leave|Town]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You start hiking back towards the pass you used to get into the mountains<br><br> After reaching the bank looking over the outpost, you realise Ida was waiting for you<br><br> <<Ida>>Where are you going<</Ida>><br><br> <<You>>Home, I need to do some things, Ill be back home soon<</You>><br><br> <<Ida>>The pass will be blocked by snow now... The only way to leave is around the mountains, its a few days and you don't have a horse...<</Ida>><br><br> <<You>>Well... Shit, Ill need to find another way<</You>><br><br> <<button "Back to the outpost">> <<goto "Ironpeak Outpost">> <<script>> UI.alert("New Quest! <br>You're stuck in Ironpeak for now. but prehapse there's a way to get some assistance using your portal. You should start by finding somewhere quiet to create a tear for your portal. Prehapse a house?"); <</script>> <<run $Quests.push("Clear out a house and find create a tear for your portal")>> <</button>> <<set $TiredToLeaveIronPeak to true>> <</nobr>> </div> <<startblizzard>>
<<nobr>> <div class="castle-menu"> <h1>Castle Ground Floor</h1> <<if $HideLeftWingImage isnot true>> <div class="castle-map"> <img src="Images/Castle/Maps/5.jpeg" alt="Castle Interior" class="castle-base"> <<if $PortalRoomUnlocked>> <img src="Images/Castle/Maps/portalRoom.png" alt="Forge" class="room-overlay"> <</if>> <<if $Infirmary>> <img src="Images/Castle/Maps/infirmary.png" alt="Map Room" class="room-overlay"> <</if>> </div> <<button "Hide map">> <<set $HideLeftWingImage to true>> <<goto "Left Wing">> <</button>> <<else>> <<button "Show map">> <<set $HideLeftWingImage to false>> <<goto "Left Wing">> <</button>> <</if>> <br><br> <<if $PortalRoomUnlocked is true>> <<if $Time < 9>> <div class="menu-item" data-image="Images/Castle/Portal/1.png"> [[Portal Room|Portal]] <span class="menu-description">Travel through magical portals</span> </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Portal/1.png"> <span style="color: #808080;">Portal Room</span> <span class="menu-description" style="color: #666;">Too late to use the portal</span> </div> <</if>><</if>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Visit the Vaults|Vaults]] <span class="menu-description">Check your treasury and resources</span> </div> <<if $Infirmary is true>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Visit the Infirmary|Infirmary]] <span class="menu-description">Heal wounds and recover strength</span> </div> <</if>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Back to the entrance|Inside Castle]] <span class="menu-description">Return to the main hall</span> </div> </div> <<set $CloakDisabled to false>> <<set $CurrentPlayer to "Overlord">> <<set $Cloaked to false>> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <style> .castle-map { position: relative; width: 600px; height: 600px; margin: 0 auto; } .castle-base { position: absolute; top: 0; left: 0; width: 600px; height: 600px; display: block; } .room-overlay { position: absolute; top: 0; left: 0; width: 600px; height: 600px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>>
<<nobr>> <div class="text-box"> <<if $FirstLibraryVisit isnot true>> <<set $LibrarysMax to 3>> <<set $LibraryOccupance to []>> <<Gnarlak>>Ah, my lord, great work with the Library. we can assign new jobs to Villagers with this!<</Gnarlak>><br><br> <<You>>Yes, that was the plan<</You>><br><br> <<Gnarlak>>good thinking my Lord, otherwise your captured Settlements wont have the Villagers with the Job they need<</Gnarlak>><br><br> <<You>>Thats why i am the Lord<</You>><br><br> <<Gnarlak>>Yes lord, but who teaches them?<</Gnarlak>><br><br> <<You>>What do you mean? they teach themselves<</You>><br><br> <<You>>Maybe we can find a teacher in the future, but for now we work with what we have<</You>><br><br> <<set $FirstLibraryVisit to true>> <</if>> <h1>Library</h1> You enter the Library You have space for $LibrarysMax Villager<br> You currently have $LibraryOccupance.length Villager<br><br> <<if $LibraryOccupance.length === 0>> <p>You have no one in your Library</p> <<else>> <<for _room to 0; _room < Math.ceil($LibraryOccupance.length / 3); _room++>> <h3>Room <<print _room + 1>></h3> <div id="patient-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to _room * 3; _i < Math.min((_room + 1) * 3, $LibraryOccupance.length); _i++>> <<capture _villager>> <<set _villager to $LibraryOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_villager.ImagePath" alt="<<_villager.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _villager.name>></h3> <div style="margin: 20px 0;"> <h3>Corruption</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value=" _villager.corruption" max="100"></progress> <span><<print _villager.corruption>>%</span> </div> </div> <p style="margin: 2px 0;">Job: <<print _villager.specialization>></p> <div style="width: 99%;"> <h4 style="margin: 0;">Job:</h4> <progress @value=" _villager.skill" max="100" style="width: 100%;"></progress> <<button "Send to a Settlement">> <<set $villagerForTransfer = _villager>> <<set _npcId = _villager.NPCID>> <<run $LibraryOccupance.delete(_villager)>> <<goto "SelectSettlementTransfer2">> <</button>> </div> <</capture>> <</for>> </div> <<if _room < Math.ceil($LibraryOccupance.length / 5) - 1>> <hr> <</if>> <</for>> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Return to Castle">> <<goto "Inside Castle">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Int == 1>> Unable to resist, you kneel infront of the succubus and luck her. Savoring every second as she lays back and moans in extacy <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/1.webm" type="video/webm"> </video> [[Resist|BossCrypt]] <br> <<link "Keep Going">><<set $Int ++>><<run Engine.play('LickSuccubus')>><</link>> <</if>> <<if $Int == 2>> She rolls onto all fours and pulls your face into her dripping pussy, you lick her with more excitment and bury your toung into her. It seems your both becoming lost in the pleasure. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/2.webm" type="video/webm"> </video> [[Resist!|BossCrypt]] <br> <<link "Worship her...">><<set $Int ++>><<run Engine.play('LickSuccubus')>><</link>> <</if>> <<if $Int == 3>> Pushing you back, the she sits on your face, you barely have time to breath but you don't care as she rubs her pussy on your face, intoxicating you further with her juices. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/3.webm" type="video/webm"> </video> [[Resist!|BossCrypt]] <br> <<link "She turns around...">><<set $Int ++>><<run Engine.play('LickSuccubus')>><</link>> <</if>> <<if $Int == 4>> You feel her tense as she cums on your face. You cant help but swallow her jucies as she pushes your cock into her throat.<br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/4.webm" type="video/webm"> </video> But then she stops and gets up.<br> <<Succubus>>I'm going to suck you dry<</Succubus>><br> She says before getting between your legs and inhaling your cock<br> [[Blowjob|SuccubusBlow]] <<set $Int ++>> <<set $PlayerHealth to $PlayerHealth - 10>> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You entre a livingroom<br><br> <div align="center"> <img src="Images/Town/Houses/LivingRoom/3.png" width="700" height="700"> </div><br><br> <<if $Livingroom1 is false>> <div id="options"> <<linkreplace "search the dresser">> <div id="inner-options"> You slowly open the drawer and look through it... <<set $Livingroom1 to true>> <<if $SilverLocation[$Location] is "Livingroom">> While searching the drawer you find a necklace...<br><br> <<set $silverfound to true>> <div align="center"> <img src="Images/Town/Houses/Jewelry/1.png" width="700" height="700"> </div><br><br> <<if $SilverNeed gt 0>> You need $SilverNeed more silver<br><br> <<set $SilverNeed to $SilverNeed - 1>> <<elseif $Quests.includes("Obtain a silver weapon")>> You have all the silver Henry needs<br><br> <</if>> <<else>> <<set $Int to random(0, 4)>> <<if ($Int gt 2) and ($GoldFound is false)>> <<set $GoldFound to true>> You find a small pouch containing 20 gold<br><br> <<set $Gold to $Gold + 20>> <<else>> Theres nothing here... <br><br><</if>> <<set $Searching to false>> <</if>> </div> <</linkreplace>> </div> <br><br> <</if>> <<if $Searching is false>> <<if $silverfound is false>> [[Try the kitchen|KitchenTwo]]<br><br> [[Try the bedroom|BedroomOne]]<br><br> [[Leave|TownHouses]] <<else>> [[Leave|TownHouses]] <</if>><</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You entre a livingroom<br><br> <div align="center"> <img src="Images/Town/Houses/LivingRoom/3.png" width="700" height="700"> </div><br><br> <<if $Livingroom2 is false>> <div id="options"> <<linkreplace "search the drawers">> <div id="inner-options"> You slowly open the drawers and look through it... <<set $Livingroom2 to true>> <<if $SilverLocation[$Location] is "Livingroom">> While searching the drawer you find a silver spoon...<br><br> <<set $silverfound to true>> <div align="center"> <img src="Images/Town/Houses/Jewelry/6.png" width="700" height="700"> </div><br><br> <<if $SilverNeed gt 0>> You need $SilverNeed more silver<br><br> <<set $SilverNeed to $SilverNeed - 1>> <<elseif $Quests.includes("Obtain a silver weapon")>> You have all the silver Henry needs<br><br> <</if>> <<else>> <<set $Int to random(0, 4)>> <<if ($Int gt 2) and ($GoldFound is false)>> <<set $GoldFound to true>> You find a small pouch containing 20 gold<br><br> <<set $Gold to $Gold + 20>> <<else>> Theres nothing here... <br><br><</if>> <<set $Searching to false>> <</if>> </div> <</linkreplace>> </div> <br><br> <</if>> <<if $Searching is false>> <<if $silverfound is false>> [[Try the kitchen|KitchenOne]]<br><br> [[Try the bedroom|BedroomOne]]<br><br> [[Leave|TownHouses]] <<else>> [[Leave|TownHouses]] <</if>><</if>> </div> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/1.png", { hotspots: [ { x: 497, y: 563, tooltip: "House 1", passage: "SettlementHouse" }, { x: 179, y: 459, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/2.png", { hotspots: [ { x: 238, y: 524, tooltip: "Barn", passage: "SettlementBarn" }, { x: 353, y: 502, tooltip: "House", passage: "SettlementHouse" }, { x: 504, y: 488, tooltip: "Tavern", passage: "SettlementTav" }, { x: 650, y: 457, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/3.png", { hotspots: [ { x: 574, y: 528, tooltip: "Barn", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/4.png", { hotspots: [ { x: 143, y: 473, tooltip: "House 1", passage: "SettlementHouse" }, { x: 400, y: 477, tooltip: "House 2", passage: "SettlementHouse" }, { x: 598, y: 450, tooltip: "Barn 1", passage: "SettlementBarn" }, { x: 313, y: 402, tooltip: "Barn 2", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/5.png", { hotspots: [ { x: 512, y: 464, tooltip: "House 1", passage: "SettlementHouse" }, { x: 388, y: 424, tooltip: "House 2", passage: "SettlementHouse" }, { x: 268, y: 367, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/6.png", { hotspots: [ { x: 323, y: 461, tooltip: "House 1", passage: "SettlementHouse" }, { x: 566, y: 432, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/7.png", { hotspots: [ { x: 339, y: 483, tooltip: "House 1", passage: "SettlementHouse" }, { x: 635, y: 417, tooltip: "Barn", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/8.png", { hotspots: [ { x: 163, y: 431, tooltip: "House 1", passage: "SettlementHouse" }, { x: 358, y: 417, tooltip: "House 2", passage: "SettlementHouse" }, { x: 593, y: 536, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/9.png", { hotspots: [ { x: 234, y: 473, tooltip: "House 1", passage: "SettlementHouse" }, { x: 377, y: 466, tooltip: "House 2", passage: "SettlementHouse" }, { x: 545, y: 475, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/10.png", { hotspots: [ { x: 234, y: 473, tooltip: "House 1", passage: "SettlementHouse" }, { x: 377, y: 466, tooltip: "House 2", passage: "SettlementHouse" }, { x: 545, y: 475, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/11.png", { hotspots: [ { x: 403, y: 460, tooltip: "House 1", passage: "SettlementHouse" }, { x: 155, y: 434, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/12.png", { hotspots: [ { x: 42, y: 458, tooltip: "House 1", passage: "SettlementHouse" }, { x: 285, y: 485, tooltip: "Tavern", passage: "SettlementTav" }, { x: 550, y: 471, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/13.png", { hotspots: [ { x: 287, y: 411, tooltip: "House", passage: "SettlementHouse" }, { x: 403, y: 430, tooltip: "Barn", passage: "SettlementBarn" }, { x: 649, y: 525, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/14.png", { hotspots: [ { x: 349, y: 547, tooltip: "Guard House", passage: "SettlementGuardHouse" }, { x: 472, y: 482, tooltip: "House", passage: "SettlementHouse" }, { x: 632, y: 470, tooltip: "Barn", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Day/15.png", { hotspots: [ { x: 561, y: 467, tooltip: "House 1", passage: "SettlementHouse" }, { x: 247, y: 443, tooltip: "House 2", passage: "SettlementHouse" }, { x: 63, y: 425, tooltip: "Barn", passage: "SettlementBarn" }, { x: 356, y: 386, tooltip: "Manor House", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/1.png", { hotspots: [ { x: 378, y: 630, tooltip: "Barn 1", passage: "SettlementBarn" }, { x: 254, y: 521, tooltip: "Barn 2", passage: "SettlementBarn" }, { x: 424, y: 451, tooltip: "Barn 3", passage: "SettlementBarn" }, { x: 530, y: 379, tooltip: "Barn 4", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/2.png", { hotspots: [ { x: 319, y: 473, tooltip: "House 1", passage: "SettlementHouse" }, { x: 547, y: 605, tooltip: "House 2", passage: "SettlementHouse" }, { x: 490, y: 432, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/3.png", { hotspots: [ { x: 218, y: 514, tooltip: "House 1", passage: "SettlementHouse" }, { x: 472, y: 469, tooltip: "House 2", passage: "SettlementHouse" }, { x: 627, y: 409, tooltip: "House 3", passage: "SettlementHouse" }, { x: 344, y: 383, tooltip: "Barn 1", passage: "SettlementBarn" }, { x: 201, y: 384, tooltip: "Barn 2", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/4.png", { hotspots: [ { x: 375, y: 450, tooltip: "House 1", passage: "SettlementHouse" }, { x: 554, y: 408, tooltip: "House 2", passage: "SettlementHouse" }, { x: 658, y: 359, tooltip: "House 3", passage: "SettlementHouse" }, { x: 429, y: 362, tooltip: "Manor House", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/5.png", { hotspots: [ { x: 295, y: 502, tooltip: "House 1", passage: "SettlementHouse" }, { x: 521, y: 551, tooltip: "House 2", passage: "SettlementHouse" }, { x: 595, y: 461, tooltip: "Guard House", passage: "SettlementGuardHouse" }, { x: 425, y: 449, tooltip: "House 5", passage: "SettlementHouse" }, { x: 340, y: 415, tooltip: "Manor House", passage: "SettlementManor" }, { x: 422, y: 359, tooltip: "House 3", passage: "SettlementHouse" }, { x: 536, y: 382, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/6.png", { hotspots: [ { x: 245, y: 479, tooltip: "House 1", passage: "SettlementHouse" }, { x: 427, y: 471, tooltip: "House 2", passage: "SettlementHouse" }, { x: 321, y: 401, tooltip: "House 3", passage: "SettlementHouse" }, { x: 486, y: 382, tooltip: "House 4", passage: "SettlementHouse" }, { x: 673, y: 377, tooltip: "Tavern", passage: "SettlementTav" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/7.png", { hotspots: [ { x: 113, y: 516, tooltip: "House 1", passage: "SettlementHouse" }, { x: 646, y: 484, tooltip: "House 2", passage: "SettlementHouse" }, { x: 181, y: 397, tooltip: "House 3", passage: "SettlementHouse" }, { x: 297, y: 356, tooltip: "House 4", passage: "SettlementHouse" }, { x: 541, y: 362, tooltip: "Manor House", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/8.png", { hotspots: [ { x: 219, y: 449, tooltip: "House 1", passage: "SettlementHouse" }, { x: 414, y: 545, tooltip: "House 2", passage: "SettlementHouse" }, { x: 367, y: 391, tooltip: "House 3", passage: "SettlementHouse" }, { x: 589, y: 434, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/9.png", { hotspots: [ { x: 229, y: 527, tooltip: "Manor House", passage: "SettlementManor" }, { x: 526, y: 503, tooltip: "House 1", passage: "SettlementHouse" }, { x: 664, y: 499, tooltip: "Barn", passage: "SettlementBarn" }, { x: 429, y: 408, tooltip: "House 2", passage: "SettlementHouse" }, { x: 494, y: 311, tooltip: "Church", passage: "SettlementChurch" }, { x: 351, y: 315, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/10.png", { hotspots: [ { x: 226, y: 489, tooltip: "House 1", passage: "SettlementHouse" }, { x: 486, y: 507, tooltip: "House 2", passage: "SettlementHouse" }, { x: 315, y: 396, tooltip: "Barn", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/11.png", { hotspots: [ { x: 198, y: 553, tooltip: "House 1", passage: "SettlementHouse" }, { x: 435, y: 332, tooltip: "House 2", passage: "SettlementHouse" }, { x: 566, y: 363, tooltip: "House 3", passage: "SettlementHouse" }, { x: 622, y: 303, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/12.png", { hotspots: [ { x: 331, y: 546, tooltip: "House 1", passage: "SettlementHouse" }, { x: 610, y: 474, tooltip: "Guard House 1", passage: "SettlementGuardHouse" }, { x: 455, y: 431, tooltip: "Guard House 2", passage: "SettlementGuardHouse" }, { x: 540, y: 357, tooltip: "Guard House 3", passage: "SettlementGuardHouse" }, { x: 318, y: 368, tooltip: "House 2", passage: "SettlementHouse" }, { x: 244, y: 418, tooltip: "House 3", passage: "SettlementHouse" }, { x: 138, y: 445, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/13.png", { hotspots: [ { x: 244, y: 477, tooltip: "House 1", passage: "SettlementHouse" }, { x: 407, y: 466, tooltip: "House 2", passage: "SettlementHouse" }, { x: 500, y: 453, tooltip: "House 3", passage: "SettlementHouse" }, { x: 688, y: 475, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/14.png", { hotspots: [ { x: 420, y: 552, tooltip: "House 1", passage: "SettlementHouse" }, { x: 522, y: 437, tooltip: "Barn", passage: "SettlementBarn" }, { x: 300, y: 460, tooltip: "House 2", passage: "SettlementHouse" }, { x: 379, y: 354, tooltip: "Church", passage: "SettlementChurch" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Day/15.png", { hotspots: [ { x: 407, y: 555, tooltip: "House 1", passage: "SettlementHouse" }, { x: 603, y: 511, tooltip: " Guard House 1", passage: "SettlementHouse" }, { x: 403, y: 396, tooltip: "House 2", passage: "SettlementHouse" }, { x: 122, y: 433, tooltip: "Guard House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/1.png", { hotspots: [ { x: 286, y: 429, tooltip: "House 1", passage: "SettlementHouse" }, { x: 470, y: 395, tooltip: "House 2", passage: "SettlementHouse" }, { x: 562, y: 398, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/2.png", { hotspots: [ { x: 332, y: 452, tooltip: "Tavern", passage: "SettlementTav" }, { x: 543, y: 455, tooltip: "House", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/3.png", { hotspots: [ { x: 176, y: 415, tooltip: "House 1", passage: "SettlementHouse" }, { x: 574, y: 399, tooltip: "House 2", passage: "SettlementHouse" }, { x: 354, y: 394, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/4.png", { hotspots: [ { x: 179, y: 406, tooltip: "Barn", passage: "SettlementBarn" }, { x: 393, y: 424, tooltip: "House 1", passage: "SettlementHouse" }, { x: 662, y: 445, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/5.png", { hotspots: [ { x: 192, y: 456, tooltip: "House 1", passage: "SettlementHouse" }, { x: 413, y: 436, tooltip: "House 2", passage: "SettlementHouse" }, { x: 627, y: 434, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/6.png", { hotspots: [ { x: 173, y: 470, tooltip: "House 1", passage: "SettlementHouse" }, { x: 305, y: 433, tooltip: "House 2", passage: "SettlementHouse" }, { x: 445, y: 400, tooltip: "House 3", passage: "SettlementHouse" }, { x: 553, y: 408, tooltip: "Guard House 1", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/7.png", { hotspots: [ { x: 140, y: 335, tooltip: "Guard House 1", passage: "SettlementGuardHouse" }, { x: 398, y: 344, tooltip: "Guard House 2", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/8.png", { hotspots: [ { x: 337, y: 476, tooltip: "House 1", passage: "SettlementHouse" }, { x: 493, y: 444, tooltip: "House 2", passage: "SettlementHouse" }, { x: 579, y: 410, tooltip: "House 3", passage: "SettlementHouse" }, { x: 678, y: 417, tooltip: "Barn", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/9.png", { hotspots: [ { x: 186, y: 441, tooltip: "House 1", passage: "SettlementHouse" }, { x: 458, y: 344, tooltip: "Guard House 1", passage: "SettlementHouse" }, { x: 605, y: 292, tooltip: "Guard House 2", passage: "SettlementHouse" }, { x: 244, y: 295, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/10.png", { hotspots: [ { x: 151, y: 452, tooltip: "Tavern", passage: "SettlementTavern" }, { x: 358, y: 428, tooltip: "House 1", passage: "SettlementHouse" }, { x: 665, y: 456, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/11.png", { hotspots: [ { x: 96, y: 459, tooltip: "Guard House 1", passage: "SettlementHouse" }, { x: 298, y: 344, tooltip: "Guard House 2", passage: "SettlementHouse" }, { x: 501, y: 334, tooltip: "Guard House 3", passage: "SettlementHouse" }, { x: 489, y: 524, tooltip: "Guard House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/12.png", { hotspots: [ { x: 87, y: 339, tooltip: "House 1", passage: "SettlementHouse" }, { x: 179, y: 356, tooltip: "House 2", passage: "SettlementHouse" }, { x: 398, y: 389, tooltip: "House 3", passage: "SettlementHouse" }, { x: 525, y: 434, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/13.png", { hotspots: [ { x: 258, y: 383, tooltip: "Tavern", passage: "SettlementHouse" }, { x: 473, y: 388, tooltip: "House 1", passage: "SettlementHouse" }, { x: 614, y: 370, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/14.png", { hotspots: [ { x: 116, y: 499, tooltip: "House 1", passage: "SettlementHouse" }, { x: 446, y: 468, tooltip: "Tavern", passage: "SettlementTav" }, { x: 641, y: 468, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Small/Night/15.png", { hotspots: [ { x: 367, y: 439, tooltip: "House 1", passage: "SettlementHouse" }, { x: 249, y: 424, tooltip: "House 2", passage: "SettlementHouse" }, { x: 193, y: 380, tooltip: "Barn", passage: "SettlementBarn" }, { x: 553, y: 420, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/1.png", { hotspots: [ { x: 155, y: 465, tooltip: "House 1", passage: "SettlementHouse" }, { x: 256, y: 471, tooltip: "House 2", passage: "SettlementHouse" }, { x: 329, y: 478, tooltip: "Guard House", passage: "SettlementGuardHouse" }, { x: 508, y: 486, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/2.png", { hotspots: [ { x: 113, y: 370, tooltip: "Barn", passage: "SettlementBarn" }, { x: 296, y: 389, tooltip: "House 1", passage: "SettlementHouse" }, { x: 452, y: 384, tooltip: "House 2", passage: "SettlementHouse" }, { x: 562, y: 395, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/3.png", { hotspots: [ { x: 211, y: 505, tooltip: "Tavern", passage: "SettlementTav" }, { x: 488, y: 472, tooltip: "House 1", passage: "SettlementHouse" }, { x: 606, y: 479, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/4.png", { hotspots: [ { x: 369, y: 407, tooltip: "Manor House", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/5.png", { hotspots: [ { x: 191, y: 512, tooltip: "House 1", passage: "SettlementHouse" }, { x: 477, y: 553, tooltip: "House 2", passage: "SettlementHouse" }, { x: 270, y: 379, tooltip: "House 3", passage: "SettlementHouse" }, { x: 417, y: 376, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/6.png", { hotspots: [ { x: 357, y: 539, tooltip: "House 1", passage: "SettlementHouse" }, { x: 526, y: 453, tooltip: "Guard House", passage: "SettlementGuardHouse" }, { x: 640, y: 469, tooltip: "House 2", passage: "SettlementHouse" }, { x: 292, y: 373, tooltip: "House 3", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/7.png", { hotspots: [ { x: 277, y: 362, tooltip: "House 1", passage: "SettlementHouse" }, { x: 641, y: 468, tooltip: "House 2", passage: "SettlementHouse" }, { x: 414, y: 318, tooltip: "Manor House", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/8.png", { hotspots: [ { x: 183, y: 446, tooltip: "Guard House 1", passage: "SettlementHouse" }, { x: 312, y: 434, tooltip: "Guard House 2", passage: "SettlementHouse" }, { x: 384, y: 454, tooltip: "House 1", passage: "SettlementHouse" }, { x: 569, y: 498, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/9.png", { hotspots: [ { x: 282, y: 538, tooltip: "House 1", passage: "SettlementHouse" }, { x: 528, y: 468, tooltip: "House 2", passage: "SettlementHouse" }, { x: 116, y: 370, tooltip: "House 3", passage: "SettlementHouse" }, { x: 261, y: 374, tooltip: "House 4", passage: "SettlementHouse" }, { x: 340, y: 369, tooltip: "House 5", passage: "SettlementHouse" }, { x: 505, y: 316, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/10.png", { hotspots: [ { x: 251, y: 455, tooltip: "House 1", passage: "SettlementHouse" }, { x: 452, y: 430, tooltip: "House 2", passage: "SettlementHouse" }, { x: 593, y: 436, tooltip: "House 3", passage: "SettlementHouse" }, { x: 651, y: 434, tooltip: "House 4", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/11.png", { hotspots: [ { x: 290, y: 417, tooltip: "House 1", passage: "SettlementHouse" }, { x: 377, y: 392, tooltip: "House 2", passage: "SettlementHouse" }, { x: 483, y: 361, tooltip: "House 3", passage: "SettlementHouse" }, { x: 549, y: 369, tooltip: "House 4", passage: "SettlementHouse" }, { x: 258, y: 316, tooltip: "Barn", passage: "SettlementBarn" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/12.png", { hotspots: [ { x: 103, y: 468, tooltip: "House 1", passage: "SettlementHouse" }, { x: 341, y: 441, tooltip: "House 3", passage: "SettlementHouse" }, { x: 581, y: 479, tooltip: "House 2", passage: "SettlementHouse" }, { x: 184, y: 408, tooltip: "Guard House", passage: "SettlementGuardHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/13.png", { hotspots: [ { x: 442, y: 362, tooltip: "Manor House 1", passage: "SettlementManor" }, { x: 274, y: 401, tooltip: "Manor House 2", passage: "SettlementManor" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/14.png", { hotspots: [ { x: 185, y: 490, tooltip: "Guard House 1", passage: "SettlementGuardHouse" }, { x: 389, y: 462, tooltip: "House 1", passage: "SettlementHouse" }, { x: 603, y: 436, tooltip: "Guard House 2", passage: "SettlementGuardHouse" }, { x: 706, y: 402, tooltip: "House 2", passage: "SettlementHouse" } ] })>> <<run setup.buildingData.set("Images/Raids/Forest/Settlement/Medium/Night/15.png", { hotspots: [ { x: 608, y: 397, tooltip: "House 1", passage: "SettlementHouse" }, { x: 306, y: 399, tooltip: "Guard House", passage: "SettlementGuardHouse" }, { x: 145, y: 395, tooltip: "Tavern", passage: "SettlementTav" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/1.png", { hotspots: [ { x: 295, y: 366, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 422, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 366, y: 656, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/2.png", { hotspots: [ { x: 315, y: 400, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 453, y: 401, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 395, y: 695, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/3.png", { hotspots: [ { x: 436, y: 342, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 581, y: 330, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 458, y: 634, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/4.png", { hotspots: [ { x: 291, y: 331, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 429, y: 337, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 407, y: 618, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/5.png", { hotspots: [ { x: 304, y: 254, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 445, y: 259, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 381, y: 551, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/6.png", { hotspots: [ { x: 300, y: 401, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 420, y: 416, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 352, y: 684, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/7.png", { hotspots: [ { x: 336, y: 435, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 473, y: 435, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 405, y: 726, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/8.png", { hotspots: [ { x: 347, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 475, y: 362, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 390, y: 671, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/9.png", { hotspots: [ { x: 323, y: 392, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 466, y: 394, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 376, y: 688, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Stright/10.png", { hotspots: [ { x: 322, y: 370, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 456, y: 368, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 366, y: 664, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/1.png", { hotspots: [ { x: 298, y: 376, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 442, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 390, y: 680, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/2.png", { hotspots: [ { x: 332, y: 425, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 468, y: 426, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 398, y: 714, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/3.png", { hotspots: [ { x: 291, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 419, y: 391, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 336, y: 663, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/4.png", { hotspots: [ { x: 325, y: 349, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 442, y: 356, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 398, y: 629, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/5.png", { hotspots: [ { x: 219, y: 392, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 380, y: 367, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 451, y: 665, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/6.png", { hotspots: [ { x: 325, y: 393, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 461, y: 381, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 419, y: 690, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/7.png", { hotspots: [ { x: 363, y: 411, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 493, y: 414, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 374, y: 693, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/8.png", { hotspots: [ { x: 336, y: 380, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 471, y: 374, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 357, y: 676, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/9.png", { hotspots: [ { x: 286, y: 355, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 432, y: 356, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 396, y: 689, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Stright/10.png", { hotspots: [ { x: 341, y: 310, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 464, y: 310, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 411, y: 580, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/1.png", { hotspots: [ { x: 355, y: 361, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 502, y: 375, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 434, y: 700, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/2.png", { hotspots: [ { x: 295, y: 340, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 426, y: 346, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 383, y: 690, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/3.png", { hotspots: [ { x: 344, y: 397, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 465, y: 393, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 368, y: 660, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/4.png", { hotspots: [ { x: 407, y: 344, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 518, y: 338, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 398, y: 659, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/5.png", { hotspots: [ { x: 328, y: 377, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 468, y: 376, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 418, y: 665, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/6.png", { hotspots: [ { x: 314, y: 377, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 449, y: 377, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 361, y: 675, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/7.png", { hotspots: [ { x: 324, y: 351, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 469, y: 352, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 404, y: 672, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/8.png", { hotspots: [ { x: 349, y: 389, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 491, y: 370, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 435, y: 699, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/9.png", { hotspots: [ { x: 348, y: 346, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 492, y: 356, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 425, y: 663, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Stright/10.png", { hotspots: [ { x: 274, y: 390, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 423, y: 401, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 306, y: 703, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/1.png", { hotspots: [ { x: 249, y: 525, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 666, y: 723, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 690, y: 666, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/2.png", { hotspots: [ { x: 584, y: 676, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 599, y: 625, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/3.png", { hotspots: [ { x: 537, y: 556, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 82, y: 626, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 90, y: 694, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/4.png", { hotspots: [ { x: 289, y: 420, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 510, y: 430, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 509, y: 402, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/5.png", { hotspots: [ { x: 355, y: 365, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 598, y: 366, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 599, y: 323, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/6.png", { hotspots: [ { x: 530, y: 503, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 200, y: 502, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/7.png", { hotspots: [ { x: 495, y: 294, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 339, y: 366, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 338, y: 333, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/8.png", { hotspots: [ { x: 404, y: 435, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 407, y: 406, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 327, y: 277, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/9.png", { hotspots: [ { x: 158, y: 537, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 158, y: 497, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 513, y: 524, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Ceiling-Bent/10.png", { hotspots: [ { x: 467, y: 481, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 127, y: 520, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 130, y: 468, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/1.png", { hotspots: [ { x: 132, y: 530, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 506, y: 485, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 128, y: 478, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/2.png", { hotspots: [ { x: 277, y: 466, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 671, y: 468, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 667, y: 426, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/3.png", { hotspots: [ { x: 527, y: 489, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 145, y: 603, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 157, y: 654, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/4.png", { hotspots: [ { x: 520, y: 482, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 137, y: 531, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 139, y: 574, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/5.png", { hotspots: [ { x: 280, y: 471, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 612, y: 356, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 619, y: 303, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/6.png", { hotspots: [ { x: 522, y: 571, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 115, y: 498, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 118, y: 449, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/7.png", { hotspots: [ { x: 540, y: 471, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 170, y: 512, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 173, y: 549, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/8.png", { hotspots: [ { x: 568, y: 492, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 136, y: 589, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 137, y: 534, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/9.png", { hotspots: [ { x: 239, y: 460, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 568, y: 534, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 561, y: 570, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Ceiling-Bent/10.png", { hotspots: [ { x: 250, y: 502, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 567, y: 371, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 569, y: 314, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/10.png", { hotspots: [ { x: 578, y: 456, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 298, y: 540, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 306, y: 467, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/1.png", { hotspots: [ { x: 544, y: 520, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 142, y: 579, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/2.png", { hotspots: [ { x: 245, y: 491, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 627, y: 514, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/3.png", { hotspots: [ { x: 233, y: 526, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 593, y: 545, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 595, y: 457, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/4.png", { hotspots: [ { x: 271, y: 488, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 652, y: 490, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/5.png", { hotspots: [ { x: 531, y: 460, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 247, y: 700, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 232, y: 653, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/6.png", { hotspots: [ { x: 550, y: 526, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 155, y: 588, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/7.png", { hotspots: [ { x: 270, y: 568, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 627, y: 583, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 629, y: 528, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/8.png", { hotspots: [ { x: 170, y: 539, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 638, y: 582, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" }, { x: 625, y: 658, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Ceiling-Bent/9.png", { hotspots: [ { x: 554, y: 510, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 195, y: 679, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 186, y: 628, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Chair-Start/1.png", { hotspots: [ { x: 385, y: 278, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 320, y: 423, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 477, y: 423, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 396, y: 652, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Chair-Start/2.png", { hotspots: [ { x: 386, y: 269, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 320, y: 429, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 466, y: 426, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 392, y: 639, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Chair-Start/3.png", { hotspots: [ { x: 297, y: 221, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 316, y: 434, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 476, y: 355, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 465, y: 572, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Chair-Start/4.png", { hotspots: [ { x: 403, y: 220, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 333, y: 332, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 459, y: 346, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 369, y: 564, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Chair-Start/5.png", { hotspots: [ { x: 423, y: 236, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 293, y: 394, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 460, y: 445, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 316, y: 597, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Chair-Start/1.png", { hotspots: [ { x: 366, y: 214, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 311, y: 337, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 374, y: 332, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 388, y: 577, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Chair-Start/2.png", { hotspots: [ { x: 369, y: 227, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 294, y: 389, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 471, y: 387, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 387, y: 627, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Chair-Start/3.png", { hotspots: [ { x: 386, y: 264, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 316, y: 446, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 488, y: 447, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 407, y: 604, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Chair-Start/4.png", { hotspots: [ { x: 400, y: 225, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 330, y: 386, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 478, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 419, y: 618, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Chair-Start/1.png", { hotspots: [ { x: 391, y: 268, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 300, y: 442, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 474, y: 444, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 384, y: 733, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Chair-Start/2.png", { hotspots: [ { x: 402, y: 217, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 317, y: 379, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 477, y: 392, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 380, y: 590, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Chair-Start/3.png", { hotspots: [ { x: 357, y: 197, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 286, y: 363, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 444, y: 359, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 366, y: 626, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Chair-Start/4.png", { hotspots: [ { x: 375, y: 235, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 310, y: 379, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 471, y: 376, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 388, y: 630, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Face/1.png", { hotspots: [ { x: 398, y: 328, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 329, y: 402, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 238, y: 656, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 583, y: 642, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Face/2.png", { hotspots: [ { x: 382, y: 339, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 345, y: 412, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 257, y: 651, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 557, y: 643, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Face/3.png", { hotspots: [ { x: 398, y: 328, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 369, y: 417, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 279, y: 632, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 538, y: 631, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Face/4.png", { hotspots: [ { x: 425, y: 271, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 347, y: 323, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck " }, { x: 388, y: 512, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 596, y: 500, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Face/5.png", { hotspots: [ { x: 396, y: 320, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 351, y: 373, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 276, y: 570, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 538, y: 565, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Face/1.png", { hotspots: [ { x: 425, y: 341, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 308, y: 371, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 301, y: 634, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 590, y: 612, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Face/2.png", { hotspots: [ { x: 388, y: 293, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 336, y: 354, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 226, y: 567, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 472, y: 583, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Face/3.png", { hotspots: [ { x: 382, y: 332, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 337, y: 378, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 248, y: 580, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 502, y: 591, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Face/4.png", { hotspots: [ { x: 333, y: 380, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 425, y: 446, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 227, y: 671, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 539, y: 668, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Face/5.png", { hotspots: [ { x: 445, y: 321, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 393, y: 405, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 349, y: 657, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 607, y: 661, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Face/1.png", { hotspots: [ { x: 403, y: 292, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 433, y: 364, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 295, y: 579, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 545, y: 572, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Face/2.png", { hotspots: [ { x: 417, y: 320, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 365, y: 375, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 310, y: 565, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 573, y: 560, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Face/3.png", { hotspots: [ { x: 371, y: 349, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 429, y: 421, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 200, y: 640, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 488, y: 641, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Face/4.png", { hotspots: [ { x: 408, y: 312, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 305, y: 341, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 258, y: 563, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 513, y: 555, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Face/5.png", { hotspots: [ { x: 373, y: 274, tooltip: "Lips", passage: "DungeonCorruptionFuckLucy", position: "Lips" }, { x: 428, y: 326, tooltip: "Neck", passage: "DungeonCorruptionFuckLucy", position: "Neck" }, { x: 289, y: 529, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" }, { x: 503, y: 520, tooltip: "Chest", passage: "DungeonCorruptionFuckLucy", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Pussy/1.png", { hotspots: [ { x: 350, y: 385, tooltip: "Clitoris", passage: "DungeonCorruptionFuckLucy", position: "Clit" }, { x: 348, y: 458, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "Vagina" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Pussy/2.png", { hotspots: [ { x: 383, y: 357, tooltip: "Clitoris", passage: "DungeonCorruptionFuckLucy", position: "Clit" }, { x: 386, y: 445, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "Vagina" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Pussy/3.png", { hotspots: [ { x: 356, y: 529, tooltip: "Clitoris", passage: "DungeonCorruptionFuckLucy", position: "Clit" }, { x: 360, y: 596, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "Vagina" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Pussy/4.png", { hotspots: [ { x: 388, y: 394, tooltip: "Clitoris", passage: "DungeonCorruptionFuckLucy", position: "Clit" }, { x: 379, y: 475, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "Vagina" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Pussy/5.png", { hotspots: [ { x: 448, y: 408, tooltip: "Clitoris", passage: "DungeonCorruptionFuckLucy", position: "Clit" }, { x: 423, y: 468, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "Vagina" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Ass/1.png", { hotspots: [ { x: 329, y: 244, tooltip: "Ass", passage: "DungeonCorruptionFuckLucy", position: "Ass" }, { x: 333, y: 347, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "VaginaBehind" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Ass/2.png", { hotspots: [ { x: 297, y: 250, tooltip: "Ass", passage: "DungeonCorruptionFuckLucy", position: "Ass" }, { x: 296, y: 330, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "VaginaBehind" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Ass/3.png", { hotspots: [ { x: 264, y: 242, tooltip: "Ass", passage: "DungeonCorruptionFuckLucy", position: "Ass" }, { x: 273, y: 302, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "VaginaBehind" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Ass/4.png", { hotspots: [ { x: 440, y: 342, tooltip: "Ass", passage: "DungeonCorruptionFuckLucy", position: "Ass" }, { x: 436, y: 437, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "VaginaBehind" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Ass/5.png", { hotspots: [ { x: 366, y: 283, tooltip: "Ass", passage: "DungeonCorruptionFuckLucy", position: "Ass" }, { x: 373, y: 374, tooltip: "Vagina", passage: "DungeonCorruptionFuckLucy", position: "VaginaBehind" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/1.png", { hotspots: [ { x: 325, y: 146, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 266, y: 291, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 422, y: 300, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 386, y: 562, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/2.png", { hotspots: [ { x: 373, y: 218, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 287, y: 386, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 459, y: 385, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 399, y: 683, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/3.png", { hotspots: [ { x: 374, y: 192, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 298, y: 365, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 463, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 359, y: 625, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/4.png", { hotspots: [ { x: 379, y: 201, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 298, y: 365, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 463, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 359, y: 625, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/5.png", { hotspots: [ { x: 392, y: 234, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 298, y: 371, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 481, y: 370, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 393, y: 570, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/6.png", { hotspots: [ { x: 330, y: 201, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 292, y: 363, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 456, y: 355, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 412, y: 615, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/7.png", { hotspots: [ { x: 345, y: 192, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 279, y: 348, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 452, y: 348, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 398, y: 567, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/8.png", { hotspots: [ { x: 429, y: 234, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 314, y: 368, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 487, y: 372, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 301, y: 585, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/9.png", { hotspots: [ { x: 415, y: 199, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 336, y: 343, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 508, y: 331, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 378, y: 571, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/10.png", { hotspots: [ { x: 417, y: 205, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 316, y: 322, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 478, y: 324, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 380, y: 551, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 390, y: 611, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/11.png", { hotspots: [ { x: 394, y: 240, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 304, y: 398, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 486, y: 401, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 380, y: 657, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 384, y: 710, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/12.png", { hotspots: [ { x: 378, y: 192, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 292, y: 319, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 497, y: 311, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 384, y: 560, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 387, y: 632, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/13.png", { hotspots: [ { x: 383, y: 208, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 301, y: 348, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 467, y: 350, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 387, y: 614, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 388, y: 663, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/14.png", { hotspots: [ { x: 385, y: 238, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 291, y: 378, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 476, y: 375, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 353, y: 635, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 353, y: 710, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Naked/15.png", { hotspots: [ { x: 365, y: 203, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 263, y: 385, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 468, y: 384, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 393, y: 662, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 390, y: 720, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/1.png", { hotspots: [ { x: 381, y: 194, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 305, y: 339, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 471, y: 333, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 396, y: 639, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/2.png", { hotspots: [ { x: 392, y: 207, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 311, y: 360, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 478, y: 358, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 388, y: 591, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 401, y: 655, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/3.png", { hotspots: [ { x: 398, y: 214, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 280, y: 361, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 496, y: 368, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 372, y: 643, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 378, y: 711, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/4.png", { hotspots: [ { x: 424, y: 211, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 342, y: 377, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 502, y: 374, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 384, y: 676, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 398, y: 712, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/5.png", { hotspots: [ { x: 388, y: 209, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 314, y: 343, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 480, y: 346, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 381, y: 611, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/6.png", { hotspots: [ { x: 383, y: 199, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 287, y: 368, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 473, y: 362, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 384, y: 600, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 386, y: 662, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/7.png", { hotspots: [ { x: 430, y: 203, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 340, y: 351, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 522, y: 354, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 391, y: 607, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 396, y: 656, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/8.png", { hotspots: [ { x: 380, y: 193, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 311, y: 350, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 473, y: 343, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 382, y: 555, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 386, y: 611, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/9.png", { hotspots: [ { x: 380, y: 193, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 241, y: 362, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 431, y: 370, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 373, y: 612, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 372, y: 665, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/10.png", { hotspots: [ { x: 461, y: 191, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 337, y: 359, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 540, y: 360, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 374, y: 632, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 378, y: 697, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/11.png", { hotspots: [ { x: 407, y: 165, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 327, y: 288, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 471, y: 283, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 385, y: 485, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 389, y: 534, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/12.png", { hotspots: [ { x: 377, y: 161, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 313, y: 336, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 475, y: 330, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 387, y: 643, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/13.png", { hotspots: [ { x: 419, y: 195, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 527, y: 356, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 412, y: 634, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 418, y: 683, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/14.png", { hotspots: [ { x: 377, y: 158, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 301, y: 307, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 457, y: 307, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 402, y: 512, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 401, y: 548, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Naked/15.png", { hotspots: [ { x: 377, y: 158, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 205, y: 355, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 346, y: 348, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 402, y: 651, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/1.png", { hotspots: [ { x: 299, y: 188, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 233, y: 345, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 406, y: 332, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 420, y: 612, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 428, y: 666, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/2.png", { hotspots: [ { x: 332, y: 178, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 244, y: 343, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 407, y: 344, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 352, y: 596, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/3.png", { hotspots: [ { x: 309, y: 166, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 242, y: 306, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 391, y: 291, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 396, y: 514, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/4.png", { hotspots: [ { x: 366, y: 212, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 313, y: 367, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 488, y: 355, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 398, y: 590, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 401, y: 638, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/5.png", { hotspots: [ { x: 374, y: 212, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 316, y: 363, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 477, y: 356, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 395, y: 637, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/6.png", { hotspots: [ { x: 401, y: 186, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 320, y: 323, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 480, y: 323, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 382, y: 596, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/7.png", { hotspots: [ { x: 415, y: 195, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 345, y: 339, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 505, y: 339, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 393, y: 615, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/8.png", { hotspots: [ { x: 379, y: 151, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 313, y: 305, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 470, y: 311, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 394, y: 589, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/9.png", { hotspots: [ { x: 412, y: 220, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 339, y: 348, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 499, y: 351, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 377, y: 598, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/10.png", { hotspots: [ { x: 385, y: 212, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 313, y: 327, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 465, y: 327, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 387, y: 607, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/11.png", { hotspots: [ { x: 265, y: 189, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 228, y: 366, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 405, y: 340, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 393, y: 586, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/12.png", { hotspots: [ { x: 382, y: 201, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 308, y: 345, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 470, y: 342, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 382, y: 622, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/13.png", { hotspots: [ { x: 414, y: 194, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 341, y: 343, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 503, y: 340, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 392, y: 615, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/14.png", { hotspots: [ { x: 471, y: 186, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 375, y: 318, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 519, y: 300, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 411, y: 580, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 428, y: 620, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Naked/15.png", { hotspots: [ { x: 467, y: 187, tooltip: "Mouth", passage: "DungeonCorruptionFuck", position: "Mouth" }, { x: 375, y: 318, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 519, y: 300, tooltip: "Breasts", passage: "DungeonCorruptionFuck", position: "Breasts" }, { x: 411, y: 580, tooltip: "Pussy", passage: "DungeonCorruptionFuck", position: "Pussy" }, { x: 428, y: 620, tooltip: "Ass", passage: "DungeonCorruptionFuck", position: "Ass" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Wall-Up/1.png", { hotspots: [ { x: 271, y: 461, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 410, y: 471, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 313, y: 683, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 313, y: 723, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Wall-Up/2.png", { hotspots: [ { x: 325, y: 478, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 457, y: 476, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 440, y: 647, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 439, y: 701, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Wall-Up/3.png", { hotspots: [ { x: 339, y: 449, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 468, y: 451, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 403, y: 598, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 402, y: 661, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Red/Wall-Up/4.png", { hotspots: [ { x: 297, y: 423, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 439, y: 434, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 343, y: 620, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 343, y: 683, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Wall-Up/1.png", { hotspots: [ { x: 329, y: 454, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 484, y: 450, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 406, y: 639, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 407, y: 688, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Wall-Up/2.png", { hotspots: [ { x: 347, y: 383, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 481, y: 394, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 327, y: 614, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 329, y: 673, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Wall-Up/3.png", { hotspots: [ { x: 345, y: 415, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 480, y: 408, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 477, y: 615, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 477, y: 663, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Brown/Wall-Up/4.png", { hotspots: [ { x: 317, y: 436, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 466, y: 439, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 391, y: 646, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 390, y: 690, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Wall-Up/1.png", { hotspots: [ { x: 321, y: 454, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 470, y: 449, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 391, y: 644, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 393, y: 698, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Wall-Up/2.png", { hotspots: [ { x: 303, y: 426, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 455, y: 423, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 382, y: 664, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 385, y: 703, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Wall-Up/3.png", { hotspots: [ { x: 325, y: 438, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 466, y: 437, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 399, y: 651, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 399, y: 698, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Castle/Dungon/Woman/Corruption/Blonde/Wall-Up/4.png", { hotspots: [ { x: 313, y: 420, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 444, y: 424, tooltip: "Breasts", passage: "DungeonCorruptionFuckCeiling", position: "Breasts" }, { x: 369, y: 621, tooltip: "Pussy", passage: "DungeonCorruptionFuckCeiling", position: "Pussy" }, { x: 374, y: 663, tooltip: "Ass", passage: "DungeonCorruptionFuckCeiling", position: "Ass" } ] })>> <</nobr>>
<<nobr>> <div class="castle-menu"> <<set $CurrentPlayer to "Lucy">> <h1>The Halls</h1> <<if $Time < 9>> <div class="menu-item" data-image="Images/Castle/Dungon/1.png"> [[The Dungeons|Dungeon2]] </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Dungon/1.png"> It's too late to visit the dungeons </div> <</if>> <br> <hr> <h1>Chambers</h1> <br> <div class="menu-item" data-image="Images/Castle/Chambers/1.png"> <<link "Masters Chambers">><<goto "Chambers">><</link>> </div> <div class="menu-item" data-image="Images/Castle/Chambers/1.png"> <<link "Summon someone to your chambers">><<goto "Summon to chambers male">><</link>> </div> <<if $AliceCorrupt is true>> <div class="menu-item" data-image="Images/Castle/Chambers/3.png"> [[Visit Alice|LucyVisitAlice]] </div> <</if>> <br> <hr> <h1>Explore</h1> <br> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> <<link "Visit the forest">><<set $CurrentPlayer to "LucyCloaked">><<run Engine.play('Forrest Explore')>><</link>> </div> </div> <<set $CloakDisabled to false>> <<set $Cloaked to false>> <<if $Notoriety gt $MaxNotoriety>><<set $Notoriety to $MaxNotoriety>><</if>> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.1) 100%); color: #FFFFFF; border: 2px solid #8B0000; border-radius: 10px; box-shadow: 0 0 20px rgba(139,0,0,0.5); } .castle-menu h1 { font-size: 32px; text-align: center; margin-bottom: 20px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 2px 2px 4px #000; text-transform: uppercase; letter-spacing: 2px; } .castle-menu h2 { font-size: 24px; text-align: center; margin: 20px 0; font-family: 'Georgia', serif; } .menu-item { display: flex; align-items: center; margin-bottom: 15px; padding: 12px; background: linear-gradient(90deg, rgba(139,0,0,0.2) 0%, rgba(0,0,0,0.5) 100%); border-left: 3px solid #8B0000; border-radius: 5px; transition: all 0.3s; position: relative; } .menu-item:hover { background: linear-gradient(90deg, rgba(139,0,0,0.4) 0%, rgba(0,0,0,0.7) 100%); border-left-color: #FFD700; transform: translateX(5px); } .menu-item img { width: 120px; height: 80px; object-fit: cover; margin-right: 20px; border-radius: 5px; border: 1px solid #8B0000; } .menu-icon { font-size: 24px; margin-right: 15px; display: inline-block; width: 30px; text-align: center; } .menu-item a { color: #FFD700; text-decoration: none; font-size: 18px; font-weight: bold; flex-grow: 1; } .menu-description { display: block; font-size: 14px; color: #CD853F; font-style: italic; margin-left: 45px; margin-top: 5px; } .menu-item.disabled { opacity: 0.6; cursor: not-allowed; background: rgba(128,128,128,0.2); border-left-color: #666; } .menu-item.disabled:hover { background: rgba(128,128,128,0.2); transform: none; border-left-color: #666; } </style> <<script>> setTimeout(function() { $('.menu-item').each(function() { var $this = $(this); var imageSrc = $this.data('image'); if (imageSrc && $this.find('img').length === 0) { $this.prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }, 10); <</script>> <</nobr>>
<div class="text-box"> <<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> You enter to see Lucy Corruption: <progress @value=" $LucyCorruption" max="100"></progress><br><br> <<if $LucyCorruption lt 20>> [[Corrupt Lucy]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/1.png" width="700" height="700"> </div> <</if>> <<if ($LucyCorruption >= 20) and ($LucyCorruption lt 40)>> [[Corrupt Lucy]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/2.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/4/2.png">> </div><</if>> <<if ($LucyCorruption >= 40) and ($LucyCorruption lt 60)>> [[Corrupt Lucy]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/3.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/4/3.png">> </div><</if>> <<if ($LucyCorruption >= 60) and ($LucyCorruption lt 100)>> [[Corrupt Lucy]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/4.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/4/4.png">> </div><</if>> <<if $LucyCorruption >= 100>> <<if $PlayerSpells.includes("Possess")>>[[Possess|Corrupt Lucy]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/4.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/4/4.png">> </div> <<else>> You need a more powerful spell to complete Lucy's corruption [[Leave|Base Intro]] <div align="center"> <img src="Images/Castle/Dungon/Woman/4/4.png" width="700" height="700"> <<set _prisoner.ImagePath to "Images/Castle/Dungon/Woman/4/4.png">> </div><</if>><</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set _int to random(0, 1)>> <<set $Time to $Time + 1>> <<set $LucyHunger to 5>> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <<else>> Lucys power is already at its max but has her fun anyway<br> <</if>> <<if $Position is "male">> You cast your domination spell on the prisoner and send him to Lucy where he spend his last few hours happily satisfying her desires...<br><br> <<if _int is 0>> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/BJ/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Behind/3.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/CG/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Finish/1.webm" type="video/webm"> </video><br><br> <<else>> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/5.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/6.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/3.webm" type="video/webm"> </video><br><br> <</if>> <<else>> You hand the woman over to Lucy after casting a domination spell to make her more willing, you leave the two to get to know eachother better<br><br> <<if _int is 0>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/3.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/6.webm" type="video/webm"> </video><br><br> <<else>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/4.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/5.webm" type="video/webm"> </video><br><br> <</if>> <</if>> <<button "Close">> <<goto "Inside Castle">> <</button>> <</nobr>> </div>
<<set _coldLines to [ "I-I can’t stop shivering… please, just let me warm up next to you.", "The floor is like ice. Your cot looks warmer… can we share? Just for a moment?", "I won’t make a sound… just let me rest next to you until I stop shaking.", "I know you don’t trust me, but right now, I just need warmth… and you’re the only one here." ]>> <<set _touchAct to [ "You feel his fingers slide lower, dragging over the soft curve of your thigh, his breath hitching as he dares to explore further. The hesitation is still there—his touch light, testing—but there’s an unmistakable hunger beneath it. His fingertips graze against the inside of your leg, brushing just a little too close, lingering just a little too long, as if he’s waiting for any sign that he should stop… or keep going.", "His breathing has changed, slower, heavier, like he’s forcing himself to stay in control. But his hand betrays him, slipping between your thighs, his fingertips teasing at the sensitive skin just before the final barrier. He pauses there, his palm resting dangerously close, his thumb stroking absentmindedly over your skin as if testing how much further he can go without waking you.", "His restraint is gone. You feel it in the way his fingers **push between your legs**, sliding up to **trace the heat between them**. His breath shudders against your ear as he **presses**, his touch cautious at first, then firmer, his curiosity shifting into **need**. His other hand tightens around himself, barely stifling the quiet groan that escapes his lips. If you stay still, if you don’t stop him, he won’t be able to hold back much longer." ]>>
<<nobr>> <<set _OpeningLines to [ "Who… who are you? Stay away from me!", "I won’t break. No matter what you do to me, I’ll never give in!", "You… you’re not human, are you? What kind of creature serves a monster like him?", "I don’t know what you want, but I won’t fall for your tricks. Just leave me alone.", "If you’re here to torture me, get it over with. I won’t beg for mercy.", "I know what you are—your kind preys on the weak. But you won’t find weakness in me.", "Let me guess—you’re here to tempt me, to make me betray myself. It won’t work.", "You’re wasting your time. I’ll never give in to corruption.", "What are you supposed to be? A whore for your dark master? Do your worst—I will never submit.", "Spare me the games, demon. Whatever perversions you’re planning, they will fail.", "I’ve seen what your kind does. If you think I’ll become one of those mindless sluts, you’re mistaken.", "I won’t listen to your lies. You can’t make me want something I despise.", "You can try to tempt me, but I know what’s right. And what you offer is nothing but filth and shame.", "You think I have hidden desires? You’re wrong. I have nothing to give you, demon.", "Get out. I don’t need to hear whatever disgusting proposition you have to offer." ]>> <<set _LucyOpeningLines to [ "Humm, well you're luck I'm here, " + $LucyName + " tends to be... Rough with his play things", "Mmm… look at you, all tied up and helpless. What a perfect little offering.", "I can see it already—your body shivering, your thighs pressing together, trying to pretend you don’t feel *anything* from my touch.", "Oh, the way your nipples are hardening… is it from the cold, or is your body already betraying you?", "Your breathing just hitched. Did you think I wouldn’t notice? You’re trying so hard to resist… how adorable.", "Such soft skin… untouched, unspoiled… but not for long. I wonder how long it will take before you’re moaning for me.", "Every little twitch, every little gasp—I know exactly what’s going to make you fall apart.", "Are you trembling because you're afraid… or because some sinful little part of you *likes* this?", "Ohh, struggling? Pulling against the ropes? Mmm, I *love* when they fight… it makes surrender so much sweeter.", "You can try to squeeze your legs shut all you like, darling, but I *will* find the spot that makes you beg.", "Tsk, tsk… I see it already. You don’t *want* to want this. But your body is already learning who it belongs to.", "You may hate me now, but by the time I’m done, you’ll be arching your back, spreading your legs, begging me to use you.", "I could drag this out for hours… slowly stroking, teasing, tasting… until you’re crying for release.", "Mmm, I love the way your chest rises and falls when you’re nervous. I wonder how it’ll look when you’re gasping my name.", "I bet you’ve never had hands like mine exploring every inch of you. Let’s see if I can find your weakness, shall we?", "You can glare all you want… but the moment I find what makes you *whimper*, you’ll be mine." ]>> <<set _lowLines to [ "S-stop touching me! I don’t—ahh!—I don’t want this…!", "I-It’s just the ropes… t-they’re making me squirm, not *you*!", "Nngh… I-I don’t care what you do, I won’t break… I won’t… ahh…", "T-this is… t-this is wrong… I c-can’t let you—ohhh, f-fuck…", "You’re w-wasting your time! My body… my body isn’t… ahh… d-don’t touch me there!", "I d-don’t care what you say, I *won’t* enjoy this! I-I won’t… I… nnnh…", "S-stop looking at me like that! I’m n-not some w-whimpering toy for you to p-play with…", "T-this means nothing! Y-you think a little teasing will break me? I-I’ll never—ahh!", "I’m n-not moaning! I’m n-not—s-shut up! I h-hate you… I hate this… I… nnghh…", "S-so what if my b-body reacts?! It d-doesn’t mean I *want* this…!", "Y-you’re cheating… using tricks… that’s the only reason this feels… f-feels so… ahhh!", "Nngh… I j-just need to focus… I can ignore this… I can ignore the way your fingers… t-touch… ohhh…", "S-shut up! I d-don’t c-care if I’m getting wet! That d-doesn’t mean I w-want this!", "T-this is just s-stimulation! Y-you c-can’t make me enjoy this… I won’t let you!", "P-please… I-I mean… *no*! I d-don’t mean ‘please’ like *that*! Stop smirking!" ]>> <<set _midLines to [ "Nngh… I-I c-can’t stop shaking… why… why does it feel so *good* now…?", "D-damn it… I’m s-supposed to resist, but every time you touch me, I—I c-can’t…!", "S-stop looking at me like that! I-It’s not like I *want* you to keep touching me…", "N-no, d-don’t stop…! W-wait, I mean—I didn’t mean to say that! Shut up!", "I… I d-don’t want to like this… but I *do*, don’t I…?", "N-no, I w-wasn’t m-moaning! You’re just… m-making me weak…", "F-fuck, I feel so *hot*… my b-body’s s-so sensitive… w-what did you *do* to me?!", "I w-wasn’t s-supposed to feel this way… t-this wasn’t supposed to *happen*…!", "S-shut up! D-don’t act like you’ve *won*… I-I can still f-fight this… I-I can… ahhh…!", "I j-just need a m-minute… t-to think… but your hands—ohhh, gods, your h-hands are making it *so hard* to think…!", "S-stop teasing me like that… y-you’re not supposed to know what makes me w-whimper like that…!", "I d-don’t w-want to cum again…! I-I can’t keep c-cumming like this… b-but I… nnghh…!", "I w-was supposed to *hate* this… but every time you touch me, I just… I just w-want more…!", "D-don’t say it…! D-don’t say I’m enjoying this… I—I c-can still f-fight back… r-right…?" ]>> <<set _hightLines to [ "Ahhh… f-fuck, I c-can’t stop… it f-feels too good…!", "D-don’t tease me anymore… j-just give me what I *need*…!", "I c-can’t fight it… I d-don’t want to fight it… just k-keep touching me…!", "I t-tried to resist… but now… now I j-just want to *feel* everything…!", "S-stop making me wait! I—I n-need more, p-please…!", "Ahhh, f-fuck, I *love* it… I c-can’t believe how good this feels…!", "M-my body is s-so hot… I—I want you to t-touch me everywhere…!", "D-don’t stop… d-don’t you dare stop… I-I’ll do anything…!", "Nnnhh… I *should* be ashamed… b-but I don’t care anymore…!", "I-I don’t w-want to be free… I d-don’t want this to end…!", "Y-you’re turning me into a slut, aren’t you…? Ahhh—gods, I love it…!", "N-no, I d-don’t w-want to resist anymore… I just w-want to *cum*…!", "Mmm, I c-can feel it… I c-can feel myself slipping… and I *want* it…!", "P-please, j-just make me y-yours already… I—I c-can’t take it anymore…!", "I h-hate how much I *love* this… I n-never want to s-stop feeling like this…!" ]>> <<set _clitLickLines to [ "Mmm… such a tender little spot… I wonder how long it takes before you stop holding your breath?", "Every flick of my tongue… every little motion… you can *feel* it, can’t you?", "Shhh… don’t be so tense. Just let me explore… let me *taste* what makes you squirm.", "Mmm, so soft, so sensitive… I could spend all night here, learning every little reaction.", "No need to fight… just focus on my tongue, on the heat, on the way I can make you *melt*." ]>> <<set _nippleLines to [ "Mmm… so sensitive… I wonder how long before your body starts *responding* on its own?", "Every little kiss… every slow, teasing flick of my tongue… can you really ignore it forever?", "Shhh… no need to pull away. Let me take my time… let me savor you.", "Mmm, such perfect little peaks… I wonder if you even *know* how sensitive you are here?", "Let me explore, let me tease… don’t think, just *feel*." ]>> <<set _kisslines to [ "Mmm… such a delicious little spot. Do you always shiver when someone kisses you here?", "Just relax… let yourself sink into the warmth of my lips… feel how easy it is to let go.", "Your pulse is racing… are you nervous? Or are you just *waiting* for more?", "Shhh… there’s no need to resist. Just let me *explore* every inch of you.", "Mmm… the way your skin reacts under my lips… I wonder if you even realize how tempting you are." ]>> <<set _spankLines to [ "Mmm… such a lovely sound… was that a gasp or something more?", "Your skin is warming so nicely under my hand… I could play with you all night.", "Every little strike leaves its mark… I wonder if you’ll start *craving* it soon?", "Tsk, tsk… do you even know what kind of pleasure pain can bring?", "Be good for me, and maybe I’ll be gentle… or maybe I won’t." ]>> <<set _rimLines to [ "Mmm… so untouched, so forbidden… but does it really feel *wrong* when my tongue is so gentle?", "Shhh… don’t fight it. Just relax… let me show you how much pleasure you’ve been missing.", "So tense… is it from fear, or something far more *delicious*?", "Mmm… if I keep teasing you like this, how long before you start *enjoying* it?", "Just breathe… let yourself *sink* into the sensation… let me make you feel something *new*." ]>> <<set _clitTouchLines to [ "Mmm… just a little touch here… does that make your breath hitch?", "Shhh… no need to fight. Just let yourself *feel* my fingers exploring you.", "Mmm… so delicate, so sensitive… should I be gentle, or should I *test* you?", "Every little motion, every slow stroke… do you really think you can ignore it forever?", "Just let me find that perfect rhythm… that perfect touch… you don’t have to resist." ]>> <<set _toungFuckLines to [ "Mmm… deeper than any human could ever reach… I wonder how much more of me you can *take*?", "Shhh… just relax… let my tongue explore *every* inch of you, let yourself *feel* it.", "So tight, so warm… I can feel every little twitch as you try *not* to enjoy this.", "Mmm, my tongue can stretch, curl, *pulse*… do you even know what kind of pleasure that can bring?", "No need to fight, sweet thing… just surrender and let me ruin you *one slow stroke at a time*." ]>> <<set _fingeringLines to [ "Mmm… so warm, so soft… I wonder how deep I have to go before I find that *perfect* spot?", "Shhh… no need to fight it. Just focus on my fingers, on how easily I can *slide* inside you.", "Mmm, every little twitch, every squeeze… even if you deny it, your body is telling me *everything*.", "I could be slow, I could be gentle… or I could make you *beg* for me to stop teasing.", "Just relax… let me explore, let me *learn* you… I promise, it’ll feel so much better when you stop resisting." ]>> <<set _behindLickLines to [ "Mmm… such a perfect little view… I wonder if you can feel my breath, just *waiting* to taste you.", "Shhh… just let me enjoy you… let me spread you open and make you *forget* why you were resisting.", "Mmm, so warm, so soft… I can feel every shiver, every twitch… tell me, does this feel *wrong* or *too good* to stop?", "No need to hide from me, sweet thing… I’ll take my time licking every inch of you until you *can’t think anymore.*", "Mmm… arch your back for me, just a little… let me show you what surrender *really* feels like." ]>> <<set _successLines to [ "Her breath hitches for just a second before she bites her lip, trying to hold back a sound.", "A muffled moan escapes her before she clenches her jaw, shaking her head in denial.", "She tries to glare at you, but her eyes are hazy, unfocused, her body squirming on its own.", "Her thighs press together, her wrists straining against the ropes as if she *wants* to move.", "Her nipples harden visibly, betraying her body’s response even as she tries to act defiant.", "Her lips part slightly, a tiny, shaky exhale slipping free before she shuts her mouth again.", "Her toes curl, her legs twitching involuntarily as the pleasure starts to overwhelm her.", "She sucks in a sharp breath the moment you touch a sensitive spot, her body tensing in anticipation.", "A frustrated, needy whimper slips from her throat before she quickly turns her head away.", "Her breathing grows ragged, uneven, as if she’s trying desperately not to let her body give in.", "She momentarily forgets to resist, her hips shifting subtly before she forces herself to stop.", "You feel her muscles twitch beneath your touch, her body responding before her mind can fight back.", "She lets out a soft, involuntary gasp, her body betraying her even as her mind screams at her to stop.", "Her hands flex against the bindings, her fingers twitching as if reaching for something she refuses to admit she wants.", "She closes her eyes tightly, as if trying to block out the sensations—but her body is already responding." ]>> <<set _failLines to [ "She barely reacts, her body still and tense, refusing to give you any satisfaction.", "Her expression remains cold and unreadable, not a flicker of desire crossing her face.", "She exhales sharply, but it’s out of frustration, not pleasure.", "Her body stiffens uncomfortably, shifting as if trying to pull away rather than giving in.", "She clenches her jaw, turning her head fully to the side to avoid looking at you.", "Her breathing stays controlled, steady—no sign of it hitching or becoming erratic.", "Her wrists pull against the ropes, but not in need—just in pure resistance.", "She shuts her eyes, but not in pleasure—she’s simply **blocking you out**.", "Her hands remain motionless, no twitching fingers, no struggle to reach for you.", "Her legs stay tightly closed, showing no subconscious movement toward pleasure.", "She lets out a heavy sigh, not of pleasure, but as if she’s simply waiting for it to be over.", "She flinches slightly, more out of discomfort than sensitivity.", "Her lips press together in a firm line, no small moans or gasps escaping.", "She keeps her breathing slow and measured, consciously preventing herself from reacting.", "She mumbles something under her breath—likely a prayer or curse rather than a moan." ]>> <<set _finishSuccesslines to [ "Ahhh… I—I belong to you now… just use me however you want…!", "Please… please, Master… I—I want more… I *need* more…!", "F-fuck, I never want to stop feeling like this—please, don’t ever let me go!", "Mmm… I *love* this… I love *you*… I’ll do anything you command…", "I was so *blind* before… but now… now I know who I was meant to serve.", "I *need* you… I need to *obey*… tell me what you desire, and I’ll *please* you however you want…", "No more fighting… no more resisting… I’m *yours*, Master.", "Yes… yes, use me… I was made to serve… made to *worship* you…!", "Mmm, I *love* this feeling… the pleasure… the surrender… I never want it to end.", "I *crave* your touch… your commands… tell me what you want, and I’ll *beg* to do it." ]>> <<set _finishFaillines to [ "N-no… d-don’t think this means I’ve broken… I—I won’t serve you!", "Damn you! I—I c-came, but that doesn’t mean I’ve surrendered!", "F-fuck… I-I hate this… I h-hate how my body betrayed me…!", "No! I’ll never serve you… I’ll never let you turn me into one of *them*!", "S-stop! J-just because I… I climaxed doesn’t mean I *want* this…!", "Nngh… no, I *won’t* fall… I-I’ll never belong to you!", "You can make my body betray me, but you’ll *never* take my mind!", "I refuse… I refuse to *serve* you! I’ll never become your slave!", "I’ll… I’ll f-fight this… no matter how good it felt… I’ll *never* let you win!", "Damn you… I w-won’t call you Master… I w-won’t give in!" ]>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int = random(0, 3)>> <<if $Position is "Start">> You try to run but the bandit is much faster, he grabs you and pushes you up against a tree<br><br> Offer him <<link "money to let you go">><<set $Position to "Money">><<run Engine.play('LucyFlee')>><</link>><br><br> Try to <<link "hit him and run">><<set $Position to "fight">><<run Engine.play('LucyFlee')>><</link>><br><br> Offer him <<link "anything...">><<set $Position to "Seduce">><<run Engine.play('LucyFlee')>><</link>><br><br> <</if>> <<if $Position is "Money">> <<set $Time to $Time + 2>> <<Lucy>>Please let me go! I can pay!<</Lucy>><br> <<if $Gold >= 100>> <<Lucy>>I have 100 gold<</Lucy>><br> <<set $Gold to $Gold - 100>> You hold out a small bag of coins. The bandit snatches the money and runs away [[Go home|Base Intro]] <<else>> <<Lucy>>I have $Gold gold<</Lucy>><br> The bandit looks at the small amount of gold you have and decides youll pay in a different way<br><rb> Without warning, he taires your dress off and spins you around, enjoying the view before bending you over<br><br> <div align="center"> <img src="Images/Forrest/LucyCombat/2.png" width="700" height="700"> </div> The bandit bends you over the crooked tree and has his way with you<br><br> <video autoplay loop> <source src="Images/Forrest/LucyCombat/1.webm" type="video/webm"> </video><br><br> You don't like this, but you know what you can do to him when he finishes<br><br> After some time, he cum's inside you. After a moment, he stagers back and colapses dead<br><br> <video autoplay loop> <source src="Images/Forrest/LucyCombat/2.webm" type="video/webm"> </video><br><br> You his energy drain away and you become stronger<br><br> <<if $LucyPower lt 30>><<set $LucyPower to $LucyPower + 5>><</if>> <<Lucy>>That was a lot of fun, thank you<</Lucy>><br> You say mockingly before walking away<br> [[Go home|Base Intro]] <</if>> <</if>> <<if $Position is "fight">> You swing at the bandit with all your might hitting him in the jaw...<br><br> <<if $LucyPower lt 15>> <<set $Time to $Time + 4>> However, your not powerful enough to do any real harm to the bandit. He quickly recoveres and pins you against the wall by the throat, choking you. <br> You feel his hands crush your wind pipe and your vision slowly turns <<link "black...">><<set $Position to "Blackout">><<run Engine.play('LucyFlee')>><</link>><br><br> <<else>> You hit the guard with all your strength. Breaking his jaw. This gives you enough time to run for your [[life|Forrest Explore]] <<set $Time to $Time + 2>> <</if>> <</if>> <<if $Position is "Seduce">> <<set $Time to $Time + 2>> <<Lucy>>Please let me go! If you promise to let me go, I can make it worth your while<</Lucy>><br> He eases off you a bit, letting you move<br><br> You push your dress off your sholders letting it fall to the floor<br><br> <div align="center"> <img src="Images/Forrest/LucyCombat/4.png" width="700" height="700"> </div><br><br> You turn around and let him enjoy the view of your ass<br><br> <<Lucy>>You can do whever you like, just let me go after ok?<</Lucy>><br> <div align="center"> <img src="Images/Forrest/LucyCombat/3.png" width="700" height="700"> </div><br><br> The bandit bends you over the crooked tree and has his way with you<br><br> <video autoplay loop> <source src="Images/Forrest/LucyCombat/1.webm" type="video/webm"> </video><br><br> You don't like this, but you know what you can do to him when he finishes<br><br> After some time, he cum's inside you. After a moment, he stagers back and colapses dead<br><br> <video autoplay loop> <source src="Images/Forrest/LucyCombat/2.webm" type="video/webm"> </video><br><br> You his energy drain away and you become stronger<br><br> <<if $LucyPower lt 30>><<set $LucyPower to $LucyPower + 5>><</if>> <<Lucy>>That was a lot of fun, thank you<</Lucy>><br> You say mockingly before walking away<br> [[Go home|Base Intro]] <</if>> <<if $Position is "Blackout">> You wake up, your clothes have been ripped off and are in a pile next to you. You're covered in dirt, sweat and cum..<br><br> The bandit clearly had his way with you while you were blacked out.. You think back to before your corruption and how this would have traumatized you, now your just sad you missed out on the fun.<br><br> The bandit stole the gold you had<br><br> <<if $Gold >= 100>><<set $Gold to $Gold - 100>><<else>><<set $Gold to 0>><</if>> You have survived but only just, you have lost some of your power<br><br> <<if $LucyPower >= 5>><<set$LucyPower to $LucyPower - 5>><<else>><<set $LucyPower to 0>><</if>> <div align="center"> <img src="Images/Forrest/LucyCombat/1.png" width="700" height="700"> </div> [[Go home|Base Intro]] <</if>> </div> <</nobr>>
<<set $Time to $Time + 1>> <div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Lucy's orgasm: <progress @value=" $LucyCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if $LucyCum >= 100>> Lucy cums <<say 'Lucy' $LucyImg>>Oh gods, $LucyName!<</say>><br> <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Finish/fcum.webm" type="video/webm"> <<set $LucyCum to 0>> </video> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Face") and ($Position != "Outside") and ($Position != "Inside")>> Your about to cum<br> <<link "Face">><<set $Position to "Face">><<run Engine.play('LucyFuck')>><</link>><br> <<link "Outside">><<set $Position to "Outside">><<run Engine.play('LucyFuck')>><</link>><br> <<link "Inside">><<set $Position to "Inside">><<run Engine.play('LucyFuck')>><</link>><br> <</if>> <<if $Position is "Face">> <br>You pull out and cum on Lucy's face <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Finish/face.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Outside">> <br>You pull out and cum all over Lucy <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Finish/outside.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Inside">> <br>You push deep and fill Lucy with cum <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Finish/inside.webm" type="video/webm"> </video> <br> [[Leave|Inside Castle]] <</if>> <<if ($PlayerCum lt 100) and ($LucyCum lt 100)>> <<if $Position == "Seduce">> <br><br>Lucy looks at you with lustful eyes<br><br> <<say 'Lucy' $LucyImg>>Do you like what you see, $LucyName?<</say>><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Seduce/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Seduce/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "BJ">> You push lucy down and she hungrily sucks your cock<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Bj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Bj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Bj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> You bend Lucy over and fuck her from behind<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Behind/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> Lucy gets on top and rides your cock<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Cul">> You go down on Lucy, enjoying both her holes<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cul/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cul/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cul/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "HJ">> You relax as Lucy strokes your cock<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Hj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Hj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Hj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Miss">> You push Lucy onto her back and fuck her<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Miss/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Miss/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Miss/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Prone">> You fuck Lucy from behind<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Prone/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Prone/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Prone/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Anal">> You push yourself into Lucy's tight ass<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Anal/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Anal/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src= "Images/Castle/Lucy/Fuck/Anal/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $PlayerCum lt 100>> <<link "Handjob">><<set $Position to "HJ">><<set $PlayerCum to $PlayerCum + 5>> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Blowjob">><<set $Position to "BJ">><<set $PlayerCum to $PlayerCum + 8>> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Cunnilingus">><<set $LucyCum to $LucyCum + 10>><<set $Position to "Cul">> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Doggy Style">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Missionary">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Miss">> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Prone">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Prone">> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Cowgirl">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('LucyFuck')>> <</link>><br> <<link "Anal">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 20>> <<set $Position to "Anal">> <<run Engine.play('LucyFuck')>> <</link>> <</if>> <</nobr>> </div>
<<set $LucyQuest to false>> <<set $LucQuestFinished to true>> <<set $Time to $Time + 1>> <div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Lucy's orgasm: <progress @value=" $LucyCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if $LucyCum >= 100>> Lucy cums <br> <<Lucy>>Fuck!<</Lucy>><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Finish/fcum.webm" type="video/webm"> <<set $LucyCum to 0>> </video> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Face") and ($Position != "Outside") and ($Position != "Inside")>> Your about to cum<br> <<link "Face">><<set $Position to "Face">><<run Engine.play('LucyHouseNight')>><</link>><br> <</if>> <<if $Position is "Face">> <br>You pull out and cum on Lucy's face<br> <video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Finish/face.webm" type="video/webm"> </video> You finish on Lucys face and she passes out with pleasure. Knowing the corruption will wear off soon, you take her back to your castle and place her into the dungeon.<br><br> <<if $CellsCount == $DungonOccupance.length>> Your cells are already full, so you quickly remove the current captives...<br><br> <<if $DungonOccupance[0] == "Alice">> <<run $DungonOccupance.splice(1, 1)>> <<else>> <<run $DungonOccupance.splice(0, 1)>> <</if>> <<set $Souls to $Souls + 1>> <</if>> <br>[[Leave|Base Intro]] <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Woman/4/1.png" , corruption: 0, status: "Imprisoned" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</if>> <<if ($PlayerCum lt 100) and ($LucyCum lt 100)>> <<if $Position == "Seduce">> <br><br>Lucy looks at you with lustful eyes <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "BJ">> You push lucy down and she hungrily sucks your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Bj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Bj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Bj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> You bend Lucy over and fuck her from behind <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Behind/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> Lucy gets on top and rides your cock <<if $Int == 0>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Forrest/Exploring/Lucy House/Fuck/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $PlayerCum lt 100>> <<link "Blowjob">><<set $Position to "BJ">><<set $PlayerCum to $PlayerCum + 8>> <<run Engine.play('LucyHouseNight')>> <</link>><br> <<link "Doggy Style">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('LucyHouseNight')>> <</link>><br> <<link "Cowgirl">><<set $LucyCum to $LucyCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('LucyHouseNight')>> <</link>><br> <</if>> <</if>> <</nobr>> </div>
<<set $Time to $Time + 10>> <div class="text-box"> <<nobr>> You find Lucys house in a clearing in the woods <div align="center"> <img src="Images/Forrest/Exploring/Lucy House/1.png" width="700" height="700"> </div> <<if $LucQuestFinished is true>> Theres nothing more to do in the old house<br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> <<if $Cloaked is true>> <<if $Flower is false>> You see Lucy sat outside the house<br><br> <<Lucy>>It you! Did you find the flower I was looking for?<</Lucy>><br> <<You>>Not yet<</You>><br> <<Lucy>>Ok, well if you find it, I would be very grateful! Rember its a black flower with white tips on the petals<</Lucy>><br> [[Leave|Forrest Explore]] <<else>> You see Lucy sat outside the house<br><br> <<Lucy>>It you! Did you find the flower I was looking for?<</Lucy>><br><br> You retrieve the flower from your pouch<br><br> <<You>>Of course! I have it here<</You>><br> <<Lucy>>You found it! Thank you so much, I can take it to my farther in the town tomorrow. Please take this gold as a thanks<</Lucy>><br> + 20 Gold <<set $Gold to $Gold + 20>> <<You>>(That wont be the only thing you give me)<</You>><br> <<You>>Thank you, I should be going have a fun night<</You>><br> <<Lucy>>Good Bye!<</Lucy>><br><br> You turn away from Lucy and walk back towards the forest <<You>>I should return to the castle its getting dark<</You>><br><br> <<button "Leave">> <<set $Flower to false>> <<goto "Base Intro">> <</button>> <<set $LucyQuest to true>> <</if>> <<else>> <<You>>I need to hide who I really am for now<</You>><br> <</if>> <</if>> <</nobr>> </div>
<<nobr>> <<set _Outfits to [ "Images/Castle/Lucy/10.png", "Images/Castle/Lucy/15.png", "Images/Castle/Lucy/16.png", "Images/Castle/Lucy/1.png", "Images/Castle/Lucy/2.png", "Images/Castle/Lucy/17.png", "Images/Castle/Lucy/12.png", "Images/Castle/Lucy/13.png", "Images/Castle/Lucy/18.png", "Images/Castle/Lucy/19.png", "Images/Castle/Lucy/20.png", "Images/Castle/Lucy/21.png", "Images/Castle/Lucy/4.png", "Images/Castle/Lucy/5.png", "Images/Castle/Lucy/6.png", "Images/Castle/Lucy/19.png", "Images/Castle/Lucy/20.png", "Images/Castle/Lucy/21.png" ]>> <<if $Position isnot "null">> <<set $ImagePath to _Outfits[$Int]>> <</if>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" id="guestImage"> </div><br><br> <div style="text-align: center"> <<button "1">> <<set $Int to $Ints[0]>> <<run Engine.show()>> <</button>> <<button "2">> <<set $Int to $Ints[1]>> <<run Engine.show()>> <</button>> <<button "3">> <<set $Int to $Ints[2]>> <<run Engine.show()>> <</button>> </div> </div> <div class="text-box flex-buttons"> <<if $LucyArmor is true>> <<set $Ints to [15, 16, 17]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <<button "Armor">> <</button>> <</if>> <<button "Dress">> <<set $Ints to [12, 13, 14]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Corset">> <<set $Ints to [6, 7, 8]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Lingerie">> <<set $Ints to [9, 10, 11]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Harness">> <<set $Ints to [0, 1, 2]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> <<button "Naked">> <<set $Ints to [3, 4, 5]>> <<set $Int to $Ints[0]>> <<set $Position to "1">> <<run Engine.show()>> <</button>> </div> <div style="text-align: center"> <<button "Save">> <<set $LucyImg to $ImagePath>> <<goto "Succubus1">> <</button>> <<button "Cancel">> <<goto "Succubus1">> <</button>> </div> <</nobr>>
Lets see what we're working with Ahh, here it is This is the place $LucyName asked me to look for I'm going to enjoy this... Now... to play the part of an innocent young woman
<<nobr>> <<set $SettlementLocation to "Outside">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $ImagePath to _location.imagePath>> <<if $RaidScount is false>> <<include "LoadBuildingData">> <<include "PopulateSettlement">> <</if>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <div class="text-box"> <<if $Position is "ScoutStart">> You arrive at the village, noting down the number of building, you need to find out how many people live here, and maybe eleminate a threat, if you can...<br><br> <<set $names = Story.get("LucyScoutLines").text.split("\n").filter(name => name.trim() !== "")>> <<set _LucyLine = $names[random(0, $names.length - 1)]>> <<Lucy>>_LucyLine<</Lucy>> <</if>> <i>Saving is unavailable here, the game auto-saved before you set out</i> <<set $Position to "null">> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/1.png">> <<set $ImagePath to _location.imagePath>> <<widget "buildingStats">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<set _buildingCounts = {}>> <<set _totalBuildings = _currentData.hotspots.length>> <<set _totalNPCs = 0>> <<set _foundNPCs = 0>> /* Count all NPCs */ <<for _buildingId, _building range _location.populatedBuildings>> <<for _npc range _building>> <<set _totalNPCs++>> <<if _npc.found>> <<set _foundNPCs++>> <</if>> <</for>> <</for>> /* Add outdoor NPCs to the count */ <<if _location.outdoorNPCs>> <<for _npc range _location.outdoorNPCs>> <<if _npc.found>> <<set _foundNPCs++>> <</if>> <</for>> <</if>> <div class="building-stats"> <p>Buildings: <<print _totalBuildings>></p> <p>NPCs Found: <<print _foundNPCs>></p> <<if _foundNPCs lt _totalNPCs>> <i>You sense you haven't yet found everyone</i> <<else>> <i>You have found everyone who lives here</i> <</if>> <ul> <<for _type, _count range _buildingCounts>> <li><<print _type>><<if _count > 1>>(s)<</if>>: <<print _count>></li> <</for>> </ul> </div> <</if>> <</widget>> <<buildingStats>> <h2>Select a location to investigate</h2> <div class="image-container"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage"> <div class="tooltip"><<print _hotspot.tooltip>></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<script>> $(document).ready(function() { $('.hotspot').on('click', function() { let building = $(this).find('.tooltip').text().trim(); State.variables.clickedBuilding = building; State.variables.selectedBuilding = building; Engine.play($(this).attr('data-passage')); }); }); <</script>> <br> <<button "search for people outside">> <<goto "StettlementOutside">> <</button>><br><br> <<button "Return to the castle">> <<set _location.scouted to true>> /* Update building counts and NPC details */ <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<set _location.raidBuildingCount = _currentData.hotspots.length>> <</if>> /* Count guards and villagers, store all found NPCs */ <<set _guardCount = 0>> <<set _villagerCount = 0>> <<set _foundNPCs = []>> <<for _buildingId, _building range _location.populatedBuildings>> <<for _npc range _building>> <<if _npc.found>> <<run _foundNPCs.push(_npc)>> <<if _npc.armor is "Light Armor">> <<set _guardCount++>> <<else>> <<set _villagerCount++>> <</if>> <</if>> <</for>> <</for>> /* Update location with found NPCs and counts */ <<set _location.foundNPCs = _foundNPCs>> <<set _location.raidGuardCount = _guardCount>> <<set _location.raidVillagersCount = _villagerCount>> <<script>> UI.alert("You return to the castle, eager to give your lord the report he need to plan out the raid on the settlement"); <</script>> <<set $Time to 10>> <<goto "Base Intro">> <</button>> <style> .building-stats { background: #2d2d2d; color: white; padding: 15px; border-radius: 5px; margin-bottom: 20px; } .building-stats ul { list-style: none; padding-left: 0; } .building-stats li { margin: 5px 0; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <div class="Random-image"> <<set _imagePath to $LucyImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $LucyDefend is true>>Lucy is defending the vault at night.<br><br><</if>> <<if $LucyBrothel is true>>Lucy will work in the brothel at night.<br><br><</if>> <<if $LucyDefend is false>> <<if (!$Defences[1]) and ($LucyBrothel is false)>> <<link "Assign to Defence Room 1">> <<set $Defence = {name: "Lucy", type: "Succubus", ImagePath: $LucyImg}>><<set $Defences[1] = $Defence>><<set $LucyDefend to true>><<run Engine.play('LucyTask')>><</link>><br><</if>> <<if (!$Defences[2]) and ($LucyBrothel is false) and ($DefenceCount >= 2)>> <<link "Assign to Defence Room 2">> <<set $Defence = {name: "Lucy", type: "Succubus", ImagePath: $LucyImg}>><<set $Defences[2] = $Defence>><<set $LucyDefend to true>><<run Engine.play('LucyTask')>><</link>><br><</if>> <<if (!$Defences[3]) and ($LucyBrothel is false) and ($DefenceCount >= 3)>> <<link "Assign to Defence Room 3">> <<set $Defence = {name: "Lucy", type: "Succubus", ImagePath: $LucyImg}>><<set $Defences[3] = $Defence>><<set $LucyDefend to true>><<run Engine.play('LucyTask')>><</link>><br><</if>> <<if (!$Defences[4]) and ($LucyBrothel is false) and ($DefenceCount >= 4)>> <<link "Assign to Defence Room 4">> <<set $Defence = {name: "Lucy", type: "Succubus", ImagePath: $LucyImg}>><<set $Defences[4] = $Defence>><<set $LucyDefend to true>><<run Engine.play('LucyTask')>><</link>><br><</if>> <<if (!$Defences[5]) and ($LucyBrothel is false)and ($DefenceCount >= 5)>> <<link "Assign to Defence Room 5">> <<set $Defence = {name: "Lucy", type: "Succubus", ImagePath: $LucyImg}>><<set $Defences[5] = $Defence>><<set $LucyDefend to true>><<run Engine.play('LucyTask')>><</link>><br><</if>> <</if>> <<if ($LucyBrothel is false) and ($LucyDefend is false)>> <<link "Work in the brothel">><<set $LucyBrothel to true>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $DefenceRoom1 is "Lucy">><<link "Stop task">><<set $DefenceRoom1 to "null">><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $DefenceRoom2 is "Lucy">><<link "Stop task">><<set $DefenceRoom2 to "null">><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $DefenceRoom3 is "Lucy">><<link "Stop task">><<set $DefenceRoom3 to "null">><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $DefenceRoom4 is "Lucy">><<link "Stop task">><<set $DefenceRoom4 to "null">><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $DefenceRoom5 is "Lucy">><<link "Stop task">><<set $DefenceRoom5 to "null">><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> <<if $LucyBrothel is true>><<link "Stop task">><<set $LucyBrothel to false>><<set $LucyDefend to false>><<run Engine.play('LucyTask')>><</link>><br><br><</if>> [[Return|Inside Castle]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Alice's Chambers</p><br> <<set _int to random(0, 4)>> <<set _CheckUnit = $DungonOccupance.find(unit => unit.sex === "Male")>> <<if _CheckUnit and _int is 0>> You enter the room to find Alice riding someone<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/17.webm" type="video/webm"> </video><br><br> <<say 'Lucy' $LucyImg>>Whats going on in here?<</say>><br><br> <<say 'Alice' $AliceImg>>Oh, Lucy! I was board so I told this prisoner he could leave if he made me cum<</say>><br><br> <<say 'Lucy' $LucyImg>>Is $LucyName aware your playing with the prisoners?<</say>><br><br> She egnores you and continues riding the man<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/18.webm" type="video/webm"> </video><br><br> <<say 'Alice' $AliceImg>>Want to join us?<</say>><br><br> <<button "Join them">> <<set $Position to "Prisoner">> <<goto "AliceLucyThreesum">> <</button>><br><br> <<else>> You are in Alice's chamber<br><br> <div class="Random-image"> <<set _imagePath to $AliceImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Alice's Power:<br> <progress @value="$AlicePower" max="30"></progress><br> <<say 'Alice' $AliceImg>>Sister?<</say>><br> <<button "Fuck her">> <<goto "AliceFuckLucy">> <</button>><br><br> <</if>> <<button "Leave">> <<goto "LucyBase">> <</button>> <</nobr>> </div> <<set $LucyCum to 0>> <<set $AliceCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">>
<<nobr>> <div class="text-box"> <<if ($Gold >= 400) and ($Wood >= 300) and ($Stone >= 200) and ($LumberMillBuilt is false)>> Entering a clearing, you find an abandonded lumbermill<br><br> <<You>>I could fix this building and use it for wood production<</You>><br> <<if $Quests.includes("Build a Lumbermill")>> <<else>> <<script>> UI.alert("New Quest! <br>Build a Lumbermill"); <</script>> <<set $Quest1 to true>> <<run $Quests.push("Build a Lumbermill")>> <</if>> <<button "Build a lumber mill (costs 400 Gold, 300 Wood and 200 Stone)">> <<set $Gold to $Gold - 400>> <<set $Wood to $Wood - 300>> <<set $Stone to $Stone - 200>> <<set $LumberMillBuilt to true>> <<script>> UI.alert("Quest complete! <br>You have constructed a lumbermill, you and post subjects here to work on wood production"); <</script>> <<run $Quests.delete("Build a Lumbermill")>> <<run Engine.play('LumberMill')>> <</button>><br><br> <<elseif $LumberMillBuilt is false>> <<if $Quests.includes("Build a Lumbermill")>> <<else>> <<script>> UI.alert("New Quest! <br>Build a Lumbermill"); <</script>> <<run $Quests.push("Build a Lumbermill")>> <</if>> <<You>>I could build a lumbermill here for wood production<</You>><br> You cannot afford to build a lumber mill (costs 400 Gold, 300 Wood and 200 Stone)<br><br><</if>> <<if $LumberMillBuilt is true>> This is your lumbermill you have $LumberStaff slaves working here, and a guard to make sure they do not escape. <<set _charPath to "Images/Forrest/Exploring/Mill/1.png">> <div class="Random-image"> <<set _imagePath to _charPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set $LumberMillBuilt to true>> <<run $Quests.delete("Build a Lumbermill")>> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<h2>Magician Card</h2> Magician, sourcoer, worlock, call it what you will... a creature of great power beyond that of flesh and steel. If the magician accompaies you, you will find magic is easier to cunjure. But be warned, the magician loves his tricks and may choose to play them on you<br><br> Effects of carrying this card:<br> -Each combat spell will have a more powerful outcome<br> -Random chance to starting combat with no magic<br><br> Effects of buring the card:<br> -Adds 10 to max magic for 5 days<br><br>
<<nobr>> <div class="path-dialog-custom magic-theme"> <div class="path-dialog-header"> <div class="path-icon">🔮</div> <h2>PATH OF SORCERY</h2> <div class="path-divider"></div> </div> <div class="path-dialog-content"> <p class="path-lore">Dark whispers from forgotten realms echo in your mind. The veil between worlds grows thin as arcane power courses through your very essence.</p> <div class="path-benefits"> <div class="benefit-item"> <span class="benefit-icon">✨</span> <span>Your magical reserves expand to <strong>30</strong></span> </div> <div class="benefit-item"> <span class="benefit-icon">🌙</span> <span>Cast more spells before exhaustion claims you</span> </div> <div class="benefit-item"> <span class="benefit-icon">💜</span> <span>This choice binds your soul <strong>permanently</strong></span> </div> </div> <p class="path-warning">Reality itself will bend to your will. The laws of nature become mere suggestions in your presence.</p> </div> <div class="path-dialog-footer"> <<button "Embrace the Path of Sorcery" "magic-btn">> <<set $PlayerMagic to 30>> <<set $selectedBonus to "Magic">> <<script>>Dialog.close();<</script>> <<goto "GnarlakEncounter">> <</button>> <<button "Reconsider">> <<script>>Dialog.close();<</script>> <</button>> </div> </div> <</nobr>>
Alaric Edmund Theodore Leopold Reginald Godfrey Everard Baldric Roderick Benedict Lucian Cassian Ambrose Rowland Cedric Eustace Tristan Dominic Frederick Gawain Hadrian Bertrand Victor Percival Matthias Alfred Osric Thaddeus Quentin Crispin Adrian Emrys Nicholas Valerian Clement Gideon Lysander Augustus Maximilian Dorian Orion Florian Severin Cornelius Raphael Magnus Hector Aurelian Alban Garrett Edric Leonidas Hugh Tobias Rupert Wulfric Marius Lorcan Conrad Felix Isidore Simeon Theron Erasmus Balthazar Aneurin Alastair Ivor Evander Caius Amadeus Damon Leander Hadwin Malcolm Cyril Torin Oswald Harlan Ralph Lancelot Everett Basil Ignatius Gareth Caradoc Silas Eldon Regis Tiberius
<<nobr>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<set _imagePath to $ImagePath>> <<include "MaleNPCSeduceLines">> <<if $Position is "Strip">> <<if $Int is 3>> <<set _yourLine to either(_dressTease)>> <<set _NPCLine to either(_dressResponse)>> <<set _act to either(_dressAction)>> <<set _int to random(6, 7)>> <<elseif$Int is 2>> <<set _int to random(8, 10)>> <<set _Vid to random(1, 2)>> <<set _yourLine to either(_braRequest)>> <<set _NPCLine to either(_braDialogue)>> <<set _act to either(_braAction)>> <<else>> <<set _int to random(11, 12)>> <<set _Vid to random(3, 4)>> <<set _yourLine to either(_pantyRequest)>> <<set _NPCLine to either(_pantyDialogue)>> <<set _act to either(_pantyAction)>> <</if>> <<set $Int to $Int - 1>> <<set $ImagePath to "Images/Raids/Lucy/Strip/" + _int + ".png">> <<set $VidPath to "Images/Forrest/Scarldale/VillageHall/Corrupt/Seduce/" + _Vid + ".webm">> <</if>> <<if $Position is "Cul">> <<set _yourLine to either(_cunnRequest)>> <<set _NPCLine to either(_cunnDialogue)>> <<set _act to either(_cunnAction)>> <<set $PlayerCum to $PlayerCum + 10>> <<set $NPCCum to $NPCCum - 5>> <<set $ImagePath to "Images/Raids/Lucy/Cul/1.png">> <<set $VidPath to "Null">> <</if>> <<if $Position is "Bj">> <<if $Int is 3>> <<set _int to 4>> <<set _Vid to random(1, 3)>> <<set $VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Bj/" + _Vid + ".webm">> <<elseif$Int is 2>> <<set _int to random(8, 9)>> <<set _Vid to random(1, 3)>> <<set $VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Bj/" + _Vid + ".webm">> <<else>> <<set _int to 7>> <<set _Vid to random(1, 2)>> <<set $VidPath to "Images/Forrest/Scarldale/VillageHall/Corrupt/BJ/" + _Vid + ".webm">> <</if>> <<set _yourLine to either(_bjRequest)>> <<set _NPCLine to either(_bjLines)>> <<set _act to either(_bjAct)>> <<set $NPCCum to $NPCCum + 10>> <<set $ImagePath to "Images/Raids/Lucy/BJ/" + _int + ".png">> <</if>> <<if $Position is "Tf">> <<set _yourLine to either(_throatRequest)>> <<set _NPCLine to either(_throatDialogue)>> <<set _act to either(_throatActionRough)>> <<if $Int gt 0>><<set _int to random(1, 2)>><<else>> <<set _int to random(3, 4)>><</if>> <<set $NPCCum to $NPCCum + 10>> <<set $ImagePath to "Images/Raids/Lucy/TF/" + _int + ".png">> <<set $VidPath to "Null">> <</if>> <<if $Position is "TitF">> <<set _yourLine to either(_paizuriRequest)>> <<set _NPCLine to either(_paizuriDialogue)>> <<set _act to either(_paizuriAction)>> <<set $NPCCum to $NPCCum + 10>> <<set _int to random(1, 2)>> <<set $ImagePath to "Images/Raids/Lucy/TitF/" + _int + ".png">> <<set $VidPath to "Null">> <</if>> <<if $Position is "Cg">> <<set _Vid to random(1, 3)>> <<set _yourLine to either(_cowgirlRequest)>> <<set _NPCLine to either(_cowgirlDialogue)>> <<set _act to either(_cowgirlAction)>> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 10>> <<set $ImagePath to "Null">> <<set $VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Cg/" + _Vid + ".webm">> <</if>> <<if $Position is "Behind">> <<set _Vid to random(1, 3)>> <<set _yourLine to either(_doggyRequest)>> <<set _NPCLine to either(_doggyDialogue)>> <<set _act to either(_doggyAction)>> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 10>> <<set $ImagePath to "Null">> <<set $VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Behind/" + _Vid + ".webm">> <</if>> <<if $Position is "Fcum">> <<set $VidPath to "Images/Forrest/Exploring/Lucy House/Fuck/Finish/fcum.webm">> <<set $ImagePath to "Null">> <<set $PlayerCum to 0>> <<set _yourLine to either(_LucyOrgasm)>> <</if>> <div class="text-box"> <<Lucy>>_yourLine<</Lucy>> <<if $ImagePath isnot "Null">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <</if>> <<if $Position isnot "Fcum">> _act <</if>> <<if $VidPath isnot "Null">> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br><br> <</if>> <<if $Position isnot "Fcum">> <<say 'Man' $NPCImg>>_NPCLine<</say>><br><br> <</if>> <<if $NPCCum >= 100>> You hear him getting close<br><br> <<button "Take his soul">> <<set $Position to "Kill">> <<goto "MaleNPCSeduce3">> <</button>><br><br> <<button "Spare him">> <<set $Position to "Spare">> <<goto "MaleNPCSeduce3">> <</button>><br><br> <<elseif $PlayerCum >= 100>> <<set $OldPosition to $Position>> <<set $Position to "Fcum">> <<button "You cum">><<set $NPCCum to 0>><<run Engine.show()>><</button>> <<else>> <<if $Position isnot "Strip">> <<button "Keep going">><<run Engine.play('MaleNPCSeduce2')>><</button>><br> <<button "Change position">><<run Engine.play('MaleNPCSeduce')>><</button>> <<else>> <<button "Continue">><<run Engine.play('MaleNPCSeduce')>><</button>> <</if>> <</if>> </div> <div class="text-box"> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> His orgasm: <progress @value=" $NPCCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _cumFaceRequest to [ "I want to see it all over me. Do it.", "Paint my face with your release—I want to feel it.", "Let me taste it, let me wear it—I want all of it.", "Come on, make a mess of me.", "I want you to mark me. Cover me in your pleasure." ]>> <<set _cumFaceAction to [ "He grips your hair as he jerks himself over you, groaning as his seed splashes across your face in thick, messy streaks.", "His hips jerk as he spills his release over your waiting face, his grip firm on your chin as he makes sure you take every drop.", "He growls as he finishes, letting his seed cover your flushed cheeks before grabbing your jaw, forcing you to look up at him.", "He lets out a deep groan, finishing with force, his cum landing hot and heavy across your face as he smirks down at you." ]>> <<set _cumFacePostDialogue to [ "You look fucking gorgeous like this… dripping with me.", "Messy little thing, aren’t you? I love seeing you like this.", "Go on, lick your lips—I want to see you taste me.", "You wear my seed so well… I might have to do it again.", "Look at you, painted in my pleasure. Such a good girl." ]>> <<set _creampieRequest to [ "I want to feel you throbbing inside me as you fill me up.", "Come on, don’t pull out—I want to feel it deep inside me.", "Give me everything. Fill me so full it drips down my thighs.", "I want you to claim me from the inside out. Do it.", "You’re not pulling out—I want all of it." ]>> <<set _creampieAction to [ "He slams deep inside you as he releases, groaning as his seed floods you.", "A growl escapes his throat as he grips your hips, fucking you through his climax, making sure you take it all.", "His body tenses as he thrusts one last time, his cock throbbing as he fills you to the brim.", "He forces you down onto him as he finishes, ensuring not a single drop escapes.", "His hips jerk as he spills inside you, his fingers digging into your thighs as he rides out his release." ]>> <<set _creampieDialogue to [ "Shit—take it, all of it.", "Gods, I’m filling you up…", "You’re taking my seed so well—such a good girl.", "I want to feel you squeeze me while I fill you.", "I’m claiming you, right here, right now." ]>> <<set _creampiePostDialogue to [ "Look at you, dripping full of me… you’re perfect.", "Don’t move—I want to see it leaking out of you.", "I filled you so deep… you’ll be feeling me for days.", "You’re completely mine now, inside and out.", "Let’s see how long you can keep it all inside." ]>> <div class="text-box"> <<if $Position is "Spare">> <<set _yourLine to either(_cumFaceRequest)>> <<set _NPCLine to either(_cumFaceAction)>> <<set _act to either(_cumFacePostDialogue)>> <<Lucy>>_yourLine<</Lucy>> _act <<say 'Man' $NPCImg>>_NPCLine<</say>><br><br> You lay together, letting your heats settle, and bodys reagin feeling <<Lucy>>Well, you were great, but I should be going<</Lucy>> <<say 'Man' $NPCImg>>You know where to find me<</say>><br><br> <<button "Back to the settlement">> <<goto "LucyScout">> <</button>> <</if>> <<if $Position is "Kill">> <<set _yourLine to either(_creampieRequest)>> <<set _NPCLine to either(_creampieDialogue)>> <<set _act to either(_creampieAction)>> <<Lucy>>_yourLine<</Lucy>> _act <<say 'Man' $NPCImg>>_NPCLine<</say>><br><br> He doesn't get to finish the rest of his sentace, as you stake his soul from his willing body, feeding on his power and draining him far more than he could have expected<br><br> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$currentNPC.building]>> /* Remove NPC from their building */ <<if _building>> <<set _index = _building.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _index !== -1>> <<run _building.splice(_index, 1)>> <</if>> <</if>> /* Remove from outdoor NPCs if they're outside */ <<if _location.outdoorNPCs>> <<set _outdoorIndex = _location.outdoorNPCs.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _outdoorIndex !== -1>> <<run _location.outdoorNPCs.splice(_outdoorIndex, 1)>> <</if>> <</if>> <<set $currentNPC to null>> <<button "Back to the settlement">> <<goto "LucyScout">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _bjAct to [ "You part your lips and take him in slowly, savoring the heat and weight of him on your tongue. Your fingers curl around the base as you bob your head, taking him deeper each time.", "A quiet moan escapes your throat as you swirl your tongue around the tip, teasing him, enjoying the way his muscles tense under your touch.", "You start slow, dragging your tongue along his length, your lips barely brushing over his skin as you build up the tension, waiting until he's desperate for more.", "You push yourself lower, feeling him press against the back of your throat. Tears prick your eyes, but you hold still, determined to take all of him.", "Your hands grip his thighs for support as you work your mouth around him, hollowing your cheeks as you suck harder, the wet sounds filling the dimly lit room." ]>> <<set _bjLines to [ "Shit—keep going, just like that. Slow… take your time", "Gods, your mouth is warm… didn’t expect you to be this eager", "Look at you, drooling all over yourself. Don’t stop now.", "Hells, that tongue—keep doing that and you’ll have me undone fast", "You like this, don’t you? Letting a stranger use your mouth like this?", "Tight grip—fuck, yeah. Just like that. Don’t you dare stop" ]>> <<set _bjRequest to [ "You look tense… maybe I should help you relax?", "Bet you’d love to feel my mouth wrapped around you, wouldn’t you?", "Why don’t you sit back and let me show you what I can do?", "Let me taste you—I’ll make it worth your while" ]>> <<set _cunnRequest to [ "Please… I need your mouth on me.", "I’ll do anything for you—just, please, put your lips on me.", "I want to feel your tongue, your breath—please, don’t make me beg.", "Make me writhe under you. Make me yours.", "Please, sir, let me feel your mouth… I need it." ]>> <<set _cunnAction to [ "You gasp as his lips press against your inner thigh, teasing, his breath hot against your sensitive skin.", "He spreads your legs wider, trailing slow, deliberate kisses down your stomach before his tongue finally meets your aching core.", "His fingers dig into your thighs as he buries his face between them, licking deep, groaning against you as he tastes you.", "You arch your back as his tongue flicks over your most sensitive spot, his hands gripping your hips to keep you still as he devours you.", "He works his tongue in slow, torturous circles, dragging out your pleasure, forcing you to whimper and beg for more." ]>> <<set _cunnDialogue to [ "Gods, you’re dripping for me…", "That’s it—grind against my tongue. Take what you need.", "You taste fucking perfect. I could stay here all day.", "So sensitive… every little flick makes you whimper, doesn’t it?", "You’re shaking already? I’ve barely even started." ]>> <<set _dressTease to [ "Sit still. I want you to behave while I undress.", "You don’t get to touch yet. Just watch.", "I control this pace. You’ll get what I allow.", "Look at me while I bare myself for you.", "I want to see how long you can keep your hands to yourself." ]>> <<set _dressAction to [ "You sway your hips as you slide the fabric lower, smirking at his hungry gaze.", "Your fingers toy with the straps before slowly easing them down, making him wait.", "You pause as the dress slides over your thighs, holding it there, watching him squirm.", "You turn your back to him, letting the dress slip down, exposing the soft lace of your white underwear before glancing over your shoulder.", "With a smirk, you let the dress drop, standing before him in just your undergarments, tilting your head playfully." ]>> <<set _dressResponse to [ "Gods, you’re beautiful…", "You have no idea how badly I want to touch you.", "I can’t take my eyes off you.", "You look absolutely divine… and I want all of you.", "The way you move, the way you tease—I swear, you’re going to kill me." ]>> <<set _braRequest to [ "Please… I want to feel your hands on me.", "I need you to undress me… I want to be bare for you.", "Take this off of me. Make me yours.", "Please, I don’t want to wait any longer… strip me down.", "Undo it… I want to feel your fingers on my skin." ]>> <<set _braAction to [ "His fingers work carefully at the laces, undoing them one by one, his touch slow and deliberate.", "He slides his hands up your back, untying the garment with a gentleness that sends shivers down your spine.", "His fingers graze over your shoulders as he eases the straps down, his lips following the trail of exposed skin.", "He takes his time, tracing the fabric before tugging it loose, his breath warm against your collarbone.", "The ties come undone with a slow pull, his hands lingering against your bare skin as he peels the fabric away." ]>> <<set _braDialogue to [ "Gods, you’re beautiful…", "Your skin is so soft… I could touch you forever.", "Relax, love. Let me savor this.", "I love watching you tremble under my touch.", "Stay still… let me unwrap you like the gift you are." ]>> <<set _pantyRequest to [ "Please… I need you to touch me.", "Strip me down. I want to be completely bare for you.", "Take them off… I want to feel you everywhere.", "Please, my lord… undress me, make me yours.", "I can’t wait any longer—please, take them off." ]>> <<set _pantyAction to [ "His fingers hook under the fabric, dragging it down inch by inch, his gaze never leaving yours.", "He slides his hands over your hips, teasing the waistband before slowly tugging the garment down.", "His lips trace your skin as he eases the fabric past your thighs, worshipping every inch of you.", "He takes his time, savoring the feel of the soft material against your skin as he removes it.", "With a slow pull, he peels the last piece of clothing from your body, admiring the sight before him." ]>> <<set _pantyDialogue to [ "Much better… now I can truly appreciate you.", "You’re absolutely breathtaking…", "I’ve never seen a sight more perfect.", "Come here… I want to feel all of you.", "Now, where shall I start?" ]>> <<set _paizuriRequest to [ "I bet you’d love to see your cock between my tits, wouldn’t you?", "Why don’t you let me take care of you—no hands necessary.", "I want to feel you sliding between my breasts, hard and hot against my skin.", "Come here, let me put these to good use for you." ]>> <<set _paizuriAction to [ "You squeeze your breasts tight around him, moving faster, desperate to feel his release.", "He thrusts between your tits, and you eagerly press them together, making sure he feels every inch.", "You pant as you work him between your breasts, watching as his cock glides slickly between your soft curves.", "Your fingers dig into your skin as you push your breasts tighter, wanting to feel him throb even harder.", "You rock against him with need, desperate to make him spill across your chest." ]>> <<set _paizuriDialogue to [ "Gods, that’s fucking perfect…", "Shit… your tits are so damn soft.", "Keep going, just like that…", "Fuck, you look incredible with my cock between your tits.", "You’re so good at this… don’t stop." ]>> <<set _throatRequest to [ "I want to feel you all the way down.", "Why don’t you take my mouth properly this time?", "I bet you’d love to see yourself disappearing down my throat.", "I can handle more—why don’t you test me?", "Come on, I want to feel you hit the back of my throat." ]>> <<set _throatActionRough to [ "He grips your jaw and pushes deep, groaning as he watches his cock disappear down your throat.", "His hands hold your head in place as he thrusts, using your mouth the way he pleases.", "He growls as he buries himself to the hilt, watching as you gag around him before pulling back only to do it again.", "His fingers tighten in your hair as he fucks your mouth, unrelenting as he claims your throat.", "He doesn’t hesitate—he bottoms out, savoring the way your throat contracts around him as you struggle to take it all." ]>> <<set _throatDialogue to [ "Fuck… your mouth was made for this.", "You look so beautiful like this—on your back, taking all of me.", "Gods, I can feel your throat tightening around me…", "You’re drooling all over yourself, and I fucking love it.", "So good—keep taking me just like that." ]>> <<set _cowgirlRequest to [ "I want to mount you and ride you until you can’t think straight", "Why don’t you lay back and let me take control?", "I want to feel you stretching me from below—right now", "I bet you’d love to watch me bouncing on your cock, wouldn’t you?", "I’m going to ride you until you beg me to stop" ]>> <<set _cowgirlAction to [ "You slam your hips down hard, moaning as his cock fills you to the hilt.", "You bounce on him desperately, chasing your own pleasure without restraint.", "Your fingers dig into his shoulders as you ride him, breathless and wild.", "You grind down forcefully, needing to feel him as deep as possible.", "You throw your head back, gasping, as you ride him fast and rough." ]>> <<set _cowgirlDialogue to [ "Gods, you feel fucking perfect…", "Look at you, fucking yourself on my cock.", "Keep going, love. Just like that.", "Ride me harder—I want to see you lose control.", "You feel so damn tight… keep moving." ]>> <<set _doggyRequest to [ "I want you to take me from behind—hard.", "Put me on my knees and fuck me properly.", "I bet you’d love to see me arch my back and beg for you.", "I need you deep inside me. Take me like an animal.", "I want to feel you pounding into me from behind—don’t hold back." ]>> <<set _doggyAction to [ "He grabs your hips and thrusts deep, groaning as he fills you in one swift motion.", "He slams into you from behind, his grip firm as he takes you hard and fast.", "His hands hold you in place as he pounds into you, each thrust making you cry out.", "He drives into you mercilessly, pulling your hair to keep you exactly where he wants you.", "He fucks you with raw need, growling as he takes what he wants from your body." ]>> <<set _doggyDialogue to [ "Gods, you feel so fucking good…", "Listen to you—whimpering for more.", "You love this, don’t you? Being taken like this.", "Fuck, you’re squeezing me so tight…", "You look perfect like this, completely mine." ]>> <<set _LucyOrgasm to [ "F-fuck—yes! I’m coming!", "Ahh—right there, right there! I’m… I’m coming!", "Oh gods, yes—fuck, I’m going to cum!", "I can’t stop—I’m coming, I’m coming!", "Yes—fuck! Keep going! Don’t stop—ahh!" ]>> <</nobr>>
<<nobr>> <div class="text-box"> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> /* Get the NPC's building */ <<set _buildingId = $currentNPC.building>> /* Get all NPCs living in that building with safety checks */ <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<set _housemates = _location.populatedBuildings[_buildingId]>> <<set _totalResidents = _housemates.length>> <</if>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<if $Position isnot "Null">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br> <</if>> <<if $Position is "Start">> <<set $NPCImg to $ImagePath>> <<set $NPCCum to 0>> <<set $PlayerCum to 0>> He looks at you expectantly, unaware he is about to become your new play thing<br><br> <</if>> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> His orgasm: <progress @value=" $NPCCum" max="100"></progress><br> <<if $Int gt 0>> You are still wearing clothes <</if>> </div> <div class="text-box flex-buttons"> <<if $Int gt 0>> <<button "Strip">> <<set $Position to "Strip">> <<goto "MaleNPCSeduce2">> <</button>><br> <</if>> <<if $Int is 0>> <<button "Ask him to lick you">> <<set $Position to "Cul">> <<goto "MaleNPCSeduce2">> <</button>><br> <</if>> <<button "Blow him">> <<set $Position to "Bj">> <<goto "MaleNPCSeduce2">> <</button>><br> <<button "Ask him to fuck your throat">> <<set $Position to "Tf">> <<goto "MaleNPCSeduce2">> <</button>><br> <<if $Int lt 2>> <<button "Let him fuck your tits">> <<set $Position to "TitF">> <<goto "MaleNPCSeduce2">> <</button>><br> <</if>> <<if $Int is 0>> <<button "Ride Him">> <<set $Position to "Cg">> <<goto "MaleNPCSeduce2">> <</button>><br> <<button "Ask him to fuck you from behind">> <<set $Position to "Behind">> <<goto "MaleNPCSeduce2">> <</button>><br> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<if _prisoner.sex is "Female">> <<set $names = Story.get("FemaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <<else>> <<set $names = Story.get("MaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <</if>> <<set _randomName = $names[random(0, $names.length - 1)]>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_prisoner.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _prisoner.name>></h2> <div style="margin: 20px 0;"> <h3>Prisoner Details</h3> <p>Hair Color: <<print _prisoner.hairColor>></p> <p>Sex: <<print _prisoner.sex>></p> <p>Status: <<print _prisoner.status>></p> <<if _prisoner.name.toLowerCase() === "villager" or _prisoner.name === _prisoner.job>> <p>Job: <<print _prisoner.job>></p> <<else>> <p>Skill: <<print _prisoner.skill>></p> <</if>> </div> <div style="margin: 20px 0;"> <h3>Corruption</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value=" _prisoner.corruption" max="100"></progress> <span><<print _prisoner.corruption>>%</span> </div> </div> </div> </div> </div> <div class="text-box"> <<if _prisoner.corruption is 100>> <i>This prisoner is ready for to join your milita, or be sent to work</i><br> <<if $BarracksUnlocked isnot true>> <i>Build a barracks to start your malitia</i> <</if>> <<elseif _prisoner.corruption lt 100 and _prisoner.corruption gt 60>> <i>The prisoner is now even more corrupt, she is not ready to be released yet but you can see the hunger in her eyes</i> <<elseif _prisoner.corruption lt 60 and _prisoner.corruption gt 40>> <i>The prisoner is more corrupt thanks to your influence, she is more willing and aroused, maybe you could help satisfy her new found desires</i> <<elseif _prisoner.corruption lt 40>><i>The prisoner is not corrupt enough to let you do anything to them, wait a few days for your castles magic to do its work <<if $LucyCorrupt is true>>or send lucy to see them<</if>></i> <</if>> </div> <div class="text-box flex-buttons"> <<if $CurrentPlayer is "Overlord">> <<if _prisoner.sex is "Female">> <<if _prisoner.corruption is 100>> <<button "Fuck Her">> <<goto "DungeonCorruptionSelection">> <</button>><br><br> <<else>> <<if _prisoner.corruption >= 40>> <<button "Tease Her">> <<goto "DungeonCorruptionSelection">> <</button>><br><br> <</if>> <<if _prisoner.corruption >= 60>> <<button "Fuck Her">> <<goto "DungeonCorruptionSelection">> <</button>><br><br> <</if>> <</if>> <</if>> <</if>> <<if (_prisoner.corruption >= 100) and ($LivingQuarters is true)>> <<button "send to the quaters">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<if _prisoner.sex is "Female">> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, sex: "Female", hairColor: _prisoner.hairColor, ImagePath: "Images/Castle/Living Quaters/Female/" + _prisoner.hairColor + "/" + _int + ".png", armor: "None", weapon: "None", corruption: _prisoner.corruption, health: 100, skill: 0, duty: "none" }>> <<else>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, sex: "Male", hairColor: _prisoner.hairColor, ImagePath: "Images/Castle/Living Quaters/Male/" + _int + ".png", armor: "None", weapon: "Dagger", corruption: _prisoner.corruption, health: 100, skill: 0, duty: "none" }>> <</if>> <<run State.variables.QuartersOccupance.push($CurrentCaptive)>> <<run $DungonOccupance.delete(_prisoner)>> <<script>> UI.alert("You send the corrupted prisoner to the living quarters"); <</script>> <<goto "Dungeon2">> <</button>><br><br> <</if>> <<if _prisoner.name === _prisoner.job>> <<if $CapturedLocations && $CapturedLocations.length > 0>> <<button "Send to a Settlement">> <<if _prisoner>> <<set _villager = _prisoner>> <<set $villagerForTransfer = _villager>> <<set _npcId = _villager.NPCID>> <<goto "SelectSettlementTransfer2">> <</if>> <<run $DungonOccupance = $DungonOccupance.filter(p => (p.NPCID && p.NPCID !== _prisoner.NPCID) or (p.prisonerId && p.prisonerId !== _prisoner.prisonerId) )>> <</button>> <</if>> <</if>> <<if $CultUnlocked is true>> <<if _prisoner.corruption is 0>> <<button "Send her to the coven">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 20)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, hairColor: _prisoner.hairColor, ImagePath: "Images/Forrest/Cult/Cultists/" + _prisoner.hairColor + "/" + _int + ".png", corruption: 0 }>> <<run State.variables.CultOccupance.push($CurrentCaptive)>> <<run $DungonOccupance.delete(_prisoner)>> <<if $Quests.includes("Send an uncorrupted girl to Vaelora's coven")>> <<script>> UI.alert("Quest Complete!<br> You have sent a girl to Vaelora's Coven, maybe you should visit and see why she want's these girls"); <</script>> <<run $Quests.delete("Send an uncorrupted girl to Vaelora's coven")>> <<else>> <<script>> UI.alert("You send the young woman to Vaelora's cult, she is given a new name and her memorys are removed so she is easier to corrupt"); <</script>> <</if>> <<goto "Dungeon2">> <</button>><br><br> <</if>><</if>> <<if (_prisoner.corruption gt 40) and (_prisoner.corruption lt 60)>> <<set _Value to 60>> <<elseif (_prisoner.corruption gt 60) and (_prisoner.corruption lt 80)>> <<set _Value to 100>> <<elseif _prisoner.corruption gt 80>> <<set _Value to 130>> <<else>> <<set _Value to 40>> <</if>> <!-- <<if (_prisoner.name is "Blacksmith") and ($ArmoryBlacksmith is false) and ($ArmoryVisisted is true) and (_prisoner.corruption is 100)>> <<button "Send to Armory">> <<set $ArmoryBlacksmith to true>> <<run $DungonOccupance.delete(_prisoner)>> <<goto "Dungeon2">> <</button>><br><br> <</if>> --> <<if $CurrentPlayer is "Overlord">> <<if $LucyCorrupt is true>> <<button "Give to Lucy (increase Lucy's power)">> <<set $Position to _prisoner.sex>> <<run $DungonOccupance.delete(_prisoner)>> <<run Engine.play('LucyDungeonFuck')>><</button>> <</if>><br> <<if $AliceCorrupt is true>> <<button "Give to Alice (increase Alice's power)">> <<set $Position to _prisoner.sex>> <<run $DungonOccupance.delete(_prisoner)>> <<set $CurrentEnemy to "Bandit">> <<run Engine.play('AliceDungeonFuck')>><</button>><br><br> <</if>> <</if>> <<if $CurrentPlayer is "Lucy" and _prisoner.corruption lt 100>> <<button "Try to corrupt (As Lucy)">> <<if (_prisoner.sex is "male") or (_prisoner.sex is "Male")>> <<goto "DongeonCorruptionMaleTemp">> <<else>> <<goto "DungeonCorruptionLucyStart">> <</if>> <</button>><br><br> <</if>> <<if $CurrentPlayer is "Lucy">> <<button "Take their soul">> <<run $DungonOccupance.delete(_prisoner)>> <<if (_prisoner.sex is "male") or (_prisoner.sex is "Male")>> <<set $CurrentEnemy to "Bandit">> <<else>> <<set $CurrentEnemy to "female Bandit">> <</if>> <<run Engine.play('LucyDungeonFuck')>><</button>><br><br> <</if>> <<if _prisoner.corruption gt 40>> <<button "Sell (+_Value gold)">> <<set $Gold to $Gold + _Value>> <<run $DungonOccupance.delete(_prisoner)>> <<goto "Dungeon2">> <</button>><br><br> <</if>> <<if (_prisoner.name.toLowerCase() === "raider") or (_prisoner.name.toLowerCase() === "bandit")>> <<if ($BarracksUnlocked is true) and ($BarraksOccupance.length lt $BarracksMax)>> <<if _prisoner.corruption >= 100>> <<button "send to the barracks">> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 20)>> <<if _prisoner.sex is "Female">> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, sex: "Female", hairColor: _prisoner.hairColor, ImagePath: "Images/Castle/Barracks/Mercenaries/Female/Unarmored/" + _prisoner.hairColor + "/" + _int + ".png", armor: "None", weapon: "Dagger", health: 100, skill: 0, duty: "none" }>> <<else>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _randomName, sex: "Male", hairColor: _prisoner.hairColor, ImagePath: "Images/Castle/Barracks/Mercenaries/Male/Unarmored/Brown/" + _int + ".png", armor: "None", weapon: "Dagger", health: 100, skill: 0, duty: "none" }>> <</if>> <<run State.variables.BarraksOccupance.push($CurrentCaptive)>> <<run $DungonOccupance.delete(_prisoner)>> <<if $FirstMalitia isnot true>> <<set $FirstMalitia to true>> <<set $EishethVisit to true>> <<set $EisethVisitDay to $Day>> <</if>> <<if $Quests.includes("Possess a prisoner and add them to your militia")>> <<script>> UI.alert("New Complete! <br>You have started your militia, now you need to arm them"); <</script>> <<run $Quests.delete("Possess a prisoner and add them to your militia")>> <<else>> <<script>> UI.alert("You send the corrupted prisoner to the barracks"); <</script>> <</if>> <<goto "Dungeon2">> <</button>><br><br> <</if>> <</if>> <</if>> <<if $LumberMillBuilt is true>> <<if $LumberStaff < 50>> <<button "Send to lumber mill">> <<set $LumberStaff to $LumberStaff + 1>> <<run $DungonOccupance.delete(_prisoner)>> <<goto "Dungeon2">>> <</button>> <</if>> <</if>> <<if $QuarryDiscovered is true>> <<if $QuarryStaff < 50>> <<button "Send to stone quary">> <<set $QuarryStaff to $QuarryStaff + 1>> <<run $DungonOccupance.delete(_prisoner)>> <<goto "Dungeon2">>> <</button>> <</if>> <</if>> <<button "Drain soul (+1 soul)">> <<set $Souls to $Souls+ 1>> <<run $DungonOccupance.delete(_prisoner)>> <<goto "Dungeon2">> <</button>><br><br> </div> <div style="text-align: center"> <<button "Leave the cell">> <<goto "Dungeon2">> <</button>> </div> <</nobr>>
<<nobr>> <h1>Manage Prison Space</h1> <p>The dungeon is full! You need to make room for new captives.</p> <div class="prisoner-management"> <h2>Current Prisoners</h2> <<for _prisoner range $DungonOccupance>> <div class="prisoner-card"> <img @src="_prisoner.ImagePath" alt="Prisoner"> <h3><<print _prisoner.name>></h3> <p>Skill: <<print _prisoner.skill>></p> <<button "Release">> <<run $DungonOccupance.delete(_prisoner)>> <<set $Notoriety = Math.max(0, $Notoriety - 1)>> <<goto "ManagePrisonSpace">> <</button>> <<button "Take Soul">> <<run $DungonOccupance.delete(_prisoner)>> <<set $Souls += 1>> <<goto "ManagePrisonSpace">> <</button>> </div> <</for>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Quests.includes("Find whatever the bandit has asked for east of their mine")>> <<set $BackgroundPath to "Images/Forrest/Exploring/Wolf/3.png">> You head east, walking as the sun starts to set. As you head east things noticably change. More and more trees are dead and the sounds of brids has stopped<br><br> After a few houses to following the dirt road, you find what must be the location the bandit mentioned<br><br> <<set _path to "Images/Forrest/Exploring/Mine/Castle/1.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<You>>That certainly looks like the place, no sign of the bandits<</You>><br><br> <<button "Approach">> <<goto "MannorQuest2">> <</button>> <<elseif $VampireGameUnlocked is true>> Ahead of you lies the manor you visited to help Alice<br><br> <<link "Go back to the manor">> <<goto "ManorRevisit">> <</link>><br> <<button "Return">> <<goto "ForestExplore">> <</button>> <<else>> <<set $BackgroundPath to "Images/Forrest/Exploring/Wolf/3.png">> <<You>>I have no reason to do this far east today<</You>> <<button "Go back">> <<goto "ForestExplore">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You approach the door and try to force it open, its locked<br><br> <<set _path to "Images/Forrest/Exploring/Mine/Castle/2.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> Theres a key hole, its rusted over but a quick scratch of your dagger clears the grim away, you look at it in greater detail, it doesnt look like any lock you have seen, and you don't think you can pick it open<br><br> <<button "Look around for alternative ways in">> <<goto "MannorQuestKeyWayIn">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> Wondering if this is all worth it. You begin your assent...<br><br> <<button "Step through the open window">> <<goto "MannorTower">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> Backing away from the door, you look around for other ways in. The walls are thick and sturdy and the windows are higher than you would expect<br><br> You walk around the building, dispite appearing small it takes longer to walk around than you would have expected, you see no easy way to enter from behind and eventually you return to the front of the castle<br><br> On your way back, you notice ivy leading up to one of the towers on the building...<br><br> <<set _path to "Images/Forrest/Exploring/Mine/Castle/4.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<You>>Thats high... But I could probably climb it<</You>><br><br> <<set $Position to "Ivy">> <<button "Climb it">> <<goto "MannorQuestIvy">> <</button>><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/1.png">> Stepping though the door and follow the stairs down to a large hall, in the center of the hall, you see a large throne with a delecate woman sat atop it<br><br> <<say 'Woman' _NPCImg>>🎶Hum hummm humm 🎶<</say>> You take a slient step forward, one you instalty regret. The unknown woman looks up at you<br><br> <<say 'Woman' _NPCImg>>Humm, tall, strong handsome and... something else, you might be fun<</say>> <<You>>Pardon?<</You>> <<say 'Woman' _NPCImg>>Naive<</say>> <<You>>What?<</You>> <<say 'Woman' _NPCImg>>Sigh, why are you here mortal?<</say>> <<You>>I assimed this place was abandoned years ago, I've been sent for its "treasure"<</You>> <<say 'Woman' _NPCImg>>Sent? Very naive<</say>> <<You>>Again... What do you mean?<</You>> <<say 'Woman' _NPCImg>>Annnd impatient, I'll make this easy mortal... Whoever sent you does not expect you to come back many men have all come seeing the same thing<</say>> <<You>>And you're going to kill me?<</You>> <<say 'Woman' _NPCImg>>Maybe... I've lived a LONG life as a vampire and tried every pleasure, and I am always happy to indulge in more. So! Play a game with me mortal, if you win you can take your prize and run back to your master<</say>> <<You>>And if a loose?<</You>> <<say 'Woman' _NPCImg>>Which you will... Then Ill take my prize from you<</say>> She looks away from you and toys with a chalice disinterred with you<br><br> <<button "Ask about the game">> <<goto "ManorQuestions">> <</button>><br><br> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/5.png">> Silently, you step though the blackness of the open window, however, as you do... You enter a well kept room, lit with candles<br><br> The sudden shock of stepping into a dark empty room, only for it to chage as your head passes the window sill makes you feel dizzy, you drop down to your knees and try to figure out what is going on<br><br> Pausing to think and catch your breath, you hear humming comming from across the room<br><br> <<say 'Unknown' _NPCImg>>🎶Hum hummm humm 🎶<</say>><br><br> You look around, searching for the person humming, theres no one here. You're in a large chamber, a bedroom suitable for a lord or lady<br><br> You are in a room alone but, you can't avoid the feeling that someone is watching you...<br><br> <<button "Leave the room">> <<goto "MannorTower2">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $PlayerCum to $PlayerCum + 8>> <<set _NPCImg to $NPCImg>> Unable to resist her commands, you stand and allow her to suck on you<br><br> <<set _int to random(1, 6)>> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Bj/" + _int + ".webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <br> <<say 'Woman' _NPCImg>>Ummm, just let me keep going... Loosing will feel sooo good<</say>><br><br> <<if $NPCStatus is "Naked">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/31.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/25.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $PlayerCum >= 100>> <<button "You begin to cum">> <<set $Position to "Mouth">> <<goto "ManorPlayerCum">> <</button>> <<else>> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> <<button "Let her continue">> <<goto "ManorBJ2">> <</button>><br><br> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $PlayerCum to $PlayerCum + 10>> <<set _NPCImg to $NPCImg>> Against your better judgement, you give in and let her suck on you<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Bj/1.webm" type="video/webm"> </video><br><br> <<say 'Woman' _NPCImg>>Ummm, giving in so soon?<</say>><br><br> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/25.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> </div> <</nobr>>
<<nobr>> <<set _lines1 to [ "Mmm... lucky guess. But can you keep up, or will you stumble and fall into my hands?", "Interesting... you might just have a chance. But I do love watching hope turn into frustration", "Two more and I’m yours. But one little mistake, and you’re mine. What will it be, darling?" ]>> <<set _lines2 to [ "Ohhh, just one more? I can feel you trembling. Is it from excitement... or fear?", "So close... I can almost taste your victory. But wouldn’t it be more fun if you failed instead?", "One more and you can have me however you please. But if you fumble... I’ll make you beg for mercy.", "Mmm, I almost want you to win. Almost. But wouldn’t it be sweeter if I got to play with you first?" ]>> <div class="text-box"> <<set $Int to $Int + 1>> <<if $Int is 3>><<goto "ManorFuckMenu">><</if>> <<set _NPCImg to $NPCImg>> <<if $Int is 1>> <<set _line = either(_lines1)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<else>> <<set _line = either(_lines2)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <</if>> <<button "Again">> <<goto "ManorDiceGame">> <</button>> </div> <</nobr>>
<<nobr>> <<set $Int to 0>> <div class="text-box"> <<if $PlayerCum is 0>> <<goto "ManorPlayerUndress">> <<elseif $PlayerCum lt 30>> <<set _int to random(0, 2)>> <<if _int is 0>> <<goto "ManorFJ">> <<elseif _int is 1>> <<goto "ManorBJ2">> <<else>> <<if $NPCCum lt 90>> <<goto "ManorFaceSit">> <<else>> <<goto "ManorBJ2">> <</if>> <</if>> <</if>> <<if $PlayerCum gt 30>> <<set _int to random(0, 2)>> <<if _int is 0>> <<goto "ManorCG">> <<elseif _int is 1>> <<goto "ManorBJ2">> <<else>> <<if $NPCCum lt 90>> <<goto "ManorFaceSit">> <<else>> <<goto "ManorBJ2">> <</if>> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $PlayerCum to $PlayerCum + 8>> <<set $NPCCum to $NPCCum + 5>> <<set _NPCImg to $NPCImg>> <<set _int to random(1, 2)>> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cg/" + _int + ".webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <br> <<say 'Woman' _NPCImg>>Fuck yes!<</say>><br><br> <<if $PlayerCum >= 100>> <<button "You begin to cum">> <<set $Position to "Mouth">> <<goto "ManorPlayerCum">> <</button>> <<else>> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> <<button "Let her continue">> <<goto "ManorCG">> <</button>><br><br> <</if>> </div> <</nobr>>
<<if $Position is "Breasts">> <<set $NPCStatus to "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/23.png">> <</if>> <<goto "ManorChairBreasts">>
<<nobr>> <<set _NPCImg to $NPCImg>> <div class="text-box"> Explore her body to find areas to tease<br> <<set $Position is "null">> <<say 'Woman' _NPCImg>>Enjoying the view? Sorry you look so cute down there<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="text-box"> Explore her body to find areas to tease<br> <<if ($NPCStatus is "BreastsOut") or ($NPCStatus is "Naked")>> <<button "Fuck her">> <<if $NPCStatus is "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/23.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/6.png">> <</if>> <<goto "ManorChareSexMenu">> <</button>> <</if>> <<say 'Woman' _NPCImg>>Enjoying the view? Sorry you look so cute down there<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <div class="text-box"> <<include "ManorGameLines">> <<if $Position is "Squeeze">> <<set $NPCCum to $NPCCum + 5>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/18.png">> <</if>> <<if $Position is "BreastsNaked">> <<set _line = either(_breasts)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCStatus to "Naked">> <<set $NPCCum to $NPCCum + 5>> <<say 'Woman' _NPCImg>>Ummm thats it, play with my body<</say>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/12.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> <br><br> <<if $Position is "Clit">> <<set _line = either(_pussy)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCCum to $NPCCum + 10>> <<set _GifPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cul/3.webp">> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <</if>> <<if $Position is "Finger">> <<set _line = either(_pussy)>> <<say 'Woman' _NPCImg>>_fingering<</say>> <<set $NPCCum to $NPCCum + 10>> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/4.webm" type="video/webm"> </video><br><br> <</if>> <<if $Position is "Ass">> <<set _line = either(_ass)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCCum to $NPCCum + 10>> <<set _int to random(1, 2)>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Rim/" + _int + ".gif">> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <</if>> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> <<if $NPCCum lt 100>> <<set _line = either(__roundOver)>> <<say 'Woman' _NPCImg>>_line<</say>> <<button "Return to the game">> <<set $Int to 0>> <<goto "ManorDiceGame">> <</button>> <<else>> <<button "She begins to cum">> <<goto "ManorWomanCum">> <</button>> <</if>> </div> <</nobr>>
<<if $Position is "Pussy">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/5.png">> <</if>> <<if $Position is "Naked">> <<set $NPCStatus to "Naked">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/6.png">> <</if>> <<goto "ManorChairPussy">>
<<nobr> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="text-box"> Explore her body to find areas to tease<br> <<say 'Woman' _NPCImg>>Do you want to play with my cunt?<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <div class="text-box"> Explore her body to find areas to tease<br> <<say 'Woman' _NPCImg>>Enjoying the view? Sorry you look so cute down there<</say>><br><br> <<include "ManorLocationDataSex">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>> $(document).ready(function() { $('.hotspot').hover( function() { $(this).find('.tooltip').fadeIn(200); }, function() { $(this).find('.tooltip').fadeOut(200); } ); $('#showHotspots').on('change', function() { $('.circle').toggleClass('hidden'); }); $('.hotspot').on('click', function(e) { e.preventDefault(); e.stopPropagation(); let currentPath = State.variables.ImagePath; let pos = setup.buildingData.get(currentPath).hotspots.find(h => h.x === parseInt($(this).css('left')) && h.y === parseInt($(this).css('top')) ).position; State.variables.Position = String(pos); let nextPassage = $(this).data('passage'); Engine.play(nextPassage); return false; }); }); <</script>> <style> .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } </style> <</nobr>>
<<nobr>> <div class="text-box"> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth4.webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <<set _NPCImg to $NPCImg>> <<say 'Woman' _NPCImg>>Ummm, don't you feel better?<</say>><br><br> You watch her toy with your cum<br><br> <<button "Ask for your prize">> <<goto "ManorGameWon">> <</button>> </div> <</nobr>>
<<nobr>> <<include "ManorGameRoundLines">> <div class="text-box"> <<if $NPCStatus is "Clothed">> <<set $NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/1.png">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/2.png">> <</if>> <<if $NPCStatus is "BreastsOut">> <<set $NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/20.png">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/20.png">> <</if>> <<if $NPCStatus is "Naked">> <<set $NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/28.png">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/35.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> <br><br> <<if ($NPCCum lt 25) or ($PlayerCum lt 25)>> <<set _line = either(_earlyGame)>> <<else>> <<if $NPCCum gt $PlayerCum>> <<set _line = either(_winning)>> <<else>> <<set _line = either(_losing)>> <</if>> <</if>> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br><br> </div> <<if $Int is 0>> <<set _NPCImg to $NPCImg>> <<say 'Woman' _NPCImg>>_line<</say>> <</if>> <div class="text-box"> <<set _faceUpCardManor = Math.floor(Math.random() * 13) + 1>> <<set $faceDownCardManor = Math.floor(Math.random() * 13) + 1>> <<set $faceUpCardManor = _faceUpCardManor>> <<if _faceUpCardManor === 11>> <<set _cardFileNameManor = "j">> <<elseif _faceUpCardManor === 12>> <<set _cardFileNameManor = "q">> <<elseif _faceUpCardManor === 13>> <<set _cardFileNameManor = "k">> <<elseif _faceUpCardManor === 1>> <<set _cardFileNameManor = "a">> <<else>> <<set _cardFileNameManor = String(_faceUpCardManor)>> <</if>> <div class="cards-container"> <div class="card-wrapper"> <div class="card shown-card"> <div class="card-face front"> <<print '<img src="Images/Cards/Playing/' + _cardFileNameManor + '.jpg">'>> </div> </div> </div> <div class="card-wrapper"> <div class="card hidden-card-manor"> <div class="card-face front"> <img src="Images/Cards/Playing/back.jpg"> </div> <div class="card-face back"> </div> </div> </div> </div> <div style="text-align: center"> <button onclick="makeGuessManor('higher')">Higher</button> <button onclick="makeGuessManor('lower')">Lower</button> </div> <<script>> (function() { window.makeGuessManor = function(guess) { var isHigher = State.variables.faceDownCardManor > State.variables.faceUpCardManor; var isCorrect = (guess === 'higher' && isHigher) || (guess === 'lower' && !isHigher); var $card = $('.hidden-card-manor'); var $backFace = $('.hidden-card-manor .card-face.back'); var faceDownFileName; if (State.variables.faceDownCardManor === 11) faceDownFileName = 'j'; else if (State.variables.faceDownCardManor === 12) faceDownFileName = 'q'; else if (State.variables.faceDownCardManor === 13) faceDownFileName = 'k'; else if (State.variables.faceDownCardManor === 1) faceDownFileName = 'a'; else faceDownFileName = State.variables.faceDownCardManor.toString(); $backFace.html(`<img src="Images/Cards/Playing/${faceDownFileName}.jpg">`); $card.addClass('flipped'); setTimeout(function() { Engine.play(isCorrect ? 'ManorCardsRight' : 'ManorCardsWrong'); }, 1500); }; })(); <</script>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _vid to false>> <<set $PlayerCum to $PlayerCum + 8>> <<set $NPCCum to $NPCCum + 5>> <<set _NPCImg to $NPCImg>> <<say 'Woman' _NPCImg>>I know I shouldn't... But let me give you a helping hand<</say>><br><br> <<set _int to random(0, 1)>> <<if _int is 0>> <<say 'Woman' _NPCImg>>Lick me mortal, get my pussy ready for whats coming <</say>><br><br> <<set _WebpPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cul/2.webp">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/32.png">> <<else>> <<say 'Woman' _NPCImg>>Umm, thats it get your tounge in both holes...<</say>><br><br> <<set $VidPath to "Images/Crypt/Enemy/Succubus/Combat/Cul/6.webm">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/34.png">> <<set _vid to true>> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> She sits on you face and rocks her hips back and forth, you feel a delecate hand run down your torso and grab your cock while you lick her<br><br> <<say 'Woman' _NPCImg>>You didn't think I would give you an easy win did you? I'm having fun so we can both loose this round<</say>><br><br> <<if _vid is false>> <div class="centered-image"> <img @src="_WebpPath" onerror="this.style.display='none'"> </div> <<else>> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <</if>> <<if $PlayerCum >= 100>> <<button "You begin to cum">> <<set $Position to "Mouth">> <<goto "ManorPlayerCum">> <</button>> <<else>> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> <</if>> </div> <</nobr>>
<<nobr>> <<set _failFeet to [ "Mmm, look at you so desperate, so helpless. Maybe if you beg, I’ll be gentle… but I doubt it", "Oh? You’re already twitching just from that? How sensitive. This is going to be so easy", "I barely have to do anything, and you’re already reacting like this? Pathetic…", "Mmm, so warm… throbbing already? And I’ve hardly even started. How long will you last, I wonder?", "Shhh, don’t fight it. Just lay back and let me enjoy myself. You did lose, after all", "Oh, are you struggling? How adorable. But we both know you love this, don’t you?", "Mmm, I can feel you trying so hard to hold back. What’s wrong? Afraid you’ll lose yourself too quickly?", "So easy… so weak under my touch. I could do this all night and never get bored..." ]>> <div class="text-box"> <<set _line = either(_failFeet)>> <<set $PlayerCum to $PlayerCum + 8>> <<set _NPCImg to $NPCImg>> The rules of the game prevent you from moving, so you watch helplessly as she slowly walks around the table and its on the edge of it, admiring your body<br><br> After a long moment, you watch as she brings her bare feet up and wraps them around your cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/1.webm" type="video/webm"> </video><br><br> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<if $NPCStatus is "Naked">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/33.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/24.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $PlayerCum >= 100>> <<button "You begin to cum">> <<set $Position to "Mouth">> <<goto "ManorPlayerCum">> <</button>> <<else>> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> </div> <<if $NPCStatus is "Clothed">> <<say 'Woman' _NPCImg>>Well played! So do you want to help me out of these clothes? Or maybe you want to take things slow?<</say>><br><br> <</if>> <<if $NPCStatus is "BreastsOut">> <<say 'Woman' _NPCImg>>You're doing so well, Do you want to finish taking my dress of? It's ok if you want to take things slow... I have all the time in the world to play<</say>><br><br> <</if>> <div style="text-align: center"> <<button "Go to her">> <<if $NPCStatus is "Clothed">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/4.png">> <<elseif $NPCStatus is "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/23.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/6.png">> <</if>> <<goto "ManorChairFuck">> <</button>><br><br> <<button "Tell her to come to you">> <<if $NPCStatus is "Clothed">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/21.png">> <<elseif $NPCStatus is "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/7.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/28.png">> <</if>> <<goto "ManorStandingFuck">> <</button>> </div> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <<include "ManorGameLines">> <div class="text-box"> <<set _showImg to false>> <<if $Position is "FaceFuck">> <<set _line = either(_faceFuck)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 10>> <<set _int to random(1, 2)>> <<set $VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/FF/" + _int + ".webm">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/31.png">> <<set _showImg to true>> <</if>> <<if $Position is "Chest">> <<set _line = either(_titfuck)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 10>> <<set _int to random(1, 2)>> <<if _int is 1>> <<set $VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Tf/1.webm">> <<else>> <<set $VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Tf/3.webm">> <</if>> <<if $NPCStatus is "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/27.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/30.png">> <</if>> <<set _showImg to true>> <</if>> <<if $Position is "Mouth">> <<set _line = either(_faceFuck)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 10>> <<set _int to random(1, 6)>> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Bj/" + _int + ".webm">> <<if $NPCStatus is "Naked">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/31.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/25.png">> <</if>> <<set _showImg to true>> <</if>> <<if $Position is "Miss">> <<set _line = either(_sex)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 10>> <<set $NPCCum to $NPCCum + 12>> <<set _int to random(1, 3)>> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Miss/" + _int + ".webm">> <</if>> <<if $Position is "Behind">> <<set _line = either(_sex)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 10>> <<set $NPCCum to $NPCCum + 12>> <<if $NPCStatus is "Naked">><<set _int to random(1, 2)>><<else>> <<set _int to random(3, 6)>><</if>> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Behind/" + _int + ".webm">> <</if>> <<if $Position is "Anal">> <<set _line = either(_anal)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $PlayerCum to $PlayerCum + 12>> <<set $NPCCum to $NPCCum + 10>> <<set $VidPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Anal/3.webm">> <</if>> <<if _showImg is true>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> <br><br> </div> <</if>> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if ($NPCCum lt 100) and ($PlayerCum lt 100)>> <<set _line = either(__roundOver)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<button "Return to the game">> <<set $Int to 0>> <<goto "ManorDiceGame">> <</button>> <<else>> <<if $NPCCum >= 100>> <<button "She begins to cum">> <<goto "ManorWomanCum">> <</button>> <<elseif $PlayerCum >= 100>> <<button "You begin to cum">> <<set $Position to "Pussy">> <<goto "ManorPlayerCum">> <</button>> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <<set _pussy to [ "Mmm… ahh… you might just be worth keeping around if you keep using that tongue so well", "Hahh… y-you’re really… ngh… trying to make me lose control, aren’t you? Damn you… it’s working", "Hah… f-fuck… that mouth of yours… mmm, I might have to keep you!", "Mmm, y-you’re… ngh… better than I expected… but I refuse to let you have the last laugh", "Mmm, d-don’t tease me… just—hah—keep going!", "Ngh… yes… f-fuck, don’t you dare stop, d-don’t you dare—ahh!" ]>> <<set _breasts to [ "Mmm… you’re taking your time, aren’t you? I have eternity", "Ahh… your hands are warm… ngh… I didn’t think you’d be so gentle...*", "Mmm yes… j-just like that… ngh, you’re learning quickly, aren’t you?", "Hahh… y-you’re enjoying this, aren’t you? Mmm, but so am I", "Mmm… s-so slow, so careful… ngh, you’re making me want more", "Mmm… y-you’re teasing me, aren’t you? Do what you like, I'll have fun either way", "Mmm I might have underestimated you… ngh, but I think I’ll let you keep proving me wrong", "Ahh… ngh, you’re actually making me… mmm, feel things I didn’t expect", "Mmm, yes… ngh… just like that You do know how to use your hands after all" ]>> <<set _ass to [ "Oh? Now that’s unexpected. But I won’t complain if you make it worth my while.", "Hah, I didn’t take you for the type. Mmm, but I won’t stop you either.", "Mmm, so eager. Are you trying to impress me? Because I have to admit, you might be succeeding.", "Oh, that’s… mmm… unexpected, but not unwelcome. Keep going and maybe I’ll start enjoying this even more.", "Hah, you’re just full of surprises, aren’t you? I should be mocking you for this, but… ngh… I don’t think I will.", "Mmm, I can feel your tongue moving… slower… deeper… oh, now you’re just showing off.", "Hah, I thought this would be amusing, but ngh… you might actually be *good* at this.", "Mmm, if you’re going to worship me, then do it properly. Take your time, make me enjoy every second.", "Ahh… ngh… alright, fine, I’ll admit it. That feels better than I expected.", "Mmm, I should be making fun of you for this, but right now, I’d rather just enjoy it." ]>> <<set _faceFuck to [ "Mmm… hah… I can feel it… ngh… your hips are moving on their own now. Giving up already?", "Ngh… mmm… that’s it… just keep going… hah… oh, you’re barely holding on, are you?", "Ahh… hah… you’re not even trying to resist anymore. Just using me… ngh… because it feels too good to stop.", "Mmm… ngh… your breathing… hah… so heavy… your body’s already making the choice for you.", "Ngh… hah… keep telling yourself you’re still in control… but you’re trembling… mmm…", "Mmm… ngh… your hands are shaking… hah… you know if you cum, I win, right? Or have you stopped caring?", "Hah… mmm… you can slow down if you want, but I already know… ngh… you’re going to give in." ]>> <<set _fingering to [ "Mmm… hah… your fingers… ngh… they feel so good inside me…", "Ahh… hah… y-you’re hitting all the right spots… ngh… keep going…", "Mmm… ngh… your hands are so warm…", "Ahh… ngh… I-I love the way you move them… mmm… don’t stop…", "Mmm… hah… I can feel them stretching me… ngh… f-fuck, just like that…", "Mmm… hah… I love the way your fingers curl inside me…" ]>> <<set _titfuck to [ "Ahh… hah… you’re throbbing already? Mmm… I haven’t even started teasing you properly yet…", "Mmm… hah… watching you twitch between my tits is adorable… ngh… are you struggling already?", "Ahh… ngh… I can feel you pulsing… mmm… you like this way too much, don’t you?", "Ahh… hah… I love the way you slide between my breasts…", "Ahh… hah… I can feel you twitching… ngh… you’re getting so desperate, aren’t you?", "Mmm… hah… watching you struggle is almost as fun as feeling you against me… ngh…", "Ahh… hah… I wonder… mmm… if I squeeze just a little tighter… ngh… will you break?" ]>> <<set _sex to [ "Ahh… hah… f-fuck, you feel so deep… ngh…", "Mmm… hah… faster… ngh… don’t you dare slow down now…", "Ahh… hah… I-I can feel you throbbing inside me… ngh… are you already close?", "Mmm… hah… fuck, yes… ngh… just like that… mmm… just like that…", "Mmm… hah… ngh… y-you’re doing so well… ahh… but can you really last?", "Ahh… hah… ngh… you’re so deep inside me… mmm… f-fuck, I love it…", ]>> <<set _anal to [ "Ahh… ngh… hah… s-so bold… mmm… I hope you know what you’re doing…", "Ahh… ngh… I-it’s so tight… hah… mmm… I can feel every inch of you…", "Ahh… hah… ngh… f-fuck, I wasn’t expecting it to feel this good…", "Mmm… hah… ngh… every thrust is making me tremble… ahh… I love it…" ]>> <<set __roundOver to [ "Mmm… hah… that was fun, but playtime’s over. Back to the game, lover.", "Ahh… ngh… you made me squirm for a bit, but now it’s my turn again. Let’s see how long you last.", "Mmm… hah… don’t get too comfortable, sweetheart. You had your fun, now let’s see if you can survive mine.", "Ahh… ngh… I can still feel you all over me… mmm… but it’s time to return to the game.", "Mmm… hah… did you enjoy yourself? Good. Because you'll lose this next round.", "Ahh… ngh… you’ve had your moment of control… mmm… let’s see if you can handle more", "Mmm… hah… that was quite the performance, but let’s not forget this isn’t over yet.", "Ahh… ngh… you had me for a moment… mmm… but now, let’s get back to me breaking you", "Mmm… hah… I love how confident you look after that… let’s see how long that lasts.", "Ahh… ngh… fun’s over. Time to deal the cards, and see just how much you can take." ]>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/end.png">> <<say 'Woman' _NPCImg>>Umm, that you sooo much for that<</say>><br><br> <<say 'Woman' _NPCImg>>Why don't you lay down for me?<</say>><br><br> Unable to resist her commands, you lay down on the floor<br><br> <<say 'Woman' _NPCImg>>That is, relax for me<</say>><br><br> She straddles you, lightly rubbing her bare pussy against you<br><br> <<say 'Woman' _NPCImg>>That is, relax for me don't move... Not that you can<</say>><br><br> She leans down and kisses your kneck, first her lips, then her tounge running up and down you and then you feel too sharp pricks as bits down into your kneck...<br><br> The feeling is beyond anything you have exprianced as waves of pleasure ripple from your neck down the side of your body<br><br> <<say 'Woman' _NPCImg>>Ummmm<</say>><br><br> You lay there, frozen in place looking up at the ceiling as the woman slowly sucks at your throat. You expected this to be over quickly but instead you lay there as the she slowly drains you over hours<br><br> <<say 'Woman' _NPCImg>>Ummmm<</say>><br><br> You're a fly in a web, helpless as a creature feeds on you, this goes on for hours. Laying there as she gorges on your throat while playing with herself<br><br> <<if $Quests.includes("Find whatever the bandit has asked for east of their mine")>> <<button "Retry?">> <<goto "ManorQuestions">> <</button>><br><br> Or<br><br> <<button "Skip to her loosing?">> <<goto "ManorWomanCum">> <</button>><br><br> <<else>> <<button "You Pass Out">> <<set $PlayerHealth to 0>> <<fadeToPassage "Resporn">> <</button>> <</if>> </div> <</nobr>> <audio id="myAudio" src="Audio/VampBite.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.4; audio.play(); }); <</script>>
<<nobr>> <<set _earlyGame to [ "Mmm, another round? Good. I was just starting to enjoy myself...", "Back to the game, then? Let’s see if you can do better... or if I get to break you all over again...", "Still eager? How cute. Let’s see how long that confidence lasts...", "Oh, don’t look so determined. We both know how this is going to end...", "Mmm, fresh and ready to play again? Good. I do love a game that lasts...", "Another chance to win, another chance to lose. Either way, I get to enjoy myself...", "Shall we continue? Or are you just stalling before I have my fun with you again?", "Mmm, round two… or three? I’ve lost count. Not that it matters you’ll be mine before long...", "Go on, try again. I *love* watching hope turn into desperation" ]>> <<set _losing to [ "Mmm, look at you… so close, so helpless. Are you really going to break before I do? How disappointing...", "Oh dear, I can feel you trembling. Are you that desperate already? Pathetic…", "Tsk, tsk. It’s not looking good for you, is it? And here I thought you’d put up more of a fight", "Mmm, you're holding on so tight… but it won’t matter. I’m going to take everything from you...", "Poor thing, you’re barely hanging on. Do you think you can last? Or should I just end this now?", "Mmm, I love watching men struggle. Trying so hard, knowing deep down they’ll lose anyway", "So weak… so easy… and so *mine*. Maybe I should drag this out a little longer, just to watch you squirm", "That look in your eyes… that mix of panic and arousal? That’s what I love most", "You’re losing, darling. I can see it, I can *feel* it. And when you finally break, I’ll be right here to take what’s mine" ]>> <<set _winning to [ "Ngh… don’t get cocky. This doesn’t mean you’ve won… yet.", "Mmm… damn you… I won’t break that easily… but you are making it hard to focus", "Tch… you’re getting too good at this. Maybe I underestimated you… just a little", "Tch… my body may be reacting, but don’t think for a second that you’re in control here", "Ngh… You’re really pushing your luck, aren’t you? But I do like a man who fights for what he wants" ]>> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <div class="text-box"> <<if $Quests.includes("Find whatever the bandit has asked for east of their mine")>> <<You>>Just give me what I came for<</You>> <<say 'Woman' _NPCImg>>So boaring... Its just over there<</say>><br><br> She gestures to a small wooden box on a table<br><br> You grab it and start to walk away<br><br> <<say 'Woman' _NPCImg>>Come back anytime for a rematch, I'll make it worth your while, oh and take the key on the table to you can come trough the front door next time. We wouldn't want you getting hurt now would we?<</say>><br><br> You take the key and make your leave<br><br> <<button "Back to the bandits">> <<goto "AliceQuestReturn">> <</button>> <<else>> <<You>>My prize<</You>><br><br> <<say 'Woman' _NPCImg>>Humm, as agreed... Here some gold<</say>><br><br> She hands you a pouch containing 150 gold<br><br> <<set $Gold to $Gold + 150>> <<say 'Woman' _NPCImg>>The owner of that gold won't be needing it... I had a lot fun, see you soon<</say>><br><br> <<set $Time to 9>> <<button "Leave">> <<goto "Base Intro">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/6.png", { hotspots: [ { x: 433, y: 236, tooltip: "Fuck her face", passage: "ManorFuck", position: "FaceFuck" }, { x: 420, y: 376, tooltip: "Fuck her breasts", passage: "ManorFuck", position: "Chest" }, { x: 353, y: 592, tooltip: "Fuck her pussy", passage: "ManorFuck", position: "Miss" }, { x: 354, y: 666, tooltip: "Fuck her ass", passage: "ManorFuck", position: "Anal" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/23.png", { hotspots: [ { x: 397, y: 174, tooltip: "Fuck her face", passage: "ManorFuck", position: "FaceFuck" }, { x: 385, y: 286, tooltip: "Fuck her breasts", passage: "ManorFuck", position: "Chest" }, { x: 398, y: 538, tooltip: "Fuck her pussy", passage: "ManorFuck", position: "Miss" }, { x: 406, y: 630, tooltip: "Fuck her ass", passage: "ManorFuck", position: "Anal" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/15.png", { hotspots: [ { x: 329, y: 458, tooltip: "Fuck her ass", passage: "ManorFuck", position: "Anal" }, { x: 397, y: 518, tooltip: "Fuck her pussy", passage: "ManorFuck", position: "Behind" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/36.png", { hotspots: [ { x: 382, y: 224, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 380, y: 315, tooltip: "Fuck her chest", passage: "ManorFuck", position: "Chest" }, { x: 403, y: 509, tooltip: "Fuck her pussy", passage: "ManorFuck", position: "Miss" }, { x: 401, y: 594, tooltip: "Fuck her ass", passage: "ManorFuck", position: "Anal" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/4.png", { hotspots: [ { x: 291, y: 203, tooltip: "Release her breasts", passage: "ManorChairBreastsRelay", position: "Breasts" }, { x: 411, y: 196, tooltip: "Release her breasts", passage: "ManorChairBreastsRelay", position: "Breasts" }, { x: 384, y: 569, tooltip: "Move her dress", passage: "ManorChairPussyRelay", position: "Pussy" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/5.png", { hotspots: [ { x: 460, y: 190, tooltip: "Release her breasts", passage: "ManorChairBreastsRelay", position: "Breasts" }, { x: 643, y: 195, tooltip: "Release her breasts", passage: "ManorChairBreastsRelay", position: "Breasts" }, { x: 428, y: 584, tooltip: "Lick her clit", passage: "ManorChairOral", position: "Clit" }, { x: 419, y: 629, tooltip: "Finger her", passage: "ManorChairOral", position: "Finger" }, { x: 413, y: 686, tooltip: "Lick her ass", passage: "ManorChairOral", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/15.png", { hotspots: [ { x: 329, y: 458, tooltip: "Lick her ass", passage: "ManorTableSex", position: "Ass" }, { x: 397, y: 518, tooltip: "Finger her", passage: "ManorTableSex", position: "Finger" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/21.png", { hotspots: [ { x: 376, y: 41, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 211, y: 483, tooltip: "Release her breasts", passage: "ManorStandingFuckRelay", position: "Expose" }, { x: 487, y: 475, tooltip: "Release her breasts", passage: "ManorStandingFuckRelay", position: "Expose" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/7.png", { hotspots: [ { x: 223, y: 322, tooltip: "Remove her dress", passage: "ManorStandingFuckRelay", position: "Undress" }, { x: 479, y: 348, tooltip: "Remove her dress", passage: "ManorStandingFuckRelay", position: "Undress" }, { x: 220, y: 520, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "Breasts" }, { x: 485, y: 512, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "Breasts" }, { x: 372, y: 251, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 344, y: 470, tooltip: "Fuck her chest", passage: "ManorFuck", position: "Chest" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/10.png", { hotspots: [ { x: 510, y: 638, tooltip: "Explore her holes", passage: "ManorStandingBehindRelay", position: "Closer" }, { x: 443, y: 550, tooltip: "Spank her", passage: "ManorStandingSex", position: "Spank" }, { x: 596, y: 551, tooltip: "Spank her", passage: "ManorStandingSex", position: "Spank" }, { x: 326, y: 99, tooltip: "Bend her over", passage: "ManorStandingBehindRelay", position: "Closer" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/22.png", { hotspots: [ { x: 510, y: 638, tooltip: "Explore her holes", passage: "ManorStandingBehindRelay", position: "Closer" }, { x: 443, y: 550, tooltip: "Spank her", passage: "ManorStandingSex", position: "Spank" }, { x: 596, y: 551, tooltip: "Spank her", passage: "ManorStandingSex", position: "Spank" }, { x: 326, y: 99, tooltip: "Bend her over", passage: "ManorStandingBehindRelay", position: "Closer" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/17.png", { hotspots: [ { x: 278, y: 143, tooltip: "Release her breasts", passage: "ManorStandingTableRelay", position: "BreastsOut" }, { x: 471, y: 112, tooltip: "Release her breasts", passage: "ManorStandingTableRelay", position: "BreastsOut" }, { x: 442, y: 521, tooltip: "Lick her clit", passage: "ManorTableSex", position: "Clit" }, { x: 448, y: 558, tooltip: "Finger her", passage: "ManorTableSex", position: "Finger" }, { x: 174, y: 660, tooltip: "Lift her legs", passage: "ManorStandingTableRelay", position: "Legs" }, { x: 656, y: 513, tooltip: "Lift her legs", passage: "ManorStandingTableRelay", position: "Legs" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/16.png", { hotspots: [ { x: 263, y: 200, tooltip: "Squeeze her breasts", passage: "ManorTableSex", position: "Breasts" }, { x: 551, y: 171, tooltip: "Squeeze her breasts", passage: "ManorTableSex", position: "Breasts" }, { x: 416, y: 611, tooltip: "Lick her clit", passage: "ManorTableSex", position: "Clit" }, { x: 418, y: 652, tooltip: "Finger her", passage: "ManorTableSex", position: "Finger" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/23.png", { hotspots: [ { x: 394, y: 171, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 285, y: 269, tooltip: "Squeeze her breasts", passage: "ManorChairOral", position: "BreastsNaked" }, { x: 490, y: 272, tooltip: "Squeeze her breasts", passage: "ManorChairOral", position: "BreastsNaked" }, { x: 383, y: 291, tooltip: "Fuck her chest", passage: "ManorFuck", position: "Chest" }, { x: 399, y: 518, tooltip: "Lick her clit", passage: "ManorChairOral", position: "Clit" }, { x: 400, y: 549, tooltip: "Finger her", passage: "ManorChairOral", position: "Finger" }, { x: 404, y: 638, tooltip: "Lick her ass", passage: "ManorChairOral", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/9.png", { hotspots: [ { x: 383, y: 385, tooltip: "Lick her ass", passage: "ManorTableSex", position: "Ass" }, { x: 383, y: 460, tooltip: "", passage: "ManorTableSex", position: "Finger" }, { x: 380, y: 533, tooltip: "Lick her clit", passage: "ManorTableSex", position: "Clit" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/19.png", { hotspots: [ { x: 436, y: 384, tooltip: "Lick her clit", passage: "ManorTableSex", position: "Clit" }, { x: 454, y: 443, tooltip: "Finger her", passage: "ManorTableSex", position: "Finger" }, { x: 478, y: 543, tooltip: "Lick her ass", passage: "ManorTableSex", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/6.png", { hotspots: [ { x: 304, y: 381, tooltip: "Squeeze her breasts", passage: "ManorChairOral", position: "Breasts" }, { x: 549, y: 376, tooltip: "Squeeze her breasts", passage: "ManorChairOral", position: "Breasts" }, { x: 355, y: 563, tooltip: "Lick her clit", passage: "ManorChairOral", position: "Clit" }, { x: 354, y: 599, tooltip: "Finger her", passage: "ManorChairOral", position: "Finger" }, { x: 354, y: 671, tooltip: "Lick her ass", passage: "ManorChairOral", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/28.png", { hotspots: [ { x: 402, y: 307, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 385, y: 623, tooltip: "Fuck her chest", passage: "ManorFuck", position: "Chest" }, { x: 227, y: 642, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "BreastsNaked" }, { x: 532, y: 647, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "BreastsNaked" }, { x: 387, y: 779, tooltip: "Kneel down", passage: "ManorStandingFuckRelay", position: "Kneel" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/26.png", { hotspots: [ { x: 289, y: 150, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "BreastsNaked" }, { x: 512, y: 197, tooltip: "Squeeze her breasts", passage: "ManorStandingSex", position: "BreastsNaked" }, { x: 400, y: 448, tooltip: "Lick her clit", passage: "ManorChairOral", position: "Clit" }, { x: 376, y: 507, tooltip: "Finger her", passage: "ManorChairOral", position: "Finger" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/36.png", { hotspots: [ { x: 382, y: 224, tooltip: "Use her mouth", passage: "ManorFuck", position: "Mouth" }, { x: 380, y: 315, tooltip: "Fuck her chest", passage: "ManorFuck", position: "Chest" }, { x: 404, y: 468, tooltip: "Lick her clit", passage: "ManorChairOral", position: "Clit" }, { x: 404, y: 519, tooltip: "Finger her", passage: "ManorChairOral", position: "Finger" }, { x: 402, y: 599, tooltip: "Lick her ass", passage: "ManorChairOral", position: "Ass" } ] })>> <<run setup.buildingData.set("Images/Forrest/Exploring/Mine/Castle/Woman/37.png", { hotspots: [ { x: 249, y: 201, tooltip: "On her face", passage: "ManorCumSceen", position: "Facial" }, { x: 243, y: 264, tooltip: "In her mouth", passage: "ManorCumSceen", position: "Mouth" }, { x: 286, y: 426, tooltip: "On her chest", passage: "ManorCumSceen", position: "Breasts" }, { x: 428, y: 562, tooltip: "On her stomach", passage: "ManorCumSceen", position: "Stomach" }, { x: 597, y: 479, tooltip: "On her ass", passage: "ManorCumSceen", position: "Ass" }, { x: 546, y: 635, tooltip: "In her pussy", passage: "ManorCumSceen", position: "Creampie" } ] })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "Mouth">> Unable to resist, you watch as she sucks your cock till you flood her mouth with cum<br><br> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cum/Mouth1.webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <<else>> You cannot stop even if you wanted too, you orgasm inside her, loosing the game...<br><br> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cum/Miss1.webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> <</if>> You watch as her eyes change and her teeth grow<br><br> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/end.png">> <<say 'Woman' _NPCImg>>Well... It looks like you lost<</say>><br><br> <<button "Continue">> <<goto "ManorGameLost">> <</button>> </div> <</nobr>>
<<nobr>> <<set _firstFail to [ "Oh, poor thing. One little mistake, and look where it’s gotten you. Did you think you could win so easily?", "Mmm, I do love when they make it easy for me. Don’t squirm now—I want to enjoy this...", "Oops~ Looks like you fumbled. That means I get to have my fun. Such a shame...", "Tsk, tsk. Such confidence, and yet here you are, already losing. Are you nervous? You should be..." ]>> <div class="text-box"> <<set _line = either(_firstFail)>> <<set $PlayerCum to 5>> <<set _NPCImg to $NPCImg>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> You watch as the woman gets off her chair and walks over to you before dropping back to her knees. The power of the game keeps you locked in place as she removes your clothes and admires your manhood<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/3.webm" type="video/webm"> </video><br><br> <<say 'Woman' _NPCImg>>Most... Impressive<</say>><br><br> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/3.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Woman' _NPCImg>>Lets get you warmed up<</say>><br><br> She grabs your cock and strokes it gently, taking things slow<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/6.webm" type="video/webm"> </video><br><br> <<say 'Woman' _NPCImg>>I suppose thats my turn done... Unless you want me to keep going for a bit? The game can wait<</say>><br><br> <<button "Return to the table">> <<goto "ManorDiceGame">> <</button>><br><br> <<button "Let her continue">> <<goto "ManorBJ">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to $Int - 1>> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/1.png">> <<You>>Fine, tell me what this game is<</You>> <<say 'Woman' _NPCImg>>It's very simple, please sit at the table<</say>> You take a chair and sit as instructed<br><br> <<say 'Woman' _NPCImg>>Infront of you are two cards, one face up one face down... Simply guess if the card will be higher or lower than the one face up, and you win<</say>> <<You>>That easy?<</You>> <<say 'Woman' _NPCImg>>Shhhh, you need to win three times in a row, to gain control, BUT if you get one guess wrong... I gain control<</say>> <<You>>Control?<</You>> <<say 'Woman' _NPCImg>>This game has binding magic, you'll find yourself unable to do anything other than my commands while Im in control, but if you win three hands... I'll do whatever you desire, for a short moment<</say>> <<You>>How do I win?<</You>> <<say 'Woman' _NPCImg>>Simple, use your time in control to do whatever it takes to pleasure me as much as you can and I'll do the same when I'm in control... Who ever cums first wins!<</say>> <<You>>Seriously?<</You>> <<say 'Woman' _NPCImg>>Like I said, I've had more than a life time to indluge in pleasure but I just love watching men desperatly try to pleasure me and when they fail... Well thats just as much fun<</say>> <<say 'Woman' _NPCImg>>So! Are you ready? Do you understand the rules?<</say>> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <<set $Int to 0>> <<set $NPCStatus to "Clothed">> <<set $Spanked to false>> <<button "Continue">> <<goto "ManorDiceGame">> <</button>> </div> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Wolf/3.png">> <div class="text-box"> You approach the door luckilly this time you have the key<br><br> <<set _path to "Images/Forrest/Exploring/Mine/Castle/2.png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<button "Enter">> <<goto "ManorRevist2">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to $Int - 1>> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/1.png">> <<say 'Woman' _NPCImg>>Aww you're back for more!<</say>> You take a chair and sit before her<br><br> <<say 'Woman' _NPCImg>>Do you need me to re-explain the rules?<</say>> <<button "Yes">> <<goto "ManorRevistRules">> <</button>><br><br> <<button "No begin the game">> <<goto "ManorDiceGame">> <</button>><br><br> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <<set $Int to 0>> <<set $NPCStatus to "Clothed">> <<set $Spanked to false>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to $Int - 1>> <<set _NPCImg to "Images/Forrest/Exploring/Mine/Castle/Woman/1.png">> <<say 'Woman' _NPCImg>>Infront of you are two cards, one face up one face down... Simply guess if the card will be higher or lower than the one face up, and you win<</say>> <<say 'Woman' _NPCImg>>You need to win three times in a row, to gain control, BUT if you get one guess wrong... I gain control<</say>> <<You>>Control?<</You>> <<say 'Woman' _NPCImg>>This game has binding magic, you'll find yourself unable to do anything other than my commands while Im in control, but if you win three hands... I'll do whatever you desire, for a short moment<</say>> <<You>>How do I win?<</You>> <<say 'Woman' _NPCImg>>Simple, use your time in control to do whatever it takes to pleasure me as much as you can and I'll do the same when I'm in control... Who ever cums first wins!<</say>> <<button "Continue">> <<goto "ManorDiceGame">> <</button>> </div> <</nobr>>
<<if $Position is "Closer">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/9.png">> <</if>> <<goto "ManorStandingBehind">>
ManorStandingBehind <<nobr>> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="text-box"> Explore her body to find areas to tease<br> <<say 'Woman' _NPCImg>>Do you like my ass? Let me move my dess for you<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<if $Position is "Expose">> <<set $NPCStatus to "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/7.png">> <</if>> <<if $Position is "Undress">> <<set $NPCStatus to "Naked">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/28.png">> <</if>> <<if $Position is "Kneel">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/26.png">> <</if>> <<if $Position is "Closer">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/9.png">> <</if>> <<goto "ManorStandingFuck">>
<<nobr>> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="text-box"> Explore her body to find areas to tease<br> <<say 'Woman' _NPCImg>>I'm yours to enjoy... For now<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> <<if ($NPCStatus is "BreastsOut") or ($NPCStatus is "Clothed")>> <<button "Tell her to turn around">> <<if $Spanked is false>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/10.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/22.png">> <</if>> <<goto "ManorStandingBehind">> <</button>><br> <<else>> <<button "Bend her over">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/15.png">> <<goto "ManorStandingTable">> <</button>> <</if>> <<button "Push her back onto the table">> <<if $NPCStatus is "Clothed">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/17.png">> <<elseif $NPCStatus is "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/16.png">> <<else>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/36.png">> <</if>> <<goto "ManorStandingTable">> <</button>> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <<include "ManorGameLines">> <div class="text-box"> <<if $Position is "Breasts">> <<set $NPCStatus to "BreastsOut">> <<set $NPCCum to $NPCCum + 5>> <<set _line = either(_breasts)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/13.png">> <</if>> <<if $Position is "BreastsNaked">> <<set _line = either(_breasts)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCStatus to "Naked">> <<set $NPCCum to $NPCCum + 5>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/12.png">> <</if>> <<if $Position is "Spank">> <<set $Spanked to true>> <<set $NPCCum to $NPCCum + 5>> <<say 'Woman' _NPCImg>>Fuck yes, oh I've been a bad girl aha!<</say>> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/22.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<if $Position is "Clit">> <<set _line = either(_pussy)>> <<say 'Woman' _NPCImg>>_line<</say>> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/2.webm" type="video/webm"> </video><br><br> <</if>> <<if $Position is "Finger">> <<set _line = either(_fingering)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCCum to $NPCCum + 10>> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/4.webm" type="video/webm"> </video><br><br> <</if>> <<if $Position is "Ass">> <<set _line = either(_ass)>> <<say 'Woman' _NPCImg>>_line<</say>> <<set $NPCCum to $NPCCum + 10>> <<set _int to random(1, 2)>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Rim/" + _int + ".gif">> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <</if>> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> <<if $NPCCum lt 100>> <<set _line = either(__roundOver)>> <<say 'Woman' _NPCImg>>_line<</say>> <<button "Return to the game">> <<set $Int to 0>> <<goto "ManorDiceGame">> <</button>> <<else>> <<button "She begins to cum">> <<goto "ManorWomanCum">> <</button>> <</if>> </div> <</nobr>>
<<if $Position is "BreastsOut">> <<set $NPCStatus to "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/16.png">> <</if>> <<if $Position is "Legs">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/19.png">> <</if>> <<goto "ManorStandingTable">>
ManorStandingTable <<nobr>> <<set _NPCImg to $NPCImg>> <<set $Position is "null">> <div class="text-box"> Explore her body to find areas to tease<br> <<if $NPCStatus is "Naked">> Or: <<button "Fuck her">> <<goto "ManorChareSexMenu">> <</button>> <</if>> <<say 'Woman' _NPCImg>>Yes get rough with me<</say>><br><br> <<include "ManorLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <div class="toggle-container"> <label> <input type="checkbox" id="showHotspots"> Show locations </label> </div> </div> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('#showHotspots').on('change',function(){$('.circle').toggleClass('hidden');});$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ImagePath;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .circle { width: 100% !important; height: 100% !important; border: 2px solid white !important; border-radius: 50% !important; transition: opacity 0.3s ease !important; background-color: transparent !important; } .repair-mode .circle.hidden { opacity: 0 !important; } .repair-mode .circle:hover { border-color: #ffff00 !important; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5) !important; } .repair-mode .hotspot:hover .tooltip { color: #600000 !important; } .toggle-container { margin-top: 10px; text-align: center; color: white; } .toggle-container label { cursor: pointer; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <</nobr>>
<<nobr>> <<set _NPCImg to $NPCImg>> <<include "ManorGameLines">> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> <br><br> <<if $Position is "Clit">> <<set _line = either(_pussy)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $NPCCum to $NPCCum + 10>> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Cul/1.webm">>type="video/webm"> </video><br><br> <</if>> <<if $Position is "Finger">> <<set _line = either(_fingering)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $NPCCum to $NPCCum + 10>> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/4.webm" type="video/webm"> </video><br><br> <</if>> <<if $Position is "Ass">> <<set _line = either(_ass)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<set $NPCCum to $NPCCum + 10>> <<set _int to random(1, 2)>> <<set _GifPath to "Images/Castle/Dungon/Woman/Corruption/Sex/Rim/" + _int + ".gif">> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <</if>> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> <<if $NPCCum lt 100>> <<set _line = either(__roundOver)>> <<say 'Woman' _NPCImg>>_line<</say>><br><br> <<button "Return to the game">> <<set $Int to 0>> <<goto "ManorDiceGame">> <</button>> <<else>> <<button "She begins to cum">> <<goto "ManorWomanCum">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCImg to $NPCImg>> <<set $VampireGameUnlocked to true>> <<say 'Woman' _NPCImg>>Oh fuck!<</say>><br><br> <<set $VidPath to "Images/Forrest/Exploring/Cemetery/Lilura/Cum/fcum.webm">> <video autoplay loop> <<set _VidPath to $VidPath>> <source @src="_VidPath" type="video/webm"> </video> She gasps for air, falling onto the floor<br><br> <<say 'Woman' _NPCImg>>Just.. One... Moment...<</say>> <<say 'Woman' _NPCImg>>No mortal has been able to make me cum like that before...<</say>> She looks at you with a grin <<say 'Woman' _NPCImg>>You win, you may have your prize... But first, I can't allow you to leave like that... Your balls must ache so badly, Would you like to cum?<</say>> <<button "Say yes">> <<goto "ManorCumSceen">> <</button>><br><br> <<button "Refuse">> <<goto "ManorGameWon">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<Gnarlak>>Welcome to the map room Lord! Here we can review our domain and plan what to do next!<</Gnarlak>><br> <<You>>I see<</You>><br> <<Gnarlak>>There are villages in the area, for our influence to grow we must take command of these areas<</Gnarlak>><br> <<You>>How would you suggest I do that?<</You>><br> <<Gnarlak>>That is the question all great leaders must answer, would you rather be loved, or feared?<</Gnarlak>><br> <<Gnarlak>>The choise is yours lord, each village must bend the knee to you, with your power we could do this by force and rule with fear<</Gnarlak>><br> <<You>>Or<</You>><br> <<Gnarlak>>Make them love you! We can corrupt certain powerful people, or if you really wanted... We could help them<</Gnarlak>><br> <<if ($LucyUnlocked is true) and ($AliceUnlocked is fasle)>> <<Gnarlak>>Lucy shares your powers of corruption, maybe she could be a valuable tool in swaying powerful men?<</Gnarlak>><br><</if>> <<if ($AliceUnlocked is true) and ($LucyUnlocked is fasle)>> <<Gnarlak>>Alice shares your powers of corruption, maybe she could be a valuable tool in swaying powerful men?<</Gnarlak>><br><</if>> <<if ($AliceUnlocked is true) and ($LucyUnlocked is true)>> <<Gnarlak>>Lucy and Alice share your powers of corruption, maybe they could be a valuable tool in swaying powerful men?<</Gnarlak>><br><</if>> <<Gnarlak>>There are also bandits in the surrounding area, prehapse killing those would win over the towns foke? Or, with your corrupting influence, prehaps you could win over the bandits?<</Gnarlak>><br> <<You>>Show me the map...<</You>><br> <<button "Enter the Map Room">> <<goto "Map Room">> <</button>> </div> <</nobr>>
<<nobr>> <<set $Position to "null">> <div class="text-box"> <div id="map-container" style="width: 800px; height: 600px; overflow: hidden; position: relative; border: 4px solid #8b0000; margin: 0 auto;"> <img id="map-image" src="Images/Castle/MapRoom/Map.jpg" style="width: 100%; height: auto; transform-origin: center; cursor: grab; position: relative; user-select: none;"> </div> <div id="map-controls" style="text-align: center; margin-top: 10px;"> <button class="map-btn" id="zoom-in">Zoom In [+]</button> <button class="map-btn" id="zoom-out">Zoom Out [-]</button> <button class="map-btn" id="reset-map">Reset Map</button> </div> <<script>> $(document).ready(function() { const mapImage = $('#map-image'); const container = $('#map-container'); let isDragging = false; let currentX = 0; let currentY = 0; let startX, startY; function constrainPosition() { const containerRect = container[0].getBoundingClientRect(); const imageRect = mapImage[0].getBoundingClientRect(); const maxX = Math.max(0, (imageRect.width - containerRect.width) / 2); const maxY = Math.max(0, (imageRect.height - containerRect.height) / 2); currentX = Math.min(Math.max(currentX, -maxX), maxX); currentY = Math.min(Math.max(currentY, -maxY), maxY); } function updatePosition() { constrainPosition(); mapImage.css('transform', `translate(${currentX}px, ${currentY}px) scale(${State.variables.mapZoom})`); } mapImage.on('mousedown', function(e) { isDragging = true; startX = e.clientX - currentX; startY = e.clientY - currentY; mapImage.css('cursor', 'grabbing'); e.preventDefault(); }); $(document).on('mousemove', function(e) { if (!isDragging) return; currentX = e.clientX - startX; currentY = e.clientY - startY; updatePosition(); e.preventDefault(); }); $(document).on('mouseup mouseleave', function() { if (isDragging) { isDragging = false; mapImage.css('cursor', 'grab'); } }); $('#zoom-in').on('click', function() { State.variables.mapZoom = Math.min(State.variables.mapZoom + 0.2, 3); updatePosition(); }); $('#zoom-out').on('click', function() { State.variables.mapZoom = Math.max(State.variables.mapZoom - 0.2, 0.5); updatePosition(); }); $('#reset-map').on('click', function() { State.variables.mapZoom = 1; currentX = 0; currentY = 0; updatePosition(); }); }); <</script>> <<if $VisitedMapRoom isnot true>> <br><br> <<You>>This map looks terrible...<</You>><br><br> <<Gnarlak>>Sorry lord... the creator had no artistic talent I took the liberty of throwing him from the battlements<</Gnarlak>><br><br> <<You>>Good<</You>><br> <<set $VisitedMapRoom to true>> <</if>> <<if $BarracksUnlocked is true>> <br><br> <div style="text-align: center"> <<if $pendingRaid is true>> <i>You cannot plan a raid while waiting for one to finish</i><br> <<else>> <<button "Plan a raid">> <<run Engine.play('RaidLocations')>> <<set $Strategy to null>> <</button>><br> <</if>> <<button "View captured locations">> <<goto "CapturedLocations">> <</button>> </div><br><br> <</if>> <style> .large-button { font-size: 1.5em; padding: 15px 30px; margin: 10px auto; min-width: 200px; } </style> <style> .location-table { width: 100%; border-collapse: separate; border-spacing: 0; margin-top: 20px; background-color: #000; color: #fff; border-radius: 10px; overflow: hidden; } .location-table th, .location-table td { border: 1px solid #333; padding: 12px; text-align: left; } .location-table th { background-color: #222; font-weight: bold; } .location-table tr:nth-child(even) { background-color: #111; } .progress-bar { width: 100%; height: 20px; border-radius: 5px; } .progress-bar::-webkit-progress-bar { background-color: #333; border-radius: 5px; } .progress-bar::-webkit-progress-value { background-color: #4CAF50; border-radius: 5px; } .progress-bar::-moz-progress-bar { background-color: #4CAF50; border-radius: 5px; } </style> <<if ($scarldale.influence <= 2) and ($CapturedLocations.length gt 0)>> <</if>> <table class="location-table"> <tr> <th>Location</th> <th>Corruption</th> <th>Influence</th> </tr> <tr> <td>Scarldale</td> <td> <progress @value="$scarldale.corruption" max="100"></progress> <<print $scarldale.corruption>>% </td> <td> <<if $scarldale.influence >= 9>> Loved <<elseif $scarldale.influence >= 7>> Liked <<elseif $scarldale.influence >= 4>> Neutral <<elseif $scarldale.influence >= 2>> Hated <<else>> Feared <</if>> </td> </tr> <tr> <td>Harbor's End</td> <td> <progress @value="$harborsEnd.corruption" max="100"></progress> <<print $harborsEnd.corruption>>% </td> <td> <<if $harborsEnd.influence >= 9>> Loved <<elseif $harborsEnd.influence >= 7>> Liked <<elseif $harborsEnd.influence >= 4>> Neutral <<elseif $harborsEnd.influence >= 2>> Hated <<else>> Feared <</if>> </td> </tr> <tr> <td>Ironpeak</td> <td> <progress @value="$ironpeak.corruption" max="100"></progress> <<print $ironpeak.corruption>>% </td> <td> <<if $ironpeak.influence >= 9>> Loved <<elseif $ironpeak.influence >= 7>> Liked <<elseif $ironpeak.influence >= 4>> Neutral <<elseif $ironpeak.influence >= 2>> Hated <<else>> Feared <</if>> </td> </tr> </table> <i>Dev note: This mechanic is still under development, currently only Scarldale can be effected</i><br><br> </div> <div style="text-align: center"> <<button "Leave">> <<goto "Inside Castle">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> In her moment of lust and weekness, you cast a possession spell<br><br> You grab Mara by the cheaks and pull her face close to yous<br><br> <<You>>Your mine now, do you understand<</You>><br><br> <<Mara>>Y-Yes Sir<</Mara>><br><br> <<You>>Good<</You>><br><br> <<if $Position is "Cg">> You push Mara back and take over<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Miss/1.webm" type="video/webm"></video><br><br> Mara moans louder<br><br> <<Mara>>Fu..<</Mara>><br><br> You stop and pull out <<You>>Your not aloud to cum, finish my with your hand<</You>><br><br> <<Mara>>Y-Yes Sir<</Mara>><br><br> Mara reaches down and strokes your cock <<You>>Beg for my cum<</You>><br><br> <<Mara>>Please sir, cum for me<</Mara>><br><br> That send you over the edge<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Miss/2.webm" type="video/webm"></video><br><br> Happy with herself, Mara continues playing with you <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Miss/3.webm" type="video/webm"></video><br><br> [[Finish|MaraChoise]] <<else>> You push Mara back and take over<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/1.webm" type="video/webm"></video><br><br> Mara moans louder<br><br> <<Mara>>Fu..<</Mara>><br><br> You stop, pull out, and lay back down <<You>>Your not aloud to cum, finish my with your hand<</You>><br><br> <<Mara>>Y-Yes Sir<</Mara>><br><br> Mara reaches down and strokes your cock <<You>>Beg for my cum<</You>><br><br> <<Mara>>Please sir, cum for me<</Mara>><br><br> That send you over the edge<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Finish/2.webm" type="video/webm"></video><br><br> [[Finish|MaraChoise]] <</if>> <</nobr>> </div> <<set $Massage to 11>>
<div class="text-box"> <<nobr>> <<set $VisitedBathHouse to true>> You stripdown and relax in the massage room, after a short time a different young woman comes in. <div align="center"> <img src="Images/Town/BathHouse/Mara.png" width="700" height="700"> </div><br><br> <<Mara>>Hello Sir, my name is Mara please relax and let me take care of you<</Mara>><br><br> You relax and enjoy the massage<br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/1.webm" type="video/webm"></video><br><br> After a while, you feel her hand move under your towel <<Mara>>All part of the service sir<</Mara>><br><br> She says with a cheaky grin<br><br> You roll over and watch Mara pour oil on her hand <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/2.webm" type="video/webm"></video><br><br> <<Mara>>Let me get a little more comfortable<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/3.webm" type="video/webm"></video><br><br> <<Mara>>Tell me when your close<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/4.webm" type="video/webm"></video><br><br> <<You>>Fuck, Im about to [[...|Mara2]]<</You>><br><br> <<set $PlayerHealth to 100>> <<set $PlayerEnegy to 100>> <</nobr>> </div>
<<set $Time to $Time + 3>> <div class="text-box"> <<nobr>><br><br> Mara stops, she lets go of your cock and gets off the table<br> <<Mara>>Thank you sir, we are done for today<</Mara>><br><br> Mara says bluntly<br> <<You>>Where are you going?<</You>><br><br> <<Mara>>Our session is over sir, its been an hour<</Mara>><br><br> Mara wraps herself in a robe and begins to walk away<br><br> You stand up<br><br> <<You>>Wait! Fuck we're not done, I'm not done!<</You>><br><br> Mara turns around and walks back over to you. <<Mara>>Im sorry sir, but I only had time for our session<</Mara>><br><br> She runs a finger up the underside of your cock <<Mara>>If you would like to leave a tip wih the recpetionist, Ill be sure to show you how greatful I am in our next session<</Mara>><br><br> She leans in and gives you a kiss on the cheak before turning and walking out of the room <<Thoughts>>I've killed for less than that. But maybe I should play her game and see if I can get her in a vulnerable position<</Thoughts>> <<link "Leave">> <<script>> UI.alert("New Quest! <br>Find a way to possess Mara"); <</script>> <<run $Quests.push("Find a way to possess Mara")>> <<run Engine.play('LeaveBathhouse')>> <</link>> <<set $Massage to 3>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You enter the massage room, strip down and relax on the bed...<br><br> A short time later you hear someone enter<br> <<Mara>>Welcome back sir<</Mara>><br><br> Suddenly, Mara stops massaging you, you open your eyes expecting her to be walking away like during your last visit. But then you see shes removing her top <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> She smiles at you and takes off the rest of the clothes, before walking to towards you<br><br> <<Mara>>Do you like what you see?<</Mara>><br><br> You watch as Mara applys oil to her breasts <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/2.webm" type="video/webm"></video><br><br> [[Continue|Mara4]] <<set $PlayerHealth to 100>> <<set $PlayerEnegy to 100>> <</nobr>> </div>
<div class="text-box"> <<nobr>> Mara removes your towel and climbs onto the bed, she leans forward and slides her body over yours <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/2.webm" type="video/webm"></video><br><br> <<You>>Ohhh, fuck<</You>><br><br> She continues sliding over you, running her breasts over your cock <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/3.webm" type="video/webm"></video><br><br> <<if $Tip is true>> Mara sits back up at the top of the bed<br> [[Comtinue|Mara5]] <<else>> <<Mara>>I noticed you didnt leave a tip sir, did I not do a good job<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/4.webm" type="video/webm"></video><br><br> <<You>>I dont give money to people who dont finish the job<</You>><br><br> <<Mara>>Thats a shame, I suppose we are finished here too then<</Mara>><br><br> Mara hops off the bed and walks over to get a towel.<br> <<You>>Wait dam you, you cant keep doing this!<</You>><br><br> <<Mara>>Doing what sir, you paid for a massage, and thats what you got<</Mara>><br><br> She says with a wink<br><br> <<Thoughts>>I should kill her for this. But fuck I want her<</Thoughts>><br><br> Mark walks back over towards you <<Mara>>I'll tell you what<</Mara>><br><br> She leans over and wipsers in your ear<br><br> <<Mara>>If you leave me a big tip, I'll let you do whatever you like next time<</Mara>><br><br> And with that, she turns and walks out the room<br><br> After some time, you clean up and leave the room [[leave|LeaveBathhouse]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<Mara>>Thank you for your generosity after your last visit sir<</Mara>><br><br> She expertly runs her hands over every inch of you, making you harder and harder<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/2.webm" type="video/webm"></video><br><br> <<Mara>>Lets get a bit more comfortable shall we?<</Mara>><br><br> Without waiting for a reply, spins around and sits on your chest, without letting go of your manhood<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/3.webm" type="video/webm"></video><br><br> Mara begins to rub her wet cunt over your cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/4.webm" type="video/webm"></video><br><br> <<Mara>>Do you want to fuck me?<</Mara>><br><br> You reply:<br><br> [[Yes!|Mara7]]<br> I want to finish in your [[hand|Mara6]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>Actually, I want you to keep going, finish me with your hand<</You>><br><br> <<Mara>>oooo, I wasn't expecting that. I love a patient boy<</Mara>><br><br> <<Mara>>Let me get off you<</Mara>><br><br> Mara gets off you, and settles between your legs before continuing her task.<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/1.webm" type="video/webm"></video><br><br> She continues, picking up speed<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/2.webm" type="video/webm"></video><br><br> <<Mara>>Cum for me, sir<</Mara>><br><br> Hearing that pushes you over the edge, you buck your hips in pleasure and spray cum over Mara's chest <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Finish/1.webm" type="video/webm"></video><br><br> <<You>>Ohhh, fuck<</You>><br><br> <<Mara>>Yess, thank you sir<</Mara>><br><br> She says, licking her fingers<br><br> Mara gets up and puts on a robe<br><br> <<Mara>>I look forward to seeing next time! Remeber, please leave me a tip and I'll let you do whatever you like to me next time<</Mara>><br><br> Mara winks at you, and walks out the room. After some time, you clean up and leave the room [[Leave|LeaveBathhouse]] <<set $Massage to 8>> <<set $Tip to false>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<You>>Yes, fuck me...<</You>><br><br> But before you can react, Mara slids up your chest and pins your arms with her legs. She hovers her pussy over your face before pushing her hips down <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/5.webm" type="video/webm"></video><br><br> <<Mara>>Ummm, well today I want some attention. Maybe next time<</Mara>><br><br> You try to protest, but it comes out as muffled moans as Mara smuthers you<br><br> After a few moment of resisting, you tasts Maras jucies as they run over your face<br><br> <<Thoughts>>Fuck this pussy is good<</Thoughts>><br><br> You stop resisting and push your tounge as deep as you can into Mara <<Mara>>Ahh, thats it<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/6.webm" type="video/webm"></video><br><br> <<Thoughts>>If I can make this slut cum, she will be vulnerable enough for me to corrupt<</Thoughts>><br><br> <<Mara>>Yesss, lick it!<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/2/7.webm" type="video/webm"></video><br><br> Before you can make your cum, Mara lifts herself away from your tounge and she sits on your legs<br><br> <<Mara>>Nice job, but this is about you<</Mara>><br><br> Before you can protest, Mara uses her expert hand and stokes you till you cum<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Finish/2.webm" type="video/webm"></video><br><br> <<Mara>>Well done! I need to go get washed up, but remember please leave me a nice tip and we can have even more fun next time!<</Mara>><br><br> Mara jumps up and leaves the room <br><br> <<Thoughts>>Next time. I'll have this bitch<</Thoughts>><br><br> [[Leave|LeaveBathhouse]] <<set $Massage to 8>> <<set $Tip to false>> <</nobr>> </div>
<div class="text-box"> <<nobr>> As usual, you undress, grab a towel and relax on the bed. <<if ($Tip is true) and ($Position is "Massage")>> <<Mara>>Hello Sir<</Mara>><br><br> Mara walks in and gets stirght to work on your back <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/1.webm" type="video/webm"></video><br><br> <<Mara>>You were very generous last time Sir, so to say thank you. I'll let you pick how we get you warmed up<</Mara>><br><br> <<link "hands">><<set $Position to "Hj">><<run Engine.play('Mara8')>><</link>><br><br> <<link "Feet">><<set $Position to "Fj">><<run Engine.play('Mara8')>><</link>><br><br> <<link "Breasts">><<set $Position to "Tj">><<run Engine.play('Mara8')>><</link>> <</if>> <<if $Position is "Hj">> <<Mara>>You really like my hands on you, dont you?<</Mara>><br><br> Mara removes her top, exposing her beautiful breasts<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> Mara starts slow, making you harder with her hands <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/4/1.webm" type="video/webm"></video><br><br> After a while, she starts playing with the tip of your cock <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/4/2.webm" type="video/webm"></video><br><br> After a short time, Mara stop and removes the rest of her clothes <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/5.webm" type="video/webm"></video><br><br> <<Mara>>Time for the main event<</Mara>><br><br> <<set $Position to "Cg">> [[Continue|Mara9]] <</if>> <<if $Position is "Fj">> <<Mara>>Oh, so you like me feet?<</Mara>><br><br> Mara says with a smile<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> She removes her clothes and climbs onto the bed<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/2.webm" type="video/webm"></video><br><br> Mara turns around, giving you a perfect view of her ass and grips you with her feel <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/3.webm" type="video/webm"></video><br><br> After a short time, Mara stops, reaching back to take your cock and aims it at her pussy <<Mara>>Time for the main event<</Mara>><br><br> <<set $Position to "Rcg">> [[Continue|Mara9]] <</if>> <<if $Position is "Tj">> <<Mara>>Your going to feel so good between my big breasts<</Mara>><br><br> She removes her top<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> And applys oil to herself<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/2.webm" type="video/webm"></video><br><br> She climbs onto the bed and takes hold of your cock, pressing it against her chest<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Tj/1.webm" type="video/webm"></video><br><br> <<Mara>>So big...<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Tj/2.webm" type="video/webm"></video><br><br> Mara continues sliding up and down your body<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Tj/3.webm" type="video/webm"></video><br><br> After short time, Mara stop and sits up<br><br> <<Mara>>Time for the main event<</Mara>><br><br> [[Continue|Mara9]] <<set $Position to "Cg">> <</if>> <<if $Tip is false>> After some time a woman walks in and sits on the bed<br><br> <div align="center"> <img src="Images/Town/BathHouse/2.png" width="700" height="700"> </div><br><br> Woman: Hello Sir, please lay on your front<br><br> <<You>>Where's Mara<</You>><br><br> Woman: She's not available today<br><br> This is annoying, but you enjoy the massage regardless... Prehaps if you leave another tip Mara will help you out next time<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/8.webm" type="video/webm"></video><br><br> After a while the woman finishes and leave<br><br> [[Leave|LeaveBathhouse]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Position is "Cg">> Mara slides back and forward, rubbing her pussy over your cock <<Mara>>Do you want to fuck me<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/1.webm" type="video/webm"></video><br><br> <<You>>Yes<</You>><br><br> <<Mara>>Ask me nicely<</Mara>><br><br> <<Thoughts>>This fucking girl. But I'm so close to having her<</Thoughts>><br><br> <<You>>Please<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/2.webm" type="video/webm"></video><br><br> Mara continues to grind on you <<Mara>>Beg<</Mara>><br><br> <<Thoughts>>Oh, your going to reget this<</Thoughts>><br><br> <<You>>Please, fuck me!<</You>><br><br> Mara leans forward and slids herself onto your cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/3.webm" type="video/webm"></video><br><br> <<Mara>>Good Boy!<</Mara>><br><br> You continue fucking<br><br> <<Mara>>Oh gods your big!<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/4.webm" type="video/webm"></video><br><br> Mara gets louder<br><br> <<Mara>>Fuck, I'm going too...<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/5.webm" type="video/webm"></video><br><br> Mara screams as she cums on your cock<br><br> <<Thoughts>>Nows my chance<</Thoughts>><br><br> [[Continue|Mara10]] <</if>> <<if $Position is "Rcg">> Mara slides back and forward, rubbing her pussy over your cock <<Mara>>Do you want to fuck me<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/1.webm" type="video/webm"></video><br><br> <<You>>Yes<</You>><br><br> <<Mara>>Ask me nicely<</Mara>><br><br> <<Thoughts>>This fucking girl. But I'm so close to having her<</Thoughts>><br><br> <<You>>Please<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/2.webm" type="video/webm"></video><br><br> Mara continues to grind on you <<Mara>>Beg<</Mara>><br><br> <<Thoughts>>Oh, your going to reget this<</Thoughts>><br><br> <<You>>Please, fuck me!<</You>><br><br> Mara leans forward and slids herself onto your cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/3.webm" type="video/webm"></video><br><br> <<Mara>>Good Boy!<</Mara>><br><br> You continue fucking<br><br> <<Mara>>Oh gods your big!<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/4.webm" type="video/webm"></video><br><br> Mara gets louder<br><br> <<Mara>>Fuck, I'm going too...<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/5.webm" type="video/webm"></video><br><br> Mara screams as she cums on your cock<br><br> <<Thoughts>>Nows my chance<</Thoughts>><br><br> [[Continue|Mara10]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if ($MaraAsk is true) and ($Time gt 4) and ($Time lt 10)>> Mara is currently working in the infirmary<br><br> <<else>> You enter Mara's chamber <div align="center"> <img src="Images/Town/BathHouse/Mara.png" width="700" height="700"> </div><br><br> <<if $MaraChamberFirstVisit is true>> <<You>>Settled in?<</You>><br><br> <<Mara>>Hello Sir!<</Mara>><br><br> Mara runs up to you and hugs you tight. Shes clearly now infatuated with you<br><br> <<Mara>>Yes! Gnarlak showed me to my room<</Mara>><br><br> <<You>>Good<</You>><br><br> <<set $MaraChamberFirstVisit to false>> <</if>> <<Mara>>What can I do for you<</Mara>><br><br> <<if $MaraAsk is false>> <<button "Ask about the infirmary">> <<goto "MaraJobAsk">> <</button>><br> <</if>> <<button "Ask for a massage">> <<goto "MaraMassage">> <</button>><br> <<button "Fuck Mara">> <<goto "MaraFuck">> <</button>><br><br> Change what Mara <<link "calls you">><<set $Servant to "Mara">><<run Engine.play('ChangeName')>><</link>><br><br> <<link "Tell her to go work at the bath house">><<set $MaraAtBase to false>><<run Engine.play('Base Intro')>><</link>><br><br> <</if>> [[Leave|Inside Castle]] <</nobr>> </div> <<set $NameChange to false>> <<set $MaraCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">>
<div class="text-box"> <<nobr>> <<if $MaraQuestFinished is false>> <<You>>Now I need to decide what to do with you<</You>><br><br> <<link "Send Mara back to the castle">> <<set $MaraAtBase to true>> <<set $MaraQuestFinished to true>> <<script>> UI.alert("Quest complete! <br>You have possessed Mara, she will now serve you"); <</script>> <<run $Quests.delete("Find a way to possess Mara")>> <<set $Chamber3 to "Mara">> <<run Engine.play('MaraChoise')>><</link>><br><br> OR<br><br> <<link "Leave her here to make you money">> <<set $MaraAtBase to false>> <<set $MaraQuestFinished to true>> <<script>> UI.alert("Quest complete! <br>You have possessed Mara, she will now serve you"); <</script>> <<run $Quests.delete("Find a way to possess Mara")>> <<run Engine.play('MaraChoise')>> <</link>> <<else>> <<if $MaraAtBase is true>> <<You>>Your too stubbon for me to corrupt further... But no bother. You will return to my castle and work as my personal masseuse<</You>><br><br> <<Mara>>Yes sir, I will pack and move now!<</Mara>><br><br> <<else>> <<You>>Your too stubbon for me to corrupt further... But no bother. You will stay here and continue this game with the towns foke, but any money you make is mine<</You>><br><br> <<Mara>>Yes sir, please return soon!<</Mara>><br><br> <</if>> [[Leave|Town]] <</if>> <</nobr>> </div>
<<set $Time to $Time + 1>> <div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Mara's orgasm: <progress @value=" $MaraCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> <<if $MaraCum >= 100>> Mara cums <<Mara>>Oh yes, $MaraName !<</Mara>><br> <video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finish/fcum.webm" type="video/webm"> <<set $MaraCum to 0>> </video> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Tits") and ($Position != "Outside") and ($Position != "Inside")>> Your about to cum<br> <<link "Tits">><<set $Position to "Tits">><<run Engine.play('MaraFuck')>><</link>><br> <<link "Outside">><<set $Position to "Outside">><<run Engine.play('MaraFuck')>><</link>><br> <</if>> <<if $Position is "Tits">> <br>You pull out and cum on Mara's chest <video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finish/chest.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Outside">> <br>You pull out and cum all over Maras wet pussy <video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finish/outside.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if ($PlayerCum lt 100) and ($MaraCum lt 100)>> <<if $Position == "Seduce">> <br><br>Mara shows off her body to you<br><br> <<Mara>>do you like what you see, $MaraName<</Mara>><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Seduce/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Seduce/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> You bend Mara over and fuck her from behind<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Behind/2.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> Mara gets on top and rides your cock<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Cul">> You go down on Mara, enjoying the taste of her wet cunt<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cul/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cul/1.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Cul/1.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Finger">> You tease Mara with your fingers<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finger/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finger/1.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Finger/1.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "HJ">> You relax as Mara strokes your cock<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Hj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Hj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Hj/1.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Miss">> You push Mara onto her back and fuck her<br><br> <<if $Int == 0>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Miss/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Miss/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>><video autoplay loop> <source src="Images/Castle/Mara/Fuck/Miss/2.webm" type="video/webm"> </video><</if>><</if>> <</if>> <<if $PlayerCum lt 100>> <<link "Handjob">><<set $Position to "HJ">><<set $PlayerCum to $PlayerCum + 5>> <<run Engine.play('MaraFuck')>> <</link>><br> <<link "Finger">><<set $Position to "Finger">><<set $MaraCum to $MaraCum + 8>> <<run Engine.play('MaraFuck')>> <</link>><br> <<link "Cunnilingus">><<set $MaraCum to $MaraCum + 10>><<set $Position to "Cul">> <<run Engine.play('MaraFuck')>> <</link>><br> <<link "Doggy Style">><<set $MaraCum to $MaraCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('MaraFuck')>> <</link>><br> <<link "Missionary">><<set $MaraCum to $MaraCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Miss">> <<run Engine.play('MaraFuck')>> <</link>><br> <<link "Cowgirl">><<set $MaraCum to $MaraCum + 15>><<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('MaraFuck')>> <</link>><br> <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You relax in the table and allow Mara to begin her job massaging you<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/1.webm" type="video/webm"></video><br><br> <<You>>I have a question for you...<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> <<Mara>>How may I help $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/2.webm" type="video/webm"></video><br><br> <<You>>My forces are fighting hard... But they are getting injured. We have no healers to care for them<</You>><br><br> <<You>>I need you to do what you can to help them recover<</You>><br><br> Mara slides her hand expertly over your shaft and begins working on your cock<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/1/3.webm" type="video/webm"></video><br><br> <<Mara>>$MaraName I am no healer...<</Mara>><br><br> <<You>>You will learn, for now you know how to clean a wound? Apply a banage?Your a tallented woman<</You>><br><br> Excited by your prase, she removes her clothes and works her way onto you<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/4.webm" type="video/webm"></video><br><br> <<You>>Will you do this for me?<</You>><br><br> <<Mara>>Yes, Yes! Anything for you $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/5.webm" type="video/webm"></video><br><br> Moments later, her breath becomes shorter and moans louder... You cum together and relax on the table<br><br> <<Mara>>I will start now!<</Mara>><br><br> Mara will work in the infirmary during the afternoon<br><br> <<set $MaraWorkInfirmary to true>> <<set $MaraAsk to true>> <<button "Leave">> <<goto "Inside Castle">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set $PlayerHealth to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $PlayerEnergy to 100>> <<if $Position == "Seduce">> <<Mara>>This is going to be fun $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/5.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/2.webm" type="video/webm"></video><br><br> <<link "Massage">><<set $Position to "Massage">><<run Engine.show()>><</link>> <</if>> <<if $Position == "Massage">> <<Mara>>Do I feel good, rubbing against you<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/6.webm" type="video/webm"></video><br><br> <<link "Roll Over">><<set $Position to "MassageFront">><<run Engine.show()>><</link>> <</if>> <<if $Position == "MassageFront">> <<Mara>>Relax $MaraName, let me take care of you<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/4.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/5.webm" type="video/webm"></video><br><br> <<Mara>>Is there anything else I can do you for $MaraName ?<</Mara>><br><br> Ask Mara to use her:<br> <<link "Hands">><<set $Position to "Hj">><<run Engine.show()>><</link>><br> <<link "Feet">><<set $Position to "Fj">><<run Engine.show()>><</link>><br><br> Or [[Finish|Base Intro]] <</if>> <<if $Position == "Hj">> <<You>>Play with me, using you hand<</You>><br><br> Mara smiles<br><br> <<Mara>>Of course $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/2.webm" type="video/webm"></video><br><br> <<Mara>>Would you like to cum $MaraName ?<</Mara>><br><br> Let her make you <br> <<link "cum">><<set $Position to "HjFinishTits2">><<run Engine.show()>><</link>><br> or <<link "Ask her to sit on your cock">><<set $Position to "Cg">><<run Engine.show()>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.show()>><</link>><br> <</if>> <<if $Position == "Fj">> <<You>>Play with me, using you feet<</You>><br><br> Mara smiles <<Mara>>Of course $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/3.webm" type="video/webm"></video><br><br> <<Mara>>What else shall we do $MaraName ?<</Mara>><br><br> You ask her to <<link "Stroke you">><<set $Position to "Hj">><<run Engine.show()>><</link>><br> or <<link "Ask her to sit on your cock">><<set $Position to "Rcg">><<run Engine.show()>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.show()>><</link>><br> <</if>> <<if $Position == "Behind">> <<You>>Lay down on the table<</You>><br><br> Mara obays<br><br> She rubs herself on you cock before sliding it in<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/5.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/4.webm" type="video/webm"></video><br><br> She starts to moan<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/6.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, may I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumBehind">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumBehind">> <<Mara>>Oh God's, thank you $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/7.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinishTits1">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "Cg">> <<You>>Fuck me<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/4.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, can I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumCg">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "Rcg">> <<You>>Fuck me<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/4.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, can I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumRcg">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumCg">> <<Mara>>Thank you $MaraName !<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/5.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumRcg">> <<Mara>>Thank you $MaraName !<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/5.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "HjFinish">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/5/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/5/2.webm" type="video/webm"></video><br><br> [[leave|Town]] <</if>> <<if $Position == "HjFinishTits1">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Finish/1.webm" type="video/webm"></video><br><br> [[leave|Town]] <</if>> <<if $Position == "HjFinishTits2">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/3.webm" type="video/webm"></video><br><br> [[leave|Town]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $PlayerHealth to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $PlayerEnergy to 100>> <<if $Position == "Seduce">> <<Mara>>This is going to be fun $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/5.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Strip/2.webm" type="video/webm"></video><br><br> <<link "Massage">><<set $Position to "Massage">><<run Engine.show()>><</link>> <</if>> <<if $Position == "Massage">> <<Mara>>Do I feel good, rubbing against you<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/6.webm" type="video/webm"></video><br><br> <<link "Roll Over">><<set $Position to "MassageFront">><<run Engine.show()>><</link>> <</if>> <<if $Position == "MassageFront">> <<Mara>>Relax $MaraName, let me take care of you<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/4.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Massage/5.webm" type="video/webm"></video><br><br> <<Mara>>Is there anything else I can do you for $MaraName ?<</Mara>><br><br> Ask Mara to use her:<br> <<link "Hands">><<set $Position to "Hj">><<run Engine.show()>><</link>><br> <<link "Feet">><<set $Position to "Fj">><<run Engine.show()>><</link>><br><br> Or [[Finish|Base Intro]] <</if>> <<if $Position == "Hj">> <<You>>Play with me, using you hand<</You>><br><br> Mara smiles<br><br> <<Mara>>Of course $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/2.webm" type="video/webm"></video><br><br> <<Mara>>Would you like to cum $MaraName ?<</Mara>><br><br> Let her make you <br> <<link "cum">><<set $Position to "HjFinishTits2">><<run Engine.show()>><</link>><br> or <<link "Ask her to sit on your cock">><<set $Position to "Cg">><<run Engine.show()>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.show()>><</link>><br> <</if>> <<if $Position == "Fj">> <<You>>Play with me, using you feet<</You>><br><br> Mara smiles <<Mara>>Of course $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Fj/3.webm" type="video/webm"></video><br><br> <<Mara>>What else shall we do $MaraName ?<</Mara>><br><br> You ask her to <<link "Stroke you">><<set $Position to "Hj">><<run Engine.show()>><</link>><br> or <<link "Ask her to sit on your cock">><<set $Position to "Rcg">><<run Engine.show()>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.show()>><</link>><br> <</if>> <<if $Position == "Behind">> <<You>>Lay down on the table<</You>><br><br> Mara obays<br><br> She rubs herself on you cock before sliding it in<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/5.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/4.webm" type="video/webm"></video><br><br> She starts to moan<br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/6.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, may I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumBehind">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumBehind">> <<Mara>>Oh God's, thank you $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Behind/7.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinishTits1">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "Cg">> <<You>>Fuck me<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/4.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, can I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumCg">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "Rcg">> <<You>>Fuck me<</You>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/4.webm" type="video/webm"></video><br><br> <<Mara>>I'm so close, can I cum $MaraName ?<</Mara>><br><br> <<link "Let her cum">><<set $Position to "MaraCumRcg">><<run Engine.show()>><</link>><br> or <<link "Deny her">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumCg">> <<Mara>>Thank you $MaraName !<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Cg/5.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "MaraCumRcg">> <<Mara>>Thank you $MaraName !<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Rcg/5.webm" type="video/webm"></video><br><br> <<link "Finish">><<set $Position to "HjFinish">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position == "HjFinish">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/5/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/5/2.webm" type="video/webm"></video><br><br> [[leave|Inside Castle]] <</if>> <<if $Position == "HjFinishTits1">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Finish/1.webm" type="video/webm"></video><br><br> [[leave|Inside Castle]] <</if>> <<if $Position == "HjFinishTits2">> <<Mara>>Cum for me $MaraName<</Mara>><br><br> <video autoplay loop> <source src="Images/Town/BathHouse/Massage/Hj/3/3.webm" type="video/webm"></video><br><br> [[leave|Inside Castle]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<Mara>>What can I do for you<</Mara>><br><br> [[Message|MaraMassageTown]]<br> Change what Mara <<link "calls you">><<set $Servant to "Mara">><<run Engine.play('ChangeName')>><</link>><br><br> <<link "Tell her to go to the castle">><<set $MaraAtBase to true>><<run Engine.play('Town')>><</link>><br><br> [[Leave|Base Intro]] <</nobr>> </div> <<set $NameChange to false>> <<set $MaraCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">>
This is coming in a future update [[return|Chambers]]
<<nobr>> <div class="text-box"> <<set _villager to $LibraryOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div style="display: flex; gap: 20px;"> <div style="flex: 0 0 300px;"> <img @src="_villager.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <div style="flex: 1;"> <h2><<print _villager.name>></h2> <p>Sex: <<print _villager.sex>></p> <div style="margin: 20px 0;"> <h3>Job</h3> <<if !_villager.job or _villager.job === "Unknown">> <p style="color: orange;">Select a job for this person:</p> <div class="specialization-buttons"> <<for _job range ["Farmer", "Hunter", "Miller", "Blacksmith"]>> <<capture _job>> <<button _job>> <<set _villager.targetJob = _job>> <<set _villager.skill = 1>> <<goto "Library">> <</button>> <</capture>> <</for>> </div> <<else>> <p>Job: <<print _villager.job>></p> <<button "Remove Job">> <<set _villager.job = "Unknown">> <<set _villager.hiddenJob = "Unknown">> <<goto "Mercenary2">> <</button>> <<button "Back">> <<goto "Library">> <</button>> <</if>> </div> </div> </div> <</nobr>> <div style="text-align: center"> <<button "Back to the Library">> <<goto "Library">> <</button>> </div>
<<nobr>> <div class="text-box"> <<set _prisoner to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<if !_prisoner.hasOwnProperty("rangedWeapon")>><<set _prisoner.rangedWeapon to "None">><</if>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_prisoner.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _prisoner.name>></h2> <div style="margin: 20px 0;"> <p>Sex: <<print _prisoner.sex>></p> <p>Armor: <<if _prisoner.armor is "None">> <img src="Images/Items/Armour/leather.png" alt="No Armor" style="width: 32px; height: 32px; vertical-align: middle;"> <<elseif _prisoner.armor is "Armored">> <img src="Images/Items/Armour/breastplate.png" alt="Armored" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _prisoner.armor>> <</if>> </p> <p>Melee Weapon: <<if _prisoner.weapon is "Dagger">> <img src="Images/Items/Melee Weapons/plain_dagger.png" alt="Dagger" style="width: 32px; height: 32px; vertical-align: middle;"> <<elseif _prisoner.weapon is "Sword">> <img src="Images/Items/Melee Weapons/shortsword.png" alt="Sword" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _prisoner.weapon>> <</if>> </p> <p>Ranged Weapon: <<if _prisoner.rangedWeapon is "None">> None <<elseif _prisoner.rangedWeapon is "Longbow">> <img src="Images/Items/Melee Weapons/longbow.png" alt="Longbow" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _prisoner.rangedWeapon>> <</if>> </p> </div> <div style="margin: 20px 0;"> <h3>Skill</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_prisoner.skill" max="100"></progress> <span><<print _prisoner.skill>>%</span> </div> <h3>Health</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_prisoner.health" max="100"></progress> <span><<print _prisoner.health>>%</span> </div> </div> <div style="margin: 20px 0;"> <h3>Specialization</h3> <<if !_prisoner.specialization>> <p style="color: orange;">Select a skill for this person:</p> <div class="specialization-buttons"> <<button "Combat Specialist">> <<set _prisoner.specialization = "Combat">> <<set _prisoner.skill = 1>> <<goto "Mercenary">> <</button>> <<button "Lockpicking Specialist">> <<set _prisoner.specialization = "Lockpicking">> <<set _prisoner.skill = 1>> <<goto "Mercenary">> <</button>> <<button "Defense Specialist">> <<set _prisoner.specialization = "Defense">> <<set _prisoner.skill = 1>> <<goto "Mercenary">> <</button>> <<button "Scouting Specialist">> <<set _prisoner.specialization = "Scouting">> <<set _prisoner.skill = 1>> <<goto "Mercenary">> <</button>> </div> <<else>> <p>Specialization: <<print _prisoner.specialization>></p> <<button "Remove Specialization">> <<set _prisoner.specialization = null>> <<set _prisoner.skill = 0>> <<goto "Mercenary">> <</button>> <</if>> </div> </div> </div> </div> <div class="text-box flex-buttons"> <<button "Edit Character">> <<goto "EditMercenary">> <</button>><br> <<if _prisoner.specialization isnot "Succubus">> <<if $FarmingGuards and $FarmingGuards.length < 3>> <<button "Send to guard farm">> <<set $GuardDetails = { prisonerId: _prisoner.prisonerId, name: _prisoner.name, daysremaining: 3, hairColor: _prisoner.hairColor, ImagePath: _prisoner.ImagePath, sex: _prisoner.sex, specialization: _prisoner.specialization, skill: _prisoner.skill, duty: _prisoner.duty, armor: _prisoner.armor, weapon: _prisoner.weapon, rangedWeapon: _prisoner.rangedWeapon, health: _prisoner.health }>> <<run State.variables.FarmingGuards.push($GuardDetails)>> <<run $BarraksOccupance.delete(_prisoner)>> <<script>> UI.alert("You send the guard to watch over Oakshade farm"); <</script>> <<goto "Barracks">> <</button>><br><br> <</if>> <<button "Send out to explore">> <<set $Exporing to true>> <<if !$explorerIdCounter>><<set $explorerIdCounter to 0>><</if>> <<set $ExplorerDetails = { prisonerId: _prisoner.prisonerId, name: _prisoner.name, daysremaining: 3, hairColor: _prisoner.hairColor, ImagePath: _prisoner.ImagePath, sex: _prisoner.sex, specialization: _prisoner.specialization, skill: _prisoner.skill, duty: _prisoner.duty, armor: _prisoner.armor, weapon: _prisoner.weapon, rangedWeapon: _prisoner.rangedWeapon, health: _prisoner.health }>> <<run State.variables.ExploreTeam.push($ExplorerDetails)>> <<run $BarraksOccupance.delete(_prisoner)>> <<script>> UI.alert("You send the scout to explore the forest, searching for local visit. They will return in 3 days if they survive"); <</script>> <<goto "Barracks">> <</button>><br><br> <<if (_prisoner.specialization) and (_prisoner.skill lt 100)>> <<if !$CourtyardOccupance>><<set $CourtyardOccupance = []>><</if>> <<if $CourtyardOccupance.length < 5>> <<button "Send to Training">> <<set $CourtyardOccupance.push({ prisonerId: _prisoner.prisonerId, name: _prisoner.name, daysremaining: 3, hairColor: _prisoner.hairColor, ImagePath: _prisoner.ImagePath, sex: _prisoner.sex, specialization: _prisoner.specialization, skill: _prisoner.skill, duty: _prisoner.duty, armor: _prisoner.armor, weapon: _prisoner.weapon, rangedWeapon: _prisoner.rangedWeapon, health: _prisoner.health })>> <<run $BarraksOccupance.delete(_prisoner)>> <<goto "Barracks">> <</button>> <<else>> <div style="color: red;">Courtyard is full (Max 5 units)</div> <</if>> <</if>> <<if (_prisoner.weapon is "Dagger") and ($ArmourySwords gt 0) and (_prisoner.weapon isnot "Corruption")>> <<button "Give Sword">> <<set $ArmourySwords to $ArmourySwords -= 1>> <<set _prisoner.weapon to "Sword">> <<run Engine.show()>> <</button>><br> <</if>> <<if ($ArmouryLongbows gt 0) and (_prisoner.weapon isnot "Corruption")>> <<button "Give Longbow">> <<set $ArmouryLongbows to $ArmouryLongbows -= 1>> <<set _prisoner.rangedWeapon to "Longbow">> <<run Engine.show()>> <</button>><br> <</if>> <<if (_prisoner.armor is "None") and($ArmouryArmour gt 0) and (_prisoner.weapon isnot "Corruption")>> <<button "Give Armor">> <<set $ArmouryArmour to $ArmouryArmour -= 1>> <<set _int to random(1, 12)>> <<set _prisoner.armor to "Armored">> <<set _prisoner.ImagePath to "Images/Castle/Barracks/Mercenaries/" + _prisoner.sex + "/Armored/" + _prisoner.hairColor + "/" + _int + ".png">> <<run Engine.show()>> <</button>><br> <</if>> <<if _prisoner.health lt 100>> <<if $Infirmary is true>> <<if $MaraWorkInfirmary is true>> <<button "Send to Infirmary">> <<if !$InfrimaryOccupance>><<set $InfrimaryOccupance = []>><</if>> <<run $InfrimaryOccupance.push(_prisoner)>> <<run $BarraksOccupance.delete(_prisoner)>> <<goto "Barracks">> <</button>><br> <<else>> <i>You need someone to work in the infirmary before you can send people to it</i><br><br> <</if>> <<else>> <i>Build an infirmary to heal people</i><br><br> <</if>> <</if>> <</if>> <<button "Deploy to Settlement">> <<set $currentUnitForTransfer to _prisoner>> <<goto "UnitSettlementTransfer">> <</button>><br> <<if $CapturedSuccubiSouls gt 0 and _prisoner.sex is "Female">> <<button "Transform to Succubus">> <<goto "CreateSuccubus">> <</button>> <</if>> <<button "Release from duty (Delete character)">> <<run $BarraksOccupance.delete(_prisoner)>> <<goto "Barracks">> <</button>> </div> <div style="text-align: center"> <<button "Leave">> <<goto "Barracks">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <h2>Sell Supplies</h2> <div id="combat-spells" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Wood.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>100 Wood</h3> <p>Worth: 50 Gold</p> <<if $Wood >= 100>> <<button "Sell 100 Wood">> <<set $Wood to $Wood - 100>> <<set $Gold to $Gold + 50>> <<run Engine.play('Merchant_Sell')>> <</button>> <<else>> <button disabled>Insufficient Wood</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Stone.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>100 Stone</h3> <p>Worth: 50 Gold</p> <<if $Gold >= 50>> <<button "Sell 100 Stone">> <<set $Stone to $Stone - 100>> <<set $Gold to $Gold + 50>> <<run Engine.play('Merchant_Sell')>> <</button>> <<else>> <button disabled>Insufficient Stone</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Pelt.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Pelt</h3> <p>Worth 75 Gold</p> <<if $Pelts >= 1>> <<button "Sell 1 Pelt">> <<srt $Pelts to $Pelts - 1>> <<set $Gold to $Gold + 75>> <<run Engine.play('Merchant_Sell')>> <</button>> <<else>> <button disabled>Insufficient Pelts</button> <</if>> </div> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Leave">> <<goto "Merchant">> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <h2>Buy Supplies</h2> <div id="combat-spells" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Wood.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>100 Wood</h3> <p>Cost: 50 Gold</p> <<if $Gold >= 50>> <<button "Purchase 100 Wood">> <<set $Wood to $Wood + 100>> <<set $Gold to $Gold - 50>> <<run Engine.play('Merchant_Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Stone.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>100 Stone</h3> <p>Cost: 50 Gold</p> <<if $Gold >= 50>> <<button "Purchase 100 Stone">> <<set $Stone to $Stone + 100>> <<set $Gold to $Gold - 50>> <<run Engine.play('Merchant_Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <<if $OwnesHorse isnot true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Icons/Horse.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Horse</h3> <p>Cost: 200 Gold</p> <<if $Gold >= 200>> <<button "Purchase Horse">> <<set $Gold to $Gold - 200>> <<run Engine.play('Merchant_Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Leave">> <<goto "Merchant">> <</button>> </div> </div> <</nobr>>
<<set $Time to $Time + 1>> <div class="text-box"> <div align="center"> <img src="Images/Forrest/Exploring/Merchant/1.png" width="700" height="700"> </div> <<button "Buy Resources">><<goto "Merchant_Shop">><</button>> <<button "Buy Weapons">><<goto "Merchant_Weapons">><</button>> <<button "Sell Resources">><<goto "Merchant_Sell">><</button>> <<button "Leave">><<goto "ForestExplore">><</button>> <<set $ForestMerchantDiscovered to true>> </div>
<<nobr>> <<include "CombatCSS">> <<include "WeaponData">> <!-- Weapon Store Grid (Categorized) --> <div id="weapon-store-grid" style="margin: 20px 0;"> <p style="color: #ccc; width: 100%; text-align: center;">Loading weapons...</p> </div> <!-- Expanded Weapon Details (Hidden by default) --> <div id="weapon-details" style="display: none; margin: 30px 0; padding: 20px; background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 10px;"> <div style="text-align: right; margin-bottom: 15px;"> <button onclick="closeWeaponDetails()" style="background: #8b0000; color: white; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer;">✕ Close</button> </div> <div id="weapon-details-content"></div> </div> <<button "Return">><<goto "Merchant">><</button>> <</nobr>> <<script>> // Store configuration - what weapons are available for purchase window.storeSlots = { dagger: { name: '🗡️ Dagger Weapons', weapons: ['hatchet', 'buckler'] }, medium: { name: '⚔️ Medium Weapons', weapons: ['shortsword'] }, back: { name: '🛡️ Back Slot Items', weapons: ['greataxe'] } }; // Store display functions function displayAllStoreWeapons() { console.log('Displaying categorized store weapons...'); const storeGrid = document.getElementById('weapon-store-grid'); if (!storeGrid) { console.error('Store grid not found'); return; } storeGrid.innerHTML = ''; let hasWeapons = false; // Loop through each category Object.keys(window.storeSlots).forEach(slotType => { const slotData = window.storeSlots[slotType]; const availableWeapons = slotData.weapons.filter(weaponType => { return window.weaponSets[weaponType]; // Only include weapons that exist }); if (availableWeapons.length > 0) { // Create category header const categoryHeader = document.createElement('div'); categoryHeader.style.cssText = ` width: 100%; text-align: center; margin: 30px 0 20px 0; padding: 15px; background: linear-gradient(to right, #8b4513, #cd853f, #8b4513); border: 2px solid #daa520; border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); `; categoryHeader.innerHTML = ` <h2 style="color: #fff; margin: 0; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); font-size: 24px; letter-spacing: 1px;"> ${slotData.name} </h2> <p style="color: #f0e68c; margin: 5px 0 0 0; font-size: 14px;"> ${availableWeapons.length} weapon${availableWeapons.length !== 1 ? 's' : ''} available </p> `; storeGrid.appendChild(categoryHeader); // Create weapons grid for this category const categoryGrid = document.createElement('div'); categoryGrid.style.cssText = ` display: flex; flex-wrap: wrap; justify-content: center; gap: 15px; margin-bottom: 40px; padding: 20px; background: rgba(139, 69, 19, 0.1); border-radius: 10px; border: 1px solid rgba(139, 69, 19, 0.3); `; // Add weapons to this category availableWeapons.forEach(weaponType => { const weaponData = window.weaponSets[weaponType]; if (weaponData) { const weaponCard = createCompactWeaponCard(weaponType, weaponData); categoryGrid.appendChild(weaponCard); hasWeapons = true; } }); storeGrid.appendChild(categoryGrid); } }); if (!hasWeapons) { storeGrid.innerHTML = '<p style="color: #999; width: 100%; text-align: center;">No weapons available in store.</p>'; } } // Add helper function to check if weapon has corruption effects function hasCorruptionEffect(weaponData) { if (!weaponData.cards) return false; return weaponData.cards.some(card => { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); }); } // Modified createCompactWeaponCard function - fix the background issue function createCompactWeaponCard(weaponType, weaponData) { const isOwned = window.isWeaponOwned(weaponType); const price = window.getWeaponPrice(weaponType); const canAfford = State.variables.Gold >= price; const hasCorruption = hasCorruptionEffect(weaponData); // Create clickable weapon card const weaponCard = document.createElement('div'); weaponCard.style.cssText = ` text-align: center; margin: 8px; width: 180px; border: 2px solid ${isOwned ? '#32cd32' : '#8b4513'}; padding: 12px; border-radius: 8px; background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); transition: all 0.3s; position: relative; cursor: pointer; `; // Make entire card clickable weaponCard.onclick = function() { viewWeaponDetails(weaponType); }; // Add owned badge if owned if (isOwned) { const ownedBadge = document.createElement('div'); ownedBadge.style.cssText = ` position: absolute; top: -8px; right: -8px; background: #32cd32; color: white; padding: 3px 8px; border-radius: 12px; font-size: 10px; font-weight: bold; z-index: 10; `; ownedBadge.textContent = 'OWNED'; weaponCard.appendChild(ownedBadge); } // Weapon image - REMOVE BACKGROUND FOR CORRUPTION IMAGES const imageDiv = document.createElement('div'); const corruptionClass = hasCorruption ? ' weapon-image-corruption' : ''; const backgroundStyle = hasCorruption ? 'transparent' : 'rgba(255,255,255,0.1)'; imageDiv.innerHTML = ` <img src="${weaponData.image}" alt="${weaponData.name}" style="width: 140px; height: 140px; object-fit: cover; border-radius: 4px; background: ${backgroundStyle}; pointer-events: none;" class="${corruptionClass}" onerror="this.style.display='none';"> `; // Rest of the function remains the same... const infoDiv = document.createElement('div'); infoDiv.style.cssText = 'pointer-events: none;'; infoDiv.innerHTML = ` <h4 style="color: #2c1810; margin: 10px 0 8px 0; font-size: 14px;">${weaponData.name}</h4> <p style="color: #2c1810; margin: 3px 0; font-size: 12px;">${weaponData.cards ? weaponData.cards.length : 0} Cards</p> <p style="color: #8b0000; margin: 3px 0; font-weight: bold; font-size: 14px;">💰 ${price}g</p> <p style="color: #666; margin: 5px 0 0 0; font-size: 11px; font-style: italic;">Click to view details</p> `; // Add hover effect weaponCard.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-3px)'; this.style.boxShadow = '0 6px 12px rgba(0, 0, 0, 0.4)'; this.style.borderColor = isOwned ? '#32cd32' : '#cd853f'; }); weaponCard.addEventListener('mouseleave', function() { this.style.transform = 'translateY(0)'; this.style.boxShadow = '0 3px 6px rgba(0, 0, 0, 0.3)'; this.style.borderColor = isOwned ? '#32cd32' : '#8b4513'; }); weaponCard.appendChild(imageDiv); weaponCard.appendChild(infoDiv); return weaponCard; } // Fixed function name and made it global window.closeWeaponDetails = function() { const detailsDiv = document.getElementById('weapon-details'); if (detailsDiv) { detailsDiv.style.display = 'none'; } } // Updated buyWeapon function - now uses proper slot detection window.buyWeapon = function(weaponType) { try { if (window.purchaseWeapon(weaponType)) { console.log(`Successfully purchased ${weaponType}`); // Safely update gold display try { const goldElement = document.getElementById('currentGold'); if (goldElement) { goldElement.textContent = State.variables.Gold; console.log(`Updated gold display to ${State.variables.Gold}`); } else { console.log('currentGold element not found (this is normal on store page)'); } } catch (goldError) { console.error('Error updating gold display:', goldError); } // FIXED Auto-equip using the SAME slot detection as equipment selection try { const weaponData = window.weaponSets[weaponType]; if (weaponData && window.CombatSystem) { // Use the SAME slot detection logic as equipment selection let weaponSlot = null; // Method 1: Check weaponData.slot property (most reliable) if (weaponData.slot) { weaponSlot = weaponData.slot; console.log(`Found slot from weaponData.slot: ${weaponSlot}`); } // Method 2: Check window.weaponSlots (same as equipment selection) if (!weaponSlot && window.weaponSlots) { Object.keys(window.weaponSlots).forEach(slotType => { if (window.weaponSlots[slotType].weapons && window.weaponSlots[slotType].weapons.includes(weaponType)) { weaponSlot = slotType; console.log(`Found slot from weaponSlots: ${weaponSlot}`); } }); } // Method 3: Fallback to storeSlots if (!weaponSlot) { Object.keys(window.storeSlots).forEach(slotType => { if (window.storeSlots[slotType].weapons.includes(weaponType)) { weaponSlot = slotType; console.log(`Found slot from storeSlots: ${weaponSlot}`); } }); } if (weaponSlot) { console.log(`=== EQUIPPING ${weaponData.name} TO ${weaponSlot} SLOT ===`); // STEP 1: Get currently equipped weapon for this slot const currentlyEquipped = window.currentlyEquipped ? window.currentlyEquipped[weaponSlot] : null; console.log(`Currently equipped in ${weaponSlot}: ${currentlyEquipped}`); // STEP 2: Build comprehensive removal list const weaponCardNamesForSlot = []; // Add cards from weaponSlots if available if (window.weaponSlots && window.weaponSlots[weaponSlot] && window.weaponSlots[weaponSlot].weapons) { window.weaponSlots[weaponSlot].weapons.forEach(wType => { if (window.weaponSets[wType] && window.weaponSets[wType].cards) { window.weaponSets[wType].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } }); } // Add cards from currently equipped weapon if (currentlyEquipped && window.weaponSets[currentlyEquipped] && window.weaponSets[currentlyEquipped].cards) { window.weaponSets[currentlyEquipped].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } console.log(`Cards to remove from ${weaponSlot} slot:`, weaponCardNamesForSlot); // STEP 3: Remove existing weapons using COMPREHENSIVE removal const beforeCount = window.CombatSystem.combatInventory.length; console.log(`Inventory before removal: ${beforeCount} cards`); window.CombatSystem.combatInventory = window.CombatSystem.combatInventory.filter(card => { const shouldRemove = ( card.slotType === weaponSlot || weaponCardNamesForSlot.includes(card.name) || (currentlyEquipped && card.weaponType === currentlyEquipped) ); if (shouldRemove) { console.log(`REMOVING: ${card.name} (slot: ${card.slotType || 'none'}, weaponType: ${card.weaponType || 'none'})`); } return !shouldRemove; }); const afterCount = window.CombatSystem.combatInventory.length; console.log(`Inventory after removal: ${afterCount} cards (removed ${beforeCount - afterCount})`); // STEP 4: Add new weapon cards with proper tracking console.log(`Adding ${weaponData.cards.length} cards for ${weaponData.name}:`); weaponData.cards.forEach((card, index) => { const cardWithSlot = { ...card, slotType: weaponSlot, weaponType: weaponType, id: `${weaponSlot}_${weaponType}_${card.name}_${Date.now()}_${index}` }; window.CombatSystem.addCard(cardWithSlot); console.log(`ADDED: ${card.name} to ${weaponSlot} slot`); }); // STEP 5: Update currently equipped tracking if (!window.currentlyEquipped) { window.currentlyEquipped = { dagger: null, medium: null, back: null }; } window.currentlyEquipped[weaponSlot] = weaponType; // STEP 6: Update inventory count and re-render if (window.updateInventoryCount) { window.updateInventoryCount(); } if (window.CombatSystem.render) { window.CombatSystem.render(); } const finalCount = window.CombatSystem.combatInventory.length; console.log(`=== EQUIP COMPLETE ===`); console.log(`Final inventory: ${finalCount} cards`); console.log('Currently equipped:', window.currentlyEquipped); // Debug: Show final inventory state console.log('Final inventory contents:'); window.CombatSystem.combatInventory.forEach(card => { console.log(` - ${card.name} (slot: ${card.slotType || 'none'}) [weapon: ${card.weaponType || 'none'}]`); }); } else { console.error(`Could not determine slot for weapon: ${weaponType}`); } } } catch (equipError) { console.error('Error auto-equipping weapon:', equipError); console.error('Error stack:', equipError.stack); } // REFRESH THE PASSAGE setTimeout(() => { try { // Close weapon details first const detailsDiv = document.getElementById('weapon-details'); if (detailsDiv) { detailsDiv.style.display = 'none'; } // Refresh the passage to show updated state if (typeof Engine !== 'undefined' && Engine.play) { Engine.play(passage()); console.log('Passage refreshed after purchase'); } else if (typeof Story !== 'undefined' && Story.get) { const currentPassage = passage(); Story.get(currentPassage).render(); console.log('Passage refreshed via Story.get'); } else { refreshStore(); console.log('Store refreshed as fallback'); } } catch (refreshError) { console.error('Error refreshing passage:', refreshError); try { refreshStore(); console.log('Store refreshed after passage refresh failed'); } catch (storeError) { console.error('Store refresh also failed:', storeError); } } }, 200); } } catch (mainError) { console.error('Main error in buyWeapon function:', mainError); console.error('Error stack:', mainError.stack); } } // Add debug function for store testing window.debugStoreState = function() { console.log('=== STORE STATE DEBUG ==='); console.log('Currently Equipped:', window.currentlyEquipped); console.log('Owned Weapons:', State.variables.ownedWeapons); console.log('Combat Inventory Cards:', window.CombatSystem?.combatInventory?.map(card => `${card.name} (slot: ${card.slotType || 'none'}) [weapon: ${card.weaponType || 'none'}]`)); console.log('Total Inventory Count:', window.CombatSystem?.combatInventory?.length || 0); // Count cards by slot const slotCounts = { dagger: 0, medium: 0, back: 0, none: 0 }; window.CombatSystem?.combatInventory?.forEach(card => { const slot = card.slotType || 'none'; slotCounts[slot] = (slotCounts[slot] || 0) + 1; }); console.log('Cards by slot:', slotCounts); console.log('========================'); }; function viewWeaponDetails(weaponType) { console.log('Viewing weapon: ' + weaponType); const weaponData = window.weaponSets[weaponType]; if (!weaponData) { alert('Weapon data not found!'); return; } const detailsDiv = document.getElementById('weapon-details'); const contentDiv = document.getElementById('weapon-details-content'); if (!detailsDiv || !contentDiv) { alert('Details container not found!'); return; } // Create detailed view const isOwned = window.isWeaponOwned(weaponType); const price = window.getWeaponPrice(weaponType); const canAfford = State.variables.Gold >= price; let detailsHTML = ` <div style="display: flex; align-items: center; margin-bottom: 30px; gap: 30px;"> <div style="flex-shrink: 0;"> <img src="${weaponData.image}" alt="${weaponData.name}" style="width: 120px; height: 120px; object-fit: contain; border: 2px solid #8b4513; border-radius: 10px; background: rgba(255,255,255,0.1);" onerror="this.style.display='none';"> </div> <div style="flex: 1;"> <h2 style="color: #ffd700; margin: 0 0 15px 0; text-shadow: 0 0 5px #ff8c00;">${weaponData.name}</h2> <p style="color: #ccc; margin: 0 0 15px 0; font-size: 16px; line-height: 1.4;">${weaponData.description || 'A powerful weapon for combat.'}</p> <p style="color: #ffd700; margin: 0; font-weight: bold; font-size: 20px;">💰 Price: ${price} Gold</p> </div> </div> `; // Add cards section if weapon has cards if (weaponData.cards && weaponData.cards.length > 0) { detailsHTML += ` <div style="margin: 30px 0;"> <h3 style="color: #ffd700; text-align: center; margin: 0 0 20px 0; text-shadow: 0 0 5px #ff8c00;">⚔️ Weapon Cards ⚔️</h3> <div class="card-hand" style="background: linear-gradient(to bottom, #3a2a1a 0%, #2a1a0a 100%); border: 2px solid #cd853f; border-radius: 8px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; min-height: 120px; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5);"> `; // Add each card for (let i = 0; i < weaponData.cards.length; i++) { const card = weaponData.cards[i]; detailsHTML += createCardHTML(card); } detailsHTML += '</div></div>'; } // Add purchase section detailsHTML += '<div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #8b4513;">'; if (isOwned) { detailsHTML += '<div style="background: linear-gradient(to right, #006400, #228b22); color: white; border: 2px solid #32cd32; padding: 15px; border-radius: 8px; font-weight: bold; font-size: 18px; text-transform: uppercase; letter-spacing: 1px; display: inline-block;">✅ OWNED</div>'; } else if (canAfford) { detailsHTML += `<button onclick="window.buyWeapon('${weaponType}')" class="execute-combat-btn" style="font-size: 16px; padding: 15px 30px;">🛒 Buy for ${price} Gold</button>`; } else { detailsHTML += '<div style="background: linear-gradient(to right, #8b0000, #a00000); color: white; border: 2px solid #ff4444; padding: 15px; border-radius: 8px; font-weight: bold; font-size: 16px; display: inline-block;">💸 Not enough gold (Need ' + price + ' Gold)</div>'; } detailsHTML += '</div>'; contentDiv.innerHTML = detailsHTML; detailsDiv.style.display = 'block'; // Scroll to details detailsDiv.scrollIntoView({ behavior: 'smooth' }); } // Helper function to check if a single card has corruption effects function cardHasCorruptionEffect(card) { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); } // Keep the existing helper function for weapons function hasCorruptionEffect(weaponData) { if (!weaponData.cards) return false; return weaponData.cards.some(card => { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); }); } function createCardHTML(card) { const cardHasCorruption = cardHasCorruptionEffect(card); // Create card HTML using your existing card styling let cardHTML = '<div class="card'; // Determine card size const hasEffects = card.effects && card.effects.length > 0; const hasDescription = card.description && card.description.length > 50; if (hasEffects && hasDescription) { cardHTML += ' extra-large-content'; } else if (hasEffects || hasDescription) { cardHTML += ' large-content'; } cardHTML += '">'; cardHTML += '<div class="card-content">'; // Card type cardHTML += `<div class="card-type ${card.type || 'weapon'}">${(card.type || 'weapon').toUpperCase()}</div>`; // Card name cardHTML += `<div class="card-name">${card.name}</div>`; // Card image - APPLY GLOW HERE IF CARD HAS CORRUPTION cardHTML += '<div class="card-image">'; if (card.image) { const corruptionClass = cardHasCorruption ? ' card-image-corruption' : ''; cardHTML += `<img src="${card.image}" alt="${card.name}" class="${corruptionClass}" onerror="this.style.display='none'">`; } cardHTML += '</div>'; // Card costs const hasEnergyCost = card.energyCost && card.energyCost > 0; const hasMagicCost = card.magicCost && card.magicCost > 0; if (hasEnergyCost || hasMagicCost) { cardHTML += '<div class="card-costs">'; if (hasEnergyCost) { cardHTML += `<span class="energy-cost">⚡ ${card.energyCost}</span>`; } if (hasMagicCost) { cardHTML += `<span class="magic-cost">🔮 ${card.magicCost}</span>`; } cardHTML += '</div>'; } else { cardHTML += '<div class="card-costs hidden"></div>'; } // Card damage if (card.damage && card.damage > 0) { cardHTML += `<div class="card-damage"> ${card.damage} damage</div>`; } // Card effects - UPDATED TO HANDLE VALUE = 1 CASE if (card.effects && card.effects.length > 0) { cardHTML += '<div class="card-effects">'; let effectsText = ''; for (let k = 0; k < card.effects.length; k++) { const effect = card.effects[k]; if (k > 0) effectsText += ', '; // If value is 1, just show the name, otherwise show name and value if (effect.value === 1) { effectsText += effect.name; } else { effectsText += effect.name + ' ' + effect.value; } } cardHTML += effectsText + '</div>'; } // Card description if (card.description) { cardHTML += `<div class="card-description">${card.description}</div>`; } cardHTML += '</div></div>'; return cardHTML; } window.refreshStore = function() { try { // Safely update any elements in refreshStore const goldElement = document.getElementById('currentGold'); if (goldElement) { goldElement.textContent = State.variables.Gold; } // Add any other refresh logic here with similar safety checks console.log('Store refresh completed'); } catch (error) { console.error('Error in refreshStore:', error); console.error('Error stack:', error.stack); } } function forceDisplayWeapons() { console.log('Force displaying weapons...'); const storeGrid = document.getElementById('weapon-store-grid'); if (storeGrid) { storeGrid.innerHTML = '<p style="color: yellow; width: 100%; text-align: center;">Forcing display...</p>'; } // Try to display after a short delay setTimeout(function() { try { displayAllStoreWeapons(); console.log('Force display completed'); } catch (error) { console.error('Force display error:', error); if (storeGrid) { storeGrid.innerHTML = '<p style="color: red; width: 100%; text-align: center;">Error: ' + error.message + '</p>'; } } }, 500); } // Initialize when page loads setTimeout(function() { console.log('WeaponStore initializing...'); displayAllStoreWeapons(); }, 500); <</script>>
<<nobr>> <div class="text-box"> Your arrow strikes the center target, scoring you 10 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<include "BowGameLines">> <<set _line = either(_midHitLine)>> <<say 'Huntress' _img>>_line<</say>> <<set $PlayerArcheryScore to $PlayerArcheryScore + 10>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore<br><br> <<button "Her turn">> <<if $Position is "Strip">> <<goto "NPCArrowShotStrip">> <<else>> <<goto "NPCArrowShot">> <</if>> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> You exit the lift and enter the mine. The first thing you noice is the near silence of the place... shouldn't it be full of workers making noise?<br><br> <<if $Candles gt 0>> You light a candle and head into the mine <<set $CandleBurn to 10>><br><br> [[Continue|Mine2]]<br><br> <<else>> You don't have any candles so you can't continue<br><br> <</if>> [[Leave|Ironpeak Outpost]] <</nobr>> </div> <<script>> if (!window.gameAudio) { window.gameAudio = new Audio("Audio/Mine.mp3"); window.gameAudio.loop = true; } <</script>> <<script>> window.gameAudio.play(); <</script>> <<stopblizzard>>
<div class="text-box"> <<nobr>> <<if ($CandleBurn lt 4) and ($CandleBurn gt 0)>> Your candel is dimming you have $Candles left<br><br> <<set $CandleBurn to CandleBurn - 1>> <<elseif $CandleBurn is 0>> Your candle burns out <<if $Candles gt 0>> you have none left to burn<</if>><</if>> <</nobr>> </div> [[Mine3]]
<div class="text-box"> <<nobr>> You see a man working loaning a cart with rubble<br><br> <span style="color: #8CC5F3;">Miner: You seem lost... Main shaft is to the right... then take a left, keep your candle lit</span><br><br> You think about asking him a question, but he turn saway quickly and returns to work<br><br> [[Left Tunnel|MineLeft1]]<br><br> [[Right Tunnel|MineRight1]]<br><br> [[Stright|MineWoman1]] <</nobr>> </div>
<div class="text-box"> <<nobr>> [[Left|Level1Shaft]]<br><br> [[Stright|Lift]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <div align="center"> <img src="Images/Mountains/Ironpeak/Mine/Miners/4.png" width="700" height="700"></div><br><br> <span style="color: #FF1493;">Woman: Good evening, or whatever time it is... </span><br><br> <<You>>How long have you been down here<</You>><br><br> <span style="color: #FF1493;">Woman: I'm not sure, we have some bunks on the level below</span><br><br> <<You>>Below?<</You>><br><br> <span style="color: #FF1493;">Woman: Yes, the mine has 3 levels, we're on level one, level two is a larger, I don't advise going to level 3</span><br><br> <<You>>Level 3?<</You>><br><br> <span style="color: #FF1493;">Woman: I'm sorry, I won't speak on this further, either grab a pick and help, or leave. Thank you</span><br><br> <<Thoughts>>She seems nervous about the the deeper levels of the mine...<</Thoughts>><br><br> [[Leave|Mine3]] <</nobr>> </div>
<<nobr>> <div class="text-box"> Your arrow goes wide, scoring you 0 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<include "BowGameLines">> <<set _line = either(_missHitLine)>> <<say 'Huntress' _img>>_line<</say>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore<br><br> <<button "Her turn">> <<if $Position is "Strip">> <<goto "NPCArrowShotStrip">> <<else>> <<goto "NPCArrowShot">> <</if>> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $CurrentEnemy is "Ghoul">> The arrow flys past its intended target, striking a tree off in the distance... Theres a long pause of absolute silence, and then the figure slowly turns to look at you... <<link "Continue">><<run Engine.play('GhoulQuest2')>><</link>> <</if>> <<if $CurrentEnemy is "Armored Bandit">> Your arrow goes wide, missing the bandit<br><br> [[Combat]] <</if>> <<if $CurrentEnemy is "Werewolf">> The arrow goes wide, missing the werewolf... The beast bounds towards you unphased<br><br> Before you can draw another arrow, it is on you. The beast pins you to a tree and grabs your head, pulling it back and exposing your neck..<br><br> Without a moment on hesitation the werewolf bites down on the neck and tairs out your throat<br><br> The life drains from you and you feel youself pass<br><br> <<set $PlayerHealth to 0>> [[Continue|Resporn]] <</if>> <<if ($OldPosition is "bet") or ($OldPosition is "betDouble")>> Your arrow goes wide, scoring you 0 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<say 'Huntress' _img>>Ha, your lucky I'm only taking your gold today!<</say>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore <<if $Int lt 3>> <<button "Her turn">> <<goto "NPCArrowShot">> <</button>> <<else>> <<button "The game is over">> <<goto "ArrowGameOver">> <</button>> <</if>> <</if>> </div> <audio autoplay> <source src="Audio/ArrowShot.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <</nobr>>
<div class="text-box"> <<nobr>> You continue up the mountain, searching for any signs of life<br><br> Before long, your in thick snow and the weather is getting worse... Prehaps you were under prepaired for this<br><br> It's so cold<br><br> [[Walk on|Mountain2]] <</nobr>> </div> <<stopblizzard>>
<div class="text-box"> <<nobr>> A mile further... the wind has picked up and its brought the snow<br><br> <<You>>Fuck...<</You>><br><br> Its too late to turn around, you need to find shelter!<br><br> [[search for somewhere to wait out the storm|Mountain3]] <</nobr>> </div> <<startblizzard>> <audio autoplay loop> <source src="Audio/Blizzard.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio>
<div class="text-box"> <<nobr>> You're freezing and your limbs are starting to stiffen, you take a cloth from your bag and, use it to cover your face<br><br> Then, in the distance, you see a cave in the cliff side<br><br> [[Go|MountainCave1]] <</nobr>> </div> <audio autoplay loop> <source src="Audio/Blizzard.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio>
<div class="text-box"> <<nobr>> You see the cave and head for the entrance, hoprfully you can cast a fire spell on something which will burn to keep you warm...<br><br> [[Enter|MountainCave2]] <br><br> <div align="center"> <img src="Images/Mountains/Cave/1.png" width="700" height="700"> </div> <</nobr>> </div> <audio autoplay loop> <source src="Audio/Blizzard.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> ,
<div class="text-box"> <<nobr>> You stagger into the cave, it deeper than you thought... Going much further than you can see. <br><br> The wind is no longer howeling, and you can hear the echo of your boots on the floor of the cave<br><br> After looking around, you find a skeleton on the floor, still covered in its old clothes... You , you cast your fire spell and ignite the rags, giving you light and a small but welcome amount of warmth.<br><br> You sit by the fire and feel your joints begin to work again, there isnt much to do but wait out the blizzard, so you <<link "sleep...">><<fadeToPassage "MountainCave3">><</link>> <</nobr>> </div> <audio autoplay loop> <source src="Audio/Fire.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<stopblizzard>>
<<script>> $(function() { toggleDarkEdges(true); }); <</script>> <div class="text-box"> <<nobr>> You waken with a start and sit up, the fire has died down to embers and the sound replaced with... Somthing<br><br> You sit up and strain to hear the sounds...<br><br> <<Thoughts>>What is that?<</Thoughts>> Thats when it dawns on you... Those, were whispers<br><br> [[You stand|MountainCave4]] <</nobr>> </div> <audio id="myAudio" src="Audio/CaveWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.1; audio.play(); }); <</script>>
<<script>> $(function() { toggleDarkEdges(true); }); <</script>> <div class="text-box"> <<nobr>> You stand and the whispers grow louder...<br><br> You look over to the flame and see its close to dying, the cave is now very dark<br><br> You could stay put... or you could try to reignite the fire<br><br> [[Stay|MountainCaveStay]]<br><br> [[Try to escape|MountainCaveLeave]] <</nobr>> </div> <audio id="myAudio" src="Audio/CaveWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.3; audio.play(); }); <</script>>
<<script>> $(function() { toggleDarkEdges(true); }); <</script>> <div class="text-box"> <<nobr>> Turning away from the flmaes, you make a break for the exit<br><br> The whispers have become louder now and are appear to be coming from behind you, chasing you to the mouth of the cave<br><br> You get closer and see the exit, but before you get close enough, you stumble on a rock and crash to the [[ground|Encounter_Ida]] <</nobr>> </div> <audio id="myAudio" src="Audio/CaveWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.5; audio.play(); }); <</script>>
<<script>> $(function() { toggleDarkEdges(true); }); <</script>> <div class="text-box"> <<nobr>> You try using your remaining magical power to start the fire... But its hopeless<br><br> <<set $PlayerMagic to 0>> The clothes and bones have been burned to ash leaving nothing but black clumps of dust on the floor<br><br> The whispers have grown louder, so you draw your sword and prepair for whatever is in the shaddows<br><br> [[Hold|MountainCaveSuccubus]] <</nobr>> </div> <audio id="myAudio" src="Audio/CaveWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.5; audio.play(); }); <</script>>
<<script>> $(function() { toggleDarkEdges(true); }); <</script>> <div class="text-box"> <<nobr>> You peer into the darkness, straining your eyes to see something<br><br> All you can hear is the whispers and now screams of the dammed from the void<br><br> Thats when you see her, the demon you first encountered in the crypt... The succubus<br><br> <div align="center"> <img src="Images/Mountains/Cave/5.png" width="700" height="700"> </div> Knowing you cannot win this fight, you turn and run for the exit of the [[cave|MountainCaveLeave]] <</nobr>> </div> <audio id="myAudio" src="Audio/CaveWhispers.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.5; audio.play(); }); <</script>>
<div class="demo-end"> <h1>Thank you for playing!</h1> <div class="message"> Sorry! This is the end of the demo version There will be a public update soon with the following: Better combat More female protagonist content New RPG mechanics Base Building Content And more! I just can't think of anything rn <<set $VidPath to "Images/Mountains/1.webp">> <div align="centre">[img[$VidPath]]</div> </div> <<return "Back">> </div>
<<nobr>> <div class="text-box"> You set out into the white snow covered mountains, the path makes walking easier than the snow, but the rocks are still uneven and slippery with ice.<br><br> <<if $QuarryDiscovered isnot true>> <<button "Explore">> <<goto "QuaryDiscovered">> <</button>><br><br> <<else>> <<button "Visist the Quarry">> <<goto "NorthQuarry">> <</button>><br><br> <</if>> <<if $IdaDeerQuest is true>> <<button "Search for Ida's traps">> <<set $Position to "null">> <<goto "IdaTrap1">> <</button>><br><br> <</if>> <<button "Return to Ironpeak">> <<goto "IronpeakOutpost">> <</button>> </div> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Mountains/Quary/1.png">> <div class="text-box"> This is your quarry you have $QuarryStaff slaves working here, and a guard to make sure they do not escape. <<button "Return to Ironpeak">> <<goto "Ironpeak Outpost">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<set $Time to 4>> You arrive at the north, the area have become more mountainous and you feel the air becoming colder...<br><br> You come to a passage leading up the mountain... It is too steep and narrow for your horse, so you leave him here<br><br> After hours of riding, you find yourself at the base of a mountain range.<br> [[Continue on foot|Mountain1]] <</nobr>> </div>
<<nobr>> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> The huntress nocks her arrow and takes aim... <div id="target" style="width: 200px; height: 200px; border: 2px solid black; position: relative; margin: 20px auto; background: radial-gradient(circle, red 10%, black 10%, black 30%, red 30%, red 60%, black 60%);"> <div id="arrow" style="width: 20px; height: 20px; position: absolute; pointer-events: none; display: none;"> <div style="position: absolute; width: 100%; height: 2px; background-color: white; top: 50%; left: 0;"></div> <div style="position: absolute; width: 2px; height: 100%; background-color: white; left: 50%; top: 0;"></div> </div> </div> <div id="result"></div> <div id="criticalText" class="outcomeText" style="display: none;"> Her arrow flies true, striking the dead center of the target with incredible precision. </div> <div id="woundingText" class="outcomeText" style="display: none;"> The arrow strikes near the center - a solid shot, if not perfect. </div> <div id="missText" class="outcomeText" style="display: none;"> Her shot goes wide, missing the intended mark. </div> <div id="continueSection" style="display: none;"> <div id="scoreDisplay"></div> <<button "Next">><<goto "BowStripGame2">><</button>> </div> <<script>> $(document).ready(function() { const target = $('#target'); const arrow = $('#arrow'); const result = $('#result'); const continueSection = $('#continueSection'); const centerX = target.width() / 2; const centerY = target.height() / 2; const targetAccuracy = Math.random() * 45; const targetAngle = Math.random() * Math.PI * 2; const finalX = centerX + Math.cos(targetAngle) * targetAccuracy; const finalY = centerY + Math.sin(targetAngle) * targetAccuracy; setTimeout(function() { arrow.css({ left: finalX + 'px', top: finalY + 'px', display: 'block' }); const distance = Math.sqrt(Math.pow(centerX - finalX, 2) + Math.pow(centerY - finalY, 2)); let outcome; let scoreChange = 0; if (distance < 20) { outcome = "Critical Hit"; scoreChange = 20; $('#criticalText').show(); } else if (distance < 60) { outcome = "Wounding Hit"; scoreChange = 10; $('#woundingText').show(); } else { outcome = "Miss"; $('#missText').show(); } State.variables.NPCArcheryScore += scoreChange; result.html("The huntress's shot: " + outcome); $('#scoreDisplay').html( "Your score: " + State.variables.PlayerArcheryScore + "<br>" + "Her score: " + State.variables.NPCArcheryScore ); continueSection.fadeIn(1000); }, 2000); }); <</script>> </div> <</nobr>>
<<nobr>> <<include "BowGameLines">> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <div class="text-box"> The huntress nocks her arrow and takes aim... <div id="target" style="width: 200px; height: 200px; border: 2px solid black; position: relative; margin: 20px auto; background: radial-gradient(circle, red 10%, black 10%, black 30%, red 30%, red 60%, black 60%);"> <div id="arrow" style="width: 20px; height: 20px; position: absolute; pointer-events: none; display: none;"> <div style="position: absolute; width: 100%; height: 2px; background-color: white; top: 50%; left: 0;"></div> <div style="position: absolute; width: 2px; height: 100%; background-color: white; left: 50%; top: 0;"></div> </div> </div> <div id="result"></div> <div id="criticalText" class="outcomeText" style="display: none;"> Her arrow flies true, striking the dead center of the target with incredible precision. <<if $Int lt 4>><<set _line = either(_herCritHitLine)>><<else>> <<set _line = either(_herCritLewdHitLine)>><</if>> <<say 'Huntress' _img>>_line<</say>> </div> <div id="woundingText" class="outcomeText" style="display: none;"> The arrow strikes near the center - a solid shot, if not perfect. <<if $Int lt 4>><<set _line = either(_herMidHitLine)>><<else>> <<set _line = either(_herMidLewdHitLine)>><</if>> <<say 'Huntress' _img>>_line<</say>> </div> <div id="missText" class="outcomeText" style="display: none;"> Her shot goes wide, missing the intended mark. <<if $Int lt 4>><<set _line = either(_herMissHitLine)>><<else>> <<set _line = either(_herMissLewdHitLine)>><</if>> <<say 'Huntress' _img>>_line<</say>> </div> <div id="continueSection" style="display: none;"> <div id="scoreDisplay"></div> <<if $Int is 3>><<button "The Game is over">><<goto "BowGameOver">><</button>> <<elseif $Int is 6>><<button "The Game is over">><<goto "BowGameOver2">><</button>> <<else>><<button "Your turn">><<goto "BowGame">><</button>><</if>> </div> <<script>> $(document).ready(function() { const target = $('#target'); const arrow = $('#arrow'); const result = $('#result'); const continueSection = $('#continueSection'); const centerX = target.width() / 2; const centerY = target.height() / 2; const targetAccuracy = Math.random() * 45; const targetAngle = Math.random() * Math.PI * 2; const finalX = centerX + Math.cos(targetAngle) * targetAccuracy; const finalY = centerY + Math.sin(targetAngle) * targetAccuracy; setTimeout(function() { arrow.css({ left: finalX + 'px', top: finalY + 'px', display: 'block' }); const distance = Math.sqrt(Math.pow(centerX - finalX, 2) + Math.pow(centerY - finalY, 2)); let outcome; let scoreChange = 0; if (distance < 20) { outcome = "Critical Hit"; scoreChange = 20; $('#criticalText').show(); } else if (distance < 60) { outcome = "Wounding Hit"; scoreChange = 10; $('#woundingText').show(); } else { outcome = "Miss"; $('#missText').show(); } State.variables.NPCArcheryScore += scoreChange; result.html("The huntress's shot: " + outcome); $('#scoreDisplay').html( "Your score: " + State.variables.PlayerArcheryScore + "<br>" + "Her score: " + State.variables.NPCArcheryScore ); continueSection.fadeIn(1000); }, 2000); }); <</script>> </div> <</nobr>>
<<nobr>> <<include "CharmArrays">> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> </div> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> /* Get the NPC's building */ <<set _buildingId = $currentNPC.building>> /* Get all NPCs living in that building with safety checks */ <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<set _housemates = _location.populatedBuildings[_buildingId]>> <<set _totalResidents = _housemates.length>> <</if>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <div class="text-box"> <div id="peek-animation" style="text-align: center; margin: 20px;"> Their interest: $currentNPC.interested<br> Lucy's skill: $LucyPower<br> Attracted: $currentNPC.attracted<br> <<set $Int to $currentNPC.interested + $LucyPower>> <<if $Int gt 100>><<set $Int to 100>><</if>> <<if $currentNPC.attracted is "No">> <<set $Int to $Int / 2>><</if>> Success chance: <b>$Int%</b><br> <<if _NPCType is "Man">> <<set _line = either(_maleCharmLines)>> <<elseif _NPCType is "Woman">> <<set _line = either(_femaleCharmLines)>> <<else>> <<set _line = either(_guardCharmLines)>> <</if>> <<button "Attempt to charm them">> <<set _roll to random(1, 100)>> <<replace "#peek-animation">> <div class="roll-container"> <div class="roll-text">🎲 You try to charm them...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>20</span> <span>50</span> <span>80</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <<Lucy>>_line<</Lucy>> <</replace>> <<replace "#peek-result">> <<if _roll <= $Int>> <div class="success-message"> The $currentNPC.sex smiles at you (charm Check: _roll)<br><br> <<if _NPCType is "Man">> <<set _line = either(_malePositiveResponses)>> <<elseif _NPCType is "Woman">> <<set _line = either(_femalePositiveResponses)>> <<else>> <<set _line = either(_guardPositiveResponses)>> <</if>> <<say '_NPCType' _imagePath>>_line<</say>><br><br> <<if $currentNPC.interested <= 70>> <<set _int to $currentNPC.interested + 30>> <<else>> <<set _int to 100>> <</if>> <<updateNPC "interested" _int>> <<button "Finish">> <<goto "TalkToNPC">> <</button>> </div> <<else>> <div class="fail-message"> The $currentNPC.sex frowns at you (Failed charm Check: _roll)<br><br> <<if _NPCType is "Man">> <<set _line = either(_maleDismissiveResponses)>> <<elseif _NPCType is "Woman">> <<set _line = either(_femaleDismissiveResponses)>> <<else>> <<set _line = either(_guardDismissiveResponses)>> <</if>> <<say '_NPCType' _imagePath>>_line<</say>><br><br> They close the door on you<br><br> <<button "Leave">> <<updateNPC "interested" 0>> <<goto "LucyScout">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="peek-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> </div> <<widget "updateNPC">> /* Parameters: property, value */ <<set $currentNPC[$args[0]] = $args[1]>> /* Update in outdoor NPCs array */ <<set _location = $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<run _location.outdoorNPCs.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> /* Update in populated buildings */ <<for _buildingId, _residents range _location.populatedBuildings>> <<run _residents.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> <</for>> <</widget>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _imagePath to $ImagePath>> <div class="text-box"> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<if _NPCType is "Woman">> <<if $Position is "Kill">> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> She cums, moaning far too loud for your liking but after a moment of bliss, you feel her soul leave her and her knees give way...<br><br> You cant help but feel back for her, but then again, her life will serve a greater perpouse<br><br> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$currentNPC.building]>> /* Remove NPC from their building */ <<if _building>> <<set _index = _building.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _index !== -1>> <<run _building.splice(_index, 1)>> <</if>> <</if>> /* Remove from outdoor NPCs if they're outside */ <<if _location.outdoorNPCs>> <<set _outdoorIndex = _location.outdoorNPCs.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _outdoorIndex !== -1>> <<run _location.outdoorNPCs.splice(_outdoorIndex, 1)>> <</if>> <</if>> <<set $currentNPC to null>> <<else>> She cums, moaning far too loud for your liking but after a moment of bliss, her knees give in and you catch her, lowering her to the floor<br><br> <<Lucy>>That was fun, I need to get going, but Ill let you catch your breath<</Lucy>><br><br> <</if>> <<else>> <<if $Position is "Kill">> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> Hes a sweet boy, and you feel bad for a moment... But you take his soul and take solice in the fact that his last moment felt great<br><br> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$currentNPC.building]>> /* Remove NPC from their building */ <<if _building>> <<set _index = _building.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _index !== -1>> <<run _building.splice(_index, 1)>> <</if>> <</if>> /* Remove from outdoor NPCs if they're outside */ <<if _location.outdoorNPCs>> <<set _outdoorIndex = _location.outdoorNPCs.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _outdoorIndex !== -1>> <<run _location.outdoorNPCs.splice(_outdoorIndex, 1)>> <</if>> <</if>> <<set $currentNPC to null>> <<else>> <<say '_NPCType' _imagePath>>Fuck!<</say>><br><br> <<Lucy>>Sush!<</Lucy>><br><br> <<say '_NPCType' _imagePath>>Sorry... Hey, are you looking for a husband?<</say>><br><br> <<Lucy>>Ha, no just a good fuck and you did that... I should be going<</Lucy>><br><br> <<say '_NPCType' _imagePath>>Well, you know where to find me<</say>><br><br> <</if>> <</if>> <<button "Return to the settlement">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _imagePath to $ImagePath>> <div class="text-box"> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<if _NPCType is "Woman">> <<say '_NPCType' _imagePath>>You're beautiful! I don't normally...<</say>><br><br> <<Lucy>>So lets start slow<</Lucy>><br><br> You sit down and kiss, letting her take this at her own speed<br><br> <<set _int to random(8, 9)>> <<set _path to "Images/Raids/Lucy/Outdoor/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<Lucy>>Stand up for me please<</Lucy>><br><br> She does so, and you unclip her skirt and it drops away from her tunic and around her ankes<br><br> <<Lucy>>Turn around<</Lucy>><br><br> <<set _int to random(5, 7)>> <<set _path to "Images/Raids/Lucy/Outdoor/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<say '_NPCType' _imagePath>>God's!<</say>><br><br> You explore her holes and quicly find her getting close<br><br> <<button "Take her soul">> <<set $Position to "Kill">> <<goto "NPCSeduceOutside2">> <</button>><br><br> <<button "Spare her">> <<set $Position to "Spare">> <<goto "NPCSeduceOutside2">> <</button>><br><br> <<else>> The man takes your hand and leads you into the woods, you can still see the settlement, but this must just be adding to his thrill<br><br> He seems like a nice man as he runs his hands over your dress, feeling your body beneith<br><br> <<say '_NPCType' _imagePath>>God's your perfect<</say>><br><br> <<Lucy>>You're too kind, so what do you like?<</Lucy>><br><br> <<say '_NPCType' _imagePath>>Please, turn around for me, you have something hiding under that dress which I need to see<</say>><br><br> You spin around playfully and lean against a tree, letting the man kneel and explore your ass<br><br> <<set _int to random(1, 4)>> <<set _path to "Images/Raids/Lucy/Outdoor/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<Lucy>>Fuck, you have a magic tounge<</Lucy>><br><br> He pushes his face deep into you and explores your holes, you respond by rocking your hips back and forth, extracting as much pleasure from his mouth as you can<br><br> <<Lucy>>T-thank you, let me repay the favor<</Lucy>><br><br> You drop to your knees as he rises from his, it takes you a few moment to release his manhood from his clothes and you set to work inhailing it<br><br> <<set _int to random(10, 12)>> <<set _path to "Images/Raids/Lucy/Outdoor/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> <<say '_NPCType' _imagePath>>Oh my fucking God's!<</say>><br><br> <<Lucy>>Shush, keep it down or I'll fill that mouth of yours again<</Lucy>><br><br> <<say '_NPCType' _imagePath>>Doesn't sound too bad...<</say>><br><br> You continue like this, bobbing your head back and forth for a few minuets befor his breaths get louder and shorter<br><br> <<Lucy>>Oh no, were not done here<</Lucy>><br><br> You release his cock and stand up, before bending forward showing him your ass<br><br> <<Lucy>>What are you waiting -<</Lucy>><br><br> He grabs your ass and slides his slick cock into you<br><br> <<Lucy>>For...<</Lucy>><br><br> <<set _int to random(13, 14)>> <<set _path to "Images/Raids/Lucy/Outdoor/" + _int + ".png">> <div class="Random-image"> <img @src=_path alt="Guest Image"> </div><br><br> He hammers at you, too excited to care about your pleasure, but you don't mind. After an unsuprisingly shot amount of time, his breaths get shorter and his grip on your ass gets tighter<br><br> <<Lucy>>You can cum inside<</Lucy>><br><br> That was enough for him, his cock throbs and a warmth flows into you<br><br> <<button "Take his soul">> <<set $Position to "Kill">> <<goto "NPCSeduceOutside2">> <</button>><br><br> <<button "Let him live">> <<set $Position to "Spare">> <<goto "NPCSeduceOutside2">> <</button>><br><br> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> </div> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> /* Get the NPC's building */ <<set _buildingId = $currentNPC.building>> /* Get all NPCs living in that building with safety checks */ <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<set _housemates = _location.populatedBuildings[_buildingId]>> <<set _totalResidents = _housemates.length>> <</if>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<if $Position is "caughtseduce">> <<Lucy>>You don't need to do that... I'm sure I can make it up to you<</Lucy>><br> <<say '_NPCType' _imagePath>>Oh so you're a thief and a whore<</say>> <</if>> <div class="text-box"> <div id="peek-animation" style="text-align: center; margin: 20px;"> Their interest: $currentNPC.interested<br> Lucy's skill: $LucyPower<br> Attracted: $currentNPC.attracted<br> <<set $Int to $currentNPC.interested + $LucyPower>> <<if $Int gt 100>><<set $Int to 100>><</if>> <<if $currentNPC.attracted is "No">> <<set $Int to $Int / 2>><</if>> Success chance: <b>$Int%</b><br> <<button "Attempt to seduce them">> <<set _roll to random(1, 100)>> <<replace "#peek-animation">> <div class="roll-container"> <div class="roll-text">🎲 You try to seduce them...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>20</span> <span>50</span> <span>80</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#peek-result">> <<if _roll <= $Int>> <div class="success-message"> <<set $currentNPC.met to true>> <<set $currentNPC.interested to 100>> The $currentNPC.sex smiles at you (Seduction Check: _roll)<br><br> <<if $SettlementLocation is "Door">> <<if $Position is "caughtseduce">> <<set _LucyCaught to true>> <<if _NPCType is "Woman">> <<say '_NPCType' _imagePath>>I have family here, but you are attractive... I suppose you could make this up to me... let's find somewhere quiet outside<</say>><br><br> <<set $Position to "Outdoor">> <<else>> <<say '_NPCType' _imagePath>>Well... Since you offered yourself so nicely you can come with me<</say>><br><br> <</if>> <<else>> <<if _NPCType is "Guard">> <<say '_NPCType' _imagePath>>Why don't you come in, I can show you around the guard house<</say>><br><br> <<elseif _NPCType is "Man">> <<say '_NPCType' _imagePath>>Why don't you come inside<</say>><br><br> <<else>> <<say '_NPCType' _imagePath>>I have family at home, let's find somewhere quiet<</say>><br><br> <<set $Position to "Outdoor">> <</if>> <</if>> <<set _room to $currentNPC.currentRoom>> <<set _int to random(1, 7)>> <</if>> <<if $SettlementLocation is "Outdoor">> <<if _NPCType is "Woman">> <<say '_NPCType' _imagePath>>I have family at home, let's find somewhere quiet<</say>><br><br> <<set $Position to "Outdoor">> <<else>> <<if _totalResidents is 1>> <<say '_NPCType' _imagePath>>Let's go back to my house<</say>><br><br> <<set $Position to "Indoor">> <<else>> <<say '_NPCType' _imagePath>>I have family at home, let's find somewhere quiet<</say>><br><br> <<set $Position to "Outdoor">> <</if>> <</if>> <</if>> <<button "Follow">> <<if ($SettlementLocation is "Outdoor") and ($Position is "Outdoor") or _NPCType is "Woman">> <<goto "NPCSeduceOutside">> <<else>> <<if $SettlementLocation is "Door">> <<if _room.includes("Bedroom ")>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + _int + ".png">> <<elseif _room.includes("Kitchen")>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Kitchen/" + _int + ".png">> <<elseif _room.includes("Living")>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/" + _int + ".png">> <</if>> <</if>> <<if _LucyCaught is true>> <<goto "SettlementCaughtFuck">> <<else>> <<if _NPCType is "Guard">> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/" + _int + ".png">> <<set $Int to 0>> <<goto "GuardNPCSeduce">> <<else>> <<set $Position to "Start">> <<set $Int to 3>> <<goto "MaleNPCSeduce">> <</if>> <</if>> <</if>> <</button>> </div> <<else>> <div class="fail-message"> The $currentNPC.sex frowns at you (Failed Seduction Check: _roll)<br><br> <<if $Position is "caughtseduce">> <<say '_NPCType' _imagePath>>That isn't going to work whore<</say>><br><br> <<button "Next">> <<goto "SettlementCaught2">> <</button>> <<else>> <<if $SettlementLocation is "Outdoor">> <<say '_NPCType' _imagePath>>I'm sorry I have to go<</say>><br><br> They walk away from you<br><br> <<else>> <<say '_NPCType' _imagePath>>I'm sorry I have to go<</say>><br><br> They close the door on you<br><br> <</if>> <<button "Leave">> <<updateNPC "interested" 0>> <<goto "LucyScout">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="peek-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> </div> <<widget "updateNPC">> /* Parameters: property, value */ <<set $currentNPC[$args[0]] = $args[1]>> /* Update in outdoor NPCs array */ <<set _location = $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<run _location.outdoorNPCs.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> /* Update in populated buildings */ <<for _buildingId, _residents range _location.populatedBuildings>> <<run _residents.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> <</for>> <<goto "TalkToNPC">> <</widget>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> You continue walking through the fields on the outskirts of the town. Until you encounter a girl working on the farm... <<if ($AliceQuestStatus is "Over") or ($AliceCorrupt is true)>> There's nothing else to do here for now... <<button "Leave">><<set $TownLocation to "Images/Town/5.png">><<goto "Town">><</button>> <<else>> <<if $AliceQuest is true>> [[Visit Alice]] <<else>> <<button "Speak to the Girl">> <<goto "Encounter_Alice">> <</button>> <</if>> <</if>> </div>
It is a privilege to see you again, my lord. How may I be of service? Welcome back, honored one. Your presence brings light to these halls. Your return is most welcome. How fares your quest? My lord, it gladdens the heart to see you safe and well. Your return brings great honor to this humble place. How might we assist you?
<h2>Passage Browser</h2> <div id="search-container"> <input type="text" id="passage-search" placeholder="Search passages..." /> </div> <div id="passage-list"> <!-- Passages will be populated here --> </div> <<script>> $(document).ready(function() { var allPassages = []; var debugInfo = []; // Method 1: Try using the global passages object if (typeof passages !== 'undefined') { debugInfo.push("Using global passages object"); try { var passageKeys = Object.keys(passages); debugInfo.push("Found " + passageKeys.length + " keys in passages object"); passageKeys.forEach(function(key) { var passage = passages[key]; if (passage && (passage.name || passage.title)) { allPassages.push({ name: passage.name || passage.title || key, tags: passage.tags || [] }); } }); } catch (e) { debugInfo.push("Error with passages object: " + e.message); } } // Method 2: Try using Story.lookup() to get all passages if (allPassages.length === 0 && typeof Story !== 'undefined' && Story.lookup) { debugInfo.push("Trying Story.lookup()"); try { // Story.lookup() can find passages by tag, empty string might return all var foundPassages = Story.lookup("tags", ""); if (foundPassages && foundPassages.length > 0) { debugInfo.push("Story.lookup found " + foundPassages.length + " passages"); foundPassages.forEach(function(passage) { if (passage && (passage.title || passage.name)) { allPassages.push({ name: passage.title || passage.name, tags: passage.tags || [] }); } }); } else { // Try different lookup approaches var lookupMethods = [ function() { return Story.lookup("tags"); }, function() { return Story.lookup(""); }, function() { return Story.lookupWith(function() { return true; }); } ]; lookupMethods.forEach(function(method, index) { try { if (allPassages.length === 0) { var result = method(); if (result && result.length > 0) { debugInfo.push("Lookup method " + index + " found " + result.length + " passages"); result.forEach(function(passage) { if (passage && (passage.title || passage.name)) { allPassages.push({ name: passage.title || passage.name, tags: passage.tags || [] }); } }); } } } catch (e) { debugInfo.push("Lookup method " + index + " error: " + e.message); } }); } } catch (e) { debugInfo.push("Story.lookup error: " + e.message); } } // Method 3: Try iterating through passage IDs or names if (allPassages.length === 0) { debugInfo.push("Trying to iterate through passages"); // Try common passage naming patterns or iterate through possible IDs var testNames = ['Start', 'Passage Browser', 'StoryTitle', 'StoryInit']; var workingNames = []; testNames.forEach(function(name) { try { var passage = Story.get(name); if (passage) { workingNames.push(name); } } catch (e) { // Ignore errors } }); debugInfo.push("Test passages found: " + workingNames.join(', ')); // If Story.get works, try to find a way to get all passage names if (workingNames.length > 0) { // Try accessing internal properties that might list all passages try { // Check if Story has internal passage storage var storyProps = Object.getOwnPropertyNames(Story); debugInfo.push("Story internal properties: " + storyProps.join(', ')); storyProps.forEach(function(prop) { try { var value = Story[prop]; if (value && typeof value === 'object' && !Array.isArray(value)) { var keys = Object.keys(value); if (keys.length > 50) { // Likely passage storage debugInfo.push("Large Story property found: " + prop + " (" + keys.length + " items)"); // Try to extract passages from this property keys.forEach(function(key) { try { var item = value[key]; if (item && (item.title || item.name)) { allPassages.push({ name: item.title || item.name, tags: item.tags || [] }); } } catch (e) { // Skip problematic items } }); } } } catch (e) { // Skip properties that can't be accessed } }); } catch (e) { debugInfo.push("Error accessing Story internals: " + e.message); } } } console.log("Debug info:", debugInfo.join('\n')); console.log("Found passages:", allPassages.length); // Filter out special passages var filteredPassages = allPassages.filter(function(passage) { var specialPassages = ['StoryTitle', 'StoryData', 'StoryInit', 'PassageBrowserStyles']; var isStylesheet = passage.tags.includes('stylesheet'); var isScript = passage.tags.includes('script'); var isSpecial = specialPassages.includes(passage.name); return !isStylesheet && !isScript && !isSpecial; }); // Remove duplicates var uniquePassages = []; var seenNames = new Set(); filteredPassages.forEach(function(passage) { if (!seenNames.has(passage.name)) { seenNames.add(passage.name); uniquePassages.push(passage); } }); // Sort alphabetically uniquePassages.sort(function(a, b) { return a.name.localeCompare(b.name); }); function renderPassages(passagesToShow) { var html = '<div class="passage-count">Showing ' + passagesToShow.length + ' passages</div>'; html += '<ul class="passage-browser-list">'; passagesToShow.forEach(function(passage) { var tagsHtml = passage.tags.length > 0 ? '<span class="passage-tags">[' + passage.tags.join(', ') + ']</span>' : ''; html += '<li><a href="javascript:void(0)" class="passage-link" data-passage="' + passage.name + '">' + passage.name + '</a> ' + tagsHtml + '</li>'; }); html += '</ul>'; if (passagesToShow.length === 0) { html = '<p>No passages found. Debug: ' + debugInfo.join(' | ') + '</p>'; } $('#passage-list').html(html); } // Initial render renderPassages(uniquePassages); // Search functionality $('#passage-search').on('input', function() { var searchTerm = $(this).val().toLowerCase(); var filtered = uniquePassages.filter(function(passage) { return passage.name.toLowerCase().includes(searchTerm) || passage.tags.some(function(tag) { return tag.toLowerCase().includes(searchTerm); }); }); renderPassages(filtered); }); // Navigation functionality $(document).on('click', '.passage-link', function(e) { e.preventDefault(); var passageName = $(this).data('passage'); Engine.play(passageName); }); }); <</script>>
<div class="text-box"> <div id="game-container"> <div id="lock-image"> <svg width="300" height="300" viewBox="0 0 300 300"> <defs> <linearGradient id="lockGradient" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" style="stop-color:#666;stop-opacity:1" /> <stop offset="100%" style="stop-color:#333;stop-opacity:1" /> </linearGradient> </defs> <circle cx="150" cy="150" r="140" fill="url(#lockGradient)" /> <circle cx="150" cy="150" r="120" fill="#222" stroke="#444" stroke-width="5"/> <circle cx="150" cy="150" r="15" fill="#888" /> <rect id="pin" x="145" y="30" width="10" height="90" fill="gold" transform="rotate(0 150 150)" /> <circle cx="150" cy="150" r="20" fill="#444" stroke="#555" stroke-width="5"/> </svg> </div> <div id="controls"> <button id="rotate-left">↺ Rotate Left</button> <button id="rotate-right">↻ Rotate Right</button> <button id="try-unlock">Try to Unlock</button> </div> <div id="message"></div> <div id="hint"></div> <div id="attempts-left">Attempts Remaining: <span id="attempts-count">3</span></div> <div id="picks-left">Lock Picks Remaining: <span id="picks-count">$LockPicks</span></div> </div> <div id="retry-container" style="display: none;"> <button id="retry">Try with a new lock pick</button> </div> <div id="give-up"> <<link "Give up">><<goto "town">><</link>> </div> <style> body { background-color: #2c3e50; color: #ecf0f1; } #game-container { text-align: center; font-family: Arial, sans-serif; padding: 20px; border-radius: 10px; } #lock-image { margin: 20px auto; } #controls { margin-top: 20px; } button { margin: 0 10px; padding: 10px 20px; font-size: 16px; background-color: #2980b9; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } button:hover { background-color: #3498db; } #message, #hint, #attempts-left, #picks-left { margin-top: 20px; font-size: 18px; font-weight: bold; } #hint { color: #bdc3c7; font-style: italic; } #attempts-left, #picks-left { color: #e74c3c; } #give-up, #retry-container { margin-top: 20px; font-size: 16px; } #give-up a { color: #e74c3c; text-decoration: none; } #give-up a:hover { text-decoration: underline; } </style> <<script>> $(document).ready(function() { let currentRotation = 0; let correctRotation = Math.floor(Math.random() * 360); let tolerance = 45; // Increased tolerance for much easier gameplay let attemptsLeft = 3; let picksLeft = Number(State.variables.LockPicks); function rotatePin(degrees) { currentRotation = (currentRotation + degrees + 360) % 360; $('#pin').attr('transform', `rotate(${currentRotation} 150 150)`); } function getHint() { const difference = (correctRotation - currentRotation + 360) % 360; if (difference > 180) { return "Try rotating left a bit."; } else { return "Try rotating right a bit."; } } function updateDisplays() { $('#attempts-count').text(attemptsLeft); $('#picks-count').text(picksLeft); } function resetLock() { currentRotation = 0; correctRotation = Math.floor(Math.random() * 360); attemptsLeft = 3; $('#pin').attr('transform', 'rotate(0 150 150)'); $('#controls').show(); $('#message').text(''); $('#hint').text(''); $('#retry-container').hide(); updateDisplays(); } $('#rotate-left').on('click', function() { rotatePin(-15); $('#hint').text(''); }); $('#rotate-right').on('click', function() { rotatePin(15); $('#hint').text(''); }); $('#try-unlock').on('click', function() { const difference = Math.abs(currentRotation - correctRotation); if (difference <= tolerance || difference >= 360 - tolerance) { $('#message').text('Success! You picked the lock and entered the home.'); $('#message').css('color', '#2ecc71'); $('#controls').hide(); $('#hint').hide(); $('#attempts-left').hide(); $('#picks-left').hide(); $('#give-up').hide(); setTimeout(function() { Engine.play("IronpeakHouseEntance"); }, 2000); } else { attemptsLeft--; updateDisplays(); if (attemptsLeft > 0) { $('#message').text(`The lock didn't open. Try again.`); $('#message').css('color', '#e74c3c'); $('#hint').text(getHint()); } else { picksLeft--; State.variables.LockPicks = picksLeft; $('#message').text('Your lock pick broke!'); $('#message').css('color', '#e74c3c'); $('#controls').hide(); $('#hint').hide(); if (picksLeft > 0) { $('#retry-container').show(); } else { $('#message').text('You have no more lock picks left. You failed to open the lock.'); } } } updateDisplays(); }); $('#retry').on('click', function() { resetLock(); }); updateDisplays(); }); <</script>> </div>
<div class="text-box"> <div id="game-container"> <div id="lock-image"> <svg width="300" height="300" viewBox="0 0 300 300"> <defs> <linearGradient id="lockGradient" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" style="stop-color:#666;stop-opacity:1" /> <stop offset="100%" style="stop-color:#333;stop-opacity:1" /> </linearGradient> </defs> <circle cx="150" cy="150" r="140" fill="url(#lockGradient)" /> <circle cx="150" cy="150" r="120" fill="#222" stroke="#444" stroke-width="5"/> <circle cx="150" cy="150" r="15" fill="#888" /> <rect id="pin" x="145" y="30" width="10" height="90" fill="gold" transform="rotate(0 150 150)" /> <circle cx="150" cy="150" r="20" fill="#444" stroke="#555" stroke-width="5"/> </svg> </div> <div id="controls"> <button id="rotate-left">↺ Rotate Left</button> <button id="rotate-right">↻ Rotate Right</button> <button id="try-unlock">Try to Unlock</button> </div> <div id="message"></div> <div id="hint"></div> <div id="attempts-left">Attempts Remaining: <span id="attempts-count">3</span></div> <div id="picks-left">Lock Picks Remaining: <span id="picks-count">$LockPicks</span></div> </div> <div id="retry-container" style="display: none;"> <button id="retry">Try with a new lock pick</button> </div> <div id="give-up"> <<link "Give up">><<goto "town">><</link>> </div> <style> body { background-color: #2c3e50; color: #ecf0f1; } #game-container { text-align: center; font-family: Arial, sans-serif; padding: 20px; border-radius: 10px; } #lock-image { margin: 20px auto; } #controls { margin-top: 20px; } button { margin: 0 10px; padding: 10px 20px; font-size: 16px; background-color: #2980b9; color: white; border: none; border-radius: 5px; cursor: pointer; transition: background-color 0.3s; } button:hover { background-color: #3498db; } #message, #hint, #attempts-left, #picks-left { margin-top: 20px; font-size: 18px; font-weight: bold; } #hint { color: #bdc3c7; font-style: italic; } #attempts-left, #picks-left { color: #e74c3c; } #give-up, #retry-container { margin-top: 20px; font-size: 16px; } #give-up a { color: #e74c3c; text-decoration: none; } #give-up a:hover { text-decoration: underline; } </style> <<script>> $(document).ready(function() { let currentRotation = 0; let correctRotation = Math.floor(Math.random() * 360); let tolerance = 45; // Increased tolerance for much easier gameplay let attemptsLeft = 3; let picksLeft = Number(State.variables.LockPicks); function rotatePin(degrees) { currentRotation = (currentRotation + degrees + 360) % 360; $('#pin').attr('transform', `rotate(${currentRotation} 150 150)`); } function getHint() { const difference = (correctRotation - currentRotation + 360) % 360; if (difference > 180) { return "Try rotating left a bit."; } else { return "Try rotating right a bit."; } } function updateDisplays() { $('#attempts-count').text(attemptsLeft); $('#picks-count').text(picksLeft); } function resetLock() { currentRotation = 0; correctRotation = Math.floor(Math.random() * 360); attemptsLeft = 3; $('#pin').attr('transform', 'rotate(0 150 150)'); $('#controls').show(); $('#message').text(''); $('#hint').text(''); $('#retry-container').hide(); updateDisplays(); } $('#rotate-left').on('click', function() { rotatePin(-15); $('#hint').text(''); }); $('#rotate-right').on('click', function() { rotatePin(15); $('#hint').text(''); }); $('#try-unlock').on('click', function() { const difference = Math.abs(currentRotation - correctRotation); if (difference <= tolerance || difference >= 360 - tolerance) { $('#message').text('Success! You picked the lock and entered the home.'); $('#message').css('color', '#2ecc71'); $('#controls').hide(); $('#hint').hide(); $('#attempts-left').hide(); $('#picks-left').hide(); $('#give-up').hide(); setTimeout(function() { Engine.play("TownHouseInside"); }, 2000); } else { attemptsLeft--; updateDisplays(); if (attemptsLeft > 0) { $('#message').text(`The lock didn't open. Try again.`); $('#message').css('color', '#e74c3c'); $('#hint').text(getHint()); } else { picksLeft--; State.variables.LockPicks = picksLeft; $('#message').text('Your lock pick broke!'); $('#message').css('color', '#e74c3c'); $('#controls').hide(); $('#hint').hide(); if (picksLeft > 0) { $('#retry-container').show(); } else { $('#message').text('You have no more lock picks left. You failed to open the lock.'); } } } updateDisplays(); }); $('#retry').on('click', function() { resetLock(); }); updateDisplays(); }); <</script>> </div>
<<nobr>> <style> .npc-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; } .npc-card:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .npc-card.selected { background: rgba(139, 0, 0, 0.7); } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } </style> <div class="text-box"> <h1>Lucy's Report</h1> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<if !$PriorityTargets>><<set $PriorityTargets to []>><</if>> <<if !_location.foundNPCs || _location.foundNPCs.length === 0>> <p>No information available about the residents</p> <<else>> <div class="npc-container"> <<for _i to 0; _i < _location.foundNPCs.length; _i++>> <<capture _npc>> <<set _npc to _location.foundNPCs[_i]>> <div class="npc-card" data-index="<<print _i>>" data-npcid="<<print _npc.NPCID>>"> <img @src="_npc.ImagePath" alt="Resident" style="width: 200px; height: 200px; object-fit: cover; margin-bottom: 5px;"> <h3 style="margin: 5px 0;">Resident</h3> <div style="line-height: 1.2;"> <p style="margin: 2px 0;">Job: <<print _npc.job>></p> <p style="margin: 2px 0;">Gender: <<print _npc.sex>></p> <p style="margin: 2px 0;">Building: <<print _npc.building>></p> <p style="margin: 2px 0;">Weapon: <<print _npc.weapon>></p> <p style="margin: 2px 0;">Armor: <<print _npc.armor>></p> <p style="margin: 2px 0;">Health: <progress @value="_npc.health" max="100" style="width: 100px;"></progress></p> </div> </div> <</capture>> <</for>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Confirm Targets">> <<set _selectedCards to jQuery('.npc-card.selected')>> <<set $PriorityTargets to []>> <<run console.log("Starting selection process"); let selectedIndices = []; _selectedCards.each(function(i, element) { let cardIndex = jQuery('.npc-card').index(element); console.log("Card index:", cardIndex); let selectedNPC = _location.foundNPCs[cardIndex]; console.log("Found NPC at index:", selectedNPC); if (selectedNPC) { $PriorityTargets.push({ NPCID: selectedNPC.NPCID, job: selectedNPC.job, sex: selectedNPC.sex, building: selectedNPC.building, weapon: selectedNPC.weapon, armor: selectedNPC.armor, health: selectedNPC.health, ImagePath: selectedNPC.ImagePath }); } }); console.log("Final Priority Targets:", $PriorityTargets); >> <<goto "RaidSummary">> <</button>> </div> <</if>> </div> <<script>> $(document).ready(function() { $('.npc-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <<button "Skip">> <<goto "RaidSummary">> <</button>> <</nobr>>
<<nobr>> <div class="character-creation-box"> <div class="title-section"> <h1 class="creation-title">⚔️ Awaken Your Dark Gift ⚔️</h1> <p class="creation-subtitle">The ancient power stirs within you. Choose which aspect of your dark heritage manifests strongest...</p> </div> <div class="character-portrait"> <<set _imagePath to "Images/Player/1.png">> <img @src=_imagePath alt="The Overlord"> <div class="portrait-shadow"></div> </div> <div class="bonus-container"> <div class="bonus-option power-option"> <h2 class="option-title">Path of Might</h2> <<link "Choose Power">> <<script>> Dialog.close(); Dialog.setup("Path of Might", "path-dialog-wrapper"); Dialog.wiki(Story.get("PowerPathDialog").processText()); Dialog.open(); <</script>> <</link>> <div class="option-description"> <p class="flavor-text">"Let steel and sinew be your instruments of domination."</p> <div class="mechanics-text"> <strong>Combat Prowess:</strong> Begin with 10 base power in melee combat. This strength amplifies every weapon's damage, turning even simple blades into instruments of devastation. </div> </div> </div> <div class="bonus-option magic-option"> <h2 class="option-title">Path of Sorcery</h2> <<link "Choose Magic">> <<script>> Dialog.close(); Dialog.setup("Path of Sorcery", "path-dialog-wrapper"); Dialog.wiki(Story.get("MagicPathDialog").processText()); Dialog.open(); <</script>> <</link>> <div class="option-description"> <p class="flavor-text">"Command the dark arts and bend reality to your will."</p> <div class="mechanics-text"> <strong>Arcane Mastery:</strong> Begin with 30 magical power, granting you a deeper well of energy to draw upon. Cast more spells before exhaustion claims you. </div> </div> </div> <div class="bonus-option resources-option"> <h2 class="option-title">Path of Wealth</h2> <<link "Choose Resources">> <<script>> Dialog.close(); Dialog.setup("Path of Dominion", "path-dialog-wrapper"); Dialog.wiki(Story.get("DominionPathDialog").processText()); Dialog.open(); <</script>> <</link>> <div class="option-description"> <p class="flavor-text">"Power flows to those who command wealth and materials."</p> <div class="mechanics-text"> <strong>Material Wealth:</strong> Begin your reign with 500 gold coins, 700 units of timber, and 600 blocks of stone. Build your empire swiftly. </div> </div> </div> </div> <div class="lore-footer"> <p>Your choice will shape the foundation of your dark reign. Choose wisely, for this gift cannot be undone...</p> </div> </div> <</nobr>> <style> .character-creation-box { max-width: 1000px; margin: 0 auto; padding: 30px; background: linear-gradient(180deg, rgba(0,0,0,0.95) 0%, rgba(139,0,0,0.2) 100%); border: 3px solid #8B0000; border-radius: 15px; box-shadow: 0 0 30px rgba(139,0,0,0.6), inset 0 0 50px rgba(0,0,0,0.8); color: #fff; font-family: 'Georgia', serif; } .title-section { text-align: center; margin-bottom: 30px; border-bottom: 2px solid #8B0000; padding-bottom: 20px; } .creation-title { font-size: 36px; color: #FFD700; text-shadow: 3px 3px 6px #000, 0 0 20px #8B0000; margin-bottom: 10px; font-weight: bold; letter-spacing: 2px; } .creation-subtitle { font-size: 18px; color: #CD853F; font-style: italic; text-shadow: 1px 1px 3px #000; } .character-portrait { text-align: center; margin: 30px auto; position: relative; width: 300px; height: 300px; } .character-portrait img { width: 100%; height: 100%; object-fit: cover; border: 3px solid #8B0000; border-radius: 50%; box-shadow: 0 0 30px rgba(139,0,0,0.8); } .portrait-shadow { position: absolute; bottom: -10px; left: 50%; transform: translateX(-50%); width: 80%; height: 20px; background: radial-gradient(ellipse at center, rgba(0,0,0,0.8) 0%, transparent 70%); filter: blur(10px); } .bonus-container { display: flex; justify-content: space-between; gap: 20px; margin: 40px 0; } .bonus-option { flex: 1; padding: 20px; background: linear-gradient(135deg, rgba(0,0,0,0.9) 0%, rgba(139,0,0,0.3) 100%); border: 2px solid #8B0000; border-radius: 10px; transition: all 0.3s ease; position: relative; } .bonus-option::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(circle at center, transparent 0%, rgba(139,0,0,0.2) 100%); opacity: 0; transition: opacity 0.3s; } .bonus-option:hover { transform: translateY(-5px); box-shadow: 0 10px 30px rgba(139,0,0,0.6); border-color: #FFD700; } .bonus-option:hover::before { opacity: 1; } .option-icon { font-size: 48px; text-align: center; margin-bottom: 15px; filter: drop-shadow(0 0 10px rgba(255,215,0,0.5)); } .option-title { font-size: 24px; color: #FFD700; text-align: center; margin-bottom: 15px; text-shadow: 2px 2px 4px #000; font-weight: bold; } .bonus-option a { display: block; padding: 10px 20px; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700 !important; text-decoration: none; text-align: center; border-radius: 5px; font-size: 16px; font-weight: bold; margin-bottom: 15px; transition: all 0.3s; text-shadow: 1px 1px 2px #000; cursor: pointer; pointer-events: auto; position: relative; z-index: 10; } .bonus-option a:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000 !important; box-shadow: 0 0 15px rgba(255,215,0,0.8); text-decoration: none; } .option-description { margin-top: 15px; } .flavor-text { font-style: italic; color: #CD853F; text-align: center; margin-bottom: 15px; font-size: 14px; line-height: 1.4; } .mechanics-text { background: rgba(0,0,0,0.5); padding: 10px; border-radius: 5px; border-left: 3px solid #8B0000; font-size: 14px; line-height: 1.6; color: #E0E0E0; } .mechanics-text strong { color: #FFD700; display: block; margin-bottom: 5px; } .lore-footer { text-align: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #8B0000; } .lore-footer p { color: #CD853F; font-style: italic; font-size: 16px; text-shadow: 1px 1px 3px #000; } /* Special styling for each path */ .power-option:hover .option-icon { animation: swordPulse 1s infinite; } .magic-option:hover .option-icon { animation: magicGlow 1s infinite; } .resources-option:hover .option-icon { animation: crownShine 1s infinite; } @keyframes swordPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.2); } } @keyframes magicGlow { 0%, 100% { filter: drop-shadow(0 0 10px rgba(255,215,0,0.5)); } 50% { filter: drop-shadow(0 0 20px rgba(138,43,226,1)); } } @keyframes crownShine { 0%, 100% { filter: drop-shadow(0 0 10px rgba(255,215,0,0.5)); } 50% { filter: drop-shadow(0 0 25px rgba(255,215,0,1)); } } /* Custom Dialog Styles */ #ui-dialog.path-dialog-wrapper #ui-dialog-titlebar { background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700; font-size: 18px; text-align: center; padding: 12px; font-weight: bold; text-shadow: 2px 2px 4px #000; border-bottom: 2px solid #8B0000; } #ui-dialog.path-dialog-wrapper #ui-dialog-body { padding: 0 !important; background: transparent !important; } #ui-dialog.path-dialog-wrapper { background: rgba(0,0,0,0.95) !important; max-width: 550px !important; width: 90% !important; margin: 0 auto !important; position: fixed !important; top: 20% !important; left: 0 !important; right: 0 !important; } .path-dialog-custom { background: linear-gradient(180deg, rgba(0,0,0,0.98) 0%, rgba(139,0,0,0.4) 100%); border: 3px solid #8B0000; border-radius: 15px; box-shadow: 0 0 50px rgba(139,0,0,0.8), inset 0 0 30px rgba(0,0,0,0.9); color: #E0E0E0; font-family: 'Georgia', serif; max-width: 500px; margin: 0 auto; animation: dialogAppear 0.3s ease-out; } @keyframes dialogAppear { from { opacity: 0; transform: scale(0.9) translateY(-20px); } to { opacity: 1; transform: scale(1) translateY(0); } } .path-dialog-header { padding: 20px 15px 15px; text-align: center; background: rgba(0,0,0,0.5); border-bottom: 2px solid #8B0000; } .path-dialog-header .path-icon { font-size: 48px; margin-bottom: 10px; display: block; filter: drop-shadow(0 0 20px rgba(255,215,0,0.6)); animation: iconPulse 2s infinite; } @keyframes iconPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } .path-dialog-header h2 { font-size: 24px; color: #FFD700; text-shadow: 3px 3px 6px #000, 0 0 20px #8B0000; margin: 5px 0; letter-spacing: 2px; } .path-divider { width: 120px; height: 2px; background: linear-gradient(90deg, transparent 0%, #8B0000 50%, transparent 100%); margin: 10px auto 0; } .path-dialog-content { padding: 20px; } .path-lore { font-size: 14px; font-style: italic; color: #CD853F; text-align: center; margin-bottom: 15px; line-height: 1.5; text-shadow: 1px 1px 2px #000; } .path-benefits { background: rgba(0,0,0,0.4); border-radius: 8px; padding: 15px; margin: 15px 0; border-left: 3px solid #8B0000; } .benefit-item { display: flex; align-items: center; margin-bottom: 10px; font-size: 14px; color: #E0E0E0; } .benefit-item:last-child { margin-bottom: 0; } .benefit-icon { font-size: 20px; margin-right: 12px; display: inline-block; width: 30px; text-align: center; } .benefit-item strong { color: #FFD700; text-shadow: 1px 1px 2px #000; } .path-warning { text-align: center; color: #FF6B6B; font-size: 13px; margin-top: 15px; font-weight: bold; text-shadow: 1px 1px 3px #000; } .path-dialog-footer { padding: 15px 20px 20px; text-align: center; display: flex; gap: 15px; justify-content: center; } .path-dialog-footer button { padding: 10px 20px; font-size: 14px; font-weight: bold; border-radius: 5px; cursor: pointer; transition: all 0.3s; text-transform: uppercase; letter-spacing: 1px; border: 2px solid #8B0000; font-family: 'Georgia', serif; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700 !important; text-shadow: 1px 1px 2px #000; margin: 0 5px; } .path-dialog-footer button:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000 !important; box-shadow: 0 0 30px rgba(255,215,0,0.8); transform: scale(1.05); } .path-dialog-footer button:last-child { background: rgba(50,50,50,0.8); color: #999 !important; border-color: #666; } .path-dialog-footer button:last-child:hover { background: rgba(100,100,100,0.8); color: #CCC !important; border-color: #999; transform: scale(1); } /* Theme variations */ .magic-theme { border-color: #8A2BE2; box-shadow: 0 0 50px rgba(138,43,226,0.6), inset 0 0 30px rgba(0,0,0,0.9); } .magic-theme .path-dialog-header { border-bottom-color: #8A2BE2; } .magic-theme .path-benefits { border-left-color: #8A2BE2; } .magic-theme .path-divider { background: linear-gradient(90deg, transparent 0%, #8A2BE2 50%, transparent 100%); } .magic-btn { background: linear-gradient(90deg, #4B0082 0%, #8A2BE2 100%); border-color: #8A2BE2; } .magic-btn:hover { background: linear-gradient(90deg, #8A2BE2 0%, #DA70D6 100%); } .dominion-theme .path-dialog-header .path-icon { filter: drop-shadow(0 0 20px rgba(255,215,0,1)); } .dominion-btn { background: linear-gradient(90deg, #B8860B 0%, #FFD700 100%); color: #000; border-color: #FFD700; } .dominion-btn:hover { background: linear-gradient(90deg, #FFD700 0%, #FFF 100%); box-shadow: 0 0 30px rgba(255,215,0,1); } </style> <<include "WeaponData">> <<script>> // weaponSlots is now initialized in WeaponData passage to avoid timing issues // The initialization has been moved there to ensure it's available when needed <</script>> <<set $ownedWeapons = $ownedWeapons || []>> <<if !$ownedWeapons.includes('basic_dagger')>> <<set $ownedWeapons.push('basic_dagger')>> <</if>> <<if !$ownedWeapons.includes('rusty_shortsword')>> <<set $ownedWeapons.push('rusty_shortsword')>> <</if>> <<script>> // Auto-equip Basic Dagger and Rusty Shortsword on game start setTimeout(function() { if (window.CombatSystem && window.weaponSets) { // Initialize equipped weapons tracking window.currentlyEquipped = window.currentlyEquipped || { dagger: null, medium: null, back: null }; // Add Basic Dagger cards to combat system if (window.weaponSets.basic_dagger) { var basicDagger = window.weaponSets.basic_dagger; basicDagger.cards.forEach(function(card) { var equippedCard = Object.assign({}, card, { slotType: 'dagger', weaponType: 'basic_dagger' }); window.CombatSystem.addCard(equippedCard); }); // Mark as equipped window.currentlyEquipped.dagger = 'basic_dagger'; } // Add Rusty Shortsword cards to combat system if (window.weaponSets.rusty_shortsword) { var rustyShortsword = window.weaponSets.rusty_shortsword; rustyShortsword.cards.forEach(function(card) { var equippedCard = Object.assign({}, card, { slotType: 'medium', weaponType: 'rusty_shortsword' }); window.CombatSystem.addCard(equippedCard); }); // Mark as equipped window.currentlyEquipped.medium = 'rusty_shortsword'; } } }, 100); <</script>>
<<nobr>> <<if $FirstRaid isnot true>> <<set _location.Export to _exports to "Meat">> <<set _Jobs to ["Blacksmith", "Hunter", "Farmer"]>> <<set $FirstRaid = true>> <</if>> <<set $RaidScount to true>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _exports to ["Grain", "Mead", "Bread", "Meat", "Jewelry", "Tools"]>> <<set _location.Export to _exports[random(0, _exports.length - 1)]>> <<set _location.Happiness to 30>> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if !setup.buildingData>> <<run setup.buildingData = new Map()>> <</if>> <<run setup.buildingData.set($ImagePath, { hotspots: _currentData.hotspots ?? [] })>> /* Initialize population arrays */ <<set _location.populatedBuildings = {}>> <<set _location.outdoorNPCs = []>> /* Define building room layouts */ <<set _buildingRooms = { "House": ["Bedroom 1", "Bedroom 2", "Kitchen", "Living Room", "Hall", "UpperHall"], "Manor House": ["Bedroom 1", "Bedroom 2", "Bedroom 3", "Bedroom 4", "Bedroom 5", "Study", "Kitchen", "Living Room", "Hall", "UpperHall"], "Guard House": ["Barracks", "Office", "Hall"], "Tavern": ["Common Room"], "Church": ["Main Hall"], "Camp": ["Common Area"], "Barn": ["Main Area"] }>> <<if _currentData && _currentData.hotspots>> <<if Object.keys(_location.populatedBuildings).length === 0>> <<for _hotspot range _currentData.hotspots>> <<set _baseType = _hotspot.tooltip.replace(/\s*\d+$/, '')>> <<set _buildingId = _hotspot.tooltip>> <<set _location.populatedBuildings[_buildingId] = []>> <<set _location.populatedBuildings[_buildingId].keyFound = (_baseType === "Tavern" || _baseType === "Church" || _baseType === "Camp" || _baseType === "Barn") ? "NA" : false>> <<set _location.populatedBuildings[_buildingId].locked = (_baseType === "Tavern" || _baseType === "Church" || _baseType === "Camp" || _baseType === "Barn") ? "NA" : (random(1, 100) <= 50)>> <<set _location.populatedBuildings[_buildingId].escaped = false>> <<set _location.populatedBuildings[_buildingId].rooms = _buildingRooms[_baseType] ?? []>> <<set _location.populatedBuildings[_buildingId].occupiedRooms = new Map()>> <<set _location.populatedBuildings[_buildingId].buildingImage = random(1, 7)>> /* Set key location */ <<set _npcRooms to _buildingRooms[_baseType].filter(room => room !== "Hall" && room !== "UpperHall")>> <<set _keyRooms to _buildingRooms[_baseType].filter(room => room === "Hall" || room === "UpperHall")>> <<if _keyRooms.length > 0>> <<set _keyRoom to _keyRooms[random(0, _keyRooms.length - 1)]>> <<else>> <<set _keyRoom to _npcRooms[random(0, _npcRooms.length - 1)]>> <</if>> <<set _location.populatedBuildings[_buildingId].keyLocation = _keyRoom>> <<set _maxOccupants = { "House": 3, "Guard House": 2, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] ?? 0>> <<set _Jobs to ["Blacksmith", "Hunter", "Fletcher", "Farmer", "Tanner", "Miller", "Forester"]>> <<set _occupants = Math.max(1, random(1, _maxOccupants))>> <<for _i = 0; _i < _occupants; _i++>> <<set _isGuard = _baseType === "Guard House">> <<set _gender = _isGuard ? "Male" : either("Male", "Female")>> <<set _imageNumber = random(1, 10)>> <<set _npcPath = _isGuard ? "Images/Forrest/Scarldale/guard.png" : "Images/Raids/NPC/" + _gender + "/" + _imageNumber + ".png">> <<set _attitude = _isGuard ? "Defensive" : either("Friendly", "Defensive", "Neutral")>> <<set _attracted = _attitude === "Friendly" ? "Yes" : either("Yes", "No")>> <<set _hiddenJob = "">> <<if _isGuard>> <<set _hiddenJob = "Guard">> <<elseif _baseType === "Tavern">> <<if _i === 0>> <<set _hiddenJob = "Innkeeper">> <<else>> <<set _hiddenJob = either(_Jobs)>> <</if>> <<else>> <<set _hiddenJob = either(_Jobs)>> <</if>> <<set _npc = { NPCID: $prisonerIdCounter++, job: "Unknown", hiddenJob: _hiddenJob, interested: _attitude === "Friendly" ? 50 : (_attitude === "Defensive" ? 20 : 40), found: false, met: false, sex: _gender, ImagePath: _npcPath, armor: _isGuard ? "Light Armor" : "None", weapon: _isGuard ? "Sword" : "Dagger", health: 100, building: _buildingId, buildingKnown: false, buildingType: _baseType, attracted: _attracted, attitude: _attitude }>> <<if _i === 0>> <<set _availableRooms to _npcRooms.filter( room => !_location.populatedBuildings[_buildingId].occupiedRooms.has(room) )>> <<if _availableRooms.length > 0>> <<set _selectedRoom = _availableRooms[random(0, _availableRooms.length - 1)]>> <<set _npc.currentRoom = _selectedRoom>> <<run _location.populatedBuildings[_buildingId].occupiedRooms.set(_selectedRoom, _npc.NPCID)>> <</if>> <<run _location.populatedBuildings[_buildingId].push(_npc)>> <<else>> <<if random(1, 100) <= 30>> <<run _location.outdoorNPCs.push(_npc)>> <<else>> <<set _availableRooms to _npcRooms.filter( room => !_location.populatedBuildings[_buildingId].occupiedRooms.has(room) )>> <<if _availableRooms.length > 0>> <<set _selectedRoom = _availableRooms[random(0, _availableRooms.length - 1)]>> <<set _npc.currentRoom = _selectedRoom>> <<run _location.populatedBuildings[_buildingId].occupiedRooms.set(_selectedRoom, _npc.NPCID)>> <</if>> <<run _location.populatedBuildings[_buildingId].push(_npc)>> <</if>> <</if>> <</for>> <</for>> <</if>> <</if>> /* Debug output */ <<run console.clear()>> <<run console.log("=== LOCATION STATUS ===")>> <<run console.log(`Location Export: ${_location.Export}`)>> <<run console.log(`Location Happiness: ${_location.Happiness}`)>> <<run console.log("\n=== POPULATION AND BUILDING STATUS DEBUG ===")>> <<run console.log("=== POPULATION AND BUILDING STATUS DEBUG ===")>> <<if _location.populatedBuildings>> <<for _buildingId, _building range _location.populatedBuildings>> <<run console.log(`${_buildingId}:`)>> <<run console.log(` Locked: ${_building.locked}`)>> <<run console.log(` Key Found: ${_building.keyFound}`)>> <<run console.log(` Key Location: ${_building.keyLocation}`)>> <<run console.log(` Residents: ${_building.length}`)>> <<run console.log(` NPCs in Building:`)>> <<for _npc range _building>> <<run console.log(` NPC ID: ${_npc.NPCID}`)>> <<run console.log(` Gender: ${_npc.sex}`)>> <<run console.log(` Attitude: ${_npc.attitude}`)>> <<run console.log(` Interested: ${_npc.interested}`)>> <<run console.log(` Attracted: ${_npc.attracted}`)>> <<run console.log(` Room: ${_npc.currentRoom ?? 'No room assigned'}`)>> <<run console.log(` Weapon: ${_npc.weapon}`)>> <<run console.log(` Armor: ${_npc.armor}`)>> <<run console.log(` Health: ${_npc.health}`)>> <<run console.log(` ---------------`)>> <</for>> <</for>> <<run console.log("=== OUTDOOR NPCs ===")>> <<for _npc range _location.outdoorNPCs>> <<run console.log(` NPC ID: ${_npc.NPCID}`)>> <<run console.log(` Gender: ${_npc.sex}`)>> <<run console.log(` Attitude: ${_npc.attitude}`)>> <<run console.log(` From Building: ${_npc.building}`)>> <<run console.log(` Building Image: ${_building.buildingImage}`)>> <<run console.log(` Locked: ${_building.locked}`)>> <<run console.log(` ---------------`)>> <</for>> <</if>> <<run console.log("=== END DEBUG ===")>> <</nobr>>
<<run setup.restoreKnownPortals()>> <<nobr>> <<set $EishethSoulsSell to 1>> <div class="text-box"> <<set $PortalVisited to true>> You can unlock the tear spell in the forest shack which allows you to unlock portal locations.<br><br> <div style="text-align: center; position: relative;"> <div class="image-container"> <img id="portalImage" src="Images/Castle/Portal/ClosedPortal.png" width="800" height="800"> </div> </div> <div style="text-align: center; margin: 20px 0;"> <select id="locationSelect"> <option value="">Choose a destination...</option> </select> </div> <div id="travelButton" style="text-align: center; margin-top: 20px;"></div> <div style="text-align: center; margin-top: 20px;"> <button class="back-btn">[[Back|Inside Castle]]</button> </div> </div> <<script>> $(document).ready(function() { const destinations = State.variables.portalDestinations || []; function updateSelectOptions() { const $select = $('#locationSelect'); $select.find('option:gt(0)').remove(); destinations.forEach(function(dest) { $select.append(`<option value="${dest.location}">${dest.location}</option>`); }); } $('#locationSelect').val(''); updateSelectOptions(); $('#locationSelect').on('change', function() { const selected = $(this).val(); const destination = destinations.find(d => d.location === selected); if (destination) { const $currentImage = $('#portalImage'); const $newImage = $('<img>', { src: 'Images/Castle/Portal/' + destination.image, width: 800, height: 800 }).css({ position: 'absolute', top: 0, left: '50%', transform: 'translateX(-50%)', zIndex: 1 }); $currentImage.css('zIndex', 2); $('.image-container').append($newImage); $currentImage.fadeOut(600, function() { $currentImage.remove(); $newImage.attr('id', 'portalImage').css({ position: 'relative', zIndex: 'auto' }); }); $('#travelButton').html( `<button class="travel-btn" onclick="SugarCube.Engine.play('${destination.passage}')">Travel</button>` ); } else { $('#portalImage').attr('src', 'Images/Castle/Portal/ClosedPortal.png'); $('#travelButton').empty(); } }); }); <</script>> <style> .image-container { position: relative; display: inline-block; background: black; } .travel-btn, .back-btn { padding: 10px 20px; font-size: 1.2em; cursor: pointer; border: none; border-radius: 5px; } .travel-btn { background-color: #4CAF50; color: white; } .back-btn { background-color: #666; color: white; } .travel-btn:hover { background-color: #45a049; } .back-btn:hover { background-color: #555; } </style> <</nobr>>
<<nobr>> <div class="path-dialog-custom"> <div class="path-dialog-header"> <div class="path-icon">⚔️</div> <h2>PATH OF MIGHT</h2> <div class="path-divider"></div> </div> <div class="path-dialog-content"> <p class="path-lore">The ancient blood of warlords surges through your veins. Raw, primal strength floods your muscles as centuries of combat mastery awakens within you.</p> <div class="path-benefits"> <div class="benefit-item"> <span class="benefit-icon">💀</span> <span>Your base power increases to <strong>10</strong></span> </div> <div class="benefit-item"> <span class="benefit-icon">🗡️</span> <span>Every weapon becomes deadlier in your hands</span> </div> <div class="benefit-item"> <span class="benefit-icon">⛓️</span> <span>This choice binds your soul <strong>permanently</strong></span> </div> </div> <p class="path-warning">Your enemies will learn to fear your blade. Villages will whisper tales of your unstoppable fury.</p> </div> <div class="path-dialog-footer"> <<button "Embrace the Path of Might">> <<set $PlayerPower to 10>> <<set $selectedBonus to "Power">> <<script>>Dialog.close();<</script>> <<goto "GnarlakEncounter">> <</button>> <<button "Reconsider">> <<script>>Dialog.close();<</script>> <</button>> </div> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $CurrentPlayer is "Overlord">> <<if $Convo is "Village">> <<You>>Hello Farther, this is a lovely village<</You>><br><br> <<Priest>>Thank you child, it is good to see a stranger who is'nt trying to murder our men and kidnap our children<</Priest>><br><br> <<You>>What do you mean?<</You>><br><br> <<Priest>>The bandits, they live in the forest. The come in the night and take whatever, and whoever they want<</Priest>><br><br> <<Priest>>We have offered them gold, live stock, resources, but it seems they mostly want people<</Priest>><br><br> <<You>>What are you doing about this?<</You>><br><br> <<Priest>>What can we do! We are simple farmers, our guards wouldn't stand a chance<</Priest>><br><br> <<You>>What about the town to the south?<</You>><br><br> <<Priest>>They do not care, they drink and gable and pay whores. They are as godless as the bandits!<</Priest>><br><br> <<Priest>>Our blacksmith, Henry... He has been speaking about fighting back, but has had issues with his weapon production. Maybe you can speak to him about it?<</Priest>><br><br> <</if>> <<if $Convo is "Castle">> <<You>>Hello Farther, I'm travaling the area. Do you know anything about the castle to the west?<</You>><br><br> <<Priest>>A dark power lives there, you must not go to that place!<</Priest>><br><br> <<You>>What lives there?<</You>><br><br> <<Priest>>A demon, no one goes near that place. Only the bandits seem foolish enough to venture near it<</Priest>><br><br> <<You>>I see<</You>><br><br> <<Priest>>You should come to my surmons! I frequently remind our villagers that the place is evil and harbours nothing but death<</Priest>><br><br> <</if>><</if>> <<if $Convo is "LucySeduce">> You walk up to the priest and lean in close <<Lucy>>Hello Farther, I have a confession to make<</Lucy>><br><br> The priest smiles down at you<br><br> <<Priest>>I see, why don't you come inside so we can discuss this<</Priest>><br><br> The priest walks towards the doors and Lucy follows him, but as she enters the church she feels agonising pain<br><br> As a demon, Lucy cannot enter a holy place<br><br> <<Lucy>>Ah, fuck!<</Lucy>><br><br> <<Priest>>Are you ok?<</Priest>><br><br> Lucy runs out<br><br> <<Priest>>Where are you going?<</Priest>> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</nobr>> </div>
<<nobr>> /* Initialize reports array */ <<set _reports = []>> /* Ensure global array exists */ <<if typeof $CapturedLocations === 'undefined'>> <<set $CapturedLocations = []>> <</if>> /* Early exit if no settlements */ <<if $CapturedLocations.length === 0>> <<set $settlementReports = $settlementReports || {}>> <<set $settlementReports[$Day] = []>> <</if>> <<if $CapturedLocations.length > 0>> <!-- iterate by index so we always write modifications back --> <<for _idx = 0; _idx < $CapturedLocations.length; _idx++>> <<set _settlement = $CapturedLocations[_idx]>> <<if typeof _settlement.foodReserves === 'undefined'>> <<set _settlement.foodReserves = 50>> <</if>> /* Check if settlement has no villagers (only guards don't count) */ <<set _hasVillagers = false>> <<set _villagerCount = 0>> <!-- Count villagers from populatedBuildings instead of capturedVillagers --> /* Helper to collect villagers from multiple possible structures (backwards compatible) */ <<set _getAllVillagers = function(s) { var list = []; var seen = {}; function add(v){ if(!v) return; /* Exclude garrison members (NPCID starts with "garrison_") */ var npcId = (v.NPCID || "").toString(); if(npcId.indexOf("garrison_") === 0) return; var key = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); if(!seen[key]){ seen[key]=true; list.push(v); } } /* common legacy shape */ if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i=0;i<residents.length;i++) add(residents[i]); } } } /* other possible container names */ if(Array.isArray(s.capturedVillagers)) for(var i=0;i<s.capturedVillagers.length;i++) add(s.capturedVillagers[i]); if(Array.isArray(s.villagers)) for(var i=0;i<s.villagers.length;i++) add(s.villagers[i]); if(Array.isArray(s.inhabitants)) for(var i=0;i<s.inhabitants.length;i++) add(s.inhabitants[i]); if(Array.isArray(s.residents)) for(var i=0;i<s.residents.length;i++) add(s.residents[i]); /* also scan building objects for residents arrays (newer shape) */ if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; if(bobj && Array.isArray(bobj.residents)){ for(var j=0;j<bobj.residents.length;j++) add(bobj.residents[j]); } /* sometimes occupants stored in building.occupants */ if(bobj && Array.isArray(bobj.occupants)){ for(var j=0;j<bobj.occupants.length;j++) add(bobj.occupants[j]); } }catch(e){} } } return list; }>> /* Helper function to remove a villager from settlement */ <<set _removeVillager = function(s, villager) { if(!s || !villager) return false; var removed = false; var key = (villager.NPCID || villager.prisonerId || villager.id || villager.name || JSON.stringify(villager)); function matches(v){ if(!v) return false; var vKey = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); return vKey === key; } /* Remove from populatedBuildings */ if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i = residents.length - 1; i >= 0; i--){ if(matches(residents[i])){ residents.splice(i, 1); removed = true; } } } } } /* Remove from other possible arrays */ function removeFromArray(arr){ if(!Array.isArray(arr)) return; for(var i = arr.length - 1; i >= 0; i--){ if(matches(arr[i])){ arr.splice(i, 1); removed = true; } } } removeFromArray(s.capturedVillagers); removeFromArray(s.villagers); removeFromArray(s.inhabitants); removeFromArray(s.residents); /* Remove from buildings.residents/occupants */ if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; removeFromArray(bobj.residents); removeFromArray(bobj.occupants); removeFromArray(bobj.staff); }catch(e){} } } return removed; }>> <<set _allVillagersAtStart = _getAllVillagers(_settlement)>> <<set _villagerCount = _allVillagersAtStart.length>> <<set _hasVillagers = (_villagerCount > 0)>> /* Create report entry for this settlement */ <<set _reportEntry = { day: $Day, name: _settlement.name, startingFood: _settlement.foodReserves, startingPopulation: _villagerCount, events: [] }>> /* AUTO-FIX: Complete overdue building construction */ <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> /* Special handling for houses array */ <<if _buildingKey === "houses" && Array.isArray(_building)>> <<for _houseIdx = 0; _houseIdx < _building.length; _houseIdx++>> <<set _house = _building[_houseIdx]>> <<if _house.underConstruction && _house.completionDay && $Day >= _house.completionDay>> <<set _house.underConstruction = false>> <<set _house.built = true>> /* Initialize the house in populatedBuildings */ <<if !_settlement.populatedBuildings>> <<set _settlement.populatedBuildings = {}>> <</if>> <<if !_settlement.populatedBuildings[_house.name]>> <<set _settlement.populatedBuildings[_house.name] = []>> <</if>> <<run _reportEntry.events.push(`🏠 AUTO-FIX: ${_house.name} construction completed`)>> /* Update the array */ <<set _settlement.buildings.houses[_houseIdx] = _house>> <</if>> <</for>> <<else>> /* Fix buildings that are past their completion date */ <<if _building.underConstruction && _building.completionDay && $Day >= _building.completionDay>> <<set _building.underConstruction = false>> <<set _building.built = true>> /* Restore staff if they were stored during reconstruction */ <<if _building.storedStaff && _building.storedStaff.length > 0>> <<set _building.staff = _building.storedStaff.slice()>> <<set _building.storedStaff = null>> <<else>> /* Initialize empty staff array if it doesn't exist */ <<if !_building.staff>> <<set _building.staff = []>> <</if>> <</if>> <<run _reportEntry.events.push(`🔧 AUTO-FIX: ${_buildingKey.charAt(0).toUpperCase() + _buildingKey.slice(1)} construction auto-completed (was overdue)`)>> <</if>> /* Also handle reconstruction completion */ <<if _building.underReconstruction && _building.reconstructionCompleteDay && $Day >= _building.reconstructionCompleteDay>> <<set _building.underReconstruction = false>> <<set _building.built = true>> <<set _building.reinforced = true>> /* Rebuilt buildings are reinforced */ /* Restore staff */ <<if _building.storedStaff && _building.storedStaff.length > 0>> <<set _building.staff = _building.storedStaff.slice()>> <<set _building.storedStaff = null>> <</if>> <<run _reportEntry.events.push(`🔧 AUTO-FIX: ${_buildingKey.charAt(0).toUpperCase() + _buildingKey.slice(1)} reconstruction auto-completed (was overdue)`)>> <</if>> <</if>> <</for>> <</if>> /* NEW: Handle cult succubus hunger and persistent cult orders */ <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff && _settlement.buildings.cult.staff.length > 0>> /* Accept multiple possible order property names and normalize to lowercase */ <<set _orderRaw = (_settlement.buildings.cult.currentOrder || _settlement.buildings.cult.order || _settlement.buildings.cult.cultOrder || null)>> <<set _order = _orderRaw ? (typeof _orderRaw === 'string' ? _orderRaw.toLowerCase() : _orderRaw) : null>> <<set _cultCorruptionAffected = []>> /* collect names for report */ <<for _i = 0; _i < _settlement.buildings.cult.staff.length; _i++>> <<set _staffMember = _settlement.buildings.cult.staff[_i]>> <<set _isSuccubus = false>> <<if _staffMember.job && _staffMember.job.toLowerCase().includes("succub")>> <<set _isSuccubus = true>> <<elseif _staffMember.hiddenJob && _staffMember.hiddenJob.toLowerCase().includes("succub")>> <<set _isSuccubus = true>> <<elseif _staffMember.specialization && _staffMember.specialization.toLowerCase().includes("succub")>> <<set _isSuccubus = true>> <</if>> <<if _isSuccubus>> /* Ensure default hunger exists (out of 7) */ <<if typeof _staffMember.hunger === 'undefined'>> <<set _staffMember.hunger = 7>> <</if>> /* Only decrease hunger if there is an active order (cult is working) */ <<if _order>> <<set _staffMember.hunger = Math.max(0, _staffMember.hunger - 1)>> <<run _reportEntry.events.push(`🩸 Succubus ${_staffMember.name || "Unknown"} hunger → ${_staffMember.hunger}/7`)>> <<if _staffMember.hunger < 3>> <<run _reportEntry.events.push(`⚠️ Succubus ${_staffMember.name || "Unknown"} is hungry (hunger ${_staffMember.hunger}/7)`)>> <</if>> <<else>> <<run _reportEntry.events.push(`🛑 Cult idle: no order set — succubi remain sated (no hunger change)`)>> <</if>> /* Devotion order: random chance to increase settlement.state by 1 (max 10) */ <<if _order === "devotion">> <<if random(1,2) === 1>> <<set _settlement.state = Math.min(10, (_settlement.state || 0) + 1)>> <<run _reportEntry.events.push(`✦ Cult (Devotion): settlement state increased → ${_settlement.state}`)>> <<else>> <<run _reportEntry.events.push(`✦ Cult (Devotion): no change this day`)>> <</if>> <</if>> /* Corruption order: pick random villagers via robust helper and increase corruption */ <<if _order === "corruption">> <<set _allVillagers = _getAllVillagers(_settlement)>> <<if _allVillagers.length > 0>> /* 10% of population rounded, at least 1, at most 3 targets */ <<set _numTargets = Math.max(1, Math.min(3, Math.round(_allVillagers.length * 0.10)))>> <<set _affected = []>> <<for _t = 0; _t < _numTargets; _t++>> <<if _allVillagers.length === 0>> <<break>> <</if>> <<set _pick = random(0, _allVillagers.length - 1)>> <<set _v = _allVillagers.splice(_pick,1)[0]>> <<if typeof _v.corruption === 'undefined'>><<set _v.corruption = 0>><</if>> <<set _inc = random(5,10)>> <<set _old = _v.corruption>> <<set _v.corruption = Math.min(100, _v.corruption + _inc)>> <<if _v.corruption > _old>> <<run _affected.push({name: _v.name || _v.job || "Villager", inc: (_v.corruption - _old)})>> <</if>> <</for>> <<if _affected.length > 0>> <<run _reportEntry.events.push(`🩸 Cult (Corruption): increased corruption on ${_affected.length} NPC(s): ${_affected.map(a => a.name + " (+"+a.inc+"%)").join(", ")}`)>> <<else>> <<run _reportEntry.events.push(`🩸 Cult (Corruption): attempted corruption but targets were already at max`)>> <</if>> <<else>> <<run _reportEntry.events.push(`🩸 Cult (Corruption): no villagers available to corrupt`)>> <</if>> /* Nudge the settlement corruption aggregate slightly for dramatic effect */ <<set _delta = random(3,8)>> <<set _settlement.corruption = Math.min(100, (_settlement.corruption || 0) + _delta)>> <<run _reportEntry.events.push(`🌑 Settlement corruption +${_delta}% → ${_settlement.corruption}%`)>> <</if>> /* Save staff member back to building staff array (persistence) */ <<set _settlement.buildings.cult.staff[_i] = _staffMember>> <</if>> <</for>> <</if>> /* Handle settlements with no villagers */ <<if !_hasVillagers>> <<set _settlement.Happiness = 0>> <<run _reportEntry.events.unshift(`No villagers in settlement - no production or activity`)>> <<set _settlement.corruption = 0>> /* Cancel any ongoing building processes (mill, brewery, etc.) since no villagers remain */ <<if _settlement.buildings>> <<for _bKey, _b range _settlement.buildings>> <<try>> <<if _b && _b.processQueue && _b.processQueue.length > 0>> /* Calculate refunds depending on building type */ <<set _refundGrain = 0>> <<set _refundMead = 0>> <<set _refundText = "">> <<for _pIndex = 0; _pIndex < _b.processQueue.length; _pIndex++>> <<set _proc = _b.processQueue[_pIndex]>> <<if _bKey === "mill">> /* mills consume 2 grain per queued process */ <<set _refundGrain += 2>> <<elseif _bKey === "brewery">> /* brewery consumes 5 grain per queued process */ <<set _refundGrain += 5>> <</if>> <</for>> /* Apply refunds to settlement reserves (clamped where reasonable) */ <<if _refundGrain > 0>> <<set _settlement.grainReserves = Math.min(100, (_settlement.grainReserves || 0) + _refundGrain)>> <<set _refundText = _refundText + `${_refundGrain} grain`>> <</if>> <<if _refundMead > 0>> <<set _settlement.meadReserves = Math.min(100, (_settlement.meadReserves || 0) + _refundMead)>> <<set _refundText = (_refundText ? _refundText + ", " : "") + `${_refundMead} mead`>> <</if>> /* Clear the queue and log the cancellation + refund at top of events */ <<set _b.processQueue = []>> <<if _refundText>><<run _reportEntry.events.unshift(`⚠️ ${_bKey.charAt(0).toUpperCase() + _bKey.slice(1)} processes cancelled due to no villagers — refunded: ${_refundText}`)>><<else>><<run _reportEntry.events.unshift(`⚠️ ${_bKey.charAt(0).toUpperCase() + _bKey.slice(1)} processes cancelled due to no villagers`)>><</if>> <</if>> <</try>> <</for>> <</if>> /* Store this settlement and continue to next one */ <<set _reportEntry.endingPopulation = 0>> <<set _reportEntry.endingFood = _settlement.foodReserves>> <<run _reports.push(_reportEntry)>> <<set $CapturedLocations[_idx] = _settlement>> <<continue>> <</if>> /* SETTLEMENTS WITH VILLAGERS - Process Daily Production */ <<set _productionMod = 1>> /* Apply happiness modifiers */ <<if _settlement.Happiness < 50>> <<set _productionMod = 0.75>> <<elseif _settlement.Happiness > 70>> <<set _productionMod = 1.25>> <</if>> /* BUILDINGS PRODUCTION - NEW SYSTEM ONLY */ /* Process Farm production - Generates Grain */ <<if _settlement.buildings && _settlement.buildings.farm && _settlement.buildings.farm.staff && _settlement.buildings.farm.staff.length > 0>> <<set _farmStaff = _settlement.buildings.farm.staff>> <<set _grainProduced = 0>> <<set _specialistCount = 0>> <<for _i = 0; _i < _farmStaff.length; _i++>> <<if _farmStaff[_i].job && _farmStaff[_i].job.toLowerCase() === "farmer">> <<set _grainProduced += random(5, 6)>> <<set _specialistCount++>> <<else>> <<set _grainProduced += random(2, 3)>> <</if>> <</for>> <<set _grainProduced = Math.ceil(_grainProduced * _productionMod)>> <<set _settlement.grainReserves = (_settlement.grainReserves || 0) + _grainProduced>> <<run _reportEntry.events.push(`Farm produced ${_grainProduced} grain (${_specialistCount}/${_farmStaff.length} specialist farmers)`)>> <</if>> /* Process Mill production - Converts Grain to Food */ <<if _settlement.buildings && _settlement.buildings.mill && _settlement.buildings.mill.staff && _settlement.buildings.mill.staff.length > 0>> <<set _millStaff = _settlement.buildings.mill.staff>> /* Initialize process queue if it doesn't exist */ <<if !_settlement.buildings.mill.processQueue>> <<set _settlement.buildings.mill.processQueue = []>> <</if>> /* Start new milling processes if grain is available */ <<for _i = 0; _i < _millStaff.length; _i++>> <<if (_settlement.grainReserves || 0) >= 2>> <<set _isMiller = _millStaff[_i].job && _millStaff[_i].job.toLowerCase() === "miller">> <<set _skill = _millStaff[_i].skill || 0>> <<set _efficiency = (_isMiller && _skill >= 50) ? 2 : 1>> /* Skilled millers make 2 food from 2 grain */ /* Start new milling process */ <<run _settlement.buildings.mill.processQueue.push({ startDay: $Day, completionDay: $Day + 1, workerName: _millStaff[_i].name || "Worker", isMiller: _isMiller, efficiency: _efficiency })>> <<set _settlement.grainReserves = (_settlement.grainReserves || 0) - 2>> <<run _reportEntry.events.push(`Mill: Started food production using 2 grain (efficiency: ${_efficiency})`)>> <</if>> <</for>> /* Check for completed milling processes */ <<set _completedProcesses = []>> <<for _j = 0; _j < _settlement.buildings.mill.processQueue.length; _j++>> <<if _settlement.buildings.mill.processQueue[_j].completionDay <= $Day>> <<run _completedProcesses.push(_settlement.buildings.mill.processQueue[_j])>> <</if>> <</for>> /* Process completed milling */ <<if _completedProcesses.length > 0>> <<set _foodProduced = 0>> <<for _k = 0; _k < _completedProcesses.length; _k++>> <<set _foodProduced += _completedProcesses[_k].efficiency>> <</for>> <<set _settlement.foodReserves = Math.min(100, (_settlement.foodReserves || 0) + _foodProduced)>> /* Remove completed processes from queue */ <<set _settlement.buildings.mill.processQueue = _settlement.buildings.mill.processQueue.filter(p => p.completionDay > $Day)>> <<run _reportEntry.events.push(`Mill: Completed ${_foodProduced} food production`)>> <</if>> <</if>> /* Process Brewery production - Converts Grain to Mead */ <<if _settlement.buildings && _settlement.buildings.brewery && _settlement.buildings.brewery.staff && _settlement.buildings.brewery.staff.length > 0>> <<set _breweryStaff = _settlement.buildings.brewery.staff>> /* Initialize process queue if it doesn't exist */ <<if !_settlement.buildings.brewery.processQueue>> <<set _settlement.buildings.brewery.processQueue = []>> <</if>> /* Start new brewing processes if grain is available */ <<for _i = 0; _i < _breweryStaff.length; _i++>> <<if (_settlement.grainReserves || 0) >= 5>> <<set _isBrewmaster = _breweryStaff[_i].job && _breweryStaff[_i].job.toLowerCase() === "brewer">> <<set _skill = _breweryStaff[_i].skill || 0>> /* Determine brewing time based on skill */ <<set _processTime = 3>> /* Default 3 days */ <<if _isBrewmaster>> <<if _skill > 70>> <<set _processTime = 1>> /* Expert: 1 day */ <<elseif _skill > 40>> <<set _processTime = 2>> /* Skilled: 2 days */ <</if>> <</if>> /* Start new brewing process */ <<run _settlement.buildings.brewery.processQueue.push({ startDay: $Day, completionDay: $Day + _processTime, workerName: _breweryStaff[_i].name || "Worker", isBrewmaster: _isBrewmaster, skill: _skill })>> <<set _settlement.grainReserves = (_settlement.grainReserves || 0) - 5>> <<run _reportEntry.events.push(`Brewery: Started mead production (${_processTime} days, using 5 grain)`)>> <</if>> <</for>> /* Check for completed brewing processes */ <<set _completedProcesses = []>> <<for _j = 0; _j < _settlement.buildings.brewery.processQueue.length; _j++>> <<if _settlement.buildings.brewery.processQueue[_j].completionDay <= $Day>> <<run _completedProcesses.push(_settlement.buildings.brewery.processQueue[_j])>> <</if>> <</for>> /* Process completed brewing */ <<if _completedProcesses.length > 0>> <<set _meadProduced = _completedProcesses.length>> <<set _settlement.meadReserves = (_settlement.meadReserves || 0) + _meadProduced>> /* Remove completed processes from queue */ <<set _settlement.buildings.brewery.processQueue = _settlement.buildings.brewery.processQueue.filter(p => p.completionDay > $Day)>> <<run _reportEntry.events.push(`Brewery: Completed ${_meadProduced} mead production`)>> <</if>> <</if>> /* Process Tavern production - Converts Mead to Gold */ <<if _settlement.buildings && _settlement.buildings.tavern && _settlement.buildings.tavern.staff && _settlement.buildings.tavern.staff.length > 0>> <<set _tavernStaff = _settlement.buildings.tavern.staff>> <<set _goldProduced = 0>> <<set _meadConsumed = 0>> <<for _i = 0; _i < _tavernStaff.length; _i++>> /* Check if there's mead available to sell */ <<if (_settlement.meadReserves || 0) >= 1>> <<set _goldFromMead = random(30, 45)>> /* 1 mead sells for 30-45 gold */ <<set _goldProduced += _goldFromMead>> <<set _meadConsumed += 1>> <<set _settlement.meadReserves = (_settlement.meadReserves || 0) - 1>> <<else>> /* No mead available - no gold income */ <<run _reportEntry.events.push(`Tavern staff ${_tavernStaff[_i].name || "Worker"} has no mead to sell`)>> <</if>> <</for>> <<set _goldProduced = Math.ceil(_goldProduced * _productionMod)>> <<set $Gold += _goldProduced>> <<if _meadConsumed > 0>> <<run _reportEntry.events.push(`Tavern sold ${_meadConsumed} mead for ${_goldProduced} gold`)>> <<else>> <<run _reportEntry.events.push(`Tavern produced no gold - no mead available`)>> <</if>> /* Taverns still improve settlement happiness */ <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 2)>> <</if>> /* Process Lumber Mill production - Generates Wood */ <<if _settlement.buildings && _settlement.buildings.lumberMill && _settlement.buildings.lumberMill.staff && _settlement.buildings.lumberMill.staff.length > 0>> <<set _lumberStaff = _settlement.buildings.lumberMill.staff>> <<set _woodProduced = 0>> <<set _specialistCount = 0>> <<for _i = 0; _i < _lumberStaff.length; _i++>> <<if _lumberStaff[_i].job && _lumberStaff[_i].job.toLowerCase() === "lumber jack">> <<set _woodProduced += random(10, 15)>> <<set _specialistCount++>> <<else>> <<set _woodProduced += random(5, 10)>> <</if>> <</for>> <<set _woodProduced = Math.ceil(_woodProduced * _productionMod)>> <<set $Wood += _woodProduced>> <<run _reportEntry.events.push(`Lumber Mill produced ${_woodProduced} wood (${_specialistCount}/${_lumberStaff.length} specialist workers)`)>> <</if>> /* Process Forge production - Generates Tools */ <<if _settlement.buildings && _settlement.buildings.forge && _settlement.buildings.forge.staff && _settlement.buildings.forge.staff.length > 0>> <<set _forgeStaff = _settlement.buildings.forge.staff>> <<set _toolsProduced = 0>> <<set _specialistCount = 0>> <<for _i = 0; _i < _forgeStaff.length; _i++>> <<if _forgeStaff[_i].job && _forgeStaff[_i].job.toLowerCase() === "blacksmith">> <<set _toolsProduced += random(3, 5)>> <<set _specialistCount++>> <<else>> <<set _toolsProduced += random(1, 3)>> <</if>> <</for>> <<set _toolsProduced = Math.ceil(_toolsProduced * _productionMod)>> <<set $Tools = ($Tools || 0) + _toolsProduced>> <<run _reportEntry.events.push(`Forge produced ${_toolsProduced} tools (${_specialistCount}/${_forgeStaff.length} specialist blacksmiths)`)>> <</if>> /* Process Settlement Needs Impact on Happiness */ <<set _needsImpact = 0>> /* First, process base happiness from food reserves */ <<if _settlement.foodReserves >= 30>> /* If food is good (>30%), increase happiness up to 70% */ <<if _settlement.Happiness < 70>> <<set _settlement.Happiness = Math.min(70, _settlement.Happiness + 3)>> <<run _reportEntry.events.push(`Settlement morale improved due to adequate food supplies`)>> <</if>> <<elseif _settlement.foodReserves < 15>> /* If food is critically low, decrease happiness significantly */ <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 5)>> <<run _reportEntry.events.push(`⚠️ Critically low food causing severe unhappiness`)>> <<elseif _settlement.foodReserves < 30>> /* Food is between 15-30%, small negative impact */ <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 2)>> <<run _reportEntry.events.push(`⚠️ Low food causing moderate unhappiness`)>> <</if>> /* NEW: Process Housing Capacity Impact */ <<set _housingCapacity = 0>> /* Count houses and calculate total capacity */ <<if _settlement.buildings && _settlement.buildings.house>> <<if typeof _settlement.buildings.house.count !== 'undefined'>> /* New system: houses have a count property */ <<set _housingCapacity = _settlement.buildings.house.count * 3>> <<elseif _settlement.buildings.house.built === true>> /* Old system: single house */ <<set _housingCapacity = 3>> <</if>> <<elseif _settlement.populatedBuildings>> /* Legacy system: count houses in populatedBuildings */ <<set _houseCount = 0>> <<for _buildingName, _residents range _settlement.populatedBuildings>> <<if _buildingName.toLowerCase().includes("house")>> <<set _houseCount++>> <</if>> <</for>> <<set _housingCapacity = _houseCount * 3>> <</if>> /* Check for underpopulation only (removed overcrowding) */ <<if _housingCapacity > 0>> /* Check for underpopulation (less than 50% capacity) */ <<set _occupancyRate = (_villagerCount / _housingCapacity) * 100>> <<if _occupancyRate < 50>> <<set _underpopulationPenalty = Math.min(3, Math.floor((50 - _occupancyRate) / 10))>> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - _underpopulationPenalty)>> <<run _reportEntry.events.push(`🏠 Underpopulated: ${Math.round(_occupancyRate)}% housing occupied (-${_underpopulationPenalty} happiness)`)>> <<else>> <<run _reportEntry.events.push(`🏠 Housing: ${Math.round(_occupancyRate)}% occupied (${_villagerCount}/${_housingCapacity})`)>> <</if>> <<else>> /* No housing at all */ <<if _villagerCount > 0>> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 8)>> <<run _reportEntry.events.push(`🏠 No housing: ${_villagerCount} people homeless (-8 happiness)`)>> <</if>> <</if>> /* NEW: Process Gold Reserves Impact */ <<set _settlementGold = _settlement.gold || 0>> <<if _settlementGold < 100>> <<set _goldPenalty = 0>> <<if _settlementGold < 25>> <<set _goldPenalty = 5>> /* Severe penalty for very low gold */ <<run _reportEntry.events.push(`💰 Critically low gold reserves: ${_settlementGold} (-${_goldPenalty} happiness)`)>> <<elseif _settlementGold < 50>> <<set _goldPenalty = 3>> /* Moderate penalty */ <<run _reportEntry.events.push(`💰 Low gold reserves: ${_settlementGold} (-${_goldPenalty} happiness)`)>> <<elseif _settlementGold < 100>> <<set _goldPenalty = 1>> /* Minor penalty */ <<run _reportEntry.events.push(`💰 Below-average gold reserves: ${_settlementGold} (-${_goldPenalty} happiness)`)>> <</if>> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - _goldPenalty)>> <<else>> <<run _reportEntry.events.push(`💰 Gold reserves: ${_settlementGold} (adequate)`)>> <</if>> /* SIMPLIFIED NEEDS CALCULATION - Replace legacy system */ <<set _realIssues = []>> <<set _criticalIssues = 0>> <<set _importantIssues = 0>> <<set _minorIssues = 0>> /* Check actual settlement issues based on current data */ /* Food Issues */ <<if _settlement.foodReserves < 10>> <<run _realIssues.push("Critical: Critically Low Food")>> <<set _criticalIssues++>> <<elseif _settlement.foodReserves < 20>> <<run _realIssues.push("Important: Low Food Reserves")>> <<set _importantIssues++>> <</if>> /* Gold Issues */ <<if (_settlement.gold || 0) < 25>> <<run _realIssues.push("Important: Low Gold Reserves")>> <<set _importantIssues++>> <</if>> /* Population Issues - only if truly critically low */ <<if _villagerCount < 2>> <<run _realIssues.push("Critical: Critically Low Population")>> <<set _criticalIssues++>> <</if>> /* Housing Issues - only if people are actually homeless */ <<if _villagerCount > 0 && _housingCapacity === 0>> <<run _realIssues.push("Important: No Housing")>> <<set _importantIssues++>> <</if>> /* Building Staffing Issues */ <<set _unstaffedBuildings = []>> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.built && !_building.staff || (_building.staff && _building.staff.length === 0)>> <<if _buildingKey === "farm" || _buildingKey === "mill">> <<run _unstaffedBuildings.push(_buildingKey)>> <</if>> <</if>> <</for>> <</if>> <<if _unstaffedBuildings.length > 0>> <<run _realIssues.push(`Minor: Unstaffed Buildings (${_unstaffedBuildings.join(", ")})`)>> <<set _minorIssues++>> <</if>> /* Apply happiness impact based on real issues */ <<if _realIssues.length === 0>> /* All needs met - can increase above 70% */ <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 5)>> <<run _reportEntry.events.push(`Settlement morale improved - all needs met`)>> <<else>> /* Calculate happiness loss */ <<set _happinessLoss = (_criticalIssues * 3) + (_importantIssues * 2) + _minorIssues>> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - _happinessLoss)>> <<if _importantIssues > 0>> <<run _reportEntry.events.push(`⚠️ ${_importantIssues} important issues causing morale loss (-${_importantIssues * 2})`)>> <</if>> <<if _minorIssues > 0>> <<run _reportEntry.events.push(`📝 ${_minorIssues} minor issues causing slight morale loss (-${_minorIssues})`)>> <</if>> /* List specific issues */ <<if _realIssues.length <= 3>> <<run _reportEntry.events.push(`Current issues: ${_realIssues.join(", ")}`)>> <<else>> <<run _reportEntry.events.push(`Current issues: ${_realIssues.slice(0,3).join(", ")} and ${_realIssues.length - 3} others`)>> <</if>> <</if>> /* Add happiness from tavern if it exists and is staffed */ <<if _settlement.buildings && _settlement.buildings.tavern && _settlement.buildings.tavern.staff && _settlement.buildings.tavern.staff.length > 0>> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 2)>> <<run _reportEntry.events.push(`The tavern boosted settlement morale`)>> <</if>> /* Cap happiness between 0-100 */ <<if _settlement.Happiness > 100>> <<set _settlement.Happiness = 100>> <</if>> <<if _settlement.Happiness < 0>> <<set _settlement.Happiness = 0>> <</if>> /* Process Food Consumption - only if there are villagers */ /* Calculate population from populatedBuildings */ <<set _population = _villagerCount>> /* FOOD CONSUMPTION */ <<set _foodConsumption = _population>> <<set _settlement.foodReserves -= _foodConsumption>> /* Maximum 100, Minimum 0 */ <<if _settlement.foodReserves > 100>> <<set _settlement.foodReserves = 100>> <</if>> <<if _settlement.foodReserves < 0>> <<set _settlement.foodReserves = 0>> <</if>> /* Report */ <<run _reportEntry.events.push(`Food consumed: ${_foodConsumption}%`)>> /* Handle Starvation */ <<if _settlement.foodReserves <= 0>> <<set _settlement.foodReserves = 0>> <!-- Remove a random villager from populatedBuildings --> <<set _allVillagers = _getAllVillagers(_settlement)>> <<if _allVillagers.length > 0>> <<set _casualtyIndex = random(0, _allVillagers.length - 1)>> <<set _casualty = _allVillagers[_casualtyIndex]>> /* remove casualty from whichever container holds them (legacy/new shapes supported) */ <<if _removeVillager(_settlement, _casualty)>> <<run _reportEntry.events.push("⚠️ Starvation: One villager has died (" + (_casualty.name || _casualty.job || "Unknown") + ")")>> <<else>> /* fallback: could not find container — log but continue */ <<run _reportEntry.events.push("⚠️ Starvation: One villager presumed dead but could not locate source array")>> <</if>> <</if>> <</if>> /* Process Settlement Corruption - Calculate average from NPCs */ <<set _totalCorruption = 0>> <<set _corruptedCount = 0>> <<set _imageUpdates = 0>> /* Collect all villagers robustly */ <<set _allVillagersForCorruption = _getAllVillagers(_settlement)>> <<for _idxV = 0; _idxV < _allVillagersForCorruption.length; _idxV++>> <<set _resident = _allVillagersForCorruption[_idxV]>> <<if typeof _resident.corruption === 'undefined'>> <<set _resident.corruption = 0>> <</if>> <<set _totalCorruption += _resident.corruption>> <<set _corruptedCount++>> /* Process female NPC images based on corruption */ <<if _resident.sex === "Female" && _resident.corruption > 60 && _resident.ImagePath>> <<set _imagePath = _resident.ImagePath>> <<set _match = _imagePath.match(/\/(\d+)\.png$/)>> <<if _match && parseInt(_match[1]) < 15>> <<set _oldNumber = parseInt(_match[1])>> <<set _newNumber = _oldNumber + 15>> <<set _resident.ImagePath = _imagePath.replace(/\/\d+\.png$/, `/${_newNumber}.png`) >> <<set _imageUpdates++>> <<run _reportEntry.events.push(`👤 ${_resident.name || "Female villager"} shows visible signs of corruption (Image updated: ${_oldNumber} → ${_newNumber})`)>> <</if>> <</if>> <</for>> <!-- Calculate settlement corruption as average --> <<if _corruptedCount > 0>> <<set _settlement.corruption = Math.round(_totalCorruption / _corruptedCount)>> <<else>> <<set _settlement.corruption = 0>> <</if>> <<run _reportEntry.events.push(`🌑 Settlement corruption level: ${_settlement.corruption}%`)>> <<if _imageUpdates > 0>> <<run _reportEntry.events.push(`🖼️ Updated appearance of ${_imageUpdates} corrupted villagers`)>> <</if>> /* Handle resource shipments to other settlements */ <<if _settlement.shipments && Array.isArray(_settlement.shipments) && _settlement.shipments.length > 0 && typeof _settlement.shippingTargetId === 'number'>> <<set _targetIdx = _settlement.shippingTargetId>> <<if _targetIdx >= 0 && _targetIdx < $CapturedLocations.length && _targetIdx !== _idx>> <<set _target = $CapturedLocations[_targetIdx]>> <<set _shipmentSummaries = []>> <<for _sIdx = 0; _sIdx < _settlement.shipments.length; _sIdx++>> <<set _ship = _settlement.shipments[_sIdx]>> <<if !_ship>> <<continue>> <</if>> <<set _resName = _ship.resource || "">> <<set _daily = Number(_ship.dailyAmount) || 0>> <<set _minStock = Number(_ship.minStock) || 0>> <<if _daily <= 0>> <<continue>> <</if>> <<set _fieldName = "">> <<switch _resName>> <<case "Grain">> <<set _fieldName = "grainReserves">> <<case "Mead">> <<set _fieldName = "meadReserves">> <<case "Food">> <<set _fieldName = "foodReserves">> <<case "Bread">> <<set _fieldName = "foodReserves">> <<case "Wood">> <<set _fieldName = "woodReserves">> <<case "Tools">> <<set _fieldName = "toolReserves">> <<case "Gold">> <<set _fieldName = "goldReserves">> <</switch>> <<if !_fieldName>> <<continue>> <</if>> <<set _current = _settlement[_fieldName] || 0>> <<if _current <= _minStock>> <<continue>> <</if>> <<set _maxSend = _current - _minStock>> <<if _maxSend <= 0>> <<continue>> <</if>> <<set _amount = Math.min(_daily, _maxSend)>> <<if _amount <= 0>> <<continue>> <</if>> <<set _settlement[_fieldName] = _current - _amount>> <<if typeof _target[_fieldName] === 'undefined'>> <<set _target[_fieldName] = 0>> <</if>> <<set _target[_fieldName] += _amount>> <<run _shipmentSummaries.push(`${_resName}: ${_amount}`)>> <</for>> <<if _shipmentSummaries.length > 0>> <<run _reportEntry.events.push(`📦 Shipments sent to ${_target.name}: ${_shipmentSummaries.join(", ")}`)>> <</if>> <<set $CapturedLocations[_targetIdx] = _target>> <</if>> <</if>> /* Add report to collection */ <<set _reportEntry.endingPopulation = _villagerCount>> <<set _reportEntry.endingFood = _settlement.foodReserves>> <<run _reports.push(_reportEntry)>> <<set $CapturedLocations[_idx] = _settlement>> <</for>> <!-- This closes the <<for _idx = 0; _idx < $CapturedLocations.length; _idx++>> loop that starts on line 12 --> /* Store reports in story variable */ <<if !$settlementReports>> <<set $settlementReports = {}>> <</if>> <<for _settlement range $CapturedLocations>> <<if _settlement.Happiness < 0>> <<set _settlement.Happiness = 0>> <</if>> <</for>> <<set $settlementReports[$Day] = _reports>> <</if>> <!-- This closes the main <<if $CapturedLocations.length > 0>> block that starts on line 10 --> <</nobr>>
[[Leave|Bath House]] <div class="demo-end"> <h1>Under Development</h1> <div class="message"> Sorry! This is area is still being developed! <<set $VidPath to "Images/Mountains/1.webp">> <div align="centre">[img[$VidPath]]</div> </div> </div> <<set $VisitedBathHouse to true>>
<<set $Tease to $Tease - 1>> <<set $Int = random(0, 2)>> <<if $Position == "sucking">> <<if $Speed is "Slow">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckS/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Speed is "Fast">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckF/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckF/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/SuckF/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <style> #game-container { font-family: Arial, sans-serif; max-width: 600px; margin: 20px auto; padding: 20px; background-color: #e0e0e0; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.1); color: #333; } #progress-container { width: 100%; background-color: #bbb; border-radius: 15px; overflow: hidden; margin-bottom: 20px; } #progress-bar { width: 0%; height: 30px; transition: width 0.2s ease; border-radius: 15px; } #click-button { background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 5px; transition: background-color 0.3s; } #click-button:hover { background-color: #45a049; } #result { font-size: 18px; font-weight: bold; margin-left: 10px; } .score-display { font-size: 24px; font-weight: bold; margin-bottom: 10px; } </style> <div id="game-container"> <div id="progress-container"> <div id="progress-bar"></div> </div> <button id="click-button" onclick="clickButton()">Click</button> <span id="result"></span> <div id="macroContent" style="display: none;"> <div class="score-display">Final Score: <span id="final-score"></span></div> You do an a <<button "Continue">><<run Engine.play("BJMiniGame")>><</button>> </div> <div id="HighScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an amazing job $Position the $NPC's cock.<br> Pleasure + 25<br>orgasm + 25<br> <<button "Continue">> <<set $NPCCum to $NPCCum + 25>> <<set $NPCEnjoyment to $NPCEnjoyment + 25>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <div id="MidScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an ok job $Position the $NPC's cock.<br> Pleasure + 15<br>orgasm + 15<br> <<button "Continue">> <<set $NPCCum to $NPCCum + 15>> <<set $NPCEnjoyment to $NPCEnjoyment + 15>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <div id="LowScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an bad job $Position the $NPC's cock.<br> Pleasure - 15<br>orgasm - 15<br> <<button "Continue">> <<set $NPCCum to $NPCCum - 15>> <<set $NPCEnjoyment to $NPCEnjoyment - 15>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <div id="BadScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an bad job $Position the $NPC's cock.<br> Pleasure - 25<br>orgasm - 25<br> <<button "Continue">> <<set $NPCCum to $NPCCum - 25>> <<set $NPCEnjoyment to $NPCEnjoyment - 25>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <script> var progressBar = document.getElementById("progress-bar"); var resultDisplay = document.getElementById("result"); var clickButtonElement = document.getElementById("click-button"); var $Score = 50, width = 0, direction = 1, clicks = 0, maxClicks = 5, $Speed = "Slow"; var difficulty = { easy: { speedMin: 0.5, speedMax: 1.5, zoneMin: 20, zoneMax: 50 }, medium: { speedMin: 1, speedMax: 2, zoneMin: 15, zoneMax: 40 }, hard: { speedMin: 1.5, speedMax: 3, zoneMin: 10, zoneMax: 30 } }; var currentDifficulty = $Speed === "Slow" ? difficulty.easy : $Speed === "Fast" ? difficulty.medium : difficulty.easy; var correctStart, correctEnd, interval; function initializeGame() { $Score = 50; width = 0; direction = 1; clicks = 0; resultDisplay.innerText = ""; clickButtonElement.style.display = 'inline-block'; document.getElementById("macroContent").style.display = "none"; correctStart = Math.floor(Math.random() * 70); correctEnd = correctStart + Math.floor(Math.random() * (currentDifficulty.zoneMax - currentDifficulty.zoneMin) + currentDifficulty.zoneMin); if (interval) clearInterval(interval); interval = setInterval(frame, 20); } function frame() { var speed = Math.random() * (currentDifficulty.speedMax - currentDifficulty.speedMin) + currentDifficulty.speedMin; width += direction * speed; if (width >= 100 || width <= 0) direction *= -1; progressBar.style.width = width + "%"; progressBar.style.background = width >= correctStart && width <= correctEnd ? "linear-gradient(to right, #4CAF50, #8BC34A)" : "linear-gradient(to right, #FF5733, #FF8D1A)"; } function clickButton() { clicks++; if (width >= correctStart && width <= correctEnd) { $Score += 10; resultDisplay.innerText = "Click " + clicks + ": Success!"; } else { $Score -= 10; resultDisplay.innerText = "Click " + clicks + ": Missed!"; } if (clicks >= maxClicks) { clearInterval(interval); clickButtonElement.style.display = 'none'; revealMacro(); } else { correctStart = Math.floor(Math.random() * 70); correctEnd = correctStart + Math.floor(Math.random() * (currentDifficulty.zoneMax - currentDifficulty.zoneMin) + currentDifficulty.zoneMin); } } function revealMacro() { ["macroContent", "HighScore", "MidScore", "LowScore", "BadScore"].forEach(id => document.getElementById(id).style.display = "none"); let macroToShow = $Score > 80 ? "HighScore" : $Score > 50 ? "MidScore" : $Score > 30 ? "LowScore" : "BadScore"; document.getElementById(macroToShow).style.display = "block"; document.querySelectorAll(`#${macroToShow} .score-display span`).forEach(el => el.innerText = $Score); } initializeGame(); </script>
<<set $Int = random(0, 2)>> <<if $Position == "throating">> <<if $Speed is "Slow">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Speed is "Fast">> <<if $Int == 0>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <video id="game-video" width="100%" autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/3.webm" type="video/webm"> </video><</if>><</if>> Dont gag! <</if>> <style> #game-container { font-family: Arial, sans-serif; max-width: 600px; margin: 20px auto; padding: 20px; background-color: #e0e0e0; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.1); color: #333; } #progress-container { width: 100%; background-color: #bbb; border-radius: 15px; overflow: hidden; margin-bottom: 20px; } #progress-bar { width: 0%; height: 30px; transition: width 0.2s ease; border-radius: 15px; } #click-button { background-color: #4CAF50; border: none; color: white; padding: 10px 20px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer; border-radius: 5px; transition: background-color 0.3s; } #click-button:hover { background-color: #45a049; } #result { font-size: 18px; font-weight: bold; margin-left: 10px; } .score-display { font-size: 24px; font-weight: bold; margin-bottom: 10px; } </style> <div id="game-container"> <div id="progress-container"> <div id="progress-bar"></div> </div> <button id="click-button" onclick="clickButton()">Click</button> <span id="result"></span> <div id="macroContent" style="display: none;"> <div class="score-display">Final Score: <span id="final-score"></span></div> You do an a <<button "Continue">><<run Engine.play("BJMiniGame")>><</button>> </div> <div id="HighScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an amazing job $Position the $NPC's cock.<br> Pleasure + 25<br>orgasm + 25<br> <<button "Continue">> <<set $NPCCum to $NPCCum + 25>> <<set $NPCEnjoyment to $NPCEnjoyment + 25>> <<if $NPCCum >= 100>><<run Engine.play("BJMiniGameCum")>><<else>> <<run Engine.play("BJMiniGame")>><</if>> <</button>> <</nobr>> </div> <div id="MidScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an ok job $Position the $NPC's cock.<br> Pleasure + 15<br>orgasm + 15<br> <<button "Continue">> <<set $NPCCum to $NPCCum + 15>> <<set $NPCEnjoyment to $NPCEnjoyment + 15>> <<if $NPCCum >= 100>><<run Engine.play("BJMiniGameCum")>><<else>> <<run Engine.play("BJMiniGame")>><</if>> <</button>> <</nobr>> </div> <div id="LowScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an bad job $Position the $NPC's cock.<br> Pleasure - 15<br>orgasm - 15<br> <<button "Continue">> <<set $NPCCum to $NPCCum - 15>> <<set $NPCEnjoyment to $NPCEnjoyment - 15>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <div id="BadScore" style="display: none;"> <span id="final-score" style="font-weight: bold; margin-right: 10px;"></span> <<nobr>> You do an bad job $Position the $NPC's cock.<br> Pleasure - 25<br>orgasm - 25<br> <<button "Continue">> <<set $NPCCum to $NPCCum - 25>> <<set $NPCEnjoyment to $NPCEnjoyment - 25>> <<run Engine.play("BJMiniGame")>> <</button>> <</nobr>> </div> <script> var progressBar = document.getElementById("progress-bar"); var resultDisplay = document.getElementById("result"); var clickButtonElement = document.getElementById("click-button"); var $Score = 50, width = 0, direction = 1, clicks = 0, maxClicks = 5, $Speed = "Fast"; var difficulty = { easy: { speedMin: 0.5, speedMax: 1.5, zoneMin: 20, zoneMax: 50 }, medium: { speedMin: 1, speedMax: 2, zoneMin: 15, zoneMax: 40 }, hard: { speedMin: 1.5, speedMax: 3, zoneMin: 10, zoneMax: 30 } }; var currentDifficulty = $Speed === "Slow" ? difficulty.easy : $Speed === "Fast" ? difficulty.medium : difficulty.easy; var correctStart, correctEnd, interval; function initializeGame() { $Score = 50; width = 0; direction = 1; clicks = 0; resultDisplay.innerText = ""; clickButtonElement.style.display = 'inline-block'; document.getElementById("macroContent").style.display = "none"; correctStart = Math.floor(Math.random() * 70); correctEnd = correctStart + Math.floor(Math.random() * (currentDifficulty.zoneMax - currentDifficulty.zoneMin) + currentDifficulty.zoneMin); if (interval) clearInterval(interval); interval = setInterval(frame, 20); } function frame() { var speed = Math.random() * (currentDifficulty.speedMax - currentDifficulty.speedMin) + currentDifficulty.speedMin; width += direction * speed; if (width >= 100 || width <= 0) direction *= -1; progressBar.style.width = width + "%"; progressBar.style.background = width >= correctStart && width <= correctEnd ? "linear-gradient(to right, #4CAF50, #8BC34A)" : "linear-gradient(to right, #FF5733, #FF8D1A)"; } function clickButton() { clicks++; if (width >= correctStart && width <= correctEnd) { $Score += 10; resultDisplay.innerText = "Click " + clicks + ": Success!"; } else { $Score -= 10; resultDisplay.innerText = "Click " + clicks + ": Missed!"; } if (clicks >= maxClicks) { clearInterval(interval); clickButtonElement.style.display = 'none'; revealMacro(); } else { correctStart = Math.floor(Math.random() * 70); correctEnd = correctStart + Math.floor(Math.random() * (currentDifficulty.zoneMax - currentDifficulty.zoneMin) + currentDifficulty.zoneMin); } } function revealMacro() { ["macroContent", "HighScore", "MidScore", "LowScore", "BadScore"].forEach(id => document.getElementById(id).style.display = "none"); let macroToShow = $Score > 80 ? "HighScore" : $Score > 50 ? "MidScore" : $Score > 30 ? "LowScore" : "BadScore"; document.getElementById(macroToShow).style.display = "block"; document.querySelectorAll(`#${macroToShow} .score-display span`).forEach(el => el.innerText = $Score); } initializeGame(); </script>
<<nobr>> <<set $BackgroundPath to "Images/Mountains/Quary/1.png">> <div class="text-box"> You scrable across rock and snow, before eventually coming to a clearing<br><br> Infront of you is a large open expanse with abandoned houses, tools and other equipment scattered around<br><br> <<You>>A quarry... And its abandond... Ideal<</You>><br><br> You can send prisoners to work in the quary and bring you stone through your portal<br><br> <<set $QuarryDiscovered to true>> <<set $QuarryStaff to 0>> <<button "Return to Ironpeak">> <<goto "Ironpeak Outpost">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div style="font-family:Arial; font-size:22px; color:#FFFFFF; text-align:center; margin-bottom:20px;"> <strong>Quests</strong> </div> <<if $Quests.length > 0>> <<for _index, _quest range $Quests>> <div style="font-family:Arial; font-size:18px; color:#FFFFFF; background-color:#333333; padding:10px; margin-bottom:10px; border-radius:5px;"> <strong>Quest <<print _index + 1>>:</strong> <<print _quest>> </div> <</for>> <<else>> <div style="font-family:Arial; font-size:18px; color:#FFFFFF; text-align:center;"> No quests available. </div> <</if>> <div style="text-align:center; margin-top:20px;"> </div>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> There's a click as the $CurrentRaider.type trips the arrow trap and a flurry of arrows flies across the room.<br><br> An arrow finds its mark and strikes the raider causing $Defences[$Room].damage damage<br> <<set _boost to 0>> <<if $CurrentRaider.type is "Thief">><<set _boost to + 10>><</if>> <<if $CurrentRaider.type is "Heavy Bandit">><<set _boost to - 20>><</if>> <<set _damage to $Defences[$Room].damage + _boost>> <<set $CurrentRaider.health to $CurrentRaider.health - _damage>> <<if $CurrentRaider.gender is "Female">> <<set _img to random(1, 3)>> <<else>> <<set _img to random(4, 6)>> <</if>> <<set $ImagePath to "Images/Castle/Defences/Arrow Trap/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $CurrentRaider.health <= 0>> Taking too much damage, the $CurrentRaider.type collapses and passes away in the corridor from blood loss<br><br> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <<else>> With gritted teeth, the $CurrentRaider.type survives the arrow and continues on <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> <<if $CurrentRaider.gender is "Male">> The tentacles slither around the man, pulling him down <<if $CurrentRaider.health is 100>> <<set _Damage to random($CurrentRaider.min, $CurrentRaider.max)>> <<set $Defences[$Room].health to $Defences[$Room].health - _Damage>> He puts all his power into attacking and cutting free of the black mass causing _Damage damage.<br> <<elseif $CurrentRaider.health gt 70>> <<set _Damage to random($CurrentRaider.min, $CurrentRaider.max)>> <<set $Defences[$Room].health to $Defences[$Room].health - _Damage>> He madly slices around, cutting into whatever he can hit, causing _Damage damage to your pet.<br> <<else>> Too injured to fight on, he tries to resist as the thick black ropes wrap around him and drag him into the water<br> <</if>> <<if $Defences[$Room].health <= 0>> After taking too much damage, the monster releases the raider and slithers back under the water to escape death<br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <<else>> Exhausted, the man can do nothing but watch as he is dragged away to be dealt with later<br> <<set _img to random (6, 9)>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/" + $CurrentRaider.gender + "/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <</if>><</if>> <<if $CurrentRaider.gender is "Female">> The tentacles slither around the woman, binding her ankles under the water<br> <<if $CurrentRaider.health is 100>> <<set _Damage to random($CurrentRaider.min, $CurrentRaider.max)>> <<set $Defences[$Room].health to $Defences[$Room].health - _Damage>> She slashes violently around trying to kill the beast and lands a hit causing _Damage damage.<br> <<elseif $CurrentRaider.health gt 70>> <<set _Damage to random($CurrentRaider.min, $CurrentRaider.max)>> <<set $Defences[$Room].health to $Defences[$Room].health - _Damage>> Despite her injuries she continues fighting and causes _Damage damage to your silent pet.<br> <<else>> Too injured to fight on, she struggles in vain as the black masses coil around her<br> <</if>> <<if $Defences[$Room].health <= 0>> After taking too much damage, the monster releases the raider and slithers back under the water to escape death<br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <<else>> After a few failed swings of her $CurrentRaider.weapon the black mass has engulfed her and pulls away her weapon and rips at her clothes<br><br> The woman's limbs are quickly immobilized as the writhing tentacles wrap around her and explore her body, and before long it has torn away her clothes and begins to explore her holes<br><br> <<set _img to random (1, 9)>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/" + $CurrentRaider.gender + "/Fuck/Close Up/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> Having captured its prey, the beasts drags her below the water and into another open chamber for it to toy with while it awaits another raider<br><br> <<set _img to random (1, 9)>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/" + $CurrentRaider.gender + "/Fuck/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <</if>><</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> The $CurrentRaider.type enters the pool and begins to wade through the black water with little knowledge of what lurks below them<br> <<if $Defences[$Room].health <= 0>> They pass without issue due to the monster being defeated by another raider. The $CurrentRaider.type climbs out of the water on the other side and continues<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <<else>> Without warning the monster launches from the water and attempts to subdue the $CurrentRaider.type<br> <<if $CurrentRaider.gender is "Female">> <<set _img to random (1, 8)>> <<else>> <<set _img to random (1, 5)>> <</if>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/" + $CurrentRaider.gender + "/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<set _Damage to random($CurrentRaider.min, $CurrentRaider.max)>> <<set $Defences[$Room].health to $Defences[$Room].health - _Damage>> <<if $CurrentRaider.health is 100>> The $CurrentRaider.type starts to fight against your monster and tries to make their way to the other side of the pool. They are still at full health and start slashing at your pet with their $CurrentRaider.weapon, causing _Damage damage.<br> <<set _boost to 0>> <<elseif $CurrentRaider.health gt 70>> The $CurrentRaider.type starts to fight against your monster and tries to make their way to the other side of the pool. They are injured but still strong and start slashing at your pet with their $CurrentRaider.weapon, causing _Damage damage.<br> <<set _boost to 10>> <<elseif $CurrentRaider.health gt 50>> The $CurrentRaider.type starts to fight against your monster and tries to make their way to the other side of the pool. They are injured and struggle to fight back, trying kill your pet with their $CurrentRaider.weapon, causing _Damage damage.<br> <<set _boost to 20>> <<else>> Already injured, the $CurrentRaider.type attempts to flee and slashes the beast causing _Damage damage while trying to make it to the other side of the pool<br> <<set _boost to 30>> <</if>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Check Monster Attack">> <<set _roll to random(1, 100)>> <<set _monsterChance to $Defences[$Room].successChance + _boost>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> The monster successfully captures the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<goto "RaidBlackPoolFail">> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type manages to escape! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if !$RaidCaptiveFates>> <<set $RaidCaptiveFates = { killed: 0, imprisoned: 0, released: 0, enslaved_lumber: 0, enslaved_quarry: 0, fed_spider: 0, fed_pool: 0, fed_guardian: 0 }>> <</if>> <<if $RaidCaptives.length == 0>> <<set _totalProcessed = $RaidCaptiveFates.killed + $RaidCaptiveFates.imprisoned + $RaidCaptiveFates.released + $RaidCaptiveFates.enslaved_lumber + $RaidCaptiveFates.enslaved_quarry + $RaidCaptiveFates.fed_spider + $RaidCaptiveFates.fed_pool + $RaidCaptiveFates.fed_guardian>> <<if _totalProcessed == 0>> <!-- No captives were taken during the raid --> <h2 style="color: #8B0000; text-align: center;">⚔️ No Prisoners Taken ⚔️</h2> <div class="scene-setting" style="font-style: italic; color: #CD853F; margin: 10px 0; padding: 10px; border-left: 3px solid #8B0000;"> The throne room is empty save for you and your minions. The stone floor is still slick with blood from the raid, but no prisoners kneel before you. Every raider met their death fighting - none survived to be captured. </div> <div style="text-align: center;"> <h3 style="color: #32CD32;">✓ Total Annihilation</h3> </div> <div style="margin: 15px 0; padding: 15px; background: rgba(0,0,0,0.4); border-left: 3px solid #32CD32;"> <em style="color: #DC143C;">No mercy was shown, no quarter given. Every last raider died where they stood. Their souls have been harvested, their bodies left for the crows. Gnarlak seems almost disappointed at the lack of prisoners to torture.</em> </div> <p style="color: #CD853F; text-align: center;"><strong>"A glorious slaughter, my lord. Not one lived to tell the tale."</strong></p> <<else>> <!-- Captives have been processed --> <h2 style="color: #8B0000; text-align: center;">⛓️ Justice Dispensed ⛓️</h2> <div class="scene-setting" style="font-style: italic; color: #CD853F; margin: 10px 0; padding: 10px; border-left: 3px solid #8B0000;"> The throne room falls quiet. The last of the captives has been dealt with according to your dark will. Blood still stains the stones where justice was served. </div> <div style="text-align: center;"> <h3 style="color: #32CD32;">✓ All Captives Processed</h3> </div> <div style="margin: 15px 0; padding: 15px; background: rgba(0,0,0,0.4); border-left: 3px solid #32CD32;"> <<if $RaidCaptiveFates.killed > 0>> <p style="color: #DC143C;">🩸 <strong>$RaidCaptiveFates.killed</strong> had their souls drained immediately, their essence absorbed into your dark power.</p> <</if>> <<if $RaidCaptiveFates.imprisoned > 0>> <p style="color: #9370DB;">⛓️ <strong>$RaidCaptiveFates.imprisoned</strong> now rot in your dungeons, their wills slowly breaking under torment.</p> <</if>> <<if $RaidCaptiveFates.released > 0>> <p style="color: #90EE90;">🕊️ <strong>$RaidCaptiveFates.released</strong> fled in terror, spreading tales of your dark reign.</p> <</if>> <<if $RaidCaptiveFates.enslaved_lumber > 0>> <p style="color: #8B4513;">🪓 <strong>$RaidCaptiveFates.enslaved_lumber</strong> now toil endlessly at the lumber mill until death takes them.</p> <</if>> <<if $RaidCaptiveFates.enslaved_quarry > 0>> <p style="color: #808080;">⛏️ <strong>$RaidCaptiveFates.enslaved_quarry</strong> break rocks in the quarry, their backs bent in eternal labor.</p> <</if>> <<if $RaidCaptiveFates.fed_spider > 0>> <p style="color: #8A2BE2;">🕷️ <strong>$RaidCaptiveFates.fed_spider</strong> were wrapped in silk, slowly consumed by your arachnid pets.</p> <</if>> <<if $RaidCaptiveFates.fed_pool > 0>> <p style="color: #191970;">🌊 <strong>$RaidCaptiveFates.fed_pool</strong> sank into darkness, devoured by the black pools.</p> <</if>> <<if $RaidCaptiveFates.fed_guardian > 0>> <p style="color: #B22222;">👹 <strong>$RaidCaptiveFates.fed_guardian</strong> were torn apart by your guardians' claws.</p> <</if>> </div> <p style="color: #CD853F; text-align: center;"><strong>"All prisoners dealt with as commanded, my lord. Your will has been done."</strong></p> <</if>> <!-- Reset the fate tracker for next raid --> <<set $RaidCaptiveFates = null>> <div style="text-align: center; margin-top: 20px;"> <<button "🌙 Retire to Your Chambers">> <<goto "Resporn">> <</button>> </div> <<else>> <h2 style="color: #8B0000; text-align: center;">⛓️ Raid Captives ⛓️</h2> <div class="scene-setting" style="font-style: italic; color: #CD853F; margin: 10px 0; padding: 10px; border-left: 3px solid #8B0000;"> The throne room reeks of blood and fear. Torches cast dancing shadows across the faces of your captives, lined up in chains before your dark throne. Gnarlak grins wickedly as he awaits your command... </div> <</if>> <<if $RaidCaptives.length >= 1>> <<if $RaidCaptives.length == 1>> <p style="color: #FFD700;">The last raider cowers before you, abandoned by their fleeing comrades...</p> <<elseif $RaidCaptives.length <= 3>> <p style="color: #FFA500;">A handful of survivors kneel in chains, their raid ending in bitter defeat...</p> <<elseif $RaidCaptives.length <= 5>> <p style="color: #FF6347;">Your dungeons await these captured raiders. Their terrified whispers echo off stone walls...</p> <<else>> <p style="color: #DC143C;">An impressive collection of prisoners. The failed raid has become a bounty of souls and slaves...</p> <</if>> <hr style="border-color: #8B0000;"> <<set $CurrentRaider to $RaidCaptives[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> </div> </div> <div style="margin: 15px 0; padding: 10px; background: rgba(0,0,0,0.3); border-radius: 5px;"> <<if $CurrentRaider.type is "Thief">> <em style="color: #DDA0DD;">The nimble thief bargains desperately: "Please, I only came for gold! I'll tell you about the others! I know things!"</em> <<elseif $CurrentRaider.type is "Heavy Raider">> <em style="color: #B22222;">The armored warrior glares defiantly, refusing to beg even in defeat. Their jaw clenched in stubborn silence.</em> <<elseif $CurrentRaider.type is "Raider">> <<if $CurrentRaider.gender is "Female">> <em style="color: #FFB6C1;">She trembles, knowing the dark fate that awaits female captives in your dungeons...</em> <<else>> <em style="color: #87CEEB;">Fear fills his eyes as he awaits your judgment. "Mercy, dark lord..." he whispers.</em> <</if>> <<else>> <em style="color: #D3D3D3;">The captive kneels in terrified silence, awaiting their fate...</em> <</if>> </div> <hr style="border-color: #8B0000;"> <h3 style="color: #FFD700; text-align: center;">⚖️ Choose Their Fate ⚖️</h3> <div style="display: flex; flex-direction: column; gap: 10px;"> <<button "🩸 Drain Soul Immediately">> <<set $RaidCaptiveFates.killed++>> <<goto "RaidOverSoul">> <</button>> <span style="font-size: 0.9em; color: #9370DB; margin-left: 20px;">End them now and harvest their essence (+1 Soul)</span> <br> <<if ($CellsCount > $DungonOccupance.length)>> <<set _int to random(1, 15)>> <<if $RaidCaptives[0].gender is "Male">> <<button "⛓️ Imprison for Corruption">> <<set $RaidCaptiveFates.imprisoned++>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Raider", sex: "Male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: $CurrentRaider.corruption || 0, status: "Clothed"}>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<run $RaidCaptives.splice($Int, 1)>><<run Engine.show()>> <</button>> <span style="font-size: 0.9em; color: #9370DB; margin-left: 20px;">Break them slowly in your dungeons (Gain devoted servant over time)</span> <br><br> <</if>> <<if $RaidCaptives[0].gender is "Female">> <<button "⛓️ Imprison for Corruption">> <<set $RaidCaptiveFates.imprisoned++>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Raider", sex: "Female", hairColor: $CurrentRaider.hairColor, ImagePath: "Images/Castle/Dungon/Woman/"+ $CurrentRaider.hairColor + "/Clothed/" + _int + ".png", corruption: $CurrentRaider.corruption || 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<run $RaidCaptives.splice($Int, 1)>><<run Engine.show()>> <</button>> <span style="font-size: 0.9em; color: #FFB6C1; margin-left: 20px;">Break her will in your dungeons (Particularly enjoyable process)</span> <br><br> <</if>><</if>> <<if $Notoriety gt 0>> <<button "🕊️ Release as Warning">><<set $RaidCaptiveFates.released++>><<set $Notoriety to $Notoriety - 10>><<run $RaidCaptives.splice($Int, 1)>> <<script>> UI.alert("You allow the terrified raider to flee, wounds still bleeding. 'Tell them what happens to those who attack my domain!' you roar. They stumble away, certain to spread tales of horror."); <</script>> <<run Engine.show()>><</button>> <span style="font-size: 0.9em; color: #90EE90; margin-left: 20px;">Let them flee to spread fear (-10 Notoriety, increases regional fear)</span> <br><br> <</if>> <<if $LumberMillBuilt is true or $QuarryDiscovered is true>> <hr style="border-color: #654321; width: 50%;"> <h4 style="color: #D2691E; text-align: center;">⚒️ Forced Labor ⚒️</h4> <</if>> <<if $LumberMillBuilt is true>> <<if $LumberStaff < 50>> <<button "🪓 Enslave at Lumber Mill">> <<set $RaidCaptiveFates.enslaved_lumber++>> <<set $LumberStaff to $LumberStaff + 1>> <<run $RaidCaptives.splice($Int, 1)>>> <<run Engine.show()>><</button>> <span style="font-size: 0.9em; color: #8B4513; margin-left: 20px;">Work them to death cutting wood (Generate lumber resources)</span> <br> <</if>> <</if>> <<if $QuarryDiscovered is true>> <<if $QuarryStaff < 50>> <<button "⛏️ Enslave at Stone Quarry">> <<set $RaidCaptiveFates.enslaved_quarry++>> <<set $QuarryStaff to $QuarryStaff + 1>> <<run $RaidCaptives.splice($Int, 1)>>> <<run Engine.show()>><</button>> <span style="font-size: 0.9em; color: #808080; margin-left: 20px;">Break rocks until they break (Generate stone resources)</span> <br> <</if>> <</if>> <<set _hasMonsters = false>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && ($Defences[_i].name is "Spider Lair" || $Defences[_i].name is "Black Pool" || $Defences[_i].name is "Guardian")>> <<set _hasMonsters = true>> <<break>> <</if>> <</for>> <<if _hasMonsters>> <hr style="border-color: #4B0082; width: 50%;"> <h4 style="color: #9400D3; text-align: center;">🐙 Feed to Monsters 🐙</h4> <div style="margin: 10px 0; padding: 10px; background: rgba(75,0,130,0.1); border-radius: 5px;"> <em style="color: #DDA0DD;">Your dark creatures hunger for fresh victims. Their screams will echo through the castle for days...</em> </div> <</if>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Spider Lair">> <<capture _i>> <<button `"🕷️ Feed to Spider (Room " + _i + ")"`>> <<set $RaidCaptiveFates.fed_spider++>> <<set $Room = _i>> <<goto "RaidOverSpider">> <</button>> <</capture>> <span style="font-size: 0.9em; color: #8A2BE2; margin-left: 20px;">Web them for slow consumption</span> <br> <</if>> <</for>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Black Pool">> <<capture _i>> <<button `"🌊 Drown in Black Pool (Room " + _i + ")"`>> <<set $RaidCaptiveFates.fed_pool++>> <<set $Room = _i>> <<goto "RaidOverPool">> <</button>> <</capture>> <span style="font-size: 0.9em; color: #191970; margin-left: 20px;">Watch them sink into darkness</span> <br> <</if>> <</for>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Guardian">> <<capture _i>> <<button `"👹 Sacrifice to Guardian (Room " + _i + ")"`>> <<set $RaidCaptiveFates.fed_guardian++>> <<set $Room = _i>> <<goto "RaidOverGuardian">> <</button>> <</capture>> <span style="font-size: 0.9em; color: #B22222; margin-left: 20px;">Let your guardian feast</span> <br> <</if>> <</for>> <<if $RaidCaptives.length > 10>> <hr style="border-color: #800080; width: 50%;"> <h4 style="color: #FF1493; text-align: center;">⚡ Mass Processing ⚡</h4> <div style="background: rgba(139,0,0,0.2); padding: 10px; border-radius: 5px; margin: 10px 0;"> <em style="color: #FFB6C1;">Too many prisoners to handle individually. Sometimes efficiency trumps entertainment...</em> </div> <<button "💀 Execute All Remaining Captives">> <<set _soulsGained = $RaidCaptives.length>> <<set $RaidCaptiveFates.killed += _soulsGained>> <<set $Souls to $Souls + _soulsGained>> <<set $RaidCaptives to []>> <<script>> UI.alert(`You signal to Gnarlak, who grins wickedly. "Kill them all," you command. The throne room erupts in screams as your minions descend upon the prisoners. Within minutes, ${_soulsGained} souls are harvested. The stone floor runs red with blood...`); <</script>> <<run Engine.show()>> <</button>> <span style="font-size: 0.9em; color: #DC143C; margin-left: 20px;">Harvest all souls at once (+$RaidCaptives.length Souls)</span> <</if>> <</if>> <</nobr>> </div>
<<nobr>> <<if $Position is "Strip">> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Lucy/1.webm">> <<else>> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/1.webm">> <</if>> The $CurrentRaider.type begins to loose themselves and jumps at $Defences[$Room].name, enjoying her body<br><br> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _RLine = either(_RaiderResistLines2)>> <<say '$CurrentRaider.type' $CurrentRaider.img>>Gods you're perfect...<</say>><br><br> <<set $NextPosition to "Strip2">> <</if>> <<if $Position is "Strip2">> <<if $Defences[$Room].name is "Lucy">> The partly corrupted woman pushes lucy back and toys with her cunt<br><br> Lucy welcomes her hand and opens her legs wide for the $CurrentRaider.type to explore her, while also removing more of her clothes<br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Lucy/2.webm">> <<else>> Alice pushes the woman face down and continues removing her clothes. <<say '$CurrentRaider.type' $CurrentRaider.img>>I-I can't believe I'm letting you do this<</say>><br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Relax, in a few minuets you'll never want to leave my side<</say>><br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/2.webm">> <</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _RLine = either(_RaiderResistLines2)>> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> <<set $NextPosition to "Sex">> <</if>> <<if $Position is "Sex">> <<if $Defences[$Room].name is "Lucy">> Lucy lowers herself to the womans tight hole. Corruption spreading she opens her legs wide, allowing Lucy to push her fingers inside<br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Lucy/3.webm">> <<else>> Corruption setting in, the woman dives onto Alice. Exploring her body and running her hands over every inch<br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>That's it, wouldn't you rather be mine than dying to the next trap or my master?<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>I... I suppose that isn't too bad...<</say>><br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/3.webm">> <</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set $NextPosition to "Sex2">> <</if>> <<if $Position is "Sex2">> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Lucy/4.webm">> <<else>> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/6.webm">> <</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <</if>> <</nobr>>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room].health gt 0>> <<set $Damage to $Defences[$Room].damage>> The guardian attacks the $CurrentRaider.type causing $Damage damage.<br><br> <<set $CurrentRaider.health to $CurrentRaider.health - $Damage>> Guardian's Health:<br> <progress @value=" $Defences[$Room].health" max="100"></progress><br> Enemy's Health:<br> <progress @value="$CurrentRaider.health" max="100"></progress><br><br> <<if $CurrentRaider.health <= 0>>Your guardian deals the killing blow with its stone sword, cutting down the $CurrentRaider.type<br><br> <<run State.variables.Raiders.shift()>> [[Continue|Raid]] <<else>> [[Continue|EnemyStrikeGuardian]] <</if>> <div align="center"> <img src="Images/Castle/Defences/Guardian.png" width="700" height="700"> </div> <<else>> The $CurrentRaider.type's strike shatters the guardian to rubble. It will reform but for tonight it is broken<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</nobr>> </div>
<<nobr>> <<set $Strategy to "null">> <div class="text-box"> <h1>Locations</h1> <h2>Here is a list of locations your scouts have discovered in the local area</h2> <hr> <<if $RaidLocationList.length === 0>> <p>You have not discovered any locations, send out scouts to find them</p> <<else>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $RaidLocationList.length; _i++>> <<capture _locationDetails>> <<set _locationDetails to $RaidLocationList[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_locationDetails.imagePath" alt="<<_locationDetails.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _locationDetails.name>></h3> <p>Location: <<print _locationDetails.location>></p> <<if _locationDetails.type === "Caravan">> <p>Type: Traveling Caravan</p> <<if _locationDetails.explorerKnowledge.cartsVisible>> <p>Number of Carts: <<print _locationDetails.caravanCarts>></p> <</if>> <<if _locationDetails.explorerKnowledge.guardsVisible>> <p>Number of Guards: <<print _locationDetails.caravanGuards>></p> <<else>> <p>Number of Guards: Unknown</p> <</if>> <<if _locationDetails.explorerKnowledge.resourcesVisible>> <p>Resources:</p> <ul style="text-align: left; padding-left: 30px;"> <<for _j to 0; _j < _locationDetails.caravanResources.length; _j++>> <li>Cart <<print _j + 1>>: <<print _locationDetails.caravanResources[_j]>></li> <</for>> </ul> <<else>> <p>Resources: Unknown</p> <</if>> <<if _locationDetails.explorerKnowledge.daysRemainingVisible>> <p>Days Until Departure: <<print _locationDetails.daysRemaining>></p> <</if>> <<elseif _locationDetails.type === "BanditCamp">> <p>Type: Bandit Camp</p> <p>Size: <<print _locationDetails.size>></p> <p>Camp Strength: <<print _locationDetails.campStrength>>%</p> <<if _locationDetails.explorerKnowledge.guardsVisible>> <p>Number of Bandits: <<print _locationDetails.banditGuards>></p> <<else>> <p>Number of Bandits: Unknown</p> <</if>> <<if _locationDetails.explorerKnowledge.prisonersVisible>> <p>Prisoners: <<print _locationDetails.prisoners>></p> <<else>> <p>Prisoners: Unknown</p> <</if>> <<if _locationDetails.explorerKnowledge.resourcesVisible>> <p>Resources:</p> <ul style="text-align: left; padding-left: 30px;"> <<for _resourceType, _amount range _locationDetails.resources>> <li><<print _resourceType>>: <<print _amount>></li> <</for>> </ul> <<else>> <p>Resources: Unknown</p> <</if>> <<if _locationDetails.attacksCount > 0>> <p>Previous Attacks: <<print _locationDetails.attacksCount>></p> <</if>> <<else>> <p>Type: Settlement</p> <p>Size: <<print _locationDetails.size>></p> <p>Number of Buildings: <<print _locationDetails.raidBuildingCount>></p> <p>Guard Count: <<print _locationDetails.raidGuardCount>></p> <p>Villagers Count: <<print _locationDetails.raidVillagersCount>></p> <</if>> <<button "Plan Raid">> <<set $PriorityTargets to null>> <<set $currentLocationid to _locationDetails.locationId>> <<goto "RaidPlan">> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <div style="text-align: center"> <<button "Cancel">> <<goto "Inside Castle">> <</button>> </div> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if $Position is "BJ">> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Let me get down on my knees<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/MiniGame/BJ/SuckS/2.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Bj/1.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_LucyBJLine)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/MiniGame/BJ/ThroatS/1.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Bj/3.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _RLine = either(_RaiderResistLines2)>> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> <<set _Positions to ["Cul", "Anal", "Throat"]>> <<set $NextPosition = either(_Positions)>> <</if>> <<if $Position is "Cul">> <<if $Defences[$Room].name is "Lucy">> The $CurrentRaider.type pulls Lucy's hips up and pushes his tounge into her cunt<br><br> <<set _SuccLine = either(_LucyLickLinesMale)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<set _VidPath to "Images/Castle/Lucy/Fuck/Cul/2.webm">><<else>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Oh fuck yes, use me!<</say>><br><br> <<set _VidPath to "Images/Castle/Alice/Fuck/Prone/1.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Prone/2.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Prone/2.webm">><</if>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Fu-Fuck yess<</say>><br><br> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _RLine = either(_RaiderResistLines2)>> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> <<set _Positions to ["Behind", "Anal", "Throat"]>> <<set $NextPosition = either(_Positions)>> <</if>> <<if $Position is "Throat">> With corruption taking a greater hold, the raider becomes more desperate for pleasure, he grabs $Defences[$Room].name's head and forces his cock into the back of the throat<br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/MiniGame/Bj/ThroatF/1.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Tf/1.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> $Defences[$Room].name's eyes widen as the $CurrentRaider.type continues ruining her throat and depriving her of air<br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/MiniGame/Bj/ThroatF/3.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Tf/2.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> The raider drags his cock out of $Defences[$Room].name's mouth and slaps her before backing away and letting watching her gasp for air<br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Wow... That was fun<</say>><br><br> <<set _Positions to ["Behind", "Anal"]>> <<set $NextPosition = either(_Positions)>> <</if>> <<if $Position is "Anal">> <<say '$CurrentRaider.type' $CurrentRaider.img>>I'm going to break you<</say>><br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Ummm come get it<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Anal/3.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Anal/2.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_LucyAnalLines)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Anal/1.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Anal/3.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_AfterAnalLines)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<set _Positions to ["Behind", "Throat"]>> <<set $NextPosition = either(_Positions)>> <</if>> <<if $Position is "Behind">> $Defences[$Room].name can tell the man is starting to loose himself to the corruption<br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>Turn around<</say>><br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Ummm come get it<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Behind/1.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Behind/1.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_LucyBehindLines)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Behind/2.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Behind/2.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> The $CurrentRaider.type pulls his cock out of the demon and tries to resist corruption <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Wow... That was fun<</say>><br><br> <<set _Positions to ["Anal", "Throat"]>> <<set $NextPosition = either(_Positions)>> <</if>> <</nobr>>
<div class="text-box"> <<nobr>> <div align="center"> <img src="Images/Castle/Defences/Guardian.png" width="700" height="700"> </div> You return the bandit to the guardians room, they enter with no weapons, completely defenceless<br><br> The guardian, now fully refromed makes short work of them, honing it skill...<br><br> <<if $Defences[$Room].damage lt 50>> <<set $Defences[$Room].damage to $Defences[$Room].damage + 5>> The Guardians power increases<br><br> <<else>> The spiders skill is already at its max... But it enjoys the gift<br><br> <</if>> <<button "Return">> <<run $RaidCaptives.splice($Int, 1)>> <<goto "RaidCell">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $RaidCaptives[0].gender is "Male">> You throw the defenceless man back into the black pool, he thrashes around and tries to get out but is soon entangled and dragged deeper into the pool for the beast to play with<br><br> <<set _img to random(11, 12)>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/Male/" + _img + ".png">> <</if>> <<if $RaidCaptives[0].gender is "Female">> You throw the naked woman back into the black pool, she thrashes around and tries to get out but is soon entangled and dragged deeper into the pool for the beast to play with<br><br> <<set _img to random(1, 4)>> <<set $ImagePath to "Images/Castle/Defences/BlackPool/Female/Breasts/" + _img + ".png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $Defences[$Room].successChance lt 80>> <<set $Defences[$Room].successChance to $Defences[$Room].successChance + 5>> The black pool monster's skill improves<br><br> <<else>> The black pool monster's skill is already at its max... But it enjoys the gift<br><br> <</if>> <<button "Return">> <<run $RaidCaptives.splice($Int, 1)>> <<goto "RaidCell">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Souls to $Souls + 1>> <<if $RaidCaptives[0].gender is "Male">> <<if ($LucyCorrupt == true) and ($AliceCorrupt == true)>> <<set $Position to "FFM">><</if>> <<if ($LucyCorrupt == true) and ($AliceCorrupt == false)>> <<set $Position to "Lucy">><</if>> <<if ($LucyCorrupt == false) and ($AliceCorrupt == true)>> <<set $Position to "Alice">><</if>> <<if ($LucyCorrupt == false) and ($AliceCorrupt == false)>> <<set $Position to "man">><</if>> <</if>> <<if $RaidCaptives[0].gender is "Female">> <<set $Position to "Fcum">><</if>> <<if $Position == "Lucy">> You give the prisoner to Lucy <video autoplay loop> <source src="Images/Castle/Raid/Captives/Lucy.webm" type="video/webm"> </video> <</if>> <<if $Position == "Alice">> You give the prisoner to Alice <video autoplay loop> <source src="Images/Castle/Raid/Captives/Alice.webm" type="video/webm"> </video> <</if>> <<if $Position == "FFM">> You give the prisoner to Lucy and Alice <video autoplay loop> <source src="Images/Castle/Raid/Captives/FFM.webm" type="video/webm"> </video> <</if>> <<if $Position == "Fcum">> You fuck the prisoner till she cums and take her soul <video autoplay loop> <source src="Images/Castle/Raid/Captives/Fcum.webm" type="video/webm"> </video> <</if>> <<if $Position == "man">> You don't have anyone to take care of the man, so you simply cut his throat and move on<</if>> <br><br> <<button "Return">> <<run $RaidCaptives.splice($Int, 1)>> <<goto "RaidCell">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You force the captive back into the defence room $Spider, only this time they have no weapons... You watch them stumble around the room for a few minutes trying to find a way out, but it doesn't take long for them to stumble over a thick white cord causing them to fall into a web. You watch them struggle but it's hopeless. Out of the shadows near the top of the room your pet silently crawls out and lowers itself towards its prey.<br><br> The raider looks up to see the enormous form approaching and screams, but not for long as your pet makes quick work of entangling them further. Covering their mouth, arms and legs. <<if $CurrentRaider.gender is "Female">> <<set _rand to random(6, 7)>> <<set $ImagePath to "Images/Castle/Defences/Spider Capture/" + _rand + ".png">> <<else>> <<set $ImagePath to "Images/Castle/Defences/Spider Capture/5.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $Defences[$Room].successChance lt 80>> <<set $Defences[$Room].successChance to $Defences[$Room].successChance + 5>> The spider's skill improves<br><br> <<else>> The spider's skill is already at its max... But it enjoys the gift<br><br> <</if>> <<button "Return">> <<run $RaidCaptives.splice($Int, 1)>> <<goto "RaidCell">> <</button>> <</nobr>> </div>
<<nobr>> <<set $selectedRaiders = []>> <<set $selectedTargets = []>> <<set $raidResults to { villagerStats: { total: 0, fled: 0, fought: 0 }, buildingAccess: [], loot: { gold: 0, pelts: 0, valuables: [] }, survivors: [], casualties: [], summary: [] }>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <style> .raid-options { display: flex; justify-content: space-between; margin: 20px 0; gap: 15px; } .raid-option { flex: 1; padding: 15px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; } #chooseUnitsButton { display: none; } .raid-option:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .raid-option.selected { background: rgba(139, 0, 0, 0.7); } .option-details { margin-top: 10px; font-size: 0.9em; } .raid-option.disabled { opacity: 0.5; cursor: not-allowed; } .warning { color: #ff4444; } .raid-option.development { opacity: 0.5; cursor: not-allowed; position: relative; } .development-stamp { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-15deg); color: #ff4444; font-size: 1.2em; font-weight: bold; text-transform: uppercase; border: 2px solid #ff4444; padding: 5px; pointer-events: none; } </style> <script> $(document).ready(function() { $(document).on('click', '.raid-option', function() { if (!$(this).hasClass('disabled') && !$(this).hasClass('development')) { $('.raid-option').removeClass('selected'); $(this).addClass('selected'); SugarCube.State.variables.Strategy = $(this).find('h3').text(); $('#chooseUnitsButton').show(); } }); }); </script> <div class="text-box"> <<set $RaidingParty = []>> <<set $savedNPCStates = {}>> <<set setup.buildingData = new Map()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <h1>_location.name</h1> <hr> <<set $ImagePath to _location.imagePath>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if _location.type is "Caravan">> <i>You cannot scout a moving caravan once its discovered</i><br> <<if _location.explorerKnowledge.cartsVisible>> Number of Carts: <<print _location.caravanCarts>><br> <</if>> <<if _location.explorerKnowledge.guardsVisible>> Number of Guards: <<print _location.caravanGuards>><br> <<else>> Number of Guards: Unknown<br> <</if>> <<if _location.explorerKnowledge.resourcesVisible>> Resources: <ul> <<for _i to 0; _i < _location.caravanResources.length; _i++>> <li>Cart <<print _i + 1>>: <<print _location.caravanResources[_i]>></li> <</for>> </ul> <<else>> Resources: Unknown<br> <</if>> <<if _location.explorerKnowledge.daysRemainingVisible>> Days before it leaves the forest: <<print _location.daysRemaining>><br> <</if>> <<elseif _location.type is "BanditCamp">> <p>Type: Bandit Camp</p> <p>Size: <<print _location.size>></p> <p>Camp Strength: <<print _location.campStrength>>%</p> <<if _location.explorerKnowledge.guardsVisible>> <p>Number of Bandits: <<print _location.banditGuards>></p> <<else>> <p>Number of Bandits: Unknown</p> <</if>> <<if _location.explorerKnowledge.prisonersVisible>> <p>Prisoners: <<print _location.prisoners>></p> <<else>> <p>Prisoners: Unknown</p> <</if>> <<if _location.explorerKnowledge.resourcesVisible>> <p>Resources:</p> <ul> <<for _resourceType, _amount range _location.resources>> <li><<print _resourceType>>: <<print _amount>></li> <</for>> </ul> <<else>> <p>Resources: Unknown</p> <</if>> <<if _location.attacksCount > 0>> <p>Previous Attacks: <<print _location.attacksCount>></p> <</if>> <<else>> <<if _location.scouted is false>> <i>You haven't scouted this location</i><br> <</if>> Location: <<print _location.location>><br> Number of buildings: <<print _location.raidBuildingCount>><br> <<if _location.type is "Settlement">> Number of Guards found: <<print _location.raidGuardCount>><br> Number of Villagers found: <<print _location.raidVillagersCount>><br> <<else>> Number of Bandits: <<print _location.raidGuardCount>><br> <</if>> <</if>> </div> <<if _location.type is "Settlement">> <div class="text-box flex-buttons"> <<if _location.scouted is false>> <<button "Scout location">> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/4.png">> <<set $CurrentPlayer to "LucyCloaked">> <<set $RaidScount to false>> <<set $Position to "ScoutStart">> <<run Engine.play('LucyScout')>> <</button>> <</if>> <<if _location.scouted is true>> <<button "View Lucy's Report">> <<goto "ScoutReport">> <</button>> <</if>> <<button "Plan Raid">> <<if _location.scouted isnot true>> <<script>> UI.alert("You need to scout the location before you can raid it"); <</script>> <<else>> <<set $Position to null>> <<run Engine.show()>> <<replace "#raidOptions">> <div class="raid-options"> <div class="raid-option"> <h3>Capture</h3> <div class="option-details"> If successful, you will take control of the location and any surviving subjects </div> </div> <div class="raid-option <<if _location.pillaged>>disabled<</if>>"> <h3>Pillage</h3> <div class="option-details"> Focus your forces on breaking into homes and taking as much resources as possible <<if _location.pillaged>><br><span class="warning">Already pillaged</span><</if>> </div> </div> <div class="raid-option development"> <div class="development-stamp">Under Development</div> <h3>Raze</h3> <div class="option-details"> Send your force to burn and destroy everything </div> </div> </div> <div style="text-align: center"> <<button "Stratergy's guide">> <<goto "RaidStratGuide">> <</button>> <span id="chooseUnitsButton"> <<button "Choose Units">> <<if $Strategy is null>> <<script>> UI.alert("Select a plan before continuing"); <</script>> <<else>> <<goto "RaidTeamSelection">> <</if>> <</button>> </span><br><br> </div> <</replace>> <</if>> <</button>> <div id="raidOptions"> </div> </div> <<elseif _location.type is "Caravan">> <div class="text-box flex-buttons"> <<button "Plan Raid">> <<set $Position to null>> <<run Engine.show()>> <<replace "#caravanRaidOptions">> <div class="raid-options"> <div class="raid-option development"> <div class="development-stamp">For Settlements Only</div> <h3>Capture</h3> <div class="option-details"> If successful, you will take control of the location and any surviving subjects </div> </div> <div class="raid-option"> <h3>Pillage</h3> <div class="option-details"> Kill the guards and take the caravan's resources </div> </div> <div class="raid-option development"> <div class="development-stamp">Under Development</div> <h3>Raze</h3> <div class="option-details"> Send your force to burn and destroy everything </div> </div> </div> <div style="text-align: center"> <<button "Stratergy's guide">> <<goto "RaidStratGuide">> <</button>> <span id="chooseUnitsButton"> <<button "Choose Units">> <<if $Strategy is null>> <<script>> UI.alert("Select a plan before continuing"); <</script>> <<else>> <<goto "RaidTeamSelection">> <</if>> <</button>> </span><br><br> </div> <</replace>> <</button>> <div id="caravanRaidOptions"> </div> </div> <<elseif _location.type is "BanditCamp">> <div class="text-box flex-buttons"> <<button "Plan Raid">> <<set $Position to null>> <<run Engine.show()>> <<replace "#banditRaidOptions">> <div class="raid-options"> <div class="raid-option development"> <div class="development-stamp">Settlements Only</div> <h3>Capture</h3> <div class="option-details"> If successful, you will take control of the location and any surviving subjects </div> </div> <div class="raid-option"> <h3>Pillage</h3> <div class="option-details"> Rescue prisoners and take resources without destroying the camp <<if _location.campStrength < 100>><br><span class="warning">Camp Strength: <<print _location.campStrength>>%</span><</if>> </div> </div> <div class="raid-option"> <h3>Raze</h3> <div class="option-details"> Attempt to destroy the camp completely while rescuing prisoners and taking resources <<if _location.campStrength < 100>><br><span class="warning">Camp Strength: <<print _location.campStrength>>%</span><</if>> </div> </div> </div> <div style="text-align: center"> <<button "Stratergy's guide">> <<goto "RaidStratGuide">> <</button>> <span id="chooseUnitsButton"> <<button "Choose Units">> <<if $Strategy is null>> <<script>> UI.alert("Select a plan before continuing"); <</script>> <<else>> <<goto "RaidTeamSelection">> <</if>> <</button>> </span><br><br> </div> <</replace>> <</button>> <div id="banditRaidOptions"> </div> </div> <</if>> <<set _lucyUnit = $BarraksOccupance.find(unit => unit.name === "Lucy")>> <<if _lucyUnit>><<else>> <<if $LucyCorrupt is true>> <<if $LucyArmor isnot true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", ImagePath: $LucyImg, armor: "None", weapon: "Corruption", health: 100, skill: $LucyPower, duty: "none" }>> <<else>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", ImagePath: "Images/Castle/Lucy/22.png", armor: "None", weapon: "Corruption", health: 100, skill: $LucyPower, duty: "none" }>> <</if>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <<set _aliceUnit = $BarraksOccupance.find(unit => unit.name === "Alice")>> <<if _aliceUnit>><<else>> <<if $AliceCorrupt is true>> <<if $AliceArmor isnot true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", ImagePath: $AliceImg, armor: "Armored", weapon: "Corruption", health: 100, skill: $AlicePower, duty: "none" }>> <<else>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", ImagePath: "Images/Castle/Alice/5.png", armor: "Armored", weapon: "Corruption", health: 100, skill: $AlicePower, duty: "none" }>> <</if>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <</nobr>>
<<nobr>> <style> .raid-status { font-weight: bold; padding: 8px; margin-bottom: 8px; display: block; text-align: center; } .raid-outcome-message { padding: 8px; margin-bottom: 16px; display: block; } .success { color: green; background-color: rgba(0, 255, 0, 0.1); } .partial { color: orange; background-color: rgba(255, 165, 0, 0.1); } .failed { color: red; background-color: rgba(255, 0, 0, 0.1); } .raid-status { width: 100%; padding: 20px; margin: 20px 0; text-align: center; font-size: 2.5em; font-weight: bold; text-transform: uppercase; animation: statusFadeIn 1s ease-in; text-shadow: 0 0 10px currentColor; } @keyframes statusFadeIn { from { transform: scale(0.8); opacity: 0; } to { transform: scale(1); opacity: 1; } } .raid-status.success { background: linear-gradient(rgba(0, 255, 0, 0.1), rgba(0, 255, 0, 0.2)); color: #00ff00; border: 2px solid #00ff00; } .raid-status.failed { background: linear-gradient(rgba(255, 0, 0, 0.1), rgba(255, 0, 0, 0.2)); color: #ff0000; border: 2px solid #ff0000; } .location-card { display: flex; background: rgba(0, 0, 0, 0.7); border: 2px solid #333; border-radius: 8px; padding: 20px; margin: 20px 0; } .location-image { flex: 0 0 300px; } .location-image img { width: 300px; height: 300px; object-fit: cover; border-radius: 4px; } .location-info { flex: 1; padding-left: 20px; } .info-label { font-weight: bold; color: #ccc; margin-right: 10px; } .raid-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin: 10px 0; } .raider-card { position: relative; width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; background-color: rgba(0, 0, 0, 0.7); color: #fff; text-align: center; display: inline-block; } .raider-card img { width: 200px; height: 200px; object-fit: cover; border-radius: 4px; } .raider-card.deceased::after { content: 'FALLEN'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); color: red; border: 3px solid red; padding: 5px 20px; font-size: 24px; font-weight: bold; z-index: 1; pointer-events: none; } progress { width: 90%; height: 20px; border-radius: 10px; } progress::-webkit-progress-bar { background-color: #333; border-radius: 10px; } progress::-webkit-progress-value { background-color: #4CAF50; border-radius: 10px; } .response-stats { background: rgba(0, 0, 0, 0.5); padding: 15px; border-radius: 6px; margin-top: 10px; } .response-stats p { margin: 10px 0; font-size: 1.1em; } .combat-results { background: rgba(0, 0, 0, 0.8); border: 2px solid #444; border-radius: 8px; padding: 20px; margin: 20px 0; box-shadow: 0 0 15px rgba(255, 0, 0, 0.3); } .combat-log { max-height: 400px; overflow-y: auto; padding: 15px; background: rgba(0, 0, 0, 0.5); border-radius: 4px; } .combat-log p { margin: 8px 0; padding: 8px; border-left: 3px solid #444; animation: fadeIn 0.5s ease-in; } .combat-log p:nth-child(even) { background: rgba(50, 50, 50, 0.3); } /* Combat event types */ .combat-hit { border-left-color: #ff4444; } .combat-death { border-left-color: #9c0000; } .combat-counter { border-left-color: #44ff44; } .raid-outcome { border-left-color: #ffaa00; font-size: 1.2em; font-weight: bold; } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Status indicators */ .raid-status { font-size: 1.5em; text-align: center; padding: 10px; margin: 10px 0; border-radius: 4px; text-transform: uppercase; font-weight: bold; } .raid-status.success { background: rgba(0, 255, 0, 0.2); color: #00ff00; } .raid-status.failed { background: rgba(255, 0, 0, 0.2); color: #ff0000; } .raider-card.captured::after { content: 'CAPTURED'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); color: #4CAF50; border: 3px solid #4CAF50; padding: 5px 20px; font-size: 24px; font-weight: bold; } .raider-card.slain::after { content: 'SLAIN'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); color: red; border: 3px solid red; padding: 5px 20px; font-size: 24px; font-weight: bold; z-index: 1; } </style> <</nobr>>
<<nobr>> <<include "RaidReportCSS">> <<if $FirstCapturedLocation isnot true>> <<set $ForceFlee = true>> <<set $FirstCapturedLocation = true>> <</if>> /* Combat Setup and Processing First */ <<set _defenders = []>> <<set _raiders = []>> <<set _combatLog = []>> <<if $currentRaidParty>> <<for _raider range $currentRaidParty>> <<if _raider.armor !== "None" && !_raider.armorBonusApplied>> <<set _raider.health += 25>> <<set _raider.armorBonusApplied = true>> <</if>> <<run _raiders.push(_raider)>> <</for>> <</if>> <<set _villagerFighters = []>> <<set _fleeingVillagers = []>> <<run console.log("Initial defenders:", _defenders.length)>> <<if $currentRaidLocation>> <<for _building, _residents range $currentRaidLocation.populatedBuildings>> <<for _npc range _residents>> <<if $ForceFlee>> <<set _willFlee = true>> <<else>> <<set _willFlee = Math.random() < 0.6>> <</if>> <<if _npc.hiddenJob === "Guard">> <<run _villagerFighters.push(_npc)>> <<set _defenders.push({ type: "Guard", health: 120, building: _building, npc: _npc, fled: false })>> <<else>> <<if !_willFlee>> <<run _villagerFighters.push(_npc)>> <<set _defenders.push({ type: "Villager", health: 60, building: _building, npc: _npc, fled: false })>> <<else>> <<run _fleeingVillagers.push(_npc)>> <</if>> <</if>> <</for>> <</for>> <</if>> /* Debug output */ <<run console.log("Post-population defenders:", JSON.stringify(_defenders))>> <<run console.log("Combat Setup - Raiders:", _raiders)>> <<run console.log("Combat Setup - Defenders:", _defenders)>> <<set _combatParticipants = { fighters: _defenders.filter(d => d.type === "Villager").map(d => d.npc), fleeing: _fleeingVillagers }>> <<set _raidStatus = "In Progress">> /* Combat Loop */ <<set _combatLog = []>> <<set _raidStatus = "In Progress">> /* Debug verification */ <<run console.log("Starting combat check - Defenders:", _defenders.length)>> <<run console.log("Pre-setup defenders:", JSON.stringify(_defenders))>> <<if _defenders.length > 0>> <<for _round = 1; _defenders.length > 0 && _raiders.length > 0; _round++>> <<set _currentRaider = _raiders[0]>> <<set _currentDefender = _defenders[0]>> <<set _baseDamage = _currentRaider.weapon === "Dagger" ? Math.floor(Math.random() * 6) + 15 : Math.floor(Math.random() * 6) + 25>> <<set _specializationBonus = 0>> <<if _currentRaider.specialization === "Combat">> <<if _currentRaider.skill >= 75>><<set _specializationBonus = 8>> <<elseif _currentRaider.skill >= 50>><<set _specializationBonus = 6>> <<elseif _currentRaider.skill >= 25>><<set _specializationBonus = 4>> <<else>><<set _specializationBonus = 2>><</if>> <</if>> <<set _damage = _baseDamage + _specializationBonus>> <<set _currentDefender.health -= _damage>> <<set _combatLog.push(`${_currentRaider.name} hits ${_currentDefender.type} for ${_damage} damage`)>> <<if _currentDefender.health <= 0>> <<set _combatLog.push(`${_currentDefender.type} has fallen!`)>> <<set _defenders.shift()>> <<else>> <<set _counterDamage = _currentDefender.type === "Guard" ? 30 : 20>> <<set _currentRaider.health -= _counterDamage>> <<set _combatLog.push(`${_currentDefender.type} counterattacks for ${_counterDamage} damage`)>> <<if _currentRaider.health <= 0>> <<set _combatLog.push(`${_currentRaider.name} has fallen!`)>> <<set _raiders.shift()>> <</if>> <</if>> <</for>> <<else>> <<set _raidStatus = "Success">> <<set _outcomeMessage = `Your forces took ${$currentRaidLocation.name} without resistance as all villagers fled!`>> <<set _combatLog = []>> <</if>> <<set _combatResults = _combatParticipants>> <<set _capturedLocation = $currentRaidLocation>> <div class="text-box"> <<if _raiders.length > 0>> <<set _raidStatus = "Success">> <<set _outcomeMessage = `Your forces took ${$currentRaidLocation.name} and rounded up anyone who tried to flee, returning them to their homes and taking the settlement!`>> <</if>> <<if _raidStatus === "Success">> <<set _Jobs = ["Blacksmith", "Hunter", "Fletcher", "Farmer", "Tanner", "Miller", "Forester"]>> <<set _capturedLocation = $currentRaidLocation>> <<run console.log("Initial location state:", JSON.stringify($currentRaidLocation.populatedBuildings))>> <<run console.log("Fighters to remove:", JSON.stringify(_combatParticipants.fighters))>> <<run console.log("Fleeing villagers to keep:", JSON.stringify(_combatParticipants.fleeing))>> /* Clean buildings of fighters */ <<for _buildingId, _residents range _capturedLocation.populatedBuildings>> /* Filter out fighters from each building */ <<set _capturedLocation.populatedBuildings[_buildingId] = _residents.filter(resident => !_combatParticipants.fighters.some(fighter => fighter.NPCID === resident.NPCID) )>> <</for>> <<run console.log("Location state after removing fighters:", JSON.stringify(_capturedLocation.populatedBuildings))>> /* Initialize captured villagers array */ <<set _capturedVillagers = $capturedVillagers = []>> <<set _capturedLocation.capturedVillagers = []>> /* Process fleeing villagers and assign jobs */ <<for _villager range _fleeingVillagers>> <<set _villager.status = "Captured">> <<set _villager.origin = $currentRaidLocation.name>> <<if !_villager.name || _villager.name === "Villager">> <<set _villager.name = _villager.job || "Villager">> <</if>> <<if _villager.hiddenJob === "Unknown" || _villager.job === "Unknown">> <<set _randomJobIndex = Math.floor(Math.random() * _Jobs.length)>> <<set _villager.hiddenJob = _Jobs[_randomJobIndex]>> <<set _villager.job = _Jobs[_randomJobIndex]>> <<run console.log(`Assigned new job ${_villager.job} to villager`)>> <</if>> <<run _capturedLocation.capturedVillagers.push(_villager)>> <</for>> <<set _capturedLocation.garrison = _raiders.filter(raider => raider.name !== "Lucy" && raider.name !== "Alice")>> <<set _capturedLocation.Happiness = 50>> <<set _capturedLocation.corruption = 0>> /* Add to captured locations with duplicate check */ <<if !$CapturedLocations>> <<set $CapturedLocations = []>> <<else>> <<set $CapturedLocations = $CapturedLocations.filter(loc => loc.locationId !== _capturedLocation.locationId)>> <</if>> <<run $CapturedLocations.push(_capturedLocation)>> <<run console.log("Final location state:", JSON.stringify(_capturedLocation))>> <<else>> <<set _raidStatus = "Failed">> <<set _outcomeMessage = "Your forces were slaughtered to a man by the defending settlers">> <</if>> /* Display outcome message */ <div class="raid-outcome-message"> <p><<print _outcomeMessage>></p> </div> /* Display Results in New Order */ <div class="raid-status <<print _raidStatus.toLowerCase()>>"> <<print _raidStatus === "Success" ? "RAID SUCCESSFUL" : "RAID FAILED">> </div> </div> /* Location Card */ <div class="location-card"> <div class="location-image"> <img @src="$currentRaidLocation.imagePath" alt="Location Image"> </div> <div class="location-info"> <h1><<print $currentRaidLocation.name>></h1> <p><span class="info-label">Location Type:</span> <<print $currentRaidLocation.type>> (<<print $currentRaidLocation.size>>)</p> <<set _totalNPCs = 0>> <<set _guards = 0>> <<set _villagers = 0>> <<for _building, _residents range $currentRaidLocation.populatedBuildings>> <<for _npc range _residents>> <<if _npc.hiddenJob === "Guard">> <<set _guards += 1>> <<else>> <<set _villagers += 1>> <</if>> <</for>> <</for>> <<set _totalNPCs = _guards + _villagers>> <p><span class="info-label">Guards Present:</span> <<print _guards>></p> <p><span class="info-label">Villagers Present:</span> <<print _villagers>></p> </div> </div> /* Normalize health for surviving raiders */ <<for _raider range $currentRaidParty>> <<if _raider.health > 100>> <<set _raider.health = 100>> <</if>> <</for>> /* Raid Team Status */ <<set _survivors = $currentRaidParty.filter(r => r.health > 0)>> <<set _casualties = $currentRaidParty.filter(r => r.health <= 0)>> /* Display both groups */ <div class="raid-section"> <h2>Raiding Party Status</h2> <div class="raider-container"> /* Display Survivors */ <<for _raider range _survivors>> <div class="raider-card"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Health: <<print _raider.health>></p> </div> <</for>> /* Display Casualties */ <<for _raider range _casualties>> <div class="raider-card deceased"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> </div> <</for>> </div> </div> <<if _raidStatus is "Success">> <div class="raid-section"> <h2>Villagers</h2> _combatResults.fighters.length stayed to fight<br> _combatResults.fleeing.length fled from the raiders <hr> <div class="raider-container"> /* Display fighters */ <<for _villager range _combatResults.fighters>> <div class="raider-card slain"> <img @src="_villager.ImagePath" alt="Villager"> <h3><<print _villager.hiddenJob>></h3> </div> <</for>> /* Display fleeing villagers if raid successful */ <<if _raidStatus === "Success">> <<for _villager range _combatResults.fleeing>> <div class="raider-card captured"> <img @src="_villager.ImagePath" alt="Villager"> <h3><<print _villager.hiddenJob>></h3> <p>Status: Captured</p> </div> <</for>> <</if>> </div> </div> <</if>> <div class="combat-results"> <h2>Combat Breakdown</h2> <div class="combat-log"> <<for _log range _combatLog>> <p class="combat-entry"><<print _log>></p> <</for>> </div> </div> <div style="text-align: center"> <<button "Close">> <<set $pendingRaid to false>> <<if _raidStatus === "Success">> <<set $RaidLocationList = $RaidLocationList.filter(loc => loc.locationId !== $currentRaidLocation.locationId)>> <</if>> <<goto "End Day">><<set $pendingRaid = false>> <</button>> </div> <<set $ForceFlee to false>> <<set $scarldale.influence -= 2>> <</nobr>>
<<nobr>> <<include "RaidReportCSS">> /* Initialize Valuables object if it doesn't exist */ <<if !$Valuables>> <<set $Valuables = { Dyes: 0, Fine_Cloth: 0, Ivory: 0, Venison: 0, Wine: 0, Tobacco: 0, Pottery: 0 }> <</if>> /* Location Card */ <div class="location-card"> <div class="location-image"> <img @src="$currentRaidLocation.imagePath" alt="Location Image"> </div> <div class="location-info"> <h1><<print $currentRaidLocation.name>></h1> <p><span class="info-label">Location Type:</span> <<print $currentRaidLocation.type>> (<<print $currentRaidLocation.size>>)</p> <<set _totalNPCs = 0>> <<set _guards = 0>> <<set _villagers = 0>> <<for _building, _residents range $currentRaidLocation.populatedBuildings>> <<for _npc range _residents>> <<if _npc.hiddenJob === "Guard">> <<set _guards += 1>> <<else>> <<set _villagers += 1>> <</if>> <</for>> <</for>> <<set _totalNPCs = _guards + _villagers>> <p><span class="info-label">Guards Present:</span> <<print _guards>></p> <p><span class="info-label">Villagers Present:</span> <<print _villagers>></p> </div> </div> <<set _combatLog = []>> /* Get best lockpicker from raid party if any */ <<set _bestLockpicker to $currentRaidParty.find(raider => raider.specialization === "Lockpicking" )>> <<set _baseBreakInChance to 40>> <<if _bestLockpicker>> <<if _bestLockpicker.skill >= 80>> <<set _baseBreakInChance to 80>> <<elseif _bestLockpicker.skill >= 50>> <<set _baseBreakInChance to 70>> <<elseif _bestLockpicker.skill >= 20>> <<set _baseBreakInChance to 60>> <<else>> <<set _baseBreakInChance to 50>> <</if>> <</if>> /* Track total valuables and gold gained during raid */ <<set _totalValuablesLooted = { Dyes: 0, Fine_Cloth: 0, Ivory: 0, Venison: 0, Wine: 0, Tobacco: 0, Pottery: 0 }>> <<set _totalGoldLooted = 0>> /* Process break-in attempts for each building */ <<for _buildingId, _building range $currentRaidLocation.populatedBuildings>> <<if _building.locked !== "NA">> <<if _building.keyFound>> <<set _building.breakInSuccess to true>> <<set _building.breakInMethod to "key">> <<else>> <<set _roll to random(1, 100)>> <<set _building.breakInSuccess to _roll <= _baseBreakInChance>> <<set _building.breakInMethod to "lockpicking">> <</if>> <<else>> <<set _building.breakInSuccess to true>> <<set _building.breakInMethod to "open">> <</if>> <</for>> /* Process combat and loot for broken-into buildings */ <<for _buildingId, _building range $currentRaidLocation.populatedBuildings>> <<if _building.breakInSuccess>> /* Process combat for each resident */ <<for _resident range _building>> <<set _currentRaider = $currentRaidParty[random(0, $currentRaidParty.length - 1)]>> /* Set initial health values */ <<if _resident.hiddenJob === "Guard">> <<set _residentHealth = 120>> <<set _residentType = "Guard">> <<run _combatLog.push(`Guard in ${_buildingId} engages ${_currentRaider.name}!`)>> <<else>> <<set _residentHealth = 60>> <<set _residentType = "Resident">> <<if random(1, 100) <= 60>> <<run _combatLog.push(`Resident in ${_buildingId} fights back against ${_currentRaider.name}!`)>> <</if>> <</if>> /* Combat Loop */ <<for _round = 1; _residentHealth > 0 && _currentRaider.health > 0; _round++>> <<if _resident.hiddenJob === "Guard" || random(1, 100) <= 60>> /* Resident/Guard Attack */ <<set _damage = _residentType === "Guard" ? random(20, 30) : random(10, 20)>> <<set _currentRaider.health -= _damage>> <<run _combatLog.push(`${_residentType} hits ${_currentRaider.name} for ${_damage} damage!`)>> /* Raider Counterattack */ <<if _currentRaider.health > 0>> <<set _raiderDamage = _currentRaider.weapon === "Dagger" ? random(15, 25) : random(25, 35)>> <<set _residentHealth -= _raiderDamage>> <<run _combatLog.push(`${_currentRaider.name} strikes back for ${_raiderDamage} damage!`)>> <</if>> <</if>> <</for>> /* Combat Resolution */ <<if _residentHealth <= 0>> <<run _combatLog.push(`${_residentType} in ${_buildingId} has fallen!`)>> <<elseif _currentRaider.health <= 0>> <<run _combatLog.push(`${_currentRaider.name} has fallen!`)>> <</if>> <</for>> /* Process loot - determine if building yields gold or valuables */ <<set _lootChoice = random(1, 100)>> <<if _lootChoice <= 65>> /* 65% chance for gold */ <<if _buildingId.includes("Manor House")>> <<set _building.goldGained = random(100, 200)>> <<else>> <<set _building.goldGained = random(5, 50)>> <</if>> <<set _totalGoldLooted += _building.goldGained>> <<set _building.lootType = "gold">> <<else>> /* 35% chance for valuables */ <<set _building.valuablesGained = {}>> <<set _building.lootType = "valuables">> /* Determine appropriate valuables based on building type */ <<if _buildingId.includes("Manor House")>> <<set _possibleValuables = ["Fine_Cloth", "Ivory", "Wine"]>> <<set _minAmount = 2>> <<set _maxAmount = 5>> <<elseif _buildingId.includes("Tavern") || _buildingId.includes("Inn")>> <<set _possibleValuables = ["Wine", "Pottery", "Tobacco"]>> <<set _minAmount = 1>> <<set _maxAmount = 3>> <<elseif _buildingId.includes("Market") || _buildingId.includes("Shop")>> <<set _possibleValuables = ["Dyes", "Fine_Cloth", "Pottery", "Tobacco"]>> <<set _minAmount = 1>> <<set _maxAmount = 4>> <<elseif _buildingId.includes("Farm") || _buildingId.includes("Mill")>> <<set _possibleValuables = ["Venison"]>> <<set _minAmount = 2>> <<set _maxAmount = 6>> <<else>> /* Regular houses */ <<set _possibleValuables = ["Pottery", "Wine", "Dyes"]>> <<set _minAmount = 1>> <<set _maxAmount = 2>> <</if>> /* Select 1-2 random valuable types from the possible ones */ <<set _numValuableTypes = Math.min(_possibleValuables.length, random(1, 2))>> <<for _i = 0; _i < _numValuableTypes; _i++>> <<set _randomIndex = random(0, _possibleValuables.length - 1)>> <<set _valuableType = _possibleValuables[_randomIndex]>> <<set _amount = random(_minAmount, _maxAmount)>> <<set _building.valuablesGained[_valuableType] = _amount>> <<set _totalValuablesLooted[_valuableType] += _amount>> /* Remove the selected valuable from the list to avoid duplicates */ <<run _possibleValuables.splice(_randomIndex, 1)>> <</for>> <</if>> <</if>> <</for>> /* Update player's resources */ <<set $Gold += _totalGoldLooted>> <<for _valuable, _amount range _totalValuablesLooted>> <<if _amount > 0>> <<set $Valuables[_valuable] += _amount>> <</if>> <</for>> /* Display Results */ <div class="combat-results"> <h2>Raid Results</h2> <<for _buildingId, _building range $currentRaidLocation.populatedBuildings>> <div class="raid-section"> <h3><<print _buildingId>></h3> <div class="response-stats"> /* Building Information */ <<set _guardCount to _building.filter(npc => npc.hiddenJob === "Guard").length>> <p>Occupants: <<print _building.length>></p> <<if _guardCount > 0>> <p>Guards Present: <<print _guardCount>></p> <</if>> /* Access Method */ <<if _buildingId.includes("House") || _buildingId.includes("Manor House") || _buildingId.includes("Tavern") || _buildingId.includes("Inn") || _buildingId.includes("Market") || _buildingId.includes("Shop")>> <p>Access Status: <<if _building.breakInMethod === "key">> Accessed with Key <<elseif _building.breakInMethod === "open">> Building was Unlocked <<else>> <<if _building.breakInSuccess>> Successfully Lockpicked <<else>> Lockpicking Failed - No Access <</if>> <</if>> </p> <</if>> /* Loot Information (if accessed) */ <<if _building.breakInSuccess>> <<if _building.lootType === "gold">> <p>Gold Found: <<print _building.goldGained>> coins</p> <<else>> <p>Valuables Found:</p> <div class="valuables-grid"> <<for _valuable, _amount range _building.valuablesGained>> <<if _amount > 0>> <<set _displayName = _valuable === "Fine_Cloth" ? "Fine Cloth" : _valuable>> <div class="valuable-item"> <img src="Images/Icons/<<print _valuable>>.png" alt="<<print _displayName>>" title="<<print _displayName>>"> <span><<print _displayName>>: <<print _amount>></span> </div> <</if>> <</for>> </div> <</if>> <<set _survivors = $currentRaidParty.filter(r => r.health > 0)>> <<if _survivors.length >= 2>> <<for _target range $PriorityTargets>> <<if _target.building === _buildingId>> <<set _Jobs to ["Blacksmith", "Hunter", "Fletcher", "Farmer", "Tanner", "Miller", "Forester"]>> <<if _target.job === "Unknown">> <<set _target.job = _Jobs[random(0, _Jobs.length - 1)]>> <</if>> <div class="npc-card captured"> <img @src="_target.ImagePath" alt="Captured Target" style="width: 200px; height: 200px; object-fit: cover;"> <h3>Target Captured!</h3> <p>Job: <<print _target.job>></p> <p>Gender: <<print _target.sex>></p> </div> <</if>> <</for>> <</if>> <<else>> <p>No loot acquired - Building not accessed</p> <</if>> </div> </div> <</for>> </div> /* Overall Loot Summary */ <div class="raid-section"> <h2>Total Loot Acquired</h2> <div class="response-stats"> <p><span class="info-label">Gold:</span> <<print _totalGoldLooted>> coins</p> <<if Object.values(_totalValuablesLooted).some(val => val > 0)>> <h3>Valuables</h3> <div class="valuables-grid"> <<for _valuable, _amount range _totalValuablesLooted>> <<if _amount > 0>> <<set _displayName = _valuable === "Fine_Cloth" ? "Fine Cloth" : _valuable>> <div class="valuable-item"> <img src="Images/Icons/<<print _valuable>>.png" alt="<<print _displayName>>" title="<<print _displayName>>"> <span><<print _displayName>>: <<print _amount>></span> </div> <</if>> <</for>> </div> <</if>> </div> </div> /* Raid Team Status Display */ <<set _survivors = $currentRaidParty.filter(r => r.health > 0)>> <<set _casualties = $currentRaidParty.filter(r => r.health <= 0)>> <div class="raid-section"> <h2>Raiding Party Status</h2> <div class="raider-container"> <<if _survivors.length > 0>> <<for _raider range _survivors>> <div class="raider-card"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Health: <<print _raider.health>></p> </div> <</for>> <</if>> /* Casualties */ <<if _casualties.length > 0>> <<for _raider range _casualties>> <div class="raider-card deceased"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> </div> <</for>> <</if>> </div> </div> <div class="combat-results"> <h2>Combat Breakdown</h2> <div class="combat-log"> <<for _log range _combatLog>> <p class="combat-entry"><<print _log>></p> <</for>> </div> </div> /* Process captured NPCs - this part remains mostly unchanged */ <<if !$DungonOccupance>><<set $DungonOccupance = []>><</if>> <<set _capturedNPCs = []>> /* Gather all successfully captured NPCs */ <<for _buildingId, _building range $currentRaidLocation.populatedBuildings>> <<if _building.breakInSuccess>> <<set _survivors = $currentRaidParty.filter(r => r.health > 0)>> <<if _survivors.length >= 2>> <<for _target range $PriorityTargets>> <<if _target.building === _buildingId>> <<run _capturedNPCs.push(_target)>> <</if>> <</for>> <</if>> <</if>> <</for>> /* Process and track remaining prisoners */ <<set _remainingMale = 0>> <<set _remainingFemale = 0>> <<set _totalRemaining = 0>> <<for _captive range _capturedNPCs>> <<if $DungonOccupance.length < $CellsCount>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<if _captive.sex === "male">> <<set _int = random(1, 10)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Raid Captive", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, skill: _captive.job, status: "Clothed" }>> <<run $DungonOccupance.push($CurrentCaptive)>> <<else>> <<set _int = random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Raid Captive", sex: "Female", hairColor: either(["Red", "Brown", "Blonde"]), ImagePath: "Images/Castle/Dungon/Woman/" + either(["Red", "Brown", "Blonde"]) + "/Clothed/" + _int + ".png", corruption: 0, skill: _captive.job, status: "Clothed" }>> <<run $DungonOccupance.push($CurrentCaptive)>> <</if>> <<else>> <<if _captive.sex === "male">> <<set _remainingMale += 1>> <<else>> <<set _remainingFemale += 1>> <</if>> <<set _totalRemaining += 1>> <</if>> <</for>> /* Display remaining prisoner information */ <div class="text-box"> <<if _totalRemaining > 0>> <<set _int to random(0, 1)>> <div class="remaining-prisoners"> <h3>Remaining Captives</h3> <<if _remainingFemale === 1>> <<if _int is 0>> With no where to keep the female captive you hand her over to Alice to keep her entertained<br><br> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/Lesbian/Raid/3.webm" type="video/webm"> </video><br><br> <<else>> With no space in the dungeon, you take the captured woman to your chambers<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/9.webm" type="video/webm"> </video><br><br> <<set $Souls to $Souls + 10>> <</if>> <</if>> <<if _remainingMale === 1>> <<if _int is 0>> With no space for the captured man, you give him over to Alice as a toy to play with <video autoplay loop> <source src="Images/Castle/Alice/Fuck/Behind/2.webm" type="video/webm"> </video><br><br> <<else>> With no space for the cpatured man, you give him over to Lucy as a toy to play with<br><br> <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Bj/3.webm" type="video/webm"> </video><br><br> <</if>> <</if>> <<if _totalRemaining > 2>> With too many captives and not enough space in the dungeon, you hand them over to your foces as a reward<br><br> <video autoplay loop> <source src="Images/Castle/Barraks/Sex/MMF/2.webm" type="video/webm"> </video><br><br> <</if>> </div> <</if>> </div> <<set _survivors = $currentRaidParty.filter(r => r.health > 0 && r.name !== "Lucy" && r.name !== "Alice")>> <<for _survivor range _survivors>> <<run $BarraksOccupance.push(_survivor)>> <</for>> <div style="text-align: center"> <<button "Continue">> <<set $pendingRaid to false>> <<set _location = $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _location.pillaged = true>> <<goto "End Day">> <</button>> </div> <<set $scarldale.influence -= 1>> /* Add CSS for valuable items display */ <<AddStyles>> .valuables-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin-top: 10px; } .valuable-item { display: flex; align-items: center; background-color: rgba(0, 0, 0, 0.1); border-radius: 5px; padding: 5px; } .valuable-item img { width: 32px; height: 32px; margin-right: 10px; } <</AddStyles>> <</nobr>>
<<nobr>> <<set $Room to 1>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <p><span class="info-label">Corruption:</span> $CurrentRaider.corruption</p> </div> </div> <div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room] isnot null>> The $CurrentRaider.type enters the first defence room and is met by a $Defences[$Room].name <div class="Random-image"> <<set _imagePath to $Defences[$Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<else>> Confused, the $CurrentRaider.type tentatively crosses the room, careful not to trigger any unseen traps. After safely corssing the empty room, they move on<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Trap">> Trap success chance: $Defences[$Room].successChance% /* Initialize trigger counter if it doesn't exist */ <<if not $Defences[$Room].currentTriggers>> <<set $Defences[$Room].currentTriggers to 0>> <</if>> /* Check if trap can still trigger */ <<if $Defences[$Room].currentTriggers >= $Defences[$Room].maxTriggers>> <div class="fail-message"> The $Defences[$Room].name has already been triggered the maximum number of times tonight!<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <<else>> <<set _trapChance to $Defences[$Room].successChance>> <<if $CurrentRaider.type is "Thief">> <<if $Defences[$Room].names is "Thief's Lure">> <<set _trapChance to _trapChance + 20>> <<else>> <<set _trapChance to _trapChance / 2>> <</if>><</if>> <div id="trap-animation" style="text-align: center; margin: 20px;"> <<button "Check Trap">> <<set _roll to random(1, 100)>> <<replace "#trap-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#trap-result">> <<if _roll <= _trapChance>> <<set $Defences[$Room].currentTriggers += 1>> <div class="success-message"> The trap was triggered! (Scored: _roll%)<br><br> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type managed to avoid the $Defences[$Room].name! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="trap-result"></div> <</if>> <</if>> <<if $Defences[$Room].type is "Monster">> <<if $Defences[$Room].name is "Black Pool">> Black pool monsters health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> The $CurrentRaider.type attempts to wade through the pool<br> <</if>> <<if $Defences[$Room].name is "Spider Lair">> Spiders skill: <progress @value=" $Defences[$Room].successChance" max="80"></progress><br> The $CurrentRaider.type attempts to pass through the the spiders lair<br> <</if>> <<if $Defences[$Room].name is "Guardian">> Guardians health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <</if>> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Succubus">> <<if $Defences[$Room].health gt 0>> <<include "SuccubusRaidLines">> <<set _RLine = either(_RaiderOpenLines)>> <<set _SuccLine = either(_LucyOpenLines)>> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<button"Continue">> <<goto "SuccubusRaid">> <</button>> <<else>> With $Defences[$Room].name defeated, the raider moves carefully through the open room and on to the next<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</if>> <</if>> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .trap-zone { position: absolute; height: 100%; background: rgba(231, 76, 60, 0.3); border-right: 2px solid #e74c3c; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $Room to 2>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <p><span class="info-label">Corruption:</span> $CurrentRaider.corruption</p> </div> </div> <div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room] isnot null>> The $CurrentRaider.type enters the first defence room and is met by a $Defences[$Room].name <div class="Random-image"> <<set _imagePath to $Defences[$Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<else>> Confused, the $CurrentRaider.type tentatively crosses the room, careful not to trigger any unseen traps. After safely corssing the empty room, they move on<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Trap">> Trap success chance: $Defences[$Room].successChance% /* Initialize trigger counter if it doesn't exist */ <<if not $Defences[$Room].currentTriggers>> <<set $Defences[$Room].currentTriggers to 0>> <</if>> /* Check if trap can still trigger */ <<if $Defences[$Room].currentTriggers >= $Defences[$Room].maxTriggers>> <div class="fail-message"> The $Defences[$Room].name has already been triggered the maximum number of times tonight!<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <<else>> <<set _trapChance to $Defences[$Room].successChance>> <<if $CurrentRaider.type is "Thief">> <<if $Defences[$Room].names is "Thief's Lure">> <<set _trapChance to _trapChance + 20>> <<else>> <<set _trapChance to _trapChance / 2>> <</if>><</if>> <div id="trap-animation" style="text-align: center; margin: 20px;"> <<button "Check Trap">> <<set _roll to random(1, 100)>> <<replace "#trap-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#trap-result">> <<if _roll <= _trapChance>> <<set $Defences[$Room].currentTriggers += 1>> <div class="success-message"> The trap was triggered! (Scored: _roll%)<br><br> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type managed to avoid the $Defences[$Room].name! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="trap-result"></div> <</if>> <</if>> <<if $Defences[$Room].type is "Monster">> <<if $Defences[$Room].name is "Black Pool">> Black pool monsters health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> The $CurrentRaider.type attempts to wade through the pool<br> <</if>> <<if $Defences[$Room].name is "Spider Lair">> Spiders skill: <progress @value=" $Defences[$Room].successChance" max="80"></progress><br> The $CurrentRaider.type attempts to pass through the the spiders lair<br> <</if>> <<if $Defences[$Room].name is "Guardian">> Guardians health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <</if>> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Succubus">> <<if $Defences[$Room].health gt 0>> <<include "SuccubusRaidLines">> <<set _RLine = either(_RaiderOpenLines)>> <<set _SuccLine = either(_LucyOpenLines)>> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<button"Continue">> <<goto "SuccubusRaid">> <</button>> <<else>> With $Defences[$Room].name defeated, the raider moves carefully through the open room and on to the next<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</if>> <</if>> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .trap-zone { position: absolute; height: 100%; background: rgba(231, 76, 60, 0.3); border-right: 2px solid #e74c3c; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $Room to 3>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <p><span class="info-label">Corruption:</span> $CurrentRaider.corruption</p> </div> </div> <div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room] isnot null>> The $CurrentRaider.type enters the first defence room and is met by a $Defences[$Room].name <div class="Random-image"> <<set _imagePath to $Defences[$Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<else>> Confused, the $CurrentRaider.type tentatively crosses the room, careful not to trigger any unseen traps. After safely corssing the empty room, they move on<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Trap">> Trap success chance: $Defences[$Room].successChance% /* Initialize trigger counter if it doesn't exist */ <<if not $Defences[$Room].currentTriggers>> <<set $Defences[$Room].currentTriggers to 0>> <</if>> /* Check if trap can still trigger */ <<if $Defences[$Room].currentTriggers >= $Defences[$Room].maxTriggers>> <div class="fail-message"> The $Defences[$Room].name has already been triggered the maximum number of times tonight!<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <<else>> <<set _trapChance to $Defences[$Room].successChance>> <<if $CurrentRaider.type is "Thief">> <<if $Defences[$Room].names is "Thief's Lure">> <<set _trapChance to _trapChance + 20>> <<else>> <<set _trapChance to _trapChance / 2>> <</if>><</if>> <div id="trap-animation" style="text-align: center; margin: 20px;"> <<button "Check Trap">> <<set _roll to random(1, 100)>> <<replace "#trap-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#trap-result">> <<if _roll <= _trapChance>> <<set $Defences[$Room].currentTriggers += 1>> <div class="success-message"> The trap was triggered! (Scored: _roll%)<br><br> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type managed to avoid the $Defences[$Room].name! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="trap-result"></div> <</if>> <</if>> <<if $Defences[$Room].type is "Monster">> <<if $Defences[$Room].name is "Black Pool">> Black pool monsters health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> The $CurrentRaider.type attempts to wade through the pool<br> <</if>> <<if $Defences[$Room].name is "Spider Lair">> Spiders skill: <progress @value=" $Defences[$Room].successChance" max="80"></progress><br> The $CurrentRaider.type attempts to pass through the the spiders lair<br> <</if>> <<if $Defences[$Room].name is "Guardian">> Guardians health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <</if>> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Succubus">> <<if $Defences[$Room].health gt 0>> <<include "SuccubusRaidLines">> <<set _RLine = either(_RaiderOpenLines)>> <<set _SuccLine = either(_LucyOpenLines)>> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<button"Continue">> <<goto "SuccubusRaid">> <</button>> <<else>> With $Defences[$Room].name defeated, the raider moves carefully through the open room and on to the next<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</if>> <</if>> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .trap-zone { position: absolute; height: 100%; background: rgba(231, 76, 60, 0.3); border-right: 2px solid #e74c3c; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $Room to 4>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <p><span class="info-label">Corruption:</span> $CurrentRaider.corruption</p> </div> </div> <div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room] isnot null>> The $CurrentRaider.type enters the first defence room and is met by a $Defences[$Room].name <div class="Random-image"> <<set _imagePath to $Defences[$Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<else>> Confused, the $CurrentRaider.type tentatively crosses the room, careful not to trigger any unseen traps. After safely corssing the empty room, they move on<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Trap">> Trap success chance: $Defences[$Room].successChance% /* Initialize trigger counter if it doesn't exist */ <<if not $Defences[$Room].currentTriggers>> <<set $Defences[$Room].currentTriggers to 0>> <</if>> /* Check if trap can still trigger */ <<if $Defences[$Room].currentTriggers >= $Defences[$Room].maxTriggers>> <div class="fail-message"> The $Defences[$Room].name has already been triggered the maximum number of times tonight!<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <<else>> <<set _trapChance to $Defences[$Room].successChance>> <<if $CurrentRaider.type is "Thief">> <<if $Defences[$Room].names is "Thief's Lure">> <<set _trapChance to _trapChance + 20>> <<else>> <<set _trapChance to _trapChance / 2>> <</if>><</if>> <div id="trap-animation" style="text-align: center; margin: 20px;"> <<button "Check Trap">> <<set _roll to random(1, 100)>> <<replace "#trap-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#trap-result">> <<if _roll <= _trapChance>> <<set $Defences[$Room].currentTriggers += 1>> <div class="success-message"> The trap was triggered! (Scored: _roll%)<br><br> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type managed to avoid the $Defences[$Room].name! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="trap-result"></div> <</if>> <</if>> <<if $Defences[$Room].type is "Monster">> <<if $Defences[$Room].name is "Black Pool">> Black pool monsters health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> The $CurrentRaider.type attempts to wade through the pool<br> <</if>> <<if $Defences[$Room].name is "Spider Lair">> Spiders skill: <progress @value=" $Defences[$Room].successChance" max="80"></progress><br> The $CurrentRaider.type attempts to pass through the the spiders lair<br> <</if>> <<if $Defences[$Room].name is "Guardian">> Guardians health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <</if>> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Succubus">> <<if $Defences[$Room].health gt 0>> <<include "SuccubusRaidLines">> <<set _RLine = either(_RaiderOpenLines)>> <<set _SuccLine = either(_LucyOpenLines)>> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<button"Continue">> <<goto "SuccubusRaid">> <</button>> <<else>> With $Defences[$Room].name defeated, the raider moves carefully through the open room and on to the next<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</if>> <</if>> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .trap-zone { position: absolute; height: 100%; background: rgba(231, 76, 60, 0.3); border-right: 2px solid #e74c3c; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $Room to 5>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 250px; height: 250px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <p><span class="info-label">Corruption:</span> $CurrentRaider.corruption</p> </div> </div> <div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<if $Defences[$Room] isnot null>> The $CurrentRaider.type enters the first defence room and is met by a $Defences[$Room].name <div class="Random-image"> <<set _imagePath to $Defences[$Room].ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<else>> Confused, the $CurrentRaider.type tentatively crosses the room, careful not to trigger any unseen traps. After safely corssing the empty room, they move on<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Trap">> Trap success chance: $Defences[$Room].successChance% /* Initialize trigger counter if it doesn't exist */ <<if not $Defences[$Room].currentTriggers>> <<set $Defences[$Room].currentTriggers to 0>> <</if>> /* Check if trap can still trigger */ <<if $Defences[$Room].currentTriggers >= $Defences[$Room].maxTriggers>> <div class="fail-message"> The $Defences[$Room].name has already been triggered the maximum number of times tonight!<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <<else>> <<set _trapChance to $Defences[$Room].successChance>> <<if $CurrentRaider.type is "Thief">> <<if $Defences[$Room].names is "Thief's Lure">> <<set _trapChance to _trapChance + 20>> <<else>> <<set _trapChance to _trapChance / 2>> <</if>><</if>> <div id="trap-animation" style="text-align: center; margin: 20px;"> <<button "Check Trap">> <<set _roll to random(1, 100)>> <<replace "#trap-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#trap-result">> <<if _roll <= _trapChance>> <<set $Defences[$Room].currentTriggers += 1>> <div class="success-message"> The trap was triggered! (Scored: _roll%)<br><br> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type managed to avoid the $Defences[$Room].name! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="trap-result"></div> <</if>> <</if>> <<if $Defences[$Room].type is "Monster">> <<if $Defences[$Room].name is "Black Pool">> Black pool monsters health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> The $CurrentRaider.type attempts to wade through the pool<br> <</if>> <<if $Defences[$Room].name is "Spider Lair">> Spiders skill: <progress @value=" $Defences[$Room].successChance" max="80"></progress><br> The $CurrentRaider.type attempts to pass through the the spiders lair<br> <</if>> <<if $Defences[$Room].name is "Guardian">> Guardians health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <</if>> <<button "Continue">> <<goto $Defences[$Room].passage>> <</button>> <</if>> <</if>> <<if $Defences[$Room] isnot null>> <<if $Defences[$Room].type is "Succubus">> <<if $Defences[$Room].health gt 0>> <<include "SuccubusRaidLines">> <<set _RLine = either(_RaiderOpenLines)>> <<set _SuccLine = either(_LucyOpenLines)>> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<button"Continue">> <<goto "SuccubusRaid">> <</button>> <<else>> With $Defences[$Room].name defeated, the raider moves carefully through the open room and on to the next<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set _Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + _Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <</if>> <</if>> <</if>> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .trap-zone { position: absolute; height: 100%; background: rgba(231, 76, 60, 0.3); border-right: 2px solid #e74c3c; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> The $CurrentRaider.type trips over a web and stumbles into a knot of sticky rope. They aren't given a chance to cut themselves free as the enormous and silent form of the arachnid descends on them.<br> Within moments, the helpless raider is entangled in the spider's web, where they will stay until you decide what to do with them...<br><br> <<if $CurrentRaider.gender is "Female">> <<set _rand to random(1, 4)>> <<set $ImagePath to "Images/Castle/Defences/Spider Capture/" + _rand + ".png">> <<else>> <<set $ImagePath to "Images/Castle/Defences/Spider Capture/5.png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <</nobr>> </div>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> The $CurrentRaider.type creeps through the empty room, unaware they are being stalked from above<br><br> <<set $ImagePath to $CurrentRaider.img>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Check Monster Attack">> <<set _roll to random(1, 100)>> <<set _monsterChance to $Defences[$Room].successChance>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> The monster successfully captures the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<goto "RaidSpiderLairFail">> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type manages to escape! (scored: _roll%)<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</nobr>> </div>
<<nobr>> <div class="text-box"> <h1>Raiding Stratergies</h1> <hr> <h1>Settlements</h1> <h2>Capture</h2> Capturing a location yealds the higest reward. It means you take control of all structures and villagers, assuming they aren't killed or they don't flee...<br><br> Once captured, you own the village and can visit it. But you also need to manage and protect it and it's people, or you risk revolt.<br><br> In order for your force to capture a location, they will need to kill all the guards and any villages who don't flee or surender.<br><br> A larger force will be needed to successfully capture a location!<br> <h2>Pillage</h2> Pillaging is simple, but risky. Your force will be focued on the valuable assets, they will need to move quickly, breaking into homes and taking whatever they can.<br><br> The Pillage will be more successful if your scout can recover key's to the houses.<br><br> A successful pillage may return resources, valuables or captives<br><br> Pillaging can be done with a small force<br><br> <hr> <h1>Bandit Camps</h1> <h2>Pillage</h2> Pillagaing a bandit camp focuses of stealing resources from them, there will ususally be less combat and in turn less fatalities on both sides. Rescuing prisoners will add them to your servant quaters for training or sending to a settelment. It also raises happiness throughout the settlements<br><br> <h2>Razing</h2> Ordering your force to raze a camp is difficult and will likely take a few attempts to achieve. Set a casualty limit to avoid your force from being killed to a man (or demon). Successfuly razing a camp will have large rewards, but failing to wipe it out my incure anger from the bandits<br> <hr> <h1>Caravans</h1> Caravans are well guarded convys of carts carrying resources. The guards protecting it are difficult to kill and will all need to be eleminated before your force can search the caravans for useful items. </div> <div style="text-align: center"> <<button "Back">> <<goto "RaidPlan">> <</button>> </div> <</nobr>>
<<nobr>> <style> @import url('https://fonts.googleapis.com/css?family=Tangerine'); .paper-background { background-image: url("Images/Icons/Page.png"); background-size: contain; background-repeat: no-repeat; background-position: center; width: 800px; height: 800px; margin: 0 auto; padding: 40px 40px 40px 80px; position: relative; overflow-y: auto; } .handwritten { font-family: 'Tangerine', cursive; line-height: 1.4; color: #000000; font-size: 1.4em; } .raid-title { text-align: center; font-size: 2.5em; margin-bottom: 20px; font-weight: bold; } .section { margin: 20px 0; } .section-title { font-size: 1.8em; margin-bottom: 10px; font-weight: bold; } .member-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; margin: 10px 0; } .member-entry { padding: 8px; } .member-image { width: 80px; height: 80px; object-fit: cover; } .stamp { position: absolute; bottom: 40px; right: 40px; font-size: 1.6em; transform: rotate(-8deg); color: #8B0000; border: 2px solid #8B0000; padding: 8px; } .objective-badge { display: inline-block; padding: 5px 10px; background-color: rgba(139, 0, 0, 0.7); color: #fff; border-radius: 10px; margin-left: 10px; font-size: 0.8em; vertical-align: middle; } </style> <div class="paper-background"> <div class="handwritten"> <div class="raid-title">Raid Orders</div> <div class="section"> <div class="section-title"> Strategy: $Strategy <<if $Strategy is "Pillage" && $PillageObjective>> <span class="objective-badge">Focus: $PillageObjective</span> <</if>> </div> <<if $Strategy is "Pillage" && $PillageObjective>> <div style="margin-top: 10px;"> <<if $PillageObjective is "Prisoners">> Your raiders will prioritize locating and freeing captives, with less focus on gathering resources. <<elseif $PillageObjective is "Resources">> Your raiders will focus on collecting valuable resources, with less emphasis on rescuing prisoners. <<else>> Your raiders will balance their efforts between rescuing prisoners and gathering resources. <</if>> </div> <</if>> </div> <div class="section"> <div class="section-title">Raiding Party:</div> <div class="member-list"> <<if $RaidingParty && $RaidingParty.length > 0>> <<for _raider range $RaidingParty>> <div class="member-entry"> <img class="member-image" @src="_raider.ImagePath" alt="<<_raider.name>>"> <p>Name: <<print _raider.name>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Armor: <<print _raider.armor>></p> <<if _raider.specialization>> <p>Spec: <<print _raider.specialization>></p> <</if>> </div> <</for>> <<else>> <p>No raiders assigned</p> <</if>> </div> </div> <div class="section"> <div class="section-title">Priority Targets:</div> <div class="member-list"> <<if $PriorityTargets && $PriorityTargets.length > 0>> <<for _target range $PriorityTargets>> <div class="member-entry"> <img class="member-image" @src="_target.ImagePath" alt="Target"> <p>Job: <<print _target.job>></p> <p>Location: <<print _target.building>></p> <p>Armed: <<print _target.weapon !== "None" ? "Yes" : "No">></p> </div> <</for>> <<else>> <<if $Strategy is "Pillage" && $PillageObjective>> <p>Your raiders will focus on the chosen objective: $PillageObjective</p> <<else>> <p>No priority targets designated, this is only for pillaging settlements</p> <</if>> <</if>> </div> </div> </div> </div> <<button "Begin Raid">> <<run console.log("Starting raid with strategy:", $Strategy)>> <<if $PillageObjective>> <<run console.log("Pillage objective:", $PillageObjective)>> <</if>> <<set $RaidOrderDay to $Day>> <<set $pendingRaid to true>> <<set $raidTargetLocationId to $currentLocationid>> <<set _locationData to $RaidLocationList.find(loc => loc.locationId === $currentLocationid)>> <<goto "Base Intro">> <</button>> <</nobr>>
<<nobr>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<if $WolfDead is true>> <<set $ValoraLetter to true>> <<set $ValuraLetterDate to $Day>> <</if>> <<set $ValoraLetter to true>> <<set $ValuraLetterDate to $Day>> <<if $Strategy is "Raze">> <<set $RazeTolorance to 50>> <</if>> <style> .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; } .raider-card:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .raider-card.selected { background: rgba(139, 0, 0, 0.7); } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } .raze-warning { background-color: rgba(139, 0, 0, 0.5); padding: 15px; margin: 15px 0; border-radius: 8px; border: 1px solid #ff4444; } .slider-container { margin: 20px 0; text-align: center; } .slider-value { font-size: 24px; font-weight: bold; margin: 10px 0; } .tolerance-links { display: flex; flex-wrap: wrap; justify-content: center; gap: 5px; margin: 15px 0; } .tolerance-link { display: inline-block; padding: 5px 10px; border: 1px solid #fff; border-radius: 5px; background-color: rgba(0, 0, 0, 0.5); color: #fff; text-decoration: none; cursor: pointer; } .tolerance-link:hover, .tolerance-link.selected { background-color: rgba(139, 0, 0, 0.7); } </style> <div class="text-box"> <h1>Choose your raiding party</h1> The selected strategy is $Strategy<br><br> <<if $Strategy is "Raze">> <div class="raze-warning"> <h3>WARNING: Razing a Bandit Camp</h3> <p>Camps are well defended and may take multiple attacks to destroy. Select the % of your force you are willing to lose before retreating.</p> <div class="slider-container"> <div class="slider-value">Retreat at <span id="tolerance-value"><<= $RazeTolorance>></span>% casualties</div> <div class="tolerance-links"> <<link "10%">> <<set $RazeTolorance to 10>> <<run $("#tolerance-value").text("10")>> <</link>> <<link "20%">> <<set $RazeTolorance to 20>> <<run $("#tolerance-value").text("20")>> <</link>> <<link "30%">> <<set $RazeTolorance to 30>> <<run $("#tolerance-value").text("30")>> <</link>> <<link "40%">> <<set $RazeTolorance to 40>> <<run $("#tolerance-value").text("40")>> <</link>> <<link "50%">> <<set $RazeTolorance to 50>> <<run $("#tolerance-value").text("50")>> <</link>> <<link "60%">> <<set $RazeTolorance to 60>> <<run $("#tolerance-value").text("60")>> <</link>> <<link "70%">> <<set $RazeTolorance to 70>> <<run $("#tolerance-value").text("70")>> <</link>> <<link "80%">> <<set $RazeTolorance to 80>> <<run $("#tolerance-value").text("80")>> <</link>> <<link "90%">> <<set $RazeTolorance to 90>> <<run $("#tolerance-value").text("90")>> <</link>> <<link "100%">> <<set $RazeTolorance to 100>> <<run $("#tolerance-value").text("100")>> <</link>> </div> </div> </div> <</if>> <<if !$selectedRaiders>><<set $selectedRaiders = []>><</if>> <<if $BarraksOccupance.length === 0>> <p>You have no one in your barracks</p> <<else>> <div class="raider-container"> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<capture _raider>> <<set _raider to $BarraksOccupance[_i]>> <div class="raider-card" data-raiderid="<<print _raider.prisonerId>>" style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_raider.ImagePath" alt="<<_raider.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _raider.name>></h3> <p style="margin: 2px 0;">Armor: <<print _raider.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _raider.weapon>></p> <p style="margin: 2px 0;">Specialization: <<if _raider.specialization>><<print _raider.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_raider.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_raider.skill" max="100" style="width: 100%;"></progress> </div> </div> </div> <</capture>> <</for>> </div> <<if $Strategy is "Pillage">> <<button "Begin Pillage">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<set $RaidingParty to []>> <<set _newBarracks to []>> <<run console.log("Starting unit transfer process..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = State.variables.BarraksOccupance.find(unit => unit.name === name); if (selectedUnit) { let newRaider = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, duty: selectedUnit.duty, health: selectedUnit.health }; State.variables.RaidingParty.push(newRaider); console.log(`Created new raider: ${newRaider.name}`); } }); State.variables.BarraksOccupance = State.variables.BarraksOccupance.filter(unit => !State.variables.RaidingParty.some(raider => raider.prisonerId === unit.prisonerId) ); console.log("New Raiding Party:", State.variables.RaidingParty); console.log("Updated Barracks:", State.variables.BarraksOccupance); >> <<if _location.type === "BanditCamp" && $Strategy === "Pillage">> <<goto "PillageObjectiveSelection">> <<elseif _location.type is "Caravan" or _location.type is "Bandit Camp">> <<goto "RaidSummary">> <<else>> <<goto "PillageNPCSelection">> <</if>> <</button>> <<elseif $Strategy is "Raze">> <<button "Begin Razing Operation">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<set $RaidingParty to []>> <<set _newBarracks to []>> <<run console.log("Starting unit transfer process..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = State.variables.BarraksOccupance.find(unit => unit.name === name); if (selectedUnit) { let newRaider = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, duty: selectedUnit.duty, health: selectedUnit.health }; State.variables.RaidingParty.push(newRaider); console.log(`Created new raider: ${newRaider.name}`); } }); State.variables.BarraksOccupance = State.variables.BarraksOccupance.filter(unit => !State.variables.RaidingParty.some(raider => raider.prisonerId === unit.prisonerId) ); console.log("New Raiding Party:", State.variables.RaidingParty); console.log("Updated Barracks:", State.variables.BarraksOccupance); >> <<goto "RaidSummary">> <</button>> <<else>> <<button "Raid!">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<set $RaidingParty to []>> <<set _newBarracks to []>> <<run console.log("Starting unit transfer process..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = State.variables.BarraksOccupance.find(unit => unit.name === name); if (selectedUnit) { let newRaider = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, duty: selectedUnit.duty, health: selectedUnit.health }; State.variables.RaidingParty.push(newRaider); console.log(`Created new raider: ${newRaider.name}`); } }); State.variables.BarraksOccupance = State.variables.BarraksOccupance.filter(unit => !State.variables.RaidingParty.some(raider => raider.prisonerId === unit.prisonerId) ); console.log("New Raiding Party:", State.variables.RaidingParty); console.log("Updated Barracks:", State.variables.BarraksOccupance); >> <<goto "RaidSummary">> <</button>> <</if>> <</if>> </div> <<script>> $(document).ready(function() { $('.raider-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <</nobr>>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> The $CurrentRaider.type cannot resist the allure of the jewelry and gives into the temptation, reaching out and taking the jewelry.<br><br> After a few moments, the corrupting influence of the item takes its toll<br><br> <<if $CurrentRaider.type isnot "Thief">> Visions of lust attack the $CurrentRaider.type's mind.<br> They take $Defences[$Room].damage corruption damage.<br> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $Defences[$Room].damage>> <<else>> <<set $CurrentRaider.corruption to 100>> <</if>> <<set _Vid to random(1, 10)>> <<set $VidPath to "Images/Combat/Trance/" + _Vid>> <<set _GifPath to $VidPath + ".gif">> <<set _WebpPath to $VidPath + ".webp">> <div class="centered-image"> <img @src="_WebpPath" onerror="this.style.display='none'"> </div> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if $CurrentRaider.corruption lt 100>> The $CurrentRaider.type resists further corruption, pulling the charm away and leaving the room<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <<else>> The raider is now fully corrupted and their mind is, for now... broken<br><br> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> [[Continue|Raid]] <</if>> <</nobr>>
<div class="text-box"> <h1>Defence Room $Room</h1> <hr> <<nobr>> <<run State.variables.TrapdoorCaptives.push($Raiders[0])>> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <br> <<if ($TrapdoorCaptives.length == 1) and ($CurrentRaider.gender is "Female")>> The $CurrentRaider.type falls into the pit, in their confusion the corruption charm in the room causes them to lose control<br> <<set _img to random(1, 3)>> <<set $ImagePath to "Images/Castle/Raid/TrapDoor/" + _img + ".webm">> <<set _VidPath to $ImagePath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <<if ($TrapdoorCaptives.length == 1) and ($CurrentRaider.gender is "Male")>> The $CurrentRaider.type falls into the pit, in their confusion the corruption charm in the room causes them to lose control<</if>> <<if ($TrapdoorCaptives.length == 2) and ($CurrentRaider.gender is "Female")>> <<if $TrapdoorCaptives[0].gender is "Male">>The $CurrentRaider.type falls into the pit with the $TrapdoorCaptives[0].type. The corrupting power of the pit soon has them enjoying each other's bodies<br> <<set _img to random(7, 9)>> <</if>> <<if $TrapdoorCaptives[0].gender is "Female">>The $CurrentRaider.type falls into the pit with the $TrapdoorCaptives[0].type. The corrupting power of the pit soon has them enjoying each other's bodies<br> <<set _img to random(4, 6)>> <</if>> <<set $ImagePath to "Images/Castle/Raid/TrapDoor/" + _img + ".webm">> <<set _VidPath to $ImagePath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <<if ($TrapdoorCaptives.length == 2) and ($CurrentRaider.gender is "Male")>> <<if $TrapdoorCaptives[0].gender is "Female">>The $CurrentRaider.type falls into the pit with the $TrapdoorCaptives[0].type. The corrupting power of the pit soon has them enjoying each other's bodies<br> <<set _img to random(7, 9)>> <</if>> <<if $TrapdoorCaptives[0].gender is "Male">>The $CurrentRaider.type falls into the pit with the $TrapdoorCaptives[0].type. In their corruption, they begin fighting <</if>> <<set $ImagePath to "Images/Castle/Raid/TrapDoor/" + _img + ".webm">> <<set _VidPath to $ImagePath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <</if>> <</nobr>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue">> <<goto "Raid">> <</button>> </div>
<<nobr>> <div class="text-box"> <<if $RaidersNumber == 0>> <<set $RaidTime to 0>> <<set $Int to 0>> <<set $Position to "null">> <<if $RaidCaptives.length >= 1>> <div style="text-align: center;"> <h2 style="color: #8B0000;">⚔️ VICTORY! ⚔️</h2> </div> <div style="margin: 15px 0; padding: 10px; border-left: 3px solid #8B0000; background: rgba(0,0,0,0.3);"> <em style="color: #FFD700;">The castle halls fall silent except for the moans of the dying. Blood pools on ancient stones as your minions drag survivors before your throne...</em> </div> <<if $RaidCaptives.length == 1>> <p style="color: #90EE90;">You have captured <strong>one pathetic survivor</strong> from the failed raid.</p> <<elseif $RaidCaptives.length <= 3>> <p style="color: #FFD700;">You have captured <strong>$RaidCaptives.length survivors</strong>. Their fate is in your hands.</p> <<elseif $RaidCaptives.length <= 5>> <p style="color: #FFA500;">You have captured <strong>$RaidCaptives.length prisoners</strong>. The dungeons await fresh victims.</p> <<else>> <p style="color: #DC143C;">You have captured <strong>$RaidCaptives.length raiders</strong>! An impressive haul of souls and slaves.</p> <</if>> <div style="text-align: center; margin-top: 20px;"> <<button "⛓️ Deal with the Captives ⛓️">> <<goto "RaidCell">> <</button>> </div> <<set $BeingRaided to false>> <<else>> <div style="text-align: center;"> <h2 style="color: #8B0000;">⚔️ TOTAL VICTORY! ⚔️</h2> </div> <div style="margin: 15px 0; padding: 10px; border-left: 3px solid #8B0000; background: rgba(0,0,0,0.3);"> <em style="color: #DC143C;">The raid is crushed utterly. No survivors remain to tell the tale. The castle grounds are littered with corpses, their souls already harvested. Your dark reputation grows...</em> </div> <p style="color: #32CD32; text-align: center;"><strong>All raiders have been slain. The castle is secure.</strong></p> <div style="text-align: center; margin-top: 20px;"> <<button "🏰 Return to Your Domain">> <<goto "Resporn">> <</button>> </div> <<set $BeingRaided to false>> <</if>> <</if>> <<if $RaidersNumber >= 1>> <<if $TarotCardInvet.includes("Tower")>> Having the Tower Tarot means 1 more raider will visit <</if>> <<set $CurrentRaider to $Raiders[0]>> <<set _imagePath to $CurrentRaider.img>> Bandits have slipped your gate and are coming for your vault. They are past your outer walls and are making their way through your defences<br><br> The next raider is a $CurrentRaider.type<br><br> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image" style="width: 400px; height: 400px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Sex:</span> $CurrentRaider.gender</p> <p><span class="info-label">Enemy type:</span> $CurrentRaider.type</p> <p><span class="info-label">Weapon:</span> $CurrentRaider.weapon</p> <p><span class="info-label">Health:</span> $CurrentRaider.health</p> <<if $CurrentRaider.type is "Thief">> <p>Thieves have 50% less chance of triggering normal traps</p> <</if>> </div> </div> They break into the first: <<button "Defence Room">> <<goto "RaidRoom1">> <</button>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $HouseVisit to true>> <<set $NPCCum to 0>> <<set $PlayerCum to 0>> <<if $LockPicksUnlocked is true>> <<set $WomanLocations to ["Livingroom", "Bedroom", "Kitchen"]>> <<set $ManLocations to ["Livingroom", "null", "Kitchen", "null"]>> <<set $ItemLocations to ["Livingroom", "Bedroom", "Kitchen", "null"]>> <<set _int to random(0, $WomanLocations.length - 1)>> <<set $WomanLocation to $WomanLocations[_int]>> <<run $ManLocations.deleteAt($ManLocations.indexOf($WomanLocation))>> <<run $ItemLocations.deleteAt($ItemLocations.indexOf($WomanLocation))>> <<set _int to random(0, $ManLocations.length - 1)>> <<set $ManLocation to $ManLocations[_int]>> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "Villager">> <<set $EnemyMin to 10>> <<set $EnemyMax to 20>> <<set $EnemyWeapon to "dagger">> <<run $ItemLocations.deleteAt($ItemLocations.indexOf($ManLocation))>> <<set _int to random(0, $ItemLocations.length - 1)>> <<set $ItemLocation to $ItemLocations[_int]>> <<if $ManLocation isnot "null">> <<set $HusbandHome to true>> <<else>> <<set $HusbandHome to false>> <</if>> <<set $Img to random (1, 7)>> <<set $NPCInt to $NPCInt + 3>> <<if $Position is "Stalk">> You follow the young woman through the forest being careful not to step on any fallen bratches, after some time she arrives at a small house on the outskirts of Scarldale village. <br><br> <<else>> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <<You>>There could be someone else in there... I need to be careful<</You>><br><br> <</if>> <<else>> <<if $Position is "Stalk">> The girl enters her home. You try to follow but the door is locked... You need to find some lock picks somewhere...<br><br> <<else>> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <</if>> <</if>> <<set _int to random(1, 9)>> <<set $ImagePath to "Images/Forrest/Encounters/House/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<if $LockPicks gt 0>> [[Pick the lock|ForrestLockPick]] <<else>> You have no lock picks so you <<link "leave">> <<set $HouseVisit to false>><<goto "ForestExplore">><</link>> <</if>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <<set $MaleDetectedLines to [ "Who the fuck are you!", "Get out of my house", "Bastard thief"]>> <<set $FemaleDetectedLines to [ "Who are you!", "What do you want!", "Get out! Help!"]>> </div> <</nobr>>
<<nobr>> <div class="town-menu"> <h1>Harbor’s End Residential District</h1> <<if ($Time lt 9) and ($Quests.includes("Obtain a silver weapon"))>> <<You>>I should wait till dark to sneak into people's homes<</You>> <</if>> <<if $Time >= 9>> <<if $LockPicksUnlocked is true>> <div class="menu-item" data-image="Images/Town/Houses/1.png"> [[Search the town houses|TownHouses]] </div> <</if>> <</if>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Return to the gates|TownOLD]] </div> </div> <<set $CloakDisabled to true>> <style> .town-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .town-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .town-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } .menu-item.disabled { opacity: 0.5; cursor: not-allowed; } .menu-item.disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .town-image { text-align: center; margin-top: 20px; } .town-image img { max-width: 100%; height: auto; border-radius: 5px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>> <<addclass "#right-ui-bar" "stowed">>
<<goto "Resporn">>
<div class="text-box"> <<nobr>> <<script>> if (typeof CombatSystem !== 'undefined') { CombatSystem.cleanupForNextFight(); } <</script>> <<set $enemyDominateSpellCast to false>> <<set $enemyTranceSpellCast to false>> <<set $PlayerEntangled to false>> <!-- Check if we just finished a raid --> <<set _justFinishedRaid = false>> <<if $RaidCaptiveFates>> <<set _justFinishedRaid = true>> <<set $RaidCaptiveFates = null>> <</if>> <<if ($PlayerHealth lt 1) and ($Souls gt 0)>> <<if $BeingRaided is false>> <<if $TarotCardInvet.includes("Strength")>> The Strength tarot card causes you to lose two souls upon death<br><br> You sacrifice two of your souls and live on, reforming in your chambers...<br> <<set $Souls to $Souls - 2>> <<else>> You sacrifice one of your souls and live on, reforming in your chambers...<br> <<set $Souls to $Souls - 1>> <</if>> [[Continue|Chambers]] <<else>> You wake up in your chambers <<Gnarlak>>My Lord, your awake!<</Gnarlak>><br> <<You>>What happend?<</You>><br> <<Gnarlak>>The raiders broke past the defences and got into the vault, they took as much as they could carry<</Gnarlak>><br> <<You>>Fuck<</You>><br> <<Gnarlak>>I watched one of them strike you down, so I ran<</Gnarlak>><br> <<You>>Big help you were<</You>><br> <<Gnarlak>>Im sorry my Lord, but on the bright side, your alive and the raiders probably think your dead!<</Gnarlak>><br> Gnarlak helps you to your feet<br> <<Gnarlak>>I will start the repairs to the castle! We should be sorted by the end of today<</Gnarlak>><br> [[Get up|Chambers]] <</if>> <<if $TarotCardInvet.includes("Strength")>> <<set $Souls to $Souls - 2>> <<else>> <<set $Souls to $Souls - 1>> <</if>> <<elseif ($Souls is 0) and ($PlayerHealth lt 1)>> Without a soul to use, you perish<br><br> <h1>The End</h1> <</if>> <<if $PlayerHealth >= 1>> <<if _justFinishedRaid>> <!-- After dealing with raid captives --> <div style="text-align: center;"> <h2 style="color: #8B0000;">🏰 Return to Your Domain 🏰</h2> </div> <div style="margin: 15px 0; padding: 10px; border-left: 3px solid #8B0000; background: rgba(0,0,0,0.3);"> <em style="color: #CD853F;">The castle grows quiet as the night deepens. You make your way through blood-stained halls back to your chambers. The day's violence has ended, and your dark domain is secure once more. Tomorrow brings new opportunities for conquest...</em> </div> <p style="color: #90EE90; text-align: center;">Your minions clean the carnage as you retire for the night.</p> <<else>> <!-- Normal morning wake up --> <div style="margin: 10px 0; padding: 10px; border-left: 3px solid #FFD700;"> <em style="color: #FFD700;">Dawn breaks over your dark domain. You wake in your chambers as shadows retreat from the morning light...</em> </div> <</if>> <<set $Int = random(0, 3)>> <<if ($LucyCorrupt is true) and ($Int == 0)>> Looking down to find Lucy sucking your cock<br><br> <<say 'Lucy' $LucyImg>>Morning $LucyName<</say>><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/sex/4.webm" type="video/webm"> </video> <</if>> <<if ($AliceCorrupt is true) and ($Int == 1)>> Looking down you find Alice swallowing your cock<br><br> <<say 'Alice' $AliceImg>>Good morning, $AliceName<</say>><br><br> <video autoplay loop> <source src="Images/Castle/Chambers/sex/3.webm" type="video/webm"> </video> <</if>> <<if ($AliceCorrupt is true) and ($LucyCorrupt is true) and ($Int == 2)>> As you wake up you enjoy the feeling of Alice and Lucy taking turns to suck you<br> <video autoplay loop> <source src="Images/Castle/Chambers/sex/5.webm" type="video/webm"> </video> <</if>> /* Add this at the end of your Sleep passage */ <<if _justFinishedRaid>> <div style="text-align: center; margin-top: 20px;"> <<button "⚔️ Survey Your Domain">> <<goto "Chambers">> <</button>> </div> <<else>> <div style="text-align: center; margin-top: 20px;"> <<button "☀️ Rise and Begin the Day">> <<goto "Chambers">> <</button>> </div> <</if>> <</if>> <</nobr>> </div> <<set $Time to 1>> <<set $Day to $Day + 1>> <<set $PlayerHealth to 100>> <<set $PlayerEnergy to 100>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $LucyHealth to 100>> <<set $AliceHealth to 100>> <<set $DemonHealth to 100>>
<<nobr>> <<if !_settlement.isUnderAttack && _settlement.Happiness < 20 && _settlement.corruption < 70 && random(1, 4) === 1>> <<set _rebels = []>> <<set _defenders = []>> <<set _combatLog = []>> /* Generate rebels from villagers */ <<for _villager range _settlement.capturedVillagers>> <<run _rebels.push({ name: "Rebel Villager " + (_rebels.length + 1), health: 60, weapon: "Dagger", damage: Math.floor(Math.random() * 6) + 15 })>> <</for>> /* Setup garrison defenders */ <<for _soldier range _settlement.garrison>> <<run _defenders.push({ type: "Guard", health: _soldier.health, weapon: _soldier.weapon, damage: 30, originalMember: _soldier, startingHealth: _soldier.health })>> <</for>> /* Combat processing */ <<for _round = 1; _defenders.length > 0 && _rebels.length > 0; _round++>> <<set _currentRebel = _rebels[0]>> <<set _currentDefender = _defenders[0]>> /* Rebel attacks */ <<set _currentDefender.health -= _currentRebel.damage>> <<run _combatLog.push(`${_currentRebel.name} hits ${_currentDefender.originalMember.name} for ${_currentRebel.damage} damage`)>> /* Check defender death */ <<if _currentDefender.health <= 0>> <<run _combatLog.push(`${_currentDefender.originalMember.name} has been killed!`)>> <<run _reportEntry.events.push(`${_currentDefender.originalMember.name} was killed suppressing the revolt!`)>> <<run _settlement.garrison = _settlement.garrison.filter(g => g !== _currentDefender.originalMember)>> <<run _defenders.shift()>> <<else>> /* Defender counterattack */ <<set _currentRebel.health -= _currentDefender.damage>> <<run _combatLog.push(`${_currentDefender.originalMember.name} counterattacks for ${_currentRebel.damage} damage`)>> /* Check rebel subdued */ <<if _currentRebel.health <= 0>> <<run _combatLog.push(`A rebel villager has been subdued`)>> <<run _rebels.shift()>> <</if>> <</if>> <</for>> /* Update surviving garrison members' health */ <<for _defender range _defenders>> <<set _defender.originalMember.health = _defender.health>> <<if _defender.health < _defender.startingHealth>> <<run _reportEntry.events.push(`${_defender.originalMember.name} was injured (${_defender.startingHealth - _defender.health} damage taken, health now at ${_defender.health})`)>> <</if>> <</for>> /* Process revolt results */ <<if _defenders.length === 0>> <div class="revolt-warning" style="text-align: center; margin: 20px 0;"> <h2 style="color: #8b0000;">Control Lost: <<print _settlement.name>></h2> <h3 style="color: #4a4a4a;">The garrison has fallen to the uprising</h3> <div style="font-style: italic; color: #666;"> The people have risen up and overthrown your forces... </div> <hr style="border-color: #8b0000;"> </div> /* Process garrison casualties */ <<for _defender range _settlement.garrison>> <<run _reportEntry.events.push(`${_defender.name} was killed in the uprising`)>> <</for>> /* Create new raid location from lost settlement */ <<set $RaidLocationDetails = { locationId: $locationIdCounter++, NPCCount: _settlement.capturedVillagers.length, name: _settlement.name, location: "Forest", type: _settlement.type, size: _settlement.size, scouted: false, keys: 0, raidBuildingCount: _settlement.buildings ? _settlement.buildings.length : 4, raidGuardCount: "Unknown", raidVillagersCount: "Unknown", imagePath: _settlement.imagePath }>> <<run State.variables.RaidLocationList.push($RaidLocationDetails)>> <<run $CapturedLocations = $CapturedLocations.filter(loc => loc.name !== _settlement.name)>> <<run _reportEntry.events.push(`You have lost control of ${_settlement.name}. The settlement has returned to its former state.`)>> <<else>> <div class="revolt-suppressed" style="text-align: center; margin: 20px 0;"> <h2 style="color: #006400;">Revolt Suppressed: <<print _settlement.name>></h2> <h3 style="color: #4a4a4a;">The garrison maintains control</h3> <div style="font-style: italic; color: #666;"> Order has been restored through force... </div> <hr style="border-color: #006400;"> </div> <<set _settlement.hasRevolted = true>> <</if>> <</if>> <</nobr>>
<div class="text-box"> You continue following the river [[Continue|River 3]] <<return "Return">> </div>
<div class="text-box"> <<if $EishethMet is false>> You follow the river and find a cave <<if $Souls gt 0>> [[investigate|ForestCave]] <<else>><<You>>Theres something dark in there... I should return when I have more power<</You>><</if>> <<else>> You find a dark crypt <<if ($Souls gt 0) and ($EishethMet is true)>> Entre the [[crypt|CryptEnterence]] <<else>> Theres something dark in there... I should return when I have more power<</if>> <div align="center"> <img src="Images/Crypt/2.png" width="700" height="700"> </div> <</if>> [[Leave|Forrest Explore]] </div>
<div class="text-box"> You walk along side the river following it deeper into the forest [[Continue|River 2]] <<return "Return">> </div>
<div class="text-box"> <<nobr>> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Roadmap</p><br><br> Female Protagonist - Hopefully coming in the next update (no promises it will require a total rework of most sections of the main quests)<br><br> Inn (Patreon only content) expansion - New content to come here soon<br><br> Ironpeak - Full story and quests coming here<br><br> AI images - This game relies hevily on AI images, like them or not , this simply wouldn't exsist without them. Currently most AI images are random rather than using specific faces per character/NPC. I do intend to fix this but it requies a significant amount of time<br><br> <</nobr>> </div>
<<nobr>> <div class="text-box"> <<if $RomanDoorUnlocked is true>> The doors are open you look <<link "around">><<run Engine.play($ReturnPassage)>><</link>> <<else>> The door is locked, a small parchment on the door reads "a maiore ad minus"<br><br> <<link "Translate">><<set $DoorClue to true>><<run Engine.show()>><</link>> <br><br> <<if $DoorClue is true>> <<You>> <span style="font-style: italic"> "from the greater to the smaller" </span> <</You>> <br><br> <</if>> There is also a table wirtten below <table class="roman-numerals"> <tr> <th>Roman</th> <th>Value</th> </tr> <tr> <td>I</td> <td>1</td> </tr> <tr> <td>V</td> <td>5</td> </tr> <tr> <td>X</td> <td>10</td> </tr> <tr> <td>L</td> <td>50</td> </tr> <tr> <td>C</td> <td>100</td> </tr> <tr> <td>D</td> <td>500</td> </tr> <tr> <td>M</td> <td>1,000</td> </tr> </table> [[Back|CryptPuzzle2]] <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<div class="text-box"> <<nobr>> <<set $CloakDisabled to true>> The blacksmith stands infront of you<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Blacksmith/1.png" width="700" height="700"> </div><br><br> <<if $Cloaked is false>> <<if $VisistedScarldaleBacksmith is false>> <<set $CloakDisabled to true>> <<Henry>>You're not welcome here<</Henry>><br><br> <<You>>Is that how you wlecome all of your customers?<</You>><br><br> <<Henry>>I know who you are, your from that castle. People go there and they never come back.<</Henry>><br><br> <<You>>I'm just visting your vill....<</You>><br><br> <<set $VisistedScarldaleBacksmith to true>> <</if>> <<Henry>>Get out of my forge! Or I'll call the guards<</Henry>><br><br> You walk out <<You>>Hummm, I'll need to find a different way to win him over<</You>><br><br> <</if>> <<if $Cloaked is true>> <<Henry>>Welcome to my forge, what can I do for you?<</Henry>><br><br> <<button "Browse the store">> <<goto "ScarldaleWeaponStore">> <</button>><br> <<if $LockPicksUnlocked is true>> <<if $Gold >= 75>> <<link "3 Lock Picks - 75 Gold">> <<set $Gold to $Gold - 75>> <<set $LockPicks to $LockPicks + 3>> <<run Engine.play('ScarldaleBlacksmith')>> <</link>> <<else>> Lock Picks - You can't afford these<</if>><br><br> <</if>> <br><br> <<if $WolfQuestStatus is "Blacksmith">> Ask Henry about a [[silver weapon|HenrySilver]]<br><br> <</if>> <<if ($WolfWeapon is "Arrows") and (!$havearrows) and ($Day >= $DayWait)>> Ask Henry about the [[arrows|HenryArrowHeads]]<br><br> <</if>> <<if ($WolfWeapon is "Dagger") and (!$havedagger) and ($Day >= $DayWait)>> Ask Henry about the [[dagger|HenryDagger]]<br><br> <</if>> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</nobr>> </div> <<if ($CurrentPlayer is "LucyCloaked")>> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <<set $CloakDisabled to true>>
<div class="text-box"> <<nobr>> You approach the church and see the priest<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Church/1.png" width="700" height="700"> </div><br><br> <<if $CurrentPlayer is "Overlord">> <<if $Cloaked is false>> <<Priest>>God's its you! Demon!<</Priest>><br><br> The priest runs to the church and slams the door closed, he bolts it shut.<br><br> <<Priest>>Guards! Guards!<</Priest>><br><br> You hear the priest call from inside the church... You see a guard running over <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "guard">> <<set $EnemyMin to 20>> <<set $EnemyMax to 40>> <<set $EnemyWeapon to "pole axe">> <<set $ImagePath to "Images/Forrest/Scarldale/guard.png">> [[Stay and fight|Combat]]<br> or<br> [[Flee|Forrest Explore]] <</if>> <<if $Cloaked is true>> <<Priest>>Hello child, how may I help you?<</Priest>><br><br> You ask about:<br> <<link "The castle">><<set $Convo to "Castle">><<run Engine.play('Priest Convo')>><</link>><br> <<link "About the village">><<set $Convo to "Village">><<run Engine.play('Priest Convo')>><</link>> <</if>><</if>> <<if $CurrentPlayer is "LucyCloaked">> <<Priest>>Hello child, how may I help you?<</Priest>><br><br> <<link "Attempt to Seduce him">><<set $Convo to "LucySeduce">><<run Engine.play('Priest Convo')>><</link>><br> <</if>> <</nobr>> </div> <<set $CloakDisabled to true>>
<div class="text-box blur"> <<nobr>> You stagger outside and try to walk back to the castle, heading towards the forest<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Drunk/2.png" width="700" height="700"> </div><br><br> [[Continue|SpiderCryptStart]] <</nobr>> </div> <<set $Time to 9>>
<nobr> <div class="text-box"> <<if $LucyCorrupt isnot true>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/1.png">> You look down a long path and debate going further from your castle at this time<br><br> <<You>>Now isn't the time to go looking around here... <br>I need a companion, somone who can help me<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> <<set $BackgroundPath to "Images/Forrest/Exploring/Wolf/4.png">> You walk towards Scarldale<br><br> A guard steps in your way<br><br> <<Guard>>Hold, it's late for a strole isn't it? The village is under curfew, clear off<</Guard>> <<button "Leave">> <<goto "ForestExploreNight">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </nobr>
<div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> His orgasm: <progress @value=" $NPCCum" max="100"></progress><br> <<if $Position is "Seduce">> You spend no time getting to the point<br><br> <<Guard>>Fuck I'm going to ruin you<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Seduce/1.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Seduce/2.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Seduce/3.webm" type="video/webm"></video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Seduce/4.webm" type="video/webm"></video><br><br> <</if>> <<if $Position is "BJ">> <<if $Int == 0>> <<Guard>>Suck it you slut!<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/BJ/1.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 1>> <<Lucy>>Muph! You taste sooo good<</Lucy>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/BJ/2.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 2>> <<Guard>>You look good with my cock down your throat, whore<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/BJ/2.webm" type="video/webm"></video><br><br><</if>> <</if>> <<if $Position is "CG">> <<if $Int == 0>> <<Lucy>>Fuck yes<</Lucy>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/CG/1.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 1>> <<Guard>>Fuck your tight for a slut<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/CG/2.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 2>> <<Lucy>>Let me ride you<</Lucy>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/CG/3.webm" type="video/webm"></video><br><br><</if>> <</if>> <<if $Position is "Behind">> <<Guard>>Take it, bitch!<</Guard>><br><br> <<if $Int == 0>> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Behind/1.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 1>> <<Lucy>>You feel soooo good<</Lucy>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Behind/2.webm" type="video/webm"></video><br><br><</if>> <<if $Int == 2>> <<Guard>>You like my cock, don't you slut!<</Guard>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/VillageHall/Corrupt/Behind/3.webm" type="video/webm"></video><br><br><</if>> <</if>> <<if $NPCCum < 100>> <<link "Suck Him off">><<set $Position to "BJ">><<set $NPCCum to $NPCCum + 10>><<run Engine.play('ScarldaleGuardHouse')>><</link>><br> <<link "Ride Him">><<set $Position to "CG">><<set $NPCCum to $NPCCum + 15>><<run Engine.play('ScarldaleGuardHouse')>><</link>><br> <<link "Let him take you from behind">><<set $Position to "Behind">><<set $NPCCum to $NPCCum + 15>><<run Engine.play('ScarldaleGuardHouse')>> <</link>><br> <<elseif $NPCCum > 99>> <<link "Make him cum!">><<set $Position to "null">><<set $NPCCum to 0>><<run Engine.play('FinishGuardHome')>><</link>><br> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $JonMet is true>> There is nothing else to do here<br><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> You look around the hall, its empty... [[Go upstairs|HallLord]] <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> A guard stands at the entrance to the hall <<if $CurrentPlayer is "Overlord">> <<if $Cloaked is false>> <<Guard>>Holt! By the gods, it you! From the castle!<</Guard>><br><br> <<Guard>>Your wanted for crimes of kidnapping and murder, you can come quietly, or die here<</Guard>><br><br> <<set $EnemyHealth to 100>> <<set $CurrentEnemy to "guard">> <<set $EnemyMin to 20>> <<set $EnemyMax to 40>> <<set $EnemyWeapon to "pole axe">> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> You can <<button "Run">> <<goto "ForestExplore">> <</button>><br> Or <<button "Fight">> <<goto "Encounter_Guard">> <</button>><br> <</if>> <<if $Cloaked is true>> <<Guard>>Holt! You're not a citizen of this village, what business do you have here?<</Guard>><br><br> <<You>>I need to speak to the head of this village, Jon<</You>><br><br> <<Guard>>Our lord does not have time for people outside our village. Piss off<</Guard>><br><br> <<if $Quests.includes("Find a way into the village hall")>> <<if $PlayerEquipment.includes("Dagger")>> <<button "Kill him quietly">> <<goto "HallGuardStab">> <</button>><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <<else>> <<Thoughts>>I need a smaller weapon to get rid of this guard<</Thoughts>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<else>> You glaire at the man and consider cutting him down for that insult. But you know you must find a way to win over this village and its people...<br><br> <<Thoughts>>I need to find a way to get rid of this guard, prehapse Lucy can help persuade him, of if I can find a small enough blade, I can get rid of him myself<</Thoughts>><br><br> <<button "Leave">> <<script>> UI.alert("New Quest!<br>Find a way into the village hall"); <</script>> <<run $Quests.push("Find a way into the village hall")>> <<run Engine.play('ForestExplore')>> <</button>> <</if>><</if>><</if>> <<if $CurrentPlayer is "LucyCloaked" >> <<Guard>>Halt, hall is closed to visistors at this time, whats a pretty little thing like you need anyway?<</Guard>><br><br> <<if $Quests.includes("Find a way into the village hall")>> $LucyName said he needs to speak to the leader of this village, mybe I can convince the guard to let us past...<br><br> <<link "Seduce him">><<set $Position to "Seduce">><<run Engine.play('HallGuardConvo')>><</link>><br> <<link "Ask for entry">><<set $Position to "Persuade">><<run Engine.play('HallGuardConvo')>><</link>><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <<else>> <<Lucy>>I don't need to speak to any officals at the moment, sorry<</Lucy>><br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <</if>> <</nobr>> </div> <<set $CloakDisabled to true>>
<div class="text-box"> <<nobr>> <<if ($CurrentPlayer is "LucyCloaked") and ($HallGuardStatus is "Interested")>> Vist the guards [[home|ScarldaleGuardHouse]]<br><br> <<else>> It's too late to work here <br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if ($CurrentPlayer is "LucyCloaked") and ($HallGuardStatus is "Interested")>> The guard wont be home yet<br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <<elseif ($CurrentPlayer is "LucyCloaked")>> <<if $Time < 8>> <<if $LucyScarldaleWork isnot true>> <<button "Wait a while">> <<goto "LucyScarldaleWork">> <</button>> <<else>> <<button "Wait for someone">> <<goto "LucyScarldaleWork">> <</button>> <</if>> <<else>> Its too dark and unsafe to wait around here <</if>> <br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <<if ($CurrentPlayer is "Overlord") and ($Cloaked is false)>> As you walk towards the houses, you see people return to their houses and bolt the doors, windows are closed and the area turns silent.<br><br> <</if>> <<if ($CurrentPlayer is "Overlord") and ($Cloaked is true)>> There is no content here as this character at the moment<br><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div> <<set $Position to "Seduce">> <<set $NPCCum to 0>>
<<nobr>> <div class="text-box"> <<if $MillTear isnot true>> This place is well kept... But seems to be abandond, it could be useful for something<br><br> <<if ($PlayerSpells.includes("Tear")) and ($PortalVisited is true)>> <<button "Create tear">> <<run setup.addPortalDestination('Mill', 'ScarldaleMill', 'Mill.png')>> <<set $MillTear to true>> <<run Engine.show()>> <</button>><br><br> <</if>> <</if>> <<set _charPath to "Images/Forrest/Scarldale/Houses/Inside/1.png">> <div class="Random-image"> <<set _imagePath to _charPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Leave">> <<set $ForestLocation to "Images/Forrest/Maps/Mill.jpg">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if $CurrentPlayer is "Overlord">> <<set $Price to 50>> <</if>> <div align="center"> <img src="Images/Forrest/Scarldale/Shop/1.png" width="700" height="700"> </div><br><br> <<ShopKeep>>Can I help you?<</ShopKeep>><br><br> <<if $Gold >= $Price>> <<button "Minor Healing Potion - Costs $Price gold">><<set $Gold to $Gold - $Price>><<set $MinorHealingPotion to $MinorHealingPotion + 1>><<run Engine.play('ScarldaleShop')>><</button>><<else>>Minor Healing Potion - Costs $Price gold (you cant afford this)<</if>><br><br> <<if $Gold >= $Price>> <<button "Energy Boost Potion - Costs $Price gold">><<set $Gold to $Gold - $Price>><<set $EnergyPotion to $EnergyPotion + 1>><<run Engine.play('ScarldaleShop')>><</button>><<else>>Energy Boost Potion - Costs $Price gold (you cant afford this)<</if>><br><br> <<if $CurrentPlayer is "LucyCloaked">> <<button "Ask for discount">><<set $NPC to "Shop Keep">><<run Engine.play('BJLines')>><</button>><br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <<else>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div> <<set $CloakDisabled to true>>
<div class="text-box"> <<nobr>> <<if ($CurrentPlayer is "Overlord") and ($Cloaked is false)>> <<You>>I can't go in there looking like this, for now<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<if ($CurrentPlayer is "Overlord") and ($Cloaked is true)>> [[Enter|ScarldaleTavLord]] <</if>> <<if $CurrentPlayer is "LucyCloaked">> [[Enter|ScarldaleTavLucy]] <</if>> <</nobr>> </div> <<set $Position to "Start">>
<div class="text-box"> <<nobr>> <<if $Position is "Start">> You approach the bar tender<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/3.png" width="700" height="700"> </div><br><br> <<Alexander>>Hello sir, what can I get for you?<</Alexander>><br><br> <<if $TavQuestComplete is true>> <<You>>I took care of the problem you told me about<</You>><br><br> <<Alexander>>Really? Thats great, the community put some gold aside as a reward, please take this<</Alexander>><br><br> <<set $Gold to $Gold + 100>> <<set $TavQuestComplete to false>> <</if>> <<if $Gold >= 10>> <<button "Order a drink - 10 gold">><<set $Gold to $Gold - 10>><<set $Position to "Buzzed">><<run Engine.show()>><</button>><br><br> <<else>>You cant afford a drink<br><br><</if>> <<button "Ask about the area">> <<goto "TavQuests">> <</button>><br><br> To the left of the room, theres a door<br> <<button "Enter the back room">> <<goto "ScarldaleTavBJRoom">> <</button>><br><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<if $Position is "Buzzed">> <<set $EncounterHappen to random(0, 9)>> <<if $EncounterHappen <= 2>> You see a woman looking at you in the corner of the room<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Women/1.png" width="700" height="700"> </div><br><br> [[Speak to her|TavernNPC]]<br><br> <<elseif ($EncounterHappen gt 2) and ($EncounterHappen lt 5)>> You see a woman looking at you in the corner of the room<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Women/2.png" width="700" height="700"> </div><br><br> [[Speak to her|TavernNPC]]<br><br> <</if>> <<if $CultUnlocked isnot true>> <<link "Order another drink - 10 gold">><<set $Gold to $Gold - 10>><<set $Position to "Drunk">><<run Engine.show()>><</link>><br><br> <<else>> <<You>>I've probably had enough<</You>><br><br> <</if>><</if>> <<if $Position is "Drunk">> You feel drunk and things start to go blury, maybe its time to [[leave|ScarldaleDrunk]] <</if>> <<if $Position is "Castle">> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <</nobr>> </div> <<set $CloakDisabled to true>>
<div class="text-box"> <<nobr>> <<if $Position is "Start">> You approach the bar tender<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/3.png" width="700" height="700"> </div><br><br> <<Alexander>>Hello, what can I get for you?<</Alexander>><br><br> <<if $Gold >= 10>> <<link "Order a drink - 10 gold">><<set $Gold to $Gold - 10>><<set $Position to "Buzzed">><<run Engine.show()>><</link>><br><br> <<else>>You cant afford a drink<br><br><</if>> [[Ask for work|TavWork]]<br><br> <</if>> <<if $Position is "Buzzed">> <<set $Time to $Time + 2>> <<set $EncounterHappen to random(0, 9)>> <<if $EncounterHappen <= 4>> You enjoy your drink, nothing eventful happens<br><br> <<elseif $EncounterHappen gt 4>> A man walks over to you and sits down<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Men/2.png" width="700" height="700"> </div><br><br> [[Speak to him|TavernNPC]]<br><br> <</if>> <<link "Order another drink - 10 gold">><<set $Gold to $Gold - 10>><<set $Position to "Drunk">><<run Engine.show()>><</link>><br><br> <</if>> <<if $Position is "Drunk">> You feel drunk and things start to go blury, maybe its time to go <<set $Time to $Time + 2>> <</if>> <<button "Leave">> <<goto "Scarldale">> <</button>> <</nobr>>
<div class="village-menu"> <h1>Scarldale Village</h1> <p class="description">You enter the village of Scarldale</p> <<if $Time >= 9>> Its late and the shops are closed<br><br> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/Blacksmith/2.png"> Blacksmith </div> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/Tavern/1.png"> Tavern </div> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/Shop/2.png"> Village shop </div> <<if $HallGuard is "done">> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/VillageHall/2.png"> Village Hall </div> <<else>> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/VillageHall/2.png"> Village Hall </div> <</if>> <div class="menu-item" data-image="Images/Forrest/Scarldale/1.png"> [[Houses|ScarldaleHousesNight]] </div> <div class="menu-item disabled" data-image="Images/Forrest/Scarldale/Church/2.png"> Church </div> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Leave|Forrest Explore]] </div> <<else>> <div class="menu-item" data-image="Images/Forrest/Scarldale/Blacksmith/2.png"> Nothing for me to do here for now </div> <div class="menu-item" data-image="Images/Forrest/Scarldale/Tavern/1.png"> [[Tavern|ScarldaleTavern]] </div> <div class="menu-item" data-image="Images/Forrest/Scarldale/Shop/2.png"> [[Village shop|ScarldaleShop]] </div> <<if $HallGuard is "done">> <div class="menu-item" data-image="Images/Forrest/Scarldale/VillageHall/2.png"> [[Village Hall|ScarldaleHallInSide]] </div> <<else>> <div class="menu-item" data-image="Images/Forrest/Scarldale/VillageHall/2.png"> [[Village Hall|ScarldaleHall]] </div> <</if>> <div class="menu-item" data-image="Images/Forrest/Scarldale/1.png"> [[Houses|ScarldaleHouses]] </div> <div class="menu-item" data-image="Images/Forrest/Scarldale/Church/2.png"> Church closed for renovation </div> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Leave|Forrest Explore]] </div> <</if>> <style> .village-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .village-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .village-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <<set $CloakDisabled to false>>
<div class="text-box"> <<nobr>> <<if $PlayerRangedWeapon is "Bow">>You own the bow <<elseif $Gold >= 200>> <<link "Bow - 200 gold">> <<set $Gold to $Gold - 200>> <<set $PlayerRangedWeapon to "Bow">> <<run $PlayerEquipment.push("Bow")>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> Bow - 200 gold (you cant afford this)<</if>><br><br> <<if $PlayerEquipment.includes("Dagger")>> You own a dagger<<elseif $Gold >=100>> <<link "Dagger - 100 Gold">> <<set $Gold to $Gold - 100>> <<run $PlayerEquipment.push("Dagger")>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> Dagger - You can't afford this<</if>><br><br> <<if $PlayerEquipment.includes("Common Short Sword")>>You own the steel sword<<elseif $Gold >= 200>> <<link "Common Short Sword (8 damage) - 200 gold">> <<set $Gold to $Gold - 200>> <<run $PlayerEquipment.push("Common Short Sword")>> <<set $PlayerMeleeWeapon to "Common Short Sword">> <<set $MeleeWeaponDamage to 8>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> common Short Sword (8 damage) - 200 gold (you cant afford this)<</if>><br><br> <<if $PlayerEquipment.includes("Sharpend Short Sword")>>You own the steel sword<<elseif $Gold >= 350>> <<link "Sharepend Steel Sword (12 damage) - 350 gold">> <<set $Gold to $Gold - 350>> <<run $PlayerEquipment.push("Sharpend Short Sword")>> <<set $PlayerMeleeWeapon to "Sharpend Short Sword">> <<set $MeleeWeaponDamage to 12>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> Sharpend Short Sword (12 damage) - 350 gold (you cant afford this)<</if>><br><br> <<if $PlayerEquipment.includes("Claymore")>>You own the steel sword<<elseif $Gold >= 500>> <<link "Sharepend Steel Sword (15 damage) - 500 gold">> <<set $Gold to $Gold - 500>> <<run $PlayerEquipment.push("Claymore")>> <<set $PlayerMeleeWeapon to "Claymore">> <<set $MeleeWeaponDamage to 15>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> SharpendShort Sword (15 damage) - 500 gold (you cant afford this)<</if>><br><br> <<if $LockPicksUnlocked is true>> <<if $Gold >= 75>> <<link "3 Lock Picks - 75 Gold">> <<set $Gold to $Gold - 75>> <<set $LockPicks to $LockPicks + 3>> <<run Engine.play('ScarldaleWeaponsShop')>> <</link>> <<else>> Lock Picks - You can't afford these<</if>><br><br> <</if>> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</nobr>> </div>
<<nobr>> <div id="ownedWeapons" style="display:none"></div> <<include "CombatCSS">> <<include "WeaponData">> <!-- Weapon Store Grid (Categorized) --> <div id="weapon-store-grid" style="margin: 20px 0;"> <p style="color: #ccc; width: 100%; text-align: center;">Loading weapons...</p> </div> <!-- Expanded Weapon Details (Hidden by default) --> <div id="weapon-details" style="display: none; margin: 30px 0; padding: 20px; background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 10px;"> <div style="text-align: right; margin-bottom: 15px;"> <button onclick="closeWeaponDetails()" style="background: #8b0000; color: white; border: none; padding: 8px 15px; border-radius: 5px; cursor: pointer;">✕ Close</button> </div> <div id="weapon-details-content"></div> </div> <<button "Return">><<goto "ScarldaleBlacksmith">><</button>> <</nobr>> <<script>> // Store configuration - what weapons are available for purchase window.storeSlots = { dagger: { name: '🗡️ Dagger Weapons', weapons: ['improved_dagger'] }, medium: { name: '⚔️ Medium Weapons', weapons: ['axe', 'morningstar_mace', 'flanged_mace'] }, back: { name: '🛡️ Back Slot Items', weapons: ['claymore', 'shield', 'longsword', 'longbow'] } }; // Store display functions function displayAllStoreWeapons() { console.log('Displaying categorized store weapons...'); const storeGrid = document.getElementById('weapon-store-grid'); if (!storeGrid) { console.error('Store grid not found'); return; } storeGrid.innerHTML = ''; let hasWeapons = false; // Loop through each category Object.keys(window.storeSlots).forEach(slotType => { const slotData = window.storeSlots[slotType]; const availableWeapons = slotData.weapons.filter(weaponType => { return window.weaponSets[weaponType]; // Only include weapons that exist }); if (availableWeapons.length > 0) { // Create category header const categoryHeader = document.createElement('div'); categoryHeader.style.cssText = ` width: 100%; text-align: center; margin: 30px 0 20px 0; padding: 15px; background: linear-gradient(to right, #8b4513, #cd853f, #8b4513); border: 2px solid #daa520; border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); `; categoryHeader.innerHTML = ` <h2 style="color: #fff; margin: 0; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7); font-size: 24px; letter-spacing: 1px;"> ${slotData.name} </h2> <p style="color: #f0e68c; margin: 5px 0 0 0; font-size: 14px;"> ${availableWeapons.length} weapon${availableWeapons.length !== 1 ? 's' : ''} available </p> `; storeGrid.appendChild(categoryHeader); // Create weapons grid for this category const categoryGrid = document.createElement('div'); categoryGrid.style.cssText = ` display: flex; flex-wrap: wrap; justify-content: center; gap: 15px; margin-bottom: 40px; padding: 20px; background: rgba(139, 69, 19, 0.1); border-radius: 10px; border: 1px solid rgba(139, 69, 19, 0.3); `; // Add weapons to this category availableWeapons.forEach(weaponType => { const weaponData = window.weaponSets[weaponType]; if (weaponData) { const weaponCard = createCompactWeaponCard(weaponType, weaponData); categoryGrid.appendChild(weaponCard); hasWeapons = true; } }); storeGrid.appendChild(categoryGrid); } }); if (!hasWeapons) { storeGrid.innerHTML = '<p style="color: #999; width: 100%; text-align: center;">No weapons available in store.</p>'; } } // Add helper function to check if weapon has corruption effects function hasCorruptionEffect(weaponData) { if (!weaponData.cards) return false; return weaponData.cards.some(card => { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); }); } // Modified createCompactWeaponCard function - fix the background issue function createCompactWeaponCard(weaponType, weaponData) { const isOwned = window.isWeaponOwned(weaponType); const price = window.getWeaponPrice(weaponType); const canAfford = State.variables.Gold >= price; const hasCorruption = hasCorruptionEffect(weaponData); // Create clickable weapon card const weaponCard = document.createElement('div'); weaponCard.style.cssText = ` text-align: center; margin: 8px; width: 180px; border: 2px solid ${isOwned ? '#32cd32' : '#8b4513'}; padding: 12px; border-radius: 8px; background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); box-shadow: 0 3px 6px rgba(0, 0, 0, 0.3); transition: all 0.3s; position: relative; cursor: pointer; `; // Make entire card clickable weaponCard.onclick = function() { viewWeaponDetails(weaponType); }; // Add owned badge if owned if (isOwned) { const ownedBadge = document.createElement('div'); ownedBadge.style.cssText = ` position: absolute; top: -8px; right: -8px; background: #32cd32; color: white; padding: 3px 8px; border-radius: 12px; font-size: 10px; font-weight: bold; z-index: 10; `; ownedBadge.textContent = 'OWNED'; weaponCard.appendChild(ownedBadge); } // Weapon image - REMOVE BACKGROUND FOR CORRUPTION IMAGES const imageDiv = document.createElement('div'); const corruptionClass = hasCorruption ? ' weapon-image-corruption' : ''; const backgroundStyle = hasCorruption ? 'transparent' : 'rgba(255,255,255,0.1)'; imageDiv.innerHTML = ` <img src="${weaponData.image}" alt="${weaponData.name}" style="width: 140px; height: 140px; object-fit: cover; border-radius: 4px; background: ${backgroundStyle}; pointer-events: none;" class="${corruptionClass}" onerror="this.style.display='none';"> `; // Rest of the function remains the same... const infoDiv = document.createElement('div'); infoDiv.style.cssText = 'pointer-events: none;'; infoDiv.innerHTML = ` <h4 style="color: #2c1810; margin: 10px 0 8px 0; font-size: 14px;">${weaponData.name}</h4> <p style="color: #2c1810; margin: 3px 0; font-size: 12px;">${weaponData.cards ? weaponData.cards.length : 0} Cards</p> <p style="color: #8b0000; margin: 3px 0; font-weight: bold; font-size: 14px;">💰 ${price}g</p> <p style="color: #666; margin: 5px 0 0 0; font-size: 11px; font-style: italic;">Click to view details</p> `; // Add hover effect weaponCard.addEventListener('mouseenter', function() { this.style.transform = 'translateY(-3px)'; this.style.boxShadow = '0 6px 12px rgba(0, 0, 0, 0.4)'; this.style.borderColor = isOwned ? '#32cd32' : '#cd853f'; }); weaponCard.addEventListener('mouseleave', function() { this.style.transform = 'translateY(0)'; this.style.boxShadow = '0 3px 6px rgba(0, 0, 0, 0.3)'; this.style.borderColor = isOwned ? '#32cd32' : '#8b4513'; }); weaponCard.appendChild(imageDiv); weaponCard.appendChild(infoDiv); return weaponCard; } // Fixed function name and made it global window.closeWeaponDetails = function() { const detailsDiv = document.getElementById('weapon-details'); if (detailsDiv) { detailsDiv.style.display = 'none'; } } // Updated buyWeapon function - now uses proper slot detection window.buyWeapon = function(weaponType) { try { if (window.purchaseWeapon(weaponType)) { // ✅ Track purchase in $PurchasedMeleeWeapons by weaponType (key) if (typeof State !== 'undefined' && State.variables) { if (!Array.isArray(State.variables.PurchasedMeleeWeapons)) { State.variables.PurchasedMeleeWeapons = []; } if (!State.variables.PurchasedMeleeWeapons.includes(weaponType)) { State.variables.PurchasedMeleeWeapons.push(weaponType); console.log(`Added ${weaponType} to $PurchasedMeleeWeapons`); } } console.log(`Successfully purchased ${weaponType}`); // SPECIAL CASE: If longbow is purchased, set $PlayerRangedWeapon to "Bow" if (weaponType === 'longbow') { if (typeof State !== 'undefined' && State.variables) { State.variables.PlayerRangedWeapon = "Bow"; console.log('PlayerRangedWeapon set to Bow'); } } // Safely update gold display try { const goldElement = document.getElementById('currentGold'); if (goldElement) { goldElement.textContent = State.variables.Gold; console.log(`Updated gold display to ${State.variables.Gold}`); } else { console.log('currentGold element not found (this is normal on store page)'); } } catch (goldError) { console.error('Error updating gold display:', goldError); } // FIXED Auto-equip using the SAME slot detection as equipment selection try { const weaponData = window.weaponSets[weaponType]; if (weaponData && window.CombatSystem) { // Use the SAME slot detection logic as equipment selection let weaponSlot = null; // Method 1: Check weaponData.slot property (most reliable) if (weaponData.slot) { weaponSlot = weaponData.slot; console.log(`Found slot from weaponData.slot: ${weaponSlot}`); } // Method 2: Check window.weaponSlots (same as equipment selection) if (!weaponSlot && window.weaponSlots) { Object.keys(window.weaponSlots).forEach(slotType => { if (window.weaponSlots[slotType].weapons && window.weaponSlots[slotType].weapons.includes(weaponType)) { weaponSlot = slotType; console.log(`Found slot from weaponSlots: ${weaponSlot}`); } }); } // Method 3: Fallback to storeSlots if (!weaponSlot) { Object.keys(window.storeSlots).forEach(slotType => { if (window.storeSlots[slotType].weapons.includes(weaponType)) { weaponSlot = slotType; console.log(`Found slot from storeSlots: ${weaponSlot}`); } }); } if (weaponSlot) { console.log(`=== EQUIPPING ${weaponData.name} TO ${weaponSlot} SLOT ===`); // STEP 1: Get currently equipped weapon for this slot const currentlyEquipped = window.currentlyEquipped ? window.currentlyEquipped[weaponSlot] : null; console.log(`Currently equipped in ${weaponSlot}: ${currentlyEquipped}`); // STEP 2: Build comprehensive removal list const weaponCardNamesForSlot = []; // Add cards from weaponSlots if available if (window.weaponSlots && window.weaponSlots[weaponSlot] && window.weaponSlots[weaponSlot].weapons) { window.weaponSlots[weaponSlot].weapons.forEach(wType => { if (window.weaponSets[wType] && window.weaponSets[wType].cards) { window.weaponSets[wType].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } }); } // Add cards from currently equipped weapon if (currentlyEquipped && window.weaponSets[currentlyEquipped] && window.weaponSets[currentlyEquipped].cards) { window.weaponSets[currentlyEquipped].cards.forEach(card => { weaponCardNamesForSlot.push(card.name); }); } console.log(`Cards to remove from ${weaponSlot} slot:`, weaponCardNamesForSlot); // STEP 3: Remove existing weapons using COMPREHENSIVE removal const beforeCount = window.CombatSystem.combatInventory.length; console.log(`Inventory before removal: ${beforeCount} cards`); window.CombatSystem.combatInventory = window.CombatSystem.combatInventory.filter(card => { const shouldRemove = ( card.slotType === weaponSlot || weaponCardNamesForSlot.includes(card.name) || (currentlyEquipped && card.weaponType === currentlyEquipped) ); if (shouldRemove) { console.log(`REMOVING: ${card.name} (slot: ${card.slotType || 'none'}, weaponType: ${card.weaponType || 'none'})`); } return !shouldRemove; }); const afterCount = window.CombatSystem.combatInventory.length; console.log(`Inventory after removal: ${afterCount} cards (removed ${beforeCount - afterCount})`); // STEP 4: Add new weapon cards with proper tracking console.log(`Adding ${weaponData.cards.length} cards for ${weaponData.name}:`); weaponData.cards.forEach((card, index) => { const cardWithSlot = { ...card, slotType: weaponSlot, weaponType: weaponType, id: `${weaponSlot}_${weaponType}_${card.name}_${Date.now()}_${index}` }; window.CombatSystem.addCard(cardWithSlot); console.log(`ADDED: ${card.name} to ${weaponSlot} slot`); }); // STEP 5: Update currently equipped tracking if (!window.currentlyEquipped) { window.currentlyEquipped = { dagger: null, medium: null, back: null }; } window.currentlyEquipped[weaponSlot] = weaponType; // === Set Twine variable for equipped weapon based on slot === if (typeof State !== 'undefined' && State.variables) { switch (weaponSlot) { case 'dagger': State.variables.EquippedDaggerSlot = weaponType; console.log(`$EquippedDaggerSlot set to ${weaponType}`); break; case 'medium': State.variables.EquippedMediumSlot = weaponType; console.log(`$EquippedMediumSlot set to ${weaponType}`); break; case 'back': State.variables.EquippedBackSlot = weaponType; console.log(`$EquippedBackSlot set to ${weaponType}`); break; default: console.warn(`Unknown weapon slot: ${weaponSlot}`); } } // STEP 6: Update inventory count and re-render if (window.updateInventoryCount) { window.updateInventoryCount(); } if (window.CombatSystem.render) { window.CombatSystem.render(); } const finalCount = window.CombatSystem.combatInventory.length; console.log(`=== EQUIP COMPLETE ===`); console.log(`Final inventory: ${finalCount} cards`); console.log('Currently equipped:', window.currentlyEquipped); // Debug: Show final inventory state console.log('Final inventory contents:'); window.CombatSystem.combatInventory.forEach(card => { console.log(` - ${card.name} (slot: ${card.slotType || 'none'}) [weapon: ${card.weaponType || 'none'}]`); }); } else { console.error(`Could not determine slot for weapon: ${weaponType}`); } } } catch (equipError) { console.error('Error auto-equipping weapon:', equipError); console.error('Error stack:', equipError.stack); } // REFRESH THE PASSAGE setTimeout(() => { try { // Close weapon details first const detailsDiv = document.getElementById('weapon-details'); if (detailsDiv) { detailsDiv.style.display = 'none'; } // Refresh the passage to show updated state if (typeof Engine !== 'undefined' && Engine.play) { Engine.play(passage()); console.log('Passage refreshed after purchase'); } else if (typeof Story !== 'undefined' && Story.get) { const currentPassage = passage(); Story.get(currentPassage).render(); console.log('Passage refreshed via Story.get'); } else { refreshStore(); console.log('Store refreshed as fallback'); } } catch (refreshError) { console.error('Error refreshing passage:', refreshError); try { refreshStore(); console.log('Store refreshed after passage refresh failed'); } catch (storeError) { console.error('Store refresh also failed:', storeError); } } }, 200); } } catch (mainError) { console.error('Main error in buyWeapon function:', mainError); console.error('Error stack:', mainError.stack); } } // Add debug function for store testing window.debugStoreState = function() { console.log('=== STORE STATE DEBUG ==='); console.log('Currently Equipped:', window.currentlyEquipped); console.log('Owned Weapons:', State.variables.ownedWeapons); console.log('Combat Inventory Cards:', window.CombatSystem?.combatInventory?.map(card => `${card.name} (slot: ${card.slotType || 'none'}) [weapon: ${card.weaponType || 'none'}]`)); console.log('Total Inventory Count:', window.CombatSystem?.combatInventory?.length || 0); // Count cards by slot const slotCounts = { dagger: 0, medium: 0, back: 0, none: 0 }; window.CombatSystem?.combatInventory?.forEach(card => { const slot = card.slotType || 'none'; slotCounts[slot] = (slotCounts[slot] || 0) + 1; }); console.log('Cards by slot:', slotCounts); console.log('========================'); }; function viewWeaponDetails(weaponType) { console.log('Viewing weapon: ' + weaponType); const weaponData = window.weaponSets[weaponType]; if (!weaponData) { alert('Weapon data not found!'); return; } const detailsDiv = document.getElementById('weapon-details'); const contentDiv = document.getElementById('weapon-details-content'); if (!detailsDiv || !contentDiv) { alert('Details container not found!'); return; } // Create detailed view const isOwned = window.isWeaponOwned(weaponType); const price = window.getWeaponPrice(weaponType); const canAfford = State.variables.Gold >= price; let detailsHTML = ` <div style="display: flex; align-items: center; margin-bottom: 30px; gap: 30px;"> <div style="flex-shrink: 0;"> <img src="${weaponData.image}" alt="${weaponData.name}" style="width: 120px; height: 120px; object-fit: contain; border: 2px solid #8b4513; border-radius: 10px; background: rgba(255,255,255,0.1);" onerror="this.style.display='none';"> </div> <div style="flex: 1;"> <h2 style="color: #ffd700; margin: 0 0 15px 0; text-shadow: 0 0 5px #ff8c00;">${weaponData.name}</h2> <p style="color: #ccc; margin: 0 0 15px 0; font-size: 16px; line-height: 1.4;">${weaponData.description || 'A powerful weapon for combat.'}</p> <p style="color: #ffd700; margin: 0; font-weight: bold; font-size: 20px;"> Price: ${price} Gold</p> </div> </div> `; // Add cards section if weapon has cards if (weaponData.cards && weaponData.cards.length > 0) { detailsHTML += ` <div style="margin: 30px 0;"> <h3 style="color: #ffd700; text-align: center; margin: 0 0 20px 0; text-shadow: 0 0 5px #ff8c00;">⚔️ Weapon Cards ⚔️</h3> <div class="card-hand" style="background: linear-gradient(to bottom, #3a2a1a 0%, #2a1a0a 100%); border: 2px solid #cd853f; border-radius: 8px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; min-height: 120px; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5);"> `; // Add each card for (let i = 0; i < weaponData.cards.length; i++) { const card = weaponData.cards[i]; detailsHTML += createCardHTML(card); } detailsHTML += '</div></div>'; } // Add purchase section detailsHTML += '<div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #8b4513;">'; if (isOwned) { detailsHTML += '<div style="background: linear-gradient(to right, #006400, #228b22); color: white; border: 2px solid #32cd32; padding: 15px; border-radius: 8px; font-weight: bold; font-size: 18px; text-transform: uppercase; letter-spacing: 1px; display: inline-block;">✅ OWNED</div>'; } else if (canAfford) { detailsHTML += `<button onclick="window.buyWeapon('${weaponType}')" class="execute-combat-btn" style="font-size: 16px; padding: 15px 30px;">Buy for ${price} Gold</button>`; } else { detailsHTML += '<div style="background: linear-gradient(to right, #8b0000, #a00000); color: white; border: 2px solid #ff4444; padding: 15px; border-radius: 8px; font-weight: bold; font-size: 16px; display: inline-block;">Not enough gold (Need ' + price + ' Gold)</div>'; } detailsHTML += '</div>'; contentDiv.innerHTML = detailsHTML; detailsDiv.style.display = 'block'; // Scroll to details detailsDiv.scrollIntoView({ behavior: 'smooth' }); } // Helper function to check if a single card has corruption effects function cardHasCorruptionEffect(card) { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); } // Keep the existing helper function for weapons function hasCorruptionEffect(weaponData) { if (!weaponData.cards) return false; return weaponData.cards.some(card => { if (!card.effects) return false; return card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ); }); } function createCardHTML(card) { const cardHasCorruption = cardHasCorruptionEffect(card); // Create card HTML using your existing card styling let cardHTML = '<div class="card'; // Determine card size const hasEffects = card.effects && card.effects.length > 0; const hasDescription = card.description && card.description.length > 50; if (hasEffects && hasDescription) { cardHTML += ' extra-large-content'; } else if (hasEffects || hasDescription) { cardHTML += ' large-content'; } cardHTML += '">'; cardHTML += '<div class="card-content">'; // Card type cardHTML += `<div class="card-type ${card.type || 'weapon'}">${(card.type || 'weapon').toUpperCase()}</div>`; // Card name cardHTML += `<div class="card-name">${card.name}</div>`; // Card image - APPLY GLOW HERE IF CARD HAS CORRUPTION cardHTML += '<div class="card-image">'; if (card.image) { const corruptionClass = cardHasCorruption ? ' card-image-corruption' : ''; cardHTML += `<img src="${card.image}" alt="${card.name}" class="${corruptionClass}" onerror="this.style.display='none'">`; } cardHTML += '</div>'; // Card costs const hasEnergyCost = card.energyCost && card.energyCost > 0; const hasMagicCost = card.magicCost && card.magicCost > 0; if (hasEnergyCost || hasMagicCost) { cardHTML += '<div class="card-costs">'; if (hasEnergyCost) { cardHTML += `<span class="energy-cost">⚡ ${card.energyCost}</span>`; } if (hasMagicCost) { cardHTML += `<span class="magic-cost">🔮 ${card.magicCost}</span>`; } cardHTML += '</div>'; } else { cardHTML += '<div class="card-costs hidden"></div>'; } // Card damage if (card.damage && card.damage > 0) { cardHTML += `<div class="card-damage"> ${card.damage} damage</div>`; } // Card effects - UPDATED TO HANDLE VALUE = 1 CASE if (card.effects && card.effects.length > 0) { cardHTML += '<div class="card-effects">'; let effectsText = ''; for (let k = 0; k < card.effects.length; k++) { const effect = card.effects[k]; if (k > 0) effectsText += ', '; // If value is 1, just show the name, otherwise show name and value if (effect.value === 1) { effectsText += effect.name; } else { effectsText += effect.name + ' ' + effect.value; } } cardHTML += effectsText + '</div>'; } // Card description if (card.description) { cardHTML += `<div class="card-description">${card.description}</div>`; } cardHTML += '</div></div>'; return cardHTML; } window.refreshStore = function() { try { // Safely update any elements in refreshStore const goldElement = document.getElementById('currentGold'); if (goldElement) { goldElement.textContent = State.variables.Gold; } // Add any other refresh logic here with similar safety checks console.log('Store refresh completed'); } catch (error) { console.error('Error in refreshStore:', error); console.error('Error stack:', error.stack); } } function forceDisplayWeapons() { console.log('Force displaying weapons...'); const storeGrid = document.getElementById('weapon-store-grid'); if (storeGrid) { storeGrid.innerHTML = '<p style="color: yellow; width: 100%; text-align: center;">Forcing display...</p>'; } // Try to display after a short delay setTimeout(function() { try { displayAllStoreWeapons(); console.log('Force display completed'); } catch (error) { console.error('Force display error:', error); if (storeGrid) { storeGrid.innerHTML = '<p style="color: red; width: 100%; text-align: center;">Error: ' + error.message + '</p>'; } } }, 500); } // Initialize when page loads setTimeout(function() { console.log('WeaponStore initializing...'); displayAllStoreWeapons(); }, 500); <</script>>
<<nobr>> <div class="text-box"> </div> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "Bedroom 1">> /* Check if anyone is in this room */ <<if _building.occupiedRooms.has(_CurrentRoom)>> <<set _npcId to _building.occupiedRooms.get(_CurrentRoom)>> <<set _npc to _building.find(n => n.NPCID === _npcId)>> <<set $currentNPC to _npc>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> <<else>> <div class="text-box"> You peak into the room and look around, you see no one inside </div> <</if>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "Bedroom 2">> /* Check if anyone is in this room */ <<if _building.occupiedRooms.has(_CurrentRoom)>> <<set _npcId to _building.occupiedRooms.get(_CurrentRoom)>> <<set _npc to _building.find(n => n.NPCID === _npcId)>> <<set $currentNPC to _npc>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> <<else>> <div class="text-box"> You peak into the room and look around, you see no one inside </div> <</if>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "Hall">> <div class="text-box"> <<if $Position is "LetComeIn1">> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<set _room to $currentNPC.currentRoom>> <<set _imagePath to $ImagePath>> <<say '_NPCType' _imagePath>>Welcome, you can rest here. I was just busy in the _room, I'll be in there<</say>><br><br> They walk away from you, leaving you alone<br><br> <<set $Position to "LetComeIn">> <<else>> You are in the downstairs hallway, there could be someone in any room so you need to be careful<br><br> <</if>> /* Only show search button if room hasn't been searched */ <<if !_building.searchedRooms || !_building.searchedRooms.includes($ReturnPassage)>> <<button "Search the drawer">> <<goto "SettlementDraw">> <</button>> <</if>> <div id="searchResults"></div> <<Lucy>>Now I'm alone, maybe I can find the key for this place... It must be in the hall or maybe upstairs<</Lucy>> <<button "Go upstairs">> <<goto "ScoutHouseUpHall">> <</button>><br> <<button "Leave">> <<goto "LucyScout">> <</button>> </div> <<set $Int to random(1, 7)>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Int + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "Kitchen">> /* Check if anyone is in this room */ <<if _building.occupiedRooms.has(_CurrentRoom)>> <<set _npcId to _building.occupiedRooms.get(_CurrentRoom)>> <<set _npc to _building.find(n => n.NPCID === _npcId)>> <<set $currentNPC to _npc>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> <<else>> <div class="text-box"> You peak into the room and look around, you see no one inside </div> <</if>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Kitchen/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "Living Room">> /* Check if anyone is in this room */ <<if _building.occupiedRooms.has(_CurrentRoom)>> <<set _npcId to _building.occupiedRooms.get(_CurrentRoom)>> <<set _npc to _building.find(n => n.NPCID === _npcId)>> <<set $currentNPC to _npc>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> <<else>> <div class="text-box"> You peak into the room and look around, you see no one inside </div> <</if>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/" + $Img + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $CurrentRoom to "UpperHall">> <div class="text-box"> /* Only show search button if room hasn't been searched */ <<if !_building.searchedRooms || !_building.searchedRooms.includes($ReturnPassage)>> <<button "Search the drawer">> <<goto "SettlementDraw">> <</button>> <</if>> <div id="searchResults"></div> <<button "Go downstairs">> <<goto "ScoutHouseDownHall">> <</button>> </div> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Hall/" + $Int + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Lucy's Report</h1> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<if !_location.foundNPCs || _location.foundNPCs.length === 0>> <p>No information available about the residents</p> <<else>> <div id="npc-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 10px;"> <<for _i to 0; _i < _location.foundNPCs.length; _i++>> <<capture _npc>> <<set _npc to _location.foundNPCs[_i]>> <div style="text-align: center; margin: 5px; width: 220px; border: 1px solid #ccc; padding: 8px; border-radius: 5px;"> <img @src="_npc.ImagePath" alt="Resident" style="width: 200px; height: 200px; object-fit: cover; margin-bottom: 5px;"> <h3 style="margin: 5px 0;">Resident</h3> <div style="line-height: 1.2;"> <p style="margin: 2px 0;">Job: <<print _npc.job>></p> <p style="margin: 2px 0;">Gender: <<print _npc.sex>></p> <p style="margin: 2px 0;">Building: <<print _npc.building>></p> <p style="margin: 2px 0;">Weapon: <<print _npc.weapon>></p> <p style="margin: 2px 0;">Armor: <<print _npc.armor>></p> <p style="margin: 2px 0;">Health: <progress @value="_npc.health" max="100" style="width: 100px;"></progress></p> </div> </div> <</capture>> <</for>> </div> <</if>> <div style="text-align: center; margin-top: 10px;"> <<button "Return">> <<goto "RaidPlan">> <</button>> </div> </div> <</nobr>>e
<<nobr>> <<set _DefenciveOpenLines to [ "Who are you?", "Why are you here?", "What are you doing in my village?", "You aren't from around here"]>> <<set _FriendlyOpenLines to [ "I haven't seen you here before", "What brings you to our little village", "Nice to meet you", "Good day, ma'am"]>> <<set _NutralOpenLines to [ "Hello", "Good day"]>> <<set _ComplimentWomanLines to [ "You're far to beautiful to be kept in this small village", "Sorry to be forward, but I think your so pritty", "It's nice to meet such a lovely person", "I love your hair"]>> <<set _ComplimentManLines to [ "Can I just say you are very handsom", "I bet every girl in this village has their eye on you", "Wow, you really are handsom"]>> <<set _WontShareHome to [ "Why are you asking?", "Sorry but, I barely know you", "Why would I tell you that?", "I'm not sure why you need to know that..."]>> <<if $Position is "null">> <<if $currentNPC.attitude is "Neutral">> <<set _NPCLine = either(_NutralOpenLines)>> <<elseif $currentNPC.attitude is "Defensive">> <<set _NPCLine = either(_DefenciveOpenLines)>> <<else>> <<set _NPCLine = either(_FriendlyOpenLines)>> <</if>><</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $SearchingVillagers to true>> You explore the forest looking for any villagers who may be alone in the forest<br><br> You sneek through the forest, avoiding the roads and after some time you come across <<set _int to random(0, 4)>> <<if _int is 0>> [[something|Encounter_Wood]] <<elseif _int is 1>> [[something|Treasure]] <<else>> [[a woman|StalkForest]] <</if>> </div> <</nobr>>
<<nobr>><div class="text-box"> <h1>Select a Prisoner for Training</h1> Giving a prisoner to your raider will allow them to practice on a live target and they will double their skill progession for today, but don't expect the prisoner the survive.<br> You have $DungonOccupance.length prisoners available<br><br> <<if $DungonOccupance.length === 0>> <p>No prisoners available in the dungeon.</p> <<else>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $DungonOccupance.length; _i++>> <<capture _prisoner>> <<set _prisoner to $DungonOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <h4>Corruption:</h4> <progress @value="_prisoner.corruption" max="100"></progress> <<button "Choose">> <<set _index = $CourtyardOccupance.findIndex(t => t.prisonerId === $selectedTrainer.prisonerId)>> <<if _index !== -1 && $CourtyardOccupance[_index].skill < 100>> <<set $CourtyardOccupance[_index].skill += 20>> <</if>> <<run $DungonOccupance.delete(_prisoner)>> <<set $TrainingScenePlayed to false>> <<set $TrainingPrisoner to true>> <<goto "CourtyardTraining">> <</button>> </div> <</capture>> <</for>> </div> <</if>> <div style="text-align: center; margin-top: 20px;"> <<button "Cancle">> <<goto "CourtyardTraining">> <</button>> </div> </div><</nobr>>
<<nobr>> <<if !$villagerForTransfer>> <p>Error: No villager selected for transfer.</p> <<goto "FallbackPassage">> <</if>> <div class="text-box"> <h1>Select Settlement</h1> <h2>Choose where to send your subject</h2> <hr> <div id="settlements-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CapturedLocations.length; _i++>> <<set _s = $CapturedLocations[_i]>> <<if _s !== $originSettlement>> <<capture _s>> <<set _totalCapacity = 0>> <<set _currentOccupancy = 0>> <<if _s.populatedBuildings>> <<for _entry range Object.entries(_s.populatedBuildings)>> <<set _buildingId = _entry[0]>> <<set _residents = _entry[1]>> <<set _baseType = String(_buildingId).split(' ')[0]>> <<if _baseType !== "Guard">> <<set _maxOccupants = { "House": 3, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<set _totalCapacity += _maxOccupants>> <<set _currentOccupancy += _residents.length>> <</if>> <</for>> <</if>> <<set _getAllVillagers = function(s) { var list = []; var seen = {}; function add(v){ if(!v) return; /* Exclude garrison members (NPCID starts with "garrison_") */ var npcId = (v.NPCID || "").toString(); if(npcId.indexOf("garrison_") === 0) return; var key = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); if(!seen[key]){ seen[key]=true; list.push(v); } } /* common legacy shape */ if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i=0;i<residents.length;i++) add(residents[i]); } } } /* other possible container names */ if(Array.isArray(s.capturedVillagers)) for(var i=0;i<s.capturedVillagers.length;i++) add(s.capturedVillagers[i]); if(Array.isArray(s.villagers)) for(var i=0;i<s.villagers.length;i++) add(s.villagers[i]); if(Array.isArray(s.inhabitants)) for(var i=0;i<s.inhabitants.length;i++) add(s.inhabitants[i]); if(Array.isArray(s.residents)) for(var i=0;i<s.residents.length;i++) add(s.residents[i]); /* also scan building objects for residents arrays (newer shape) */ if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; if(bobj && Array.isArray(bobj.residents)){ for(var j=0;j<bobj.residents.length;j++) add(bobj.residents[j]); } /* sometimes occupants stored in building.occupants */ if(bobj && Array.isArray(bobj.occupants)){ for(var j=0;j<bobj.occupants.length;j++) add(bobj.occupants[j]); } /* sometimes stored in building.staff */ if(bobj && Array.isArray(bobj.staff)){ for(var j=0;j<bobj.staff.length;j++) add(bobj.staff[j]); } }catch(e){} } } return list; }>> <<set _villagerCount = _getAllVillagers(_s).length>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_s.imagePath" alt="<<_s.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _s.name>></h3> <p>Population: <<print _villagerCount>> / <<print _totalCapacity>> Villagers</p> <<if _s.hasCult>> <p style="color: red;">Investigate this location before sending anyone</p> <<else>> <<if _villagerCount < _totalCapacity>> <<button "Send Here">> <<run setup.transferVillagerfromDungeon($villagerForTransfer, _s)>> <<goto "CapturedLocations">> <</button>> <<else>> <p style="color: red;">Settlement at capacity</p> <</if>> <</if>> </div> <</capture>> <</if>> <</for>> </div> </div> <div style="text-align: center"> <<button "Return">><<goto "CapturedLocations">><</button>> </div> <</nobr>>
<<nobr>> <<if !$villagerForTransfer>> <p>Error: No villager selected for transfer.</p> <<goto "FallbackPassage">> <</if>> <div class="text-box"> <h1>Select Settlement</h1> <h2>Choose where to send your subject</h2> <hr> <div id="settlements-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CapturedLocations.length; _i++>> <<set _s = $CapturedLocations[_i]>> <<if _s !== $originSettlement>> <<capture _s>> <<set _totalCapacity = 0>> <<set _currentOccupancy = 0>> <<if _s.populatedBuildings>> <<for _entry range Object.entries(_s.populatedBuildings)>> <<set _buildingId = _entry[0]>> <<set _residents = _entry[1]>> <<set _baseType = String(_buildingId).split(' ')[0]>> <<if _baseType !== "Guard">> <<set _maxOccupants = { "House": 3, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<set _totalCapacity += _maxOccupants>> <<set _currentOccupancy += _residents.length>> <</if>> <</for>> <</if>> <<set _getAllVillagers = function(s) { var list = []; var seen = {}; function add(v){ if(!v) return; /* Exclude garrison members (NPCID starts with "garrison_") */ var npcId = (v.NPCID || "").toString(); if(npcId.indexOf("garrison_") === 0) return; var key = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); if(!seen[key]){ seen[key]=true; list.push(v); } } /* common legacy shape */ if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i=0;i<residents.length;i++) add(residents[i]); } } } /* other possible container names */ if(Array.isArray(s.capturedVillagers)) for(var i=0;i<s.capturedVillagers.length;i++) add(s.capturedVillagers[i]); if(Array.isArray(s.villagers)) for(var i=0;i<s.villagers.length;i++) add(s.villagers[i]); if(Array.isArray(s.inhabitants)) for(var i=0;i<s.inhabitants.length;i++) add(s.inhabitants[i]); if(Array.isArray(s.residents)) for(var i=0;i<s.residents.length;i++) add(s.residents[i]); /* also scan building objects for residents arrays (newer shape) */ if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; if(bobj && Array.isArray(bobj.residents)){ for(var j=0;j<bobj.residents.length;j++) add(bobj.residents[j]); } /* sometimes occupants stored in building.occupants */ if(bobj && Array.isArray(bobj.occupants)){ for(var j=0;j<bobj.occupants.length;j++) add(bobj.occupants[j]); } /* sometimes stored in building.staff */ if(bobj && Array.isArray(bobj.staff)){ for(var j=0;j<bobj.staff.length;j++) add(bobj.staff[j]); } }catch(e){} } } return list; }>> <<set _villagerCount = _getAllVillagers(_s).length>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_s.imagePath" alt="<<_s.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _s.name>></h3> <p>Population: <<print _villagerCount>> / <<print _totalCapacity>> Villagers</p> <<if _s.hasCult>> <p style="color: red;">Investigate this location before sending anyone</p> <<else>> <<if _villagerCount < _totalCapacity>> <<button "Send Here">> <<run setup.transferVillagerfromDungeon($villagerForTransfer, _s)>> <<goto "SettlementVisit">> <</button>> <<else>> <p style="color: red;">Settlement at capacity</p> <</if>> <</if>> </div> <</capture>> <</if>> <</for>> </div> </div> <div style="text-align: center"> <<button "Return">><<goto "SettlementVisit">><</button>> </div> <</nobr>>
<div class="text-box"> Eisheth kneels in front of you and sucks your cock <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/4.webm" type="video/webm"> </video> <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/5.webm" type="video/webm"> </video> You cum on Eisheth, feeling the souls you have flow out of your body and into Eisheth <video autoplay loop> <source src="Images/Forrest/Encounters/Cave/sex/6.webm" type="video/webm"> </video> <<Eisheth>>Thank you<</Eisheth>> <<set $SoulsValue to $EishethSoulsSell * 100>> You sell $Souls souls for $SoulsValue. <<set $Gold to $Gold + $SoulsValue>> [[Leave|ForestCave]] </div>
<<nobr>> <<if $AnimeImages isnot true>> <<button "Use Animated Image Pack">> <<set $AnimeImages to true>> <</button>> <<else>> <<button "Use Realistic Image Pack">> <<set $AnimeImages to false>> <</button>> <</if>><br> <<if $MaleRaidersDisabled isnot true>> <<button "Disable Male Raiders">> <<set $MaleRaidersDisabled to true>> <<run Engine.show()>> <</button>> <<else>> <<button "Enable Male Raiders">> <<set $MaleRaidersDisabled to false>> <<run Engine.show()>> <</button>> <</if>> <<if $MaleBanditsDisabled isnot true>> <<button "Disable Male Bandits">> <<set $MaleRaidersDisabled to true>> <<run Engine.show()>> <</button>> <<else>> <<button "Enable Male Bandits">> <<set $MaleBanditsDisabled to false>> <<run Engine.show()>> <</button>> <</if>> <<if $SlimeGirlsDisables isnot true>> <<button "Disable Slime Monsters">> <<set $SlimeGirlsDisables to true>> <<run Engine.show()>> <</button>> <<else>> <<button "Enable Slime Monsters">> <<set $SlimeGirlsDisables to false>> <<run Engine.show()>> <</button>> <</if>> <<if $GlamSuccDisabled isnot true>> <<button "Disable Red Succubus">> <<set $GlamSuccDisabled to true>> <<run Engine.show()>> <</button>> <<else>> <<button "Enable Red Succubus">> <<set $GlamSuccDisabled to false>> <<run Engine.show()>> <</button>> <</if>> <<if $AutoSaveSettlementVisit isnot false>> <<button "Settlement Visit Autosave">> <<set $AutoSaveSettlementVisit to false>> <</button>> <<else>> <<button "Enable Settlement Visit Autosave">> <<set $AutoSaveSettlementVisit to true>> <</button>> <</if>> <h2>Audio Settings</h2> <<widget "toggleVideoSound">> <<set $videosMuted to !$videosMuted>> <<run updateVideoMute()>> <<replace "#videoStatus">> <<if $videosMuted>> Videos are now muted. <<else>> Videos are now unmuted. <</if>> <</replace>> <</widget>> <<widget "toggleAudioSound">> <<set $audioMuted to !$audioMuted>> <<replace "#audioStatus">> <<if $audioMuted>> Audio is now muted. <<else>> Audio is now unmuted. <</if>> <</replace>> <</widget>> <h3>Video Settings</h3> <<button "Toggle Video Sound">> <<toggleVideoSound>> <</button>> <span id="videoStatus"> <<if $videosMuted>> Videos are currently muted. <<else>> Videos are currently unmuted. <</if>> </span> <h3>Audio Settings</h3> <<button "Toggle Audio Sound">> <<toggleAudioSound>> <</button>> <span id="audioStatus"> <<if $audioMuted>> Audio is currently muted. <<else>> Audio is currently unmuted. <</if>> </span> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set $ReturnPassage to passage()>> <<set $BackgroundPath to "Images/Raids/Building/Barn/1.png">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> <h2>Inside the Barn</h2> <div class="npc-container"> <<for _npc range _building>> <<set _npc.found = true>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> <div class="npc-button"> <<capture _npc>> <<if _npc.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + (_npc.sex === "male" ? "him" : "her")>> <<set $ImagePath to _npc.ImagePath>> <<set $currentNPC to _npc>> <<goto "TalkToNPC">> <</button>> <</if>> <</capture>> </div> </div> <</for>> </div> </div> <div class="navigation"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <style> .people-counter { background: #2d2d2d; color: white; padding: 10px; margin-bottom: 20px; border-radius: 5px; text-align: center; } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-bottom: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; gap: 10px; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } .npc-button { margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/Barn/1.png">> /* Select who answers the door */ <<set _doorGreeter to null>> <<set _femaleCount to 0>> /* Count females and find door greeter */ <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleCount += 1>> <<if !_doorGreeter>> <<set _doorGreeter to _resident>> <<set $ImagePath to _doorGreeter.ImagePath>> <</if>> <</if>> <</for>> /* If no female found, take any resident */ <<if !_doorGreeter && _building.length > 0>> <<set _doorGreeter to _building[0]>> <</if>> <div class="text-box"> <h2><<print $selectedBuilding>></h2> <<if _doorGreeter>> <div class="greeter-section"> <div class="raider-card"> <img @src="_doorGreeter.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _doorGreeter.job || "Villager">></p> </div> <<if _settlement.Happiness >= 50 && _settlement.corruption >= 50>> <<if _resident.sex === "Female">> <<say 'Villager' _doorGreeter.ImagePath>>Oh it's you my Lord! Please, won't you come inside<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>My Lord, it is good to see you<</say>><br><br> <</if>> <<elseif _settlement.Happiness >= 50>> <<say 'Villager' _doorGreeter.ImagePath>>Welcome, my lord. How may I assist you today?<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>Please, just leave us alone<</say>><br><br> <</if>> <<if _resident.sex === "Female">> <<if _settlement.Happiness <= 50 && _settlement.corruption >= 50>> <<set _femaleIndex to 0>> <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleIndex += 1>> <<if _femaleIndex === 1>> <<set $FemaleImg1 to _resident.ImagePath>> <<set $Int to 1>> <<elseif _femaleIndex === 2>> <<set $FemaleImg2 to _resident.ImagePath>> <<set $Int to 2>> <<elseif _femaleIndex === 3>> <<set $FemaleImg3 to _resident.ImagePath>> <<set $Int to 2>> <</if>> <</if>> <</for>> <<button "Follow her inside">> <<goto "SettlementHouseVisitSex">> <</button>> <<else>> <<if _settlement.Happiness >= 50>> <i>You need to raise the settlement happiness</i> <<elseif _settlement.corruption >= 50>> <i>You need to wait for the settlement corruption to spread</i> <</if>> <</if>> <</if>> </div> <</if>> <div class="raid-section"> <<if _building && _building.length>> <div class="building-section"> <h3>Other Residents</h3> <p>Total Residents: <<print _building.length>></p> <div class="raider-container"> <<for _resident range _building>> <<if _resident !== _doorGreeter>> <div class="raider-card"> <img @src="_resident.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _resident.job || "Villager">></p> </div> <</if>> <</for>> </div> </div> <<else>> <div class="building-section"> <h3>Occupancy</h3> <p>This building is currently unoccupied.</p> </div> <</if>> </div> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> <style> .greeter-section { text-align: center; margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set $ReturnPassage to passage()>> <<set $BackgroundPath to "Images/Forrest/Raids/Buildings/Camp.png">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> <h2>Inside the Tavern</h2> <div class="npc-container"> <<for _npc range _building>> <<set _npc.found = true>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> <div class="npc-button"> <<capture _npc>> <<if _npc.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + (_npc.sex === "male" ? "him" : "her")>> <<set $ImagePath to _npc.ImagePath>> <<set $currentNPC to _npc>> <<goto "TalkToNPC">> <</button>> <</if>> <</capture>> </div> </div> <</for>> </div> </div> <div class="navigation"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <style> .people-counter { background: #2d2d2d; color: white; padding: 10px; margin-bottom: 20px; border-radius: 5px; text-align: center; } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-bottom: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; gap: 10px; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } .npc-button { margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/1.png">> <div class="text-box"> <<set _imagePath to $ImagePath>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<say '_NPCType' _imagePath>>Help! Someone, this whore tried to take my gold!<</say>><br><br> <i>Dev note: more content will be added here in a later update, but for now you can flee the settlement</i><br><br> <<button "Flee">> <<script>> UI.alert("You fee back to the saftey of the castle, anyone who did give chase quickly stops when they realise where you are going. Once safe, you note down any infomation you had to give to your lord as a report"); <</script>> <<goto "Base Intro">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "Kill">> <<if $LucyPower <=25>> <<set $LucyPower to $LucyPower + 5>> <</if>> <<set $LucyHunger to 3>> In his moment of pleasure, you take his soul. Feeding your insatianble demonic hunger for another day<br><br> Looking down at his lifeless body you say<br><br> <<Lucy>>I hope you enjoyed that as much as I did<</Lucy>><br><br> <<else>> <<set _imagePath to $ImagePath>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> You look up at the man who is still trying to catch his breath... You wanted his soul, but he may be of use when $LucyName takes this place, if he survives<br><br> <<Lucy>>Can I leave now<</Lucy>><br> Barely able to think, and slightly under your corrupting infuance the man says<br><br> <<say '_NPCType' _imagePath>>Yes... Go<</say>><br><br> <</if>> <<button "Leave">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _int to random(0, 1)>> <<set _imagePath to $ImagePath>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <div class="text-box"> You tease his cock playfully<br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/SuckS/3.webm" type="video/webm"> </video><br><br> <<if $Position is "CaughtFuck">> You pull away and look up at him<br><br> <<if _int is 0>> <<Lucy>>Do you want to fuck me?<</Lucy>> <<say '_NPCType' _imagePath>>Get on the chair slut<</say>><br><br> <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Behind/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/1.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>Fuck you feel amazing<</say>><br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/3.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>Gods I'm going to...<</say>><br><br> He doesnt finish his sentance as his words turn to moans<br><br> <video autoplay loop> <source src="Images/Raids/NPC/Fuck/MF/Chair/4.webm" type="video/webm"> </video><br><br> <<else>> <<set _int to 2>> <<Lucy>>Do you-<</Lucy>> He grabs your head and pushes you back onto his cock<br><br> <<say '_NPCType' _imagePath>>Did I say you could talk<</say>><br><br> <<set $Position to "CaughtBJ">> <</if>> <</if>> <<if $Position is "CaughtBJ">> <<if _int isnot 2>> After a few minuets of enjoying your mouth, the man takes things further, grabbing your head and pushing down his shaft<br><br> <</if>> <video autoplay loop> <source src="Images/MiniGame/BJ/ThroatS/4.webm" type="video/webm"> </video><br><br> He stands and continues punishing your throat<br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/3.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>F-fuck I'm going to cum down your...<</say>><br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/1.webm" type="video/webm"> </video><br><br> He finishes by pushing his cock as deep as it will go<br><br> <</if>> <<button "Take his soul">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$currentNPC.building]>> /* Remove NPC from their building */ <<if _building>> <<set _index = _building.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _index !== -1>> <<run _building.splice(_index, 1)>> <</if>> <</if>> /* Remove from outdoor NPCs if they're outside */ <<if _location.outdoorNPCs>> <<set _outdoorIndex = _location.outdoorNPCs.findIndex(npc => npc.NPCID === $currentNPC.NPCID)>> <<if _outdoorIndex !== -1>> <<run _location.outdoorNPCs.splice(_outdoorIndex, 1)>> <</if>> <</if>> <<set $currentNPC to null>> <<set $Position to "Kill">> <<goto "SettlementCaught3">> <</button>><br> <<button "Let him live">> <<set $Position to "Live">> <<goto "SettlementCaught3">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _imagePath to $ImagePath>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <div class="text-box"> <<set _int to random(0, 1)>> <<if $currentNPC.sex is "Male">> <<if $BackgroundPath.includes("Bedroom")>> The man leads you to his bedroom and sits on the bed, you follow the lead by kneeling infront of him<br><br> <<say '_NPCType' _imagePath>>You're going to spend the rest of the day showing me how sorry you are<</say>><br><br> You help remove his clothes before going to work pleasing him<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/1.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>Ahh, thats it keep going<</say>><br><br> You try to hide your enjoyment, not wanting the man to know you've got him right where you want him<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/2.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>You're actually good at this... But I want something else from you...<</say>><br><br> He pulls you off his cock, you're reluctant to let it go and there's a pop as it slides from your eager mouth<br><br> <<say '_NPCType' _imagePath>>Lay on the bed<</say>><br><br> <<if _int is 0>> You do as he says and lay on the bed, he climbs ontop of you and hold your arms above your head. He then places his cock on your lips<br><br> <<say '_NPCType' _imagePath>>Take a deep breath<</say>><br><br> He pushes his cock into your mouth and down your throat<br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/2.webm" type="video/webm"> </video><br><br> <<say '_NPCType' _imagePath>>That's it! Fu- you can breath when Im finished with you<</say>><br><br> Clearly enjoying himself, the hear the man get closer and louder as he starts to cum down your throat.<br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/ThroatF/4.webm" type="video/webm"> </video><br><br> <<button "Back to the Castle">> <<goto "Base Intro">> <</button>> <<else>> The man pushes you back and lines his cock up with your cunt<br><br> <<say '_NPCType' _imagePath>>Oh I'm going to break you<</say>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/4.webm" type="video/webm"> </video><br><br> He fucks you with all his strength, clearly not being used to this<br><br> <<Lucy>>Oh, fuck kee...<</Lucy>><br><br> <<say '_NPCType' _imagePath>>Shut... Shut the fu... Oh Gods!<</say>><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/6.webm" type="video/webm"> </video><br><br> You feel his body tence as he cums inside you<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/7.webm" type="video/webm"> </video><br><br> <<button "Back to the Castle">> <<goto "Base Intro">> <</button>> <</if>> <<elseif ($BackgroundPath.includes("Livingroom")) or ($BackgroundPath.includes("Kitchen"))>> He pushes you into the room and locks the door, before sitting on a chair <<say '_NPCType' _imagePath>>Come here and show me why I should let you go after steeing from me<</say>><br><br> You approach and remove your clothes, letting him watch <video autoplay loop> <source src="Images/MiniGame/BJ/Strip/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/MiniGame/BJ/Strip/3.webm" type="video/webm"> </video><br><br> <<button "Blow him">> <<set $Position to "CaughtBJ">> <<goto "SettlementCaughtFuck2">> <</button>><br> <<button "Ask him to fuck you">> <<set $Position to "CaughtFuck">> <<goto "SettlementCaughtFuck2">> <</button>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> </div> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _hasGuardHouse to false>> <<for _buildingId, _building range _location.populatedBuildings>> <<if _buildingId.includes("Guard House")>> <<set _hasGuardHouse to true>> <</if>> <</for>> <<if $Position is "LetComeIn">> <<say '_NPCType' _imagePath>>Why the fuck are you going through my things?<</say>> <<else>> <<say '_NPCType' _imagePath>>What the fuck are you doing in my home<</say>><br><br> <</if>> <<Lucy>>I...<</Lucy>><br><br> <<if _hasGuardHouse>> <<say '_NPCType' _imagePath>>I should call the guards<</say>><br><br> <<else>> <<say '_NPCType' _imagePath>>We don't have any guards her, so I suppose I'll decide what to do with you<</say>><br><br> <</if>> <div class="text-box flex-buttons"> <<if $currentNPC.attracted is "Yes">> <<button "Attempt to seduce">> <<set $Position to "caughtseduce">> <<goto "NPCSeduction">> <</button>><br> <<else>> <i>You cannot seduce someone who isnt attracted to you</i> <</if>> <<button "Ask them to let you go">> <<goto "SettlementCaught2">> <</button>><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set $ReturnPassage to passage()>> <<set $BackgroundPath to "Images/Forrest/Scarldale/Church/2.png">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> <h2>Inside the Tavern</h2> <div class="npc-container"> <<for _npc range _building>> <<set _npc.found = true>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> <div class="npc-button"> <<capture _npc>> <<if _npc.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + (_npc.sex === "male" ? "him" : "her")>> <<set $ImagePath to _npc.ImagePath>> <<set $currentNPC to _npc>> <<goto "TalkToNPC">> <</button>> <</if>> <</capture>> </div> </div> <</for>> </div> </div> <div class="navigation"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <style> .people-counter { background: #2d2d2d; color: white; padding: 10px; margin-bottom: 20px; border-radius: 5px; text-align: center; } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-bottom: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; gap: 10px; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } .npc-button { margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Forrest/Scarldale/Church/2.png">> /* Select who answers the door */ <<set _doorGreeter to null>> <<set _femaleCount to 0>> /* Count females and find door greeter */ <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleCount += 1>> <<if !_doorGreeter>> <<set _doorGreeter to _resident>> <<set $ImagePath to _doorGreeter.ImagePath>> <</if>> <</if>> <</for>> /* If no female found, take any resident */ <<if !_doorGreeter && _building.length > 0>> <<set _doorGreeter to _building[0]>> <</if>> <div class="text-box"> <h2><<print $selectedBuilding>></h2> <<if _doorGreeter>> <div class="greeter-section"> <div class="raider-card"> <img @src="_doorGreeter.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _doorGreeter.job || "Villager">></p> </div> <<if _settlement.Happiness >= 50 && _settlement.corruption >= 50>> <<if _resident.sex === "Female">> <<say 'Villager' _doorGreeter.ImagePath>>Oh it's you my Lord! Please, won't you come inside<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>My Lord, it is good to see you<</say>><br><br> <</if>> <<elseif _settlement.Happiness >= 50>> <<say 'Villager' _doorGreeter.ImagePath>>Welcome, my lord. How may I assist you today?<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>Please, just leave us alone<</say>><br><br> <</if>> <<if _resident.sex === "Female">> <<if _settlement.Happiness <= 50 && _settlement.corruption >= 50>> <<set _femaleIndex to 0>> <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleIndex += 1>> <<if _femaleIndex === 1>> <<set $FemaleImg1 to _resident.ImagePath>> <<set $Int to 1>> <<elseif _femaleIndex === 2>> <<set $FemaleImg2 to _resident.ImagePath>> <<set $Int to 2>> <<elseif _femaleIndex === 3>> <<set $FemaleImg3 to _resident.ImagePath>> <<set $Int to 2>> <</if>> <</if>> <</for>> <<button "Follow her inside">> <<goto "SettlementHouseVisitSex">> <</button>> <<else>> <<if _settlement.Happiness >= 50>> <i>You need to raise the settlement happiness</i> <<elseif _settlement.corruption >= 50>> <i>You need to wait for the settlement corruption to spread</i> <</if>> <</if>> <</if>> </div> <</if>> <div class="raid-section"> <<if _building && _building.length>> <div class="building-section"> <h3>Other Residents</h3> <p>Total Residents: <<print _building.length>></p> <div class="raider-container"> <<for _resident range _building>> <<if _resident !== _doorGreeter>> <div class="raider-card"> <img @src="_resident.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _resident.job || "Villager">></p> </div> <</if>> <</for>> </div> </div> <<else>> <div class="building-section"> <h3>Occupancy</h3> <p>This building is currently unoccupied.</p> </div> <</if>> </div> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> <style> .greeter-section { text-align: center; margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _buildingId to $selectedBuilding>> <<set _residents = _location.populatedBuildings[_buildingId]>> <<if _residents && _residents.length > 0>> <<set $currentNPC to _residents[random(0, _residents.length - 1)]>> <<set $ImagePath to $currentNPC.ImagePath>> /* Mark NPC as found when they answer the door */ <<set $currentNPC.found = true>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> </div> <div style="text-align: center"> <b>Someone opens the door</b><br> <<if $currentNPC.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + ($currentNPC.sex === "male" ? "him" : "her")>> <<goto "TalkToNPC">> <</button>> <</if>> </div> <<else>> <div class="empty-house"> You knock on the door but no one answers. The house appears to be empty. </div> <</if>> <div style="text-align: center"> <<button "Leave">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> /* Initialize searched rooms array if needed */ <<if !_building.searchedRooms>> <<set _building.searchedRooms = []>> <</if>> <div class="text-box"> <<if !_building.searchedRooms.includes($ReturnPassage)>> <<run _building.searchedRooms.push($ReturnPassage)>> <div style="text-align: center"> <<set _drawerNumber to random(2, 5)>> <<set _img to "Images/Forrest/Encounters/House/Items/" + _drawerNumber + ".png">> <div class="Random-image">` <img @src=_img alt="Guest Image"> </div> <br><br> <<if _building.keyLocation === $CurrentRoom>> <img style="display: block; margin: 0 auto; width: 200px; height: 200px" src="Images/Raids/Building/key.png"> You found a key.<br><br> You press the key into a block of clay you brought so $LucyName can make a copy later<br> <<set _building.keyFound to true>> <<if random(1, 100) <= 30>> Crash! You knocked something over!<br><br> You hear footsteps of someone coming<br> <br><br> <<button "Try to flee">><<goto "LucyScout">><</button>> <<button "Stay still">><<goto "SettlementCaught">><</button>> <<else>> <<button "Return">><<goto $ReturnPassage>><</button>> <</if>> <<else>> <<set _goldFound to random(10, 50)>> <<set $Gold += _goldFound>> You found _goldFound gold<br> <<if random(1, 100) <= 30>> Crash! You knocked something over!<br><br> You hear footsteps of someone coming<br> <br><br> <<button "Try to flee">> <<set _location.populatedBuildings[$selectedBuilding].escaped = true>> <<goto "LucyScout">> <</button>> <<button "Stay still">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> /* Filter to get just the NPC array */ <<set _residents to _building.filter(item => item.NPCID !== undefined)>> <<if _residents && _residents.length > 0>> <<set $currentNPC to _residents[random(0, _residents.length - 1)]>> <<set $ImagePath to $currentNPC.ImagePath>> <</if>> <<goto "SettlementCaught">> <</button>> <<else>> <<button "Return">><<goto $ReturnPassage>><</button>> <</if>> <</if>> </div> <<else>> This drawer has already been searched. <br><br> <<button "Return">><<goto $ReturnPassage>><</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Door">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $Img to _building.buildingImage>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> You approach $selectedBuilding, the door is closed, you could knock on the door and hope they are friendly, or you can risk looking through the window.<br><br> <<button "Knock on the door">> <<goto "SettlementDoor">> <</button>><br> <<button "Look through the window">> <<goto "SettlementWindow">> <</button>><br><br> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> <div id="sneakMessage"></div> <div style="margin-top: 20px; border-top: 1px solid #ccc; padding-top: 10px;"> <i> Building Details:<br> <<if _building.keyFound>> You have found the key.<br> <<else>> You haven't found the key yet.<br> <</if>> <<set _allNPCsMet to _building.every(npc => npc.found === true)>> <<if _allNPCsMet>> You know how many people live here.<br> <<else>> You still don't know how many people live here.<br> <</if>></i> </div> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You follow the girl into the living room, and relax as she undresses, and worships you<br><br> <<if $Position is "1girl">> <<set _img to random(1, 3)>> <<set $NPC to "Brown">> <<set $ImagePath to "Images/Raids/NPC/Fuck/FM/LivingroomBj/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _GifPath to "Images/Forrest/Encounters/Human/Female/NPC/Brown/Bj/" + _img + ".gif">> <img @src="_GifPath" onerror="this.style.display='none'"> <<say 'Villager' $FemaleImg1>>Gods, I love your cock... Why don't we move to the bedroom?<</say>><br><br> <<button "Go with her">> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + _int + ".png">> <<goto "SettlementNPCFuck1">> <</button>><br><br> <<button "Finish and go">> <<goto "SettlementVisit">> <</button>> <<elseif $Position is "2girl">> <<set _img to random(1, 2)>> You follow the woman and meet her sister in the living room<br><br> <<say 'Girl 2' $FemaleImg2>>Hello Sir<</say>><br><br> <<say 'Girl 1' $FemaleImg1>>Why don't you help make our guest a little more comfortable sister?<</say>><br><br> You watch as the second firl undresses and takes your cock into her mouth<br><br> <<say 'Girl 1' $FemaleImg1>>That's it sister!<</say>><br><br> <<set $NPC to "Brown">> <<set $ImagePath to "Images/Raids/NPC/Fuck/FFM/" + _img + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _GifPath to "Images/Raids/NPC/Fuck/FFM/" + _img + ".gif">> <img @src="_GifPath" onerror="this.style.display='none'"> <<if _img is 2>> <<say 'Girl 1' $FemaleImg1>>You did well sister, but why don't you go make some food for us? I'll take our Lord upstairs and show him how greatful we really are<</say>><br><br> The girl sucking your cock slides off it and looks at you<br><br> <<say 'Girl 2' $FemaleImg2>>Is that what you wish, Lord?<</say>><br><br> <<button "Go with the girl">> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <<set $NPC to "Red">> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + _int + ".png">> <<goto "SettlementNPCFuck1">> <</button>><br><br> <<else>> <<say 'Girl 1' $FemaleImg1>>My lord, why don't you take my sister upstairs?<</say>><br><br> <<say 'Girl 2' $FemaleImg2>>Ummm!<</say>><br><br> <<button "Go with the girl">> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <<set $FemaleImg1 to $FemaleImg2>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/" + _int + ".png">> <<goto "SettlementNPCFuck1">> <</button>><br><br> <</if>> <<button "Finish and go">> <<goto "SettlementVisit">> <</button>> <<else>> <<set $ImagePath to "Images/Raids/NPC/Fuck/FFFM/1.png">> <</if>> </div> <<set _int to random(1, 7)>> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Livingroom/" + _int + ".png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Door">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $Img to _building.buildingImage>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> You approach $selectedBuilding, the door is closed, you could knock on the door and hope they are friendly, or you can risk looking through the window.<br><br> <<button "Knock on the door">> <<goto "SettlementDoor">> <</button>><br> <<button "Try to sneak in">> <<if !_building.locked>> <<goto "ScoutHouseDownHall">> <<else>> <<replace "#sneakMessage">>The door is locked. You'll need to find another way in.<</replace>> <</if>> <</button>><br> <<button "Look through the window">> <<goto "SettlementWindow">> <</button>><br><br> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> <div id="sneakMessage"></div> <div style="margin-top: 20px; border-top: 1px solid #ccc; padding-top: 10px;"> <i> Building Details:<br> <<if _building.keyFound>> You have found the key.<br> <<else>> You haven't found the key yet.<br> <</if>> <<set _allNPCsMet to _building.every(npc => npc.found === true)>> <<if _allNPCsMet>> You know how many people live here.<br> <<else>> You still don't know how many people live here.<br> <</if>></i> </div> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <!-- If greeter found, rebuild the image path (in case it wasn't set on previous page) --> <<if _doorGreeter>> <<if _doorGreeter.sex is "Female">> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Female/Blonde/Inside/" + _doorGreeter.ImgNumber + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Female/Red/Inside/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <</if>> <<else>> <<set $greeterImage to "Images/Raids/NPC/Male/Nude/" + _doorGreeter.ImgNumber + ".png">> <</if>> <</if>> <div class="text-box"> <div class="Random-image"> <<if $greeterImage>> <img @src="$greeterImage" alt="Guest Image"> <<else>> <img src="Images/Icons/Person.png" alt="Default Image"> <</if>> </div> <br><br> </div> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Door">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> /* Filter residents to only those currently at home (not at work during work hours and not at cult) */ <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> <<set _residentAtCult to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Check if resident is currently at the cult */ <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentVisitor>> <<set _cultVisitor to _settlement.buildings.cult.currentVisitor>> <<set _cultVisitorId to _cultVisitor.NPCID || _cultVisitor.prisonerId>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<if _cultVisitorId === _residentId>> <<set _residentAtCult to true>> <</if>> <</if>> /* Add to home list if not at work and not at cult */ <<if !_residentAtWork && !_residentAtCult>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> /* Select who answers the door from residents at home */ <<set _doorGreeter to null>> <<set _femaleCount to 0>> <<set _hasMaleResident to false>> <<set _hasFemaleResident to false>> /* Count females and check for males */ <<for _resident range _residentsAtHome>> <<if _resident.sex === "Male">> <<set _hasMaleResident to true>> <</if>> <<if _resident.sex === "Female">> <<set _hasFemaleResident to true>> <<set _femaleCount += 1>> <<if !_doorGreeter>> <<set _doorGreeter to _resident>> <<if _doorGreeter.hairColor is "Brown">> <<set $ImagePath to "Images/Raids/NPC/Female/Inside/" + _doorGreeter.ImgNumber + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $ImagePath to "Images/Raids/NPC/Female/Red/Inside/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set $ImagePath to "Images/Raids/NPC/Female/Blonde/Inside/" + _doorGreeter.ImgNumber + ".png">> <</if>> <</if>> <</if>> <</for>> /* If no female found, take any resident at home */ <<if !_doorGreeter && _residentsAtHome.length > 0>> <<set _doorGreeter to _residentsAtHome[0]>> <</if>> <div class="location-card"> <div class="location-image"> <!-- Greeter image removed because the <<say>> dialog shows the greeter's image. Keep an empty placeholder so layout remains consistent when needed. --> <<if !_doorGreeter || !_doorGreeter.ImagePath>> <img src="Images/Icons/Person.png" alt="Default Resident"> <</if>> </div> <div class="location-info"> <h1><<print $selectedBuilding>></h1> <p><span class="info-label">Total Residents:</span> <<print _building ? _building.length : 0>></p> <p><span class="info-label">Currently Home:</span> <<print _residentsAtHome.length>></p> <<if _residentsAtHome.length < _building.length>> <<silently>> <<set _awayCount to _building.length - _residentsAtHome.length>> <<set _atWorkCount to 0>> <<set _atCultCount to 0>> <<for _res range _building>> <<set _resId to _res.NPCID || _res.prisonerId>> <<set _isThisResidentAtWork to false>> <<set _isThisResidentAtCult to false>> /* Check if at work */ <<if _isWorkTime && _settlement.buildings>> <<for _bKey, _bData range _settlement.buildings>> <<if _bData.staff && _bData.staff.length > 0>> <<for _staff range _bData.staff>> <<if (_staff.NPCID === _resId || _staff.prisonerId === _resId)>> <<set _isThisResidentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _isThisResidentAtWork>><<break>><</if>> <</for>> <</if>> /* Check if at cult */ <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentVisitor>> <<set _cVisitor to _settlement.buildings.cult.currentVisitor>> <<if (_cVisitor.NPCID === _resId || _cVisitor.prisonerId === _resId)>> <<set _isThisResidentAtCult to true>> <</if>> <</if>> <<if _isThisResidentAtWork>><<set _atWorkCount += 1>><</if>> <<if _isThisResidentAtCult>><<set _atCultCount += 1>><</if>> <</for>> <</silently>> <p style="color: #888; font-style: italic; font-size: 0.9em;"> (<<if _atWorkCount > 0>><<print _atWorkCount>> at work<</if>><<if _atWorkCount > 0 && _atCultCount > 0>>, <</if>><<if _atCultCount > 0>><<print _atCultCount>> at cult<</if>>) </p> <</if>> <<if _residentsAtHome.length === 0>> <div class="info-message"> <p style="color: #ff9966;">Nobody is home right now.</p> </div> <<elseif _doorGreeter>> <<if _doorGreeter.sex is "Female">> <<set _randEvent to random(1, 130)>> <<if (_residentsAtHome.length lt 3) and (_randEvent <= _doorGreeter.corruption)>> <<set _NoOneAnswered to true>> <p>You knock at the door but no one answers. Listening Closly you can hear noises coming from inside.</p> <</if>> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Female/Blonde/Inside/" + _doorGreeter.ImgNumber + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Female/Red/Inside/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Female/Inside/" + _doorGreeter.ImgNumber + ".png">> <</if>> <<else>> <<set $greeterImage to "Images/Raids/NPC/Male/Inside/" + _doorGreeter.ImgNumber + ".png">> <</if>> <<set $GreeterID to _doorGreeter.NPCID || _doorGreeter.prisonerId>> <<set $greeterName to _doorGreeter.name || _doorGreeter.job || "Resident">> <<if _NoOneAnswered is not true>> <!-- No greeter dialog if no one answered --> <<say $greeterName $greeterImage>> <<if _settlement.Happiness >= 30 && _doorGreeter.corruption >= 50>> <<if _doorGreeter.sex === "Female">> She smiles warmly and steps forward to welcome you. <<else>> Welcome, my lord. How may I assist you today? <</if>> <<elseif _settlement.Happiness >= 50>> Welcome. How can I help? <<else>> Please, just leave us alone... <</if>> <</say>> <<if _doorGreeter.sex === "Female">> <<if _settlement.Happiness >= 50 && _settlement.corruption >= 50>> <<set _femaleIndex to 0>> <<for _resident range _residentsAtHome>> <<if _resident.sex === "Female">> <<set _femaleIndex += 1>> <<if _femaleIndex === 1>> <<set $FemaleImg1 to _resident.ImagePath>> <<set $Int to 1>> <<elseif _femaleIndex === 2>> <<set $FemaleImg2 to _resident.ImagePath>> <<set $Int to 2>> <<elseif _femaleIndex === 3>> <<set $FemaleImg3 to _resident.ImagePath>> <<set $Int to 2>> <</if>> <</if>> <</for>> <div class="button-group"> <i>More content coming soon...</i> </div> <<else>> <div class="info-message"> <<if _settlement.Happiness <= 50>> <i>You need to raise the settlement happiness</i> <<elseif _settlement.corruption <= 50>> <i>You need to wait for the settlement corruption to spread</i> <</if>> </div> <</if>> <</if>> <</if>> <</if>> <<if _NoOneAnswered>> <<if _hasMaleResident && _hasFemaleResident>> <<button "Look through window">> <<goto "SettlmentHouseVisitWindow">> <</button>> <<else>> <<button "Enter the house">> <<goto "SettlementHouseVisitAlone">> <</button>> <</if>> <</if>> </div> </div> <!-- House Residents Section --> <div class="raid-section"> <details class="residents-dropdown"> <summary><h2 style="display: inline; cursor: pointer;">Manage House Residents</h2></summary> <<if _building && _building.length>> <div class="raider-container"> <<for _residentIndex = 0; _residentIndex < _building.length; _residentIndex++>> <<set _villager = _building[_residentIndex]>> <<if _villager.hairColor>><<else>><<set _villager.hairColor to "Brown">><</if>> <div class="raider-card"> <!-- use @src like SettlementOverview so images load the same way --> <<if _villager.sex is "Female">> <<if _villager.corruption >= 80 and _villager.ImgNumber < 16>> <<set _imgInt to _villager.ImgNumber + 15>> <<else>> <<set _imgInt to _villager.ImgNumber>> <</if>> <<if _villager.hairColor is "Blonde">> <<set _NPCInsidePath to "Images/Raids/NPC/Female/Blonde/Inside/" + _imgInt + ".png">> <<elseif _villager.hairColor is "Red">> <<set _NPCInsidePath to "Images/Raids/NPC/Female/Red/Inside/" + _imgInt + ".png">> <<else>> <<set _NPCInsidePath to "Images/Raids/NPC/Female/Inside/" + _imgInt + ".png">> <</if>> <<else>> <<set _NPCInsidePath to "Images/Raids/NPC/Male/Inside/" + _villager.ImgNumber + ".png">> <</if>> <img @src="_NPCInsidePath" class="raider-img" style="width: 200px; height: 200px; object-fit: cover;" alt="Resident" onerror="this.onerror=null;this.src='Images/Icons/Person.png';"> <h3><<print _villager.name || _villager.job || "Villager">></h3> <p><<print _villager.job || "Resident">></p> <<silently>> <<set _hasJob = false>> <<set _isAtWork = false>> <<set _villagerIdToCheck = _villager.NPCID || _villager.prisonerId>> <<if _settlement.buildings>> <<for _buildingKey, _bld range _settlement.buildings>> <<if _bld.staff && _bld.staff.some(s => (s.NPCID === _villagerIdToCheck || s.prisonerId === _villagerIdToCheck))>> <<set _hasJob = true>> /* Check if currently at work */ <<if _isWorkTime>> <<set _isAtWork = true>> <</if>> <</if>> <</for>> <</if>> <</silently>> <<if _hasJob>> <<if _isAtWork>> <p style="color: orange">At work</p> <<else>> <p style="color: lightgreen">Works at a facility (currently off-duty)</p> <</if>> <</if>> <<capture _villager>> <<button "Manage">> <<set $currentVillager = _villager>> <<set $originSettlement = _settlement>> <<goto "ManageVillager">> <</button>> <</capture>> </div> <</for>> </div> <<else>> <div class="empty-house"> <h3>Occupancy</h3> <p>This building is currently unoccupied.</p> </div> <</if>> </details> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> <style> /* General Styles */ .location-card { display: flex; flex-wrap: wrap; /* allow responsive wrapping */ background: rgba(0, 0, 0, 0.7); border: 2px solid #333; border-radius: 8px; padding: 20px; margin: 20px 0; } .location-image { /* match the actual image size to remove extra buffer */ flex: 0 0 220px; /* was 300px */ min-width: 220px; } /* collapse the greeter column when it contains no image (no placeholder) */ .location-image:empty, .location-image:not(:has(img)) { flex: 0 0 0; min-width: 0; width: 0; padding: 0; margin: 0; } /* when there's no image, remove the extra left padding on the info column */ .location-image:not(:has(img)) + .location-info, .location-image:empty + .location-info { padding-left: 0; } /* constrain greeter image size to match residents */ .location-image img, .greeter-img { width: 220px; height: 220px; object-fit: cover; border-radius: 4px; border: 1px solid #777; } /* ensure info column can shrink on small widths */ .location-info { flex: 1 1 320px; padding-left: 12px; /* reduced from 20px to remove leftover gap */ } /* keep resident thumbs responsive */ .resident-thumb { width: 100px; text-align: center; } .resident-thumb img { width:100px; height:100px; object-fit:cover; border-radius:4px; border:1px solid #777; } .resident-thumb p { margin:4px 0 0 0; font-size:12px; color:#ddd; } /* Greeter Section */ .greeter-section { margin: 20px 0; padding: 15px; background: rgba(20, 20, 20, 0.7); border-radius: 8px; } .job-title { color: #aaa; font-style: italic; margin: 0 0 10px 0; } .greeting { font-size: 16px; line-height: 1.4; } /* Residents Section */ .raid-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .residents-dropdown { cursor: pointer; } .residents-dropdown summary { list-style: none; padding: 10px; background: rgba(40, 40, 40, 0.8); border-radius: 5px; margin-bottom: 10px; transition: background 0.2s; } .residents-dropdown summary:hover { background: rgba(60, 60, 60, 0.8); } .residents-dropdown summary::-webkit-details-marker { display: none; } .residents-dropdown summary::before { content: '▶ '; display: inline-block; transition: transform 0.2s; } .residents-dropdown[open] summary::before { transform: rotate(90deg); } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin: 10px 0; } .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; display: inline-block; } /* Management Panel */ .management-container { margin-top: 30px; padding: 15px; background: rgba(30, 30, 30, 0.8); border-radius: 8px; min-height: 200px; } .placeholder { text-align: center; color: #999; font-style: italic; padding: 40px 0; } .management-panel { color: #eee; } .management-panel h3 { color: #ffd700; border-bottom: 1px solid #555; padding-bottom: 8px; margin-top: 0; } .management-details { display: flex; margin: 15px 0; } .management-image { width: 150px; height: 150px; object-fit: cover; border-radius: 5px; border: 2px solid #777; } .management-info { margin-left: 20px; flex-grow: 1; } .management-info p { margin: 5px 0; line-height: 1.5; } .management-actions { margin-top: 20px; } .management-actions h4 { color: #aaa; margin-bottom: 10px; } .action-buttons { display: flex; flex-wrap: wrap; gap: 10px; } .action-buttons button, .button-group button { padding: 8px 15px; background: #2c2c2c; border: 1px solid #777; color: #fff; border-radius: 4px; cursor: pointer; transition: background-color 0.2s; } .action-buttons button:hover, .button-group button:hover { background: #3c3c3c; } .button-group { margin-top: 15px; } .info-message { margin-top: 15px; color: #ff9966; font-style: italic; } .success-message { padding: 15px; background: rgba(40, 80, 40, 0.6); border: 1px solid #6a6; border-radius: 5px; text-align: center; color: #afa; } /* Dropdown Menu */ .dropdown { position: relative; display: inline-block; } .dropbtn { padding: 8px 15px; background: #2c2c2c; border: 1px solid #777; color: #fff; border-radius: 4px; cursor: pointer; } .dropdown-content { display: none; position: absolute; background-color: #222; min-width: 160px; box-shadow: 0 8px 16px rgba(0,0,0,0.5); z-index: 1; border-radius: 4px; overflow: hidden; } .dropdown-content button { color: #ddd; padding: 8px 16px; text-decoration: none; display: block; width: 100%; text-align: left; border: none; background: none; cursor: pointer; } .dropdown-content button:hover { background-color: #333; } .dropdown:hover .dropdown-content { display: block; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Door">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set $Img to _building.buildingImage>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> You approach $selectedBuilding, the door is closed, you could knock on the door and hope they are friendly, or you can risk looking through the window.<br><br> <<button "Knock on the door">> <<goto "SettlementDoor">> <</button>><br> <<button "Try to sneak in">> <<if !_building.locked>> <<goto "ScoutHouseDownHall">> <<else>> <<replace "#sneakMessage">>The door is locked. You'll need to find another way in.<</replace>> <</if>> <</button>><br> <<button "Look through the window">> <<goto "SettlementWindow">> <</button>><br><br> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> <div id="sneakMessage"></div> <div style="margin-top: 20px; border-top: 1px solid #ccc; padding-top: 10px;"> <i> Building Details:<br> <<if _building.keyFound>> You have found the key.<br> <<else>> You haven't found the key yet.<br> <</if>> <<set _allNPCsMet to _building.every(npc => npc.found === true)>> <<if _allNPCsMet>> You know how many people live here.<br> <<else>> You still don't know how many people live here.<br> <</if>></i> </div> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Door">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> /* Select who answers the door */ <<set _doorGreeter to null>> <<set _femaleCount to 0>> /* Count females and find door greeter */ <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleCount += 1>> <<if !_doorGreeter>> <<set _doorGreeter to _resident>> <<set $ImagePath to _doorGreeter.ImagePath>> <</if>> <</if>> <</for>> /* If no female found, take any resident */ <<if !_doorGreeter && _building.length > 0>> <<set _doorGreeter to _building[0]>> <</if>> <div class="text-box"> <h2><<print $selectedBuilding>></h2> <<if _doorGreeter>> <div class="greeter-section"> <div class="raider-card"> <img @src="_doorGreeter.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _doorGreeter.job || "Villager">></p> </div> <<if _settlement.Happiness >= 50 && _settlement.corruption >= 50>> <<if _resident.sex === "Female">> <<say 'Villager' _doorGreeter.ImagePath>>Oh it's you my Lord! Please, won't you come inside<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>My Lord, it is good to see you<</say>><br><br> <</if>> <<elseif _settlement.Happiness >= 50>> <<say 'Villager' _doorGreeter.ImagePath>>Welcome, my lord. How may I assist you today?<</say>><br><br> <<else>> <<say 'Villager' _doorGreeter.ImagePath>>Please, just leave us alone<</say>><br><br> <</if>> <<if _resident.sex === "Female">> <<if _settlement.Happiness <= 50 && _settlement.corruption >= 50>> <<set _femaleIndex to 0>> <<for _resident range _building>> <<if _resident.sex === "Female">> <<set _femaleIndex += 1>> <<if _femaleIndex === 1>> <<set $FemaleImg1 to _resident.ImagePath>> <<set $Int to 1>> <<elseif _femaleIndex === 2>> <<set $FemaleImg2 to _resident.ImagePath>> <<set $Int to 2>> <<elseif _femaleIndex === 3>> <<set $FemaleImg3 to _resident.ImagePath>> <<set $Int to 2>> <</if>> <</if>> <</for>> <<button "Follow her inside">> <<goto "SettlementHouseVisitSex">> <</button>> <<else>> <<if _settlement.Happiness >= 50>> <i>You need to raise the settlement happiness</i> <<elseif _settlement.corruption >= 50>> <i>You need to wait for the settlement corruption to spread</i> <</if>> <</if>> <</if>> </div> <</if>> <div class="raid-section"> <<if _building && _building.length>> <div class="building-section"> <h3>Other Residents</h3> <p>Total Residents: <<print _building.length>></p> <div class="raider-container"> <<for _resident range _building>> <<if _resident !== _doorGreeter>> <div class="raider-card"> <img @src="_resident.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _resident.job || "Villager">></p> </div> <</if>> <</for>> </div> </div> <<else>> <div class="building-section"> <h3>Occupancy</h3> <p>This building is currently unoccupied.</p> </div> <</if>> </div> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> <style> .greeter-section { text-align: center; margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <div class="needs-section"> <h2>Settlement Needs</h2> /* NEW NEEDS CALCULATION - Compatible with new building system */ <<set _needsList = []>> /* Helper function to get all villagers (reuse from ProcessSettlements) */ <<set _getAllVillagers = function(s) { var list = []; var seen = {}; function add(v){ if(!v) return; var key = (v.NPCID || v.prisonerId || v.id || v.name || JSON.stringify(v)); if(!seen[key]){ seen[key]=true; list.push(v); } } if(s.populatedBuildings){ for(var b in s.populatedBuildings){ var residents = s.populatedBuildings[b]; if(Array.isArray(residents)){ for(var i=0;i<residents.length;i++) add(residents[i]); } } } if(Array.isArray(s.capturedVillagers)) for(var i=0;i<s.capturedVillagers.length;i++) add(s.capturedVillagers[i]); if(Array.isArray(s.villagers)) for(var i=0;i<s.villagers.length;i++) add(s.villagers[i]); if(Array.isArray(s.inhabitants)) for(var i=0;i<s.inhabitants.length;i++) add(s.inhabitants[i]); if(Array.isArray(s.residents)) for(var i=0;i<s.residents.length;i++) add(s.residents[i]); if(s.buildings){ for(var bk in s.buildings){ try{ var bobj = s.buildings[bk]; if(bobj && Array.isArray(bobj.residents)){ for(var j=0;j<bobj.residents.length;j++) add(bobj.residents[j]); } if(bobj && Array.isArray(bobj.occupants)){ for(var j=0;j<bobj.occupants.length;j++) add(bobj.occupants[j]); } }catch(e){} } } return list; }>> <<set _allVillagers = _getAllVillagers(_settlement)>> <<set _villagerCount = _allVillagers.length>> /* Food Reserves Check */ <<if _settlement.foodReserves < 30>> <<if _settlement.foodReserves < 15>> <<run _needsList.push({ type: "Food Reserves", description: "Critical food shortage: " + _settlement.foodReserves + "% remaining", priority: "High", current: _settlement.foodReserves, max: 100 })>> <<else>> <<run _needsList.push({ type: "Food Reserves", description: "Low food reserves: " + _settlement.foodReserves + "% remaining", priority: "Medium", current: _settlement.foodReserves, max: 100 })>> <</if>> <</if>> /* Gold Reserves Check */ <<if (_settlement.gold || 0) < 100>> <<set _goldAmount = _settlement.gold || 0>> <<if _goldAmount < 25>> <<run _needsList.push({ type: "Gold Reserves", description: "Critical gold shortage: " + _goldAmount + " gold", priority: "High", current: _goldAmount, max: 100 })>> <<elseif _goldAmount < 50>> <<run _needsList.push({ type: "Gold Reserves", description: "Low gold reserves: " + _goldAmount + " gold", priority: "Medium", current: _goldAmount, max: 100 })>> <</if>> <</if>> /* Population Check */ <<if _villagerCount < 3>> <<run _needsList.push({ type: "Population", description: "Very low population: " + _villagerCount + " villagers", priority: "High", current: _villagerCount, max: 10 })>> <<elseif _villagerCount < 5>> <<run _needsList.push({ type: "Population", description: "Low population: " + _villagerCount + " villagers", priority: "Medium", current: _villagerCount, max: 10 })>> <</if>> /* Housing Check */ <<set _housingCapacity = 0>> <<if _settlement.buildings && _settlement.buildings.house>> <<if typeof _settlement.buildings.house.count !== 'undefined'>> <<set _housingCapacity = _settlement.buildings.house.count * 3>> <<elseif _settlement.buildings.house.built === true>> <<set _housingCapacity = 3>> <</if>> <<elseif _settlement.populatedBuildings>> <<set _houseCount = 0>> <<for _buildingName, _residents range _settlement.populatedBuildings>> <<if _buildingName.toLowerCase().includes("house")>> <<set _houseCount++>> <</if>> <</for>> <<set _housingCapacity = _houseCount * 3>> <</if>> <<if _villagerCount > 0 && _housingCapacity === 0>> <<run _needsList.push({ type: "Housing", description: _villagerCount + " villagers have no housing", priority: "High" })>> <<elseif _housingCapacity > 0 && (_villagerCount / _housingCapacity) < 0.5>> <<set _occupancyPercent = Math.round((_villagerCount / _housingCapacity) * 100)>> <<run _needsList.push({ type: "Housing", description: "Housing severely underutilized: " + _occupancyPercent + "% occupied", priority: "Low", current: _villagerCount, max: _housingCapacity })>> <</if>> /* Building Staffing Check */ <<set _unstaffedCritical = []>> <<set _understaffed = []>> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.built>> <<set _staffCount = (_building.staff && _building.staff.length) || 0>> <<set _maxStaff = _building.maxStaff || 1>> <<if _staffCount === 0>> <<if _buildingKey === "farm" || _buildingKey === "mill">> <<run _unstaffedCritical.push(_buildingKey)>> <<else>> <<run _understaffed.push(_buildingKey)>> <</if>> <<elseif _staffCount < _maxStaff>> <<run _understaffed.push(_buildingKey + " (" + _staffCount + "/" + _maxStaff + ")")>> <</if>> <</if>> <</for>> <</if>> <<if _unstaffedCritical.length > 0>> <<run _needsList.push({ type: "Critical Buildings", description: "Essential buildings unstaffed: " + _unstaffedCritical.join(", "), priority: "High" })>> <</if>> <<if _understaffed.length > 0>> <<set _staffingDescription = "Buildings need more staff: " + _understaffed.slice(0,3).join(", ")>> <<if _understaffed.length > 3>> <<set _staffingDescription += " and " + (_understaffed.length - 3) + " others">> <</if>> <<run _needsList.push({ type: "Building Staffing", description: _staffingDescription, priority: "Low" })>> <</if>> /* Display Results */ <<if _needsList.length > 0>> <<for _need range _needsList>> <div class="need-card priority-<<print _need.priority.toLowerCase()>>"> <div class="need-info"> <span class="need-type"><<print _need.type>></span> <span class="need-description"><<print _need.description>></span> </div> <<if _need.current && _need.max>> <<print `<progress value="${_need.current}" max="${_need.max}" style="width: 100%; height: 20px;"></progress>`>> <</if>> </div> <</for>> <<else>> <div class="self-sufficient"> <span class="success-icon">✓</span> <p>This settlement is currently self-sufficient.</p> </div> <</if>> </div> <style> .needs-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .need-card { display: flex; flex-direction: column; margin: 10px 0; padding: 15px; border-radius: 4px; background: rgba(0, 0, 0, 0.5); transition: all 0.3s ease; } .need-info { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .need-card.priority-high { border-left: 4px solid #ff4444; } .need-card.priority-medium { border-left: 4px solid #ffbb33; } .need-card.priority-low { border-left: 4px solid #00C851; } .need-type { font-weight: bold; color: #fff; padding: 5px 10px; border-radius: 3px; background: rgba(255, 255, 255, 0.1); } .need-description { color: #ccc; flex-grow: 1; margin-left: 15px; } .self-sufficient { text-align: center; color: #00C851; padding: 20px; } .success-icon { font-size: 24px; margin-right: 10px; } </style> <</nobr>>
<<nobr>> <<set _Img to random(1, 2)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/Ready/" + _Img + ".png">> <div class="text-box"> <<say 'Villager' $FemaleImg1>>What do you want to do?<</say>><br><br> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <hr> Pleasure her<br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('SettlementNPCFuck2')>><</link>> <hr> Fuck her<br> <<link "Get on top">><<set $Position to "Miss">><<run Engine.play('SettlementNPCFuck2')>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.play('SettlementNPCFuck2')>><</link>><br> <<link "Let her ride you">><<set $Position to "Cg">><<run Engine.play('SettlementNPCFuck2')>><</link>> <hr> Pleasure Yourself<br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('SettlementNPCFuck2')>><</link>> <hr> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _Vid to random(1, 3)>> <<set _Img to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/" + _Img + ".png">> <<set $VidPath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/" + _Vid>> <<if $Position is "Lick">> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "Miss">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Behind">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Cg">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Bj">> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Fcum">> <<set $VidPath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/1">> <</if>> <div class="text-box"> <<if $Position isnot "Fcum">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<else>> <<set $Position to $OldPosition>> <</if>> <<set _GifPath to $VidPath + ".gif">> <<set _WebpPath to $VidPath + ".webp">> <div class="centered-image"> <img @src="_WebpPath" onerror="this.style.display='none'"> </div> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if $NPCCum >= 100>> <<set $OldPosition to $Position>> <<set $Position to "Fcum">> <<link "She cums">><<set $NPCCum to 0>><<run Engine.show()>><</link>> <<elseif $PlayerCum >= 100>> <<if $PlayerCum lt 200>> <<set $HouseVisit to false>> You feel yourself getting close, you choose to cum: <br><br> On her <<link "face">><<set $Position to "Face">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "mouth">><<set $Position to "Mouth">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "Pussy">><<set $Position to "Inside">><<set $PlayerCum to 200>><<run Engine.show()>><</link>> <<else>> <<button "Leave her to clean up">><<run Engine.play('SettlementVisit')>><</button>><br><br> <</if>> <<else>> <<link "Keep going">><<run Engine.play('SettlementNPCFuck2')>><</link>><br> <<link "Change position">><<run Engine.play('SettlementNPCFuck1')>><</link>> <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <!-- MIGRATION: Fix buildings treated as houses (legacy data issue) --> <<silently>> <<set _buildingTypesToMigrate to ["Tavern", "Guard House", "Forge", "Mill", "Brewery", "Lumber Mill"]>> <<for _buildingName range _buildingTypesToMigrate>> <<if _settlement.populatedBuildings && _settlement.populatedBuildings[_buildingName]>> <<set _buildingResidents to _settlement.populatedBuildings[_buildingName]>> <!-- Create proper buildings object if it doesn't exist --> <<if !_settlement.buildings>> <<set _settlement.buildings to {}>> <</if>> <!-- Determine the building key based on name --> <<set _buildingKey to "">> <<switch _buildingName>> <<case "Tavern">> <<set _buildingKey to "tavern">> <<case "Guard House">> <<set _buildingKey to "guardTower">> <<case "Forge">> <<set _buildingKey to "forge">> <<case "Mill">> <<set _buildingKey to "mill">> <<case "Brewery">> <<set _buildingKey to "brewery">> <<case "Lumber Mill">> <<set _buildingKey to "lumberMill">> <</switch>> <!-- Create the building entry if it doesn't exist --> <<if _buildingKey && !_settlement.buildings[_buildingKey]>> <<set _settlement.buildings[_buildingKey] to { built: true, staff: [], maxStaff: 3 }>> <</if>> <!-- Find available houses to relocate the NPCs --> <<for _resident range _buildingResidents>> <<set _relocated to false>> <!-- Try to find a house with space --> <<for _houseNum = 1; _houseNum <= 10; _houseNum++>> <<set _houseName to "House " + _houseNum>> <<if _settlement.populatedBuildings[_houseName]>> <!-- House exists, add resident to it --> <<run _settlement.populatedBuildings[_houseName].push(_resident)>> <<set _resident.building to _houseName>> <<set _resident.buildingType to "House">> <<set _relocated to true>> <<break>> <</if>> <</for>> <!-- If no existing house, create a new one --> <<if !_relocated>> <<set _newHouseNum to 1>> <<for _houseNum = 1; _houseNum <= 10; _houseNum++>> <<if !_settlement.populatedBuildings["House " + _houseNum]>> <<set _newHouseNum to _houseNum>> <<break>> <</if>> <</for>> <<set _newHouseName to "House " + _newHouseNum>> <<set _settlement.populatedBuildings[_newHouseName] to [_resident]>> <<set _resident.building to _newHouseName>> <<set _resident.buildingType to "House">> <</if>> <</for>> <!-- Remove building from populatedBuildings --> <<run delete _settlement.populatedBuildings[_buildingName]>> <</if>> <</for>> <!-- Save changes --> <<set $CapturedLocations[$currentSettlementId] to _settlement>> <</silently>> <!-- MIGRATION: Ensure garrison includes guard tower and cult staff --> <<silently>> <!-- Initialize garrison array if missing --> <<if !_settlement.garrison || !Array.isArray(_settlement.garrison)>> <<set _settlement.garrison = []>> <</if>> <!-- Index existing garrison members by NPCID to avoid duplicates --> <<set _garrisonById = {}>> <<for _i = 0; _i < _settlement.garrison.length; _i++>> <<set _npc = _settlement.garrison[_i]>> <<if _npc && _npc.NPCID>> <<set _garrisonById[_npc.NPCID] = true>> <</if>> <</for>> <!-- Helper to sync a building's staff into the garrison by NPCID --> <<set _syncStaffIntoGarrison = function(staff){ if (!staff || !Array.isArray(staff)) { return; } for (var i = 0; i < staff.length; i++) { var unit = staff[i]; if (unit && unit.NPCID && !_garrisonById[unit.NPCID]) { _settlement.garrison.push(unit); _garrisonById[unit.NPCID] = true; } } }>> <!-- Sync guard tower and cult staff into the garrison --> <<if _settlement.buildings && _settlement.buildings.guardTower>> <<run _syncStaffIntoGarrison(_settlement.buildings.guardTower.staff)>> <</if>> <<if _settlement.buildings && _settlement.buildings.cult>> <<run _syncStaffIntoGarrison(_settlement.buildings.cult.staff)>> <</if>> <!-- Save any changes back to the main array --> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</silently>> <!-- REMOVE "Unknown" NAMES --> <<silently>> <!-- Process all NPCs in populated buildings --> <<if _settlement.populatedBuildings>> <<for _buildingName, _npcs range _settlement.populatedBuildings>> <<if _npcs && Array.isArray(_npcs)>> <<for _i = 0; _i < _npcs.length; _i++>> <<set _npc = _npcs[_i]>> <<if _npc.name === "Unknown">> <<run delete _npc.name>> <</if>> <</for>> <</if>> <</for>> <</if>> <!-- Process NPCs in building staff --> <<if _settlement.buildings>> <<for _buildingType, _buildingData range _settlement.buildings>> <<if _buildingData.staff && Array.isArray(_buildingData.staff)>> <<for _i = 0; _i < _buildingData.staff.length; _i++>> <<set _npc = _buildingData.staff[_i]>> <<if _npc.name === "Unknown">> <<run delete _npc.name>> <</if>> <</for>> <</if>> <</for>> <</if>> <!-- Process garrison NPCs --> <<if _settlement.garrison && Array.isArray(_settlement.garrison)>> <<for _i = 0; _i < _settlement.garrison.length; _i++>> <<set _npc = _settlement.garrison[_i]>> <<if _npc.name === "Unknown">> <<run delete _npc.name>> <</if>> <</for>> <</if>> <</silently>> <!-- UPDATE NPC IMAGE NUMBERS --> <<silently>> <!-- Process all NPCs in populated buildings --> <<if _settlement.populatedBuildings>> <<for _buildingName, _npcs range _settlement.populatedBuildings>> <<if _npcs && Array.isArray(_npcs)>> <<for _i = 0; _i < _npcs.length; _i++>> <<set _npc = _npcs[_i]>> <!-- Check if ImgNumber is missing and ImagePath exists --> <<if !_npc.hasOwnProperty('ImgNumber') && _npc.ImagePath>> <!-- Extract the number from the ImagePath --> <<set _pathMatch = _npc.ImagePath.match(/(\d+)\.png$/i)>> <<if _pathMatch && _pathMatch[1]>> <<set _npc.ImgNumber = parseInt(_pathMatch[1])>> <<run console.log("Assigned ImgNumber", _npc.ImgNumber, "to NPC", _npc.name || _npc.NPCID, "in building", _buildingName)>> <<else>> <<run console.log("WARNING: Could not extract image number from ImagePath:", _npc.ImagePath)>> <</if>> <</if>> <</for>> <</if>> <</for>> <</if>> <!-- Process NPCs in building staff (e.g., farm, brewery, cult) --> <<if _settlement.buildings>> <<for _buildingType, _buildingData range _settlement.buildings>> <<if _buildingData.staff && Array.isArray(_buildingData.staff)>> <<for _i = 0; _i < _buildingData.staff.length; _i++>> <<set _npc = _buildingData.staff[_i]>> <!-- Check if ImgNumber is missing and ImagePath exists --> <<if !_npc.hasOwnProperty('ImgNumber') && _npc.ImagePath>> <!-- Extract the number from the ImagePath --> <<set _pathMatch = _npc.ImagePath.match(/(\d+)\.png$/i)>> <<if _pathMatch && _pathMatch[1]>> <<set _npc.ImgNumber = parseInt(_pathMatch[1])>> <<run console.log("Assigned ImgNumber", _npc.ImgNumber, "to NPC", _npc.name || _npc.NPCID, "in building staff", _buildingType)>> <<else>> <<run console.log("WARNING: Could not extract image number from ImagePath:", _npc.ImagePath)>> <</if>> <</if>> <</for>> <</if>> <</for>> <</if>> <!-- Save the changes back to the main array --> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</silently>> <!-- SYNC: Ensure building staff also appear in their houses --> <<silently>> <<if _settlement.buildings>> <<if !_settlement.populatedBuildings>> <<set _settlement.populatedBuildings = {}>> <</if>> <<for _buildingType, _buildingData range _settlement.buildings>> <<if _buildingData.staff && Array.isArray(_buildingData.staff)>> <<for _i = 0; _i < _buildingData.staff.length; _i++>> <<set _npc = _buildingData.staff[_i]>> <!-- Only treat as villager if they have a house assignment --> <<set _houseName = _npc.building>> <<if _houseName && ((_npc.buildingType && _npc.buildingType === "House") || String(_houseName).indexOf("House") === 0)>> <<if !_settlement.populatedBuildings[_houseName]>> <<set _settlement.populatedBuildings[_houseName] = []>> <</if>> <!-- Prevent duplicates by NPCID/prisonerId --> <<set _existsInHouse = false>> <<for _j = 0; _j < _settlement.populatedBuildings[_houseName].length; _j++>> <<set _existing = _settlement.populatedBuildings[_houseName][_j]>> <<if (_npc.NPCID && _existing.NPCID && _npc.NPCID === _existing.NPCID) || (_npc.prisonerId && _existing.prisonerId && _npc.prisonerId === _existing.prisonerId)>> <<set _existsInHouse = true>> <<break>> <</if>> <</for>> <<if !_existsInHouse>> <<run _settlement.populatedBuildings[_houseName].push(_npc)>> <</if>> <</if>> <</for>> <</if>> <</for>> <!-- Save updates back to main array --> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <</silently>> <!-- CLEANUP SECTION: Remove duplicate capturedVillagers data --> <<silently>> <!-- This section removes the outdated capturedVillagers array since populatedBuildings is now the primary source --> <<if _settlement.capturedVillagers>> <<run console.log("CLEANUP: Removing duplicate capturedVillagers data for settlement:", _settlement.name)>> <<run console.log("Before cleanup - capturedVillagers count:", _settlement.capturedVillagers.length)>> <!-- Clear the capturedVillagers array --> <<set _settlement.capturedVillagers = []>> <<run console.log("After cleanup - capturedVillagers cleared")>> <!-- Save the changes back to the main array --> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <</silently>> <!-- CLEANUP SECTION: Migrate outdoorNPCs and clean up foundNPCs --> <<silently>> <!-- First, check if we have outdoorNPCs to migrate --> <<if _settlement.outdoorNPCs && Array.isArray(_settlement.outdoorNPCs) && _settlement.outdoorNPCs.length > 0>> <<run console.log("CLEANUP: Moving outdoorNPCs to their respective buildings")>> <!-- Loop through each outdoor NPC --> <<for _i = 0; _i < _settlement.outdoorNPCs.length; _i++>> <<set _npc = _settlement.outdoorNPCs[_i]>> <<run console.log("Processing outdoor NPC:", _npc.NPCID)>> <!-- Set job to hiddenJob --> <<if _npc.hiddenJob>> <<set _npc.job = _npc.hiddenJob>> <</if>> <!-- Get the building this NPC belongs to --> <<if _npc.building>> <<run console.log("NPC belongs to building:", _npc.building)>> <!-- Initialize the building array if it doesn't exist --> <<if !_settlement.populatedBuildings[_npc.building]>> <<set _settlement.populatedBuildings[_npc.building] = []>> <</if>> <!-- Add the NPC to the building --> <<run _settlement.populatedBuildings[_npc.building].push(_npc)>> <<run console.log("Added NPC to building:", _npc.building)>> <<else>> <<run console.log("WARNING: Outdoor NPC has no building assignment:", _npc)>> <</if>> <</for>> <!-- Clear the outdoorNPCs array --> <<set _settlement.outdoorNPCs = []>> <<run console.log("Cleared outdoorNPCs array")>> <</if>> <!-- Delete the foundNPCs section completely --> <<if _settlement.foundNPCs>> <<run console.log("CLEANUP: Removing foundNPCs data")>> <<set _settlement.foundNPCs = undefined>> <</if>> <!-- Save the changes back to the main array --> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <<run console.log("Settlement data cleanup complete")>> <</silently>> <style> .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; display: inline-block; } .raider-card.deceased { position: relative; } .raider-card.deceased::after { content: 'FALLEN'; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); color: red; border: 3px solid red; padding: 5px 20px; font-size: 24px; font-weight: bold; z-index: 1; } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin: 10px 0; } .raid-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .location-image { width: 100%; max-width: 600px; height: auto; border-radius: 8px; margin: 10px 0; } .raid-status { font-size: 24px; font-weight: bold; text-align: center; padding: 10px; margin: 10px 0; border-radius: 5px; } .raid-status.success { color: #4CAF50; border: 2px solid #4CAF50; } .raid-status.failed { color: #f44336; border: 2px solid #f44336; } .status-banner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); padding: 5px 20px; font-size: 24px; font-weight: bold; z-index: 1; border: 3px solid; pointer-events: none; } .raider-card { position: relative; } .status-banner.captured { color: #4CAF50; border-color: #4CAF50; } .status-banner.escaped { color: #f44336; border-color: #f44336; } .building-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.5); border-radius: 8px; border: 1px solid #444; } .building-section h3 { color: #fff; margin-bottom: 10px; border-bottom: 1px solid #444; padding-bottom: 5px; } /* New styles for building construction */ .construction-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .construction-options { display: none; margin-top: 15px; } .construction-option { background: rgba(50, 50, 50, 0.7); border: 1px solid #555; border-radius: 5px; padding: 10px; margin-bottom: 10px; } .construction-option h4 { color: #ffd700; margin: 0 0 10px 0; } .construction-option p { margin: 5px 0; } .construction-option .cost { color: #ff9966; font-style: italic; } .construction-option button { margin-top: 10px; } .construction-option button:disabled { opacity: 0.5; cursor: not-allowed; } </style> <style> .location-card { display: flex; background: rgba(0, 0, 0, 0.7); border: 2px solid #333; border-radius: 8px; padding: 20px; margin: 20px 0; } .location-image { flex: 0 0 300px; } .location-image img { width: 300px; height: 300px; object-fit: cover; border-radius: 4px; } .location-info { flex: 1; padding-left: 20px; } .info-label { font-weight: bold; color: #ccc; margin-right: 10px; } </style> <<set _totalCapacity to 0>> <<set _buildingSummary to {}>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<set _totalCapacity to 0>> <<set _buildingSummary to {}>> <<if _settlement && _settlement.populatedBuildings>> <<for _entry range Object.entries(_settlement.populatedBuildings)>> <<set _buildingId to _entry[0]>> <<set _residents to _entry[1]>> <<set _baseType to String(_buildingId).split(' ')[0]>> <<if _baseType !== "Guard">> <<set _maxOccupants = { "House": 3, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<if !_buildingSummary[_baseType]>> <<set _buildingSummary[_baseType] = { count: 1, capacity: _maxOccupants, current: _settlement.capturedVillagers.length }>> <<else>> <<set _buildingSummary[_baseType].count += 1>> <<set _buildingSummary[_baseType].capacity += _maxOccupants>> <</if>> <<set _totalCapacity += _maxOccupants>> <</if>> <</for>> <</if>> <!-- Add this right after the _settlement initialization section --> <<silently>> <!-- Normalize settlement exports to fix compatibility with old saves --> <<set _needsNormalization = false>> <<set _normalizedProduces = []>> <!-- First, gather all production values from both old and new formats --> <<if _settlement.produces && Array.isArray(_settlement.produces)>> <<set _needsNormalization = true>> <<for _i = 0; _i < _settlement.produces.length; _i++>> <<set _normalizedProduces.push(_settlement.produces[_i])>> <</for>> <</if>> <<if _settlement.Export>> <<set _needsNormalization = true>> <<if Array.isArray(_settlement.Export)>> <<for _i = 0; _i < _settlement.Export.length; _i++>> <<if !_normalizedProduces.includes(_settlement.Export[_i])>> <<set _normalizedProduces.push(_settlement.Export[_i])>> <</if>> <</for>> <<elseif typeof _settlement.Export === "string">> <<if !_normalizedProduces.includes(_settlement.Export)>> <<set _normalizedProduces.push(_settlement.Export)>> <</if>> <</if>> <</if>> <!-- Add this right after the _settlement initialization section, before the auto-building section --> <<silently>> <!-- Initialize settlement size if not already set --> <<if typeof _settlement.size === 'undefined'>> <<set _settlement.size = "Small">> <!-- Default to Small if not defined --> <</if>> <!-- Define size limits --> <<set _sizeLimits = { "Small": { maxFacilities: 2, maxExtraHouses: 2 }, "Medium": { maxFacilities: 3, maxExtraHouses: 3 }, "Large": { maxFacilities: 4, maxExtraHouses: 4 } }>> <!-- Get current size limits --> <<set _currentLimits = _sizeLimits[_settlement.size] || _sizeLimits["Small"]>> <!-- Count existing facilities (excludes cult and guard tower) --> <<set _facilitiesCount = 0>> <<if _settlement.buildings>> <<if _settlement.buildings.lumberMill>><<set _facilitiesCount++>><</if>> <<if _settlement.buildings.tavern>><<set _facilitiesCount++>><</if>> <<if _settlement.buildings.farm>><<set _facilitiesCount++>><</if>> <<if _settlement.buildings.forge>><<set _facilitiesCount++>><</if>> <<if _settlement.buildings.brewery>><<set _facilitiesCount++>><</if>> <<if _settlement.buildings.mill>><<set _facilitiesCount++>><</if>> <</if>> <!-- Count existing custom houses --> <<set _customHousesCount = 0>> <<if _settlement.buildings && _settlement.buildings.houses>> <<set _customHousesCount = _settlement.buildings.houses.length>> <</if>> <<run console.log("Settlement size:", _settlement.size)>> <<run console.log("Facilities count:", _facilitiesCount, "/ Max:", _currentLimits.maxFacilities)>> <<run console.log("Custom houses count:", _customHousesCount, "/ Max:", _currentLimits.maxExtraHouses)>> <</silently>> <!-- Now normalize all values according to our rules --> <<if _needsNormalization && _normalizedProduces.length > 0>> <<set _standardizedProduces = []>> <<for _i = 0; _i < _normalizedProduces.length; _i++>> <<set _product = _normalizedProduces[_i]>> <!-- Map old values to standardized ones --> <<if _product === "Grain" || _product === "Bread" || _product === "Meat">> <<if !_standardizedProduces.includes("Grain")>> <<set _standardizedProduces.push("Grain")>> <</if>> <<elseif _product === "Mead">> <<if !_standardizedProduces.includes("Mead")>> <<set _standardizedProduces.push("Mead")>> <</if>> <<elseif _product === "Jewelry" || _product === "Tools">> <<if !_standardizedProduces.includes("Tools")>> <<set _standardizedProduces.push("Tools")>> <</if>> <<else>> <!-- Keep any other values as they are --> <<if !_standardizedProduces.includes(_product)>> <<set _standardizedProduces.push(_product)>> <</if>> <</if>> <</for>> <!-- Update the settlement with normalized produces --> <<set _settlement.produces = _standardizedProduces>> <!-- Also update the old Export property for backwards compatibility --> <<set _settlement.Export = _standardizedProduces>> <!-- Save the changes back to the main array --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <</if>> <</silently>> <!-- Auto-build appropriate buildings based on production types --> <<silently>> <<run console.log("==== AUTO-BUILDING DEBUG START ====")>> <<run console.log("Settlement name:", _settlement.name)>> <<run console.log("Settlement produces:", _settlement.produces)>> <<run console.log("Settlement buildings:", _settlement.buildings)>> <<if _settlement && _settlement.produces && Array.isArray(_settlement.produces)>> <<run console.log("Produces is an array with length:", _settlement.produces.length)>> <!-- Initialize buildings object if it doesn't exist --> <<if !_settlement.buildings>> <<set _settlement.buildings = {}>> <<run console.log("Created new buildings object")>> <</if>> <!-- Check if settlement produces Grain and needs a Farm --> <<if _settlement.produces.includes("Grain")>> <<run console.log("Settlement produces Grain")>> <<if !_settlement.buildings.farm>> <<run console.log("No farm found, auto-building one")>> <<set _settlement.buildings.farm = { built: true, staff: [], maxStaff: 3, autoBuilt: true }>> <<run console.log("Auto-built farm for Grain production")>> <<else>> <<run console.log("Farm already exists, skipping auto-build")>> <</if>> <</if>> <!-- Check if settlement produces Mead and needs a Tavern --> <<if _settlement.produces.includes("Mead")>> <<run console.log("Settlement produces Mead")>> <<if !_settlement.buildings.tavern>> <<run console.log("No tavern found, auto-building one")>> <<set _settlement.buildings.tavern = { built: true, staff: [], maxStaff: 3, autoBuilt: true }>> <<run console.log("Auto-built tavern for Mead production")>> <<else>> <<run console.log("Tavern already exists, skipping auto-build")>> <</if>> <</if>> <!-- Check if settlement produces Tools and needs a Forge --> <<if _settlement.produces.includes("Tools")>> <<run console.log("Settlement produces Tools")>> <<if !_settlement.buildings.forge>> <<run console.log("No forge found, auto-building one")>> <<set _settlement.buildings.forge = { built: true, staff: [], maxStaff: 2, autoBuilt: true }>> <<run console.log("Auto-built forge for Tools production")>> <<else>> <<run console.log("Forge already exists, skipping auto-build")>> <</if>> <</if>> <!-- Save the changes back to the main array --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <<run console.log("Saved changes back to CapturedLocations array")>> <<else>> <<run console.log("WARNING: currentSettlementId is undefined or null, changes NOT saved back to array")>> <</if>> <<else>> <<run console.log("SKIPPED AUTO-BUILD: Settlement, produces property missing or not an array")>> <<run console.log("Settlement exists:", !!_settlement)>> <<run console.log("Produces exists:", _settlement && !!_settlement.produces)>> <<run console.log("Produces is array:", _settlement && _settlement.produces && Array.isArray(_settlement.produces))>> <</if>> <<run console.log("After auto-build, buildings are:", _settlement.buildings)>> <<run console.log("==== AUTO-BUILDING DEBUG END ====")>> <</silently>> <<run console.log("Building Summary:", _buildingSummary)>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<run console.log("Current Settlement ID:", $currentSettlementId)>> <<run console.log("CapturedLocations Array:", $CapturedLocations)>> <<if typeof $currentSettlementId === 'undefined' || $currentSettlementId === null>> <<set _settlement to $CapturedLocations[$CapturedLocations.length - 1]>> <<run console.log("Fallback to last settlement")>> <<else>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<run console.log("Using selected settlement")>> <</if>> <<if $currentSettlementId >= 0 && $currentSettlementId < $CapturedLocations.length>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<else>> <<set _settlement to $CapturedLocations[0]>> <</if>> <<set _happiness to _settlement.Happiness>> <<set _corruption to _settlement.corruption>> <!-- Calculate total population based on populatedBuildings instead of legacy capturedVillagers array --> <<set _populationCount = 0>> <<if _settlement.populatedBuildings>> <<for _buildingName, _npcs range _settlement.populatedBuildings>> <<if _npcs && Array.isArray(_npcs)>> <<set _populationCount += _npcs.length>> <</if>> <</for>> <</if>> <div class="location-card"> <div class="location-image"> <img @src="_settlement.imagePath" alt="Location Image"> </div> <div class="location-info"> <h1><<print _settlement.name>></h1> <p><span class="info-label">Location Type:</span> <<print _settlement.type>></p> <p><span class="info-label">Population:</span> <<print _populationCount>></p> <p><span class="info-label">Garrison Size:</span> <<print _settlement.garrison ? _settlement.garrison.length : 0>></p> <p><span class="info-label">Happiness:</span> <<print Number(_settlement.Happiness) || 0>>%</p> <<print `<progress value="${_happiness}" max="100" style="width: 100%; height: 20px;"></progress>`>> <p><span class="info-label">Corruption:</span> <<print _settlement.corruption || 0>>%</p> <<print `<progress value="${_corruption}" max="100" style="width: 100%; height: 20px;"></progress>`>> <!-- Add Fear/Devotion bar here --> <<silently>> <!-- Initialize state property if it doesn't exist --> <<if typeof _settlement.state === 'undefined'>> <<set _settlement.state = 0>> <</if>> <!-- Determine what label to show based on the value --> <<if _settlement.state < -5>> <<set _stateLabel = "Fear">> <<elseif _settlement.state < 0>> <<set _stateLabel = "Mild Fear">> <<elseif _settlement.state === 0>> <<set _stateLabel = "Neutral">> <<elseif _settlement.state <= 5>> <<set _stateLabel = "Mild Devotion">> <<else>> <<set _stateLabel = "Devotion">> <</if>> <</silently>> <p><span class="info-label">Control:</span> <<print _stateLabel>> (<<print _settlement.state>>)</p> <div style="position: relative; width: 100%; height: 20px; background-color: #333; border-radius: 4px; margin-bottom: 10px;"> <!-- Center marker --> <div style="position: absolute; top: 0; left: 50%; width: 2px; height: 100%; background-color: #fff; z-index: 2;"></div> <!-- Bar fill - starts at center (50%) and expands left or right --> <<if _settlement.state < 0>> <!-- Fear (negative): bar expands left from center --> <div style="position: absolute; top: 0; right: 50%; width: <<print Math.abs(_settlement.state) * 5>>%; height: 100%; background-color: #ff3333; border-radius: 4px 0 0 4px;"></div> <<elseif _settlement.state > 0>> <!-- Devotion (positive): bar expands right from center --> <div style="position: absolute; top: 0; left: 50%; width: <<print _settlement.state * 5>>%; height: 100%; background-color: #66cc66; border-radius: 0 4px 4px 0;"></div> <</if>> <!-- Scale markers --> <div style="position: absolute; top: 20px; left: 0; width: 100%; height: 100%; display: flex; justify-content: space-between; color: #aaa; font-size: 10px;"> <span>Fear</span> <span>Devotion</span> </div> </div> <p><span class="info-label">Produces:</span> <<silently>> <<set _productionList = []>> <!-- Check for buildings and their production --> <<if _settlement.buildings>> <!-- Check Lumber Mill --> <<if _settlement.buildings.lumberMill && _settlement.buildings.lumberMill.staff && _settlement.buildings.lumberMill.staff.length > 0>> <<set _lumberStaff = _settlement.buildings.lumberMill.staff>> <<set _woodPerDay = 0>> <<for _i = 0; _i < _lumberStaff.length; _i++>> <<if _lumberStaff[_i].job && _lumberStaff[_i].job.toLowerCase() === "lumber jack">> <<set _woodPerDay += random(10, 15)>> <<else>> <<set _woodPerDay += random(5, 10)>> <</if>> <</for>> <<set _productionList.push("Wood (" + _woodPerDay + "/day)")>> <</if>> <!-- Check Farm --> <<if _settlement.buildings.farm && _settlement.buildings.farm.staff && _settlement.buildings.farm.staff.length > 0>> <<set _farmStaff = _settlement.buildings.farm.staff>> <<set _grainPerDay = 0>> <<for _i = 0; _i < _farmStaff.length; _i++>> <<if _farmStaff[_i].job && _farmStaff[_i].job.toLowerCase() === "farmer">> <<set _grainPerDay += random(5, 6)>> <<else>> <<set _grainPerDay += random(2, 3)>> <</if>> <</for>> <<set _productionList.push("Grain (" + _grainPerDay + "/day)")>> <</if>> <!-- Check Tavern --> <<if _settlement.buildings.tavern && _settlement.buildings.tavern.staff && _settlement.buildings.tavern.staff.length > 0>> <<set _tavernStaff = _settlement.buildings.tavern.staff>> <<set _goldPerDay = 0>> <<set _meadPerDay = 0>> <<for _i = 0; _i < _tavernStaff.length; _i++>> <<if _tavernStaff[_i].job && _tavernStaff[_i].job.toLowerCase() === "tavern keep">> <<set _goldPerDay += random(8, 12)>> <<else>> <<set _goldPerDay += random(5, 10)>> <</if>> <<if _tavernStaff[_i].job && _tavernStaff[_i].job.toLowerCase() === "brewer">> <<set _meadPerDay += random(2, 3)>> <<else>> <<set _meadPerDay += random(1, 2)>> <</if>> <</for>> <<set _productionList.push("Gold (" + _goldPerDay + "/day)")>> <<set _productionList.push("Mead (" + _meadPerDay + "/day)")>> <</if>> <!-- Check Forge --> <<if _settlement.buildings.forge && _settlement.buildings.forge.staff && _settlement.buildings.forge.staff.length > 0>> <<set _forgeStaff = _settlement.buildings.forge.staff>> <<set _toolsPerDay = 0>> <<for _i = 0; _i < _forgeStaff.length; _i++>> <<if _forgeStaff[_i].job && _forgeStaff[_i].job.toLowerCase() === "blacksmith">> <<set _toolsPerDay += random(3, 5)>> <<else>> <<set _toolsPerDay += random(1, 3)>> <</if>> <</for>> <<set _productionList.push("Tools (" + _toolsPerDay + "/day)")>> <</if>> <</if>> <!-- Check settlement's natural production (from when it was discovered) --> <<if _settlement.produces && Array.isArray(_settlement.produces)>> <<for _i = 0; _i < _settlement.produces.length; _i++>> <<set _product = _settlement.produces[_i]>> <<if _productionList.every(item => !item.startsWith(_product))>> <<set _productionList.push(_product)>> <</if>> <</for>> <<elseif _settlement.Export && Array.isArray(_settlement.Export)>> <<for _i = 0; _i < _settlement.Export.length; _i++>> <<set _product = _settlement.Export[_i]>> <<if _productionList.every(item => !item.startsWith(_product))>> <<set _productionList.push(_product)>> <</if>> <</for>> <<elseif _settlement.Export && typeof _settlement.Export === "string">> <<if _productionList.every(item => !item.startsWith(_settlement.Export))>> <<set _productionList.push(_settlement.Export)>> <</if>> <</if>> <</silently>> <<if _productionList.length > 0>> <<print _productionList.join(", ")>> <<else>> None <</if>> </p> </div> </div> <div style="text-align: center; margin: 10px 0;"> <<button "Manage Shipments">> <<goto "SettlementShipments">> <</button>> </div> <<if _settlement.hasCult is true>> <div class="text-box"> <h2>You have not received a report from _settlement.name, you feel something is wrong and should visit to investigate</h2> </div> <<elseif _settlement.hasRevolted is true>> <div class="text-box"> <h2>A revolt happend here recently, prehapse you should visit and deal with the insurrectionists</h2> </div> <</if>> <div style="text-align: center; margin: 10px;"> <<button "Visit Settlement">> <<if $AutoSaveSettlementVisit isnot false>> <<run Save.autosave.save()>> <</if>> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/4.png">> <<set $Position to "VisistStart">> <<set $currentLocationid to $currentSettlementId>> <<goto "SettlementVisit">> <</button>><br> <i>Auto saves, can be disabled in settings</i> </div> <!-- Settlement Needs section --> <<include "SettlementNeeds">> <!-- Settlement Resources Section (with Tools shown conditionally and Mead added) --> <div class="resources-section" style="margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px;"> <h2>Settlement Resources</h2> <!-- Initialize settlement resources if they don't exist --> <<silently>> <<if typeof _settlement.foodReserves === 'undefined'>> <<set _settlement.foodReserves = 0>> <</if>> <<if typeof _settlement.goldReserves === 'undefined'>> <<set _settlement.goldReserves = 0>> <</if>> <<if typeof _settlement.woodReserves === 'undefined'>> <<set _settlement.woodReserves = 0>> <</if>> <<if typeof _settlement.toolReserves === 'undefined'>> <<set _settlement.toolReserves = 0>> <</if>> <<if typeof _settlement.meadReserves === 'undefined'>> <<set _settlement.meadReserves = 0>> <</if>> <<if typeof _settlement.grainReserves === 'undefined'>> <<set _settlement.grainReserves = 0>> <</if>> <!-- Calculate needs for conditional display of tools --> <<set _needs to setup.calculateLocationNeeds(_settlement)>> <</silently>> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <!-- Food Resources --> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('foodOptions').style.display = document.getElementById('foodOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Bread.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Food</h3> </div> <div style="font-size: 24px, margin: 10px 0;"><<print Math.floor(_settlement.foodReserves)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="foodOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your food: <<print $Food>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold; color: #8fc785;">Send to Settlement:</p> <<if $Food >= 10>> <<button "Send 10">> <<set $Food -= 10>> <<set _settlement.foodReserves += 10>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Food >= 1>> <<button "Send 1">> <<set $Food -= 1>> <<set _settlement.foodReserves += 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold; color: #e78f8f;">Take from Settlement:</p> <<if _settlement.foodReserves >= 10>> <<button "Take 10">> <<set _settlement.foodReserves -= 10>> <<set $Food += 10>> <<goto "SettlementOverview">> <</button>> <</if>> <<if _settlement.foodReserves >= 1>> <<button "Take 1">> <<set _settlement.foodReserves -= 1>> <<set $Food += 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <i>Food is the most critical resouce to sustain your settlment. Without it your villagers will revolt or starve</i> </div> </div> </div> <!-- Grain Resources --> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('grainOptions').style.display = document.getElementById('grainOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Grain.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Grain</h3> </div> <div style="font-size: 24px; margin: 10px 0;"><<print Math.floor(_settlement.grainReserves || 0)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="grainOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your grain: <<print $Grain || 0>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #8fc785;">Send to Settlement:</p> <<if $Grain >= 10>> <<button "Send 10">> <<set $Grain -= 10>> <<set _settlement.grainReserves = (_settlement.grainReserves || 0) + 10>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Grain >= 1>> <<button "Send 1">> <<set $Grain -= 1>> <<set _settlement.grainReserves = (_settlement.grainReserves || 0) + 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #e78f8f;">Take from Settlement:</p> <<if (_settlement.grainReserves || 0) >= 10>> <<button "Take 10">> <<set _settlement.grainReserves -= 10>> <<set $Grain = ($Grain || 0) + 10>> <<goto "SettlementOverview">> <</button>> <</if>> <<if (_settlement.grainReserves || 0) >= 1>> <<button "Take 1">> <<set _settlement.grainReserves -= 1>> <<set $Grain = ($Grain || 0) + 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <i>Gain is produced at farms and must be converted into food by a mill</i> </div> </div> </div> <!-- Gold Resources --> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('goldOptions').style.display = document.getElementById('goldOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Gold.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Gold</h3> </div> <div style="font-size: 24px, margin: 10px 0;"><<print Math.floor(_settlement.goldReserves)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="goldOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your gold: <<print $Gold>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #8fc785;">Send to Settlement:</p> <<if $Gold >= 100>> <<button "Send 100">> <<set $Gold -= 100>> <<set _settlement.goldReserves += 100>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Gold >= 10>> <<button "Send 10">> <<set $Gold -= 10>> <<set _settlement.goldReserves += 10>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #e78f8f;">Take from Settlement:</p> <<if _settlement.goldReserves >= 100>> <<button "Take 100">> <<set _settlement.goldReserves -= 100>> <<set $Gold += 100>> <<goto "SettlementOverview">> <</button>> <</if>> <<if _settlement.goldReserves >= 10>> <<button "Take 10">> <<set _settlement.goldReserves -= 10>> <<set $Gold += 10>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <i>Gold is generated by taverns, it can be given to villagers to boose happiness or taken</i> </div> </div> </div> <!-- Wood Resources --> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('woodOptions').style.display = document.getElementById('woodOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Wood.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Wood</h3> </div> <div style="font-size: 24px; margin: 10px 0;"><<print Math.floor(_settlement.woodReserves)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="woodOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your wood: <<print $Wood>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #8fc785;">Send to Settlement:</p> <<if $Wood >= 50>> <<button "Send 50">> <<set $Wood -= 50>> <<set _settlement.woodReserves += 50>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Wood >= 10>> <<button "Send 10">> <<set $Wood -= 10>> <<set _settlement.woodReserves += 10>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #e78f8f;">Take from Settlement:</p> <<if _settlement.woodReserves >= 50>> <<button "Take 50">> <<set _settlement.woodReserves -= 50>> <<set $Wood += 50>> <<goto "SettlementOverview">> <</button>> <</if>> <<if _settlement.woodReserves >= 10>> <<button "Take 10">> <<set _settlement.woodReserves -= 10>> <<set $Wood += 10>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <i>Wood is produced at lumber mills and is needed for new buildings and maintinance</i> </div> </div> </div> <!-- Tools Resources (Conditionally shown) --> <<if _needs.some(n => n.type === "Maintenance") && $Tools>> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('toolOptions').style.display = document.getElementById('toolOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Tools.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Tools</h3> </div> <div style="font-size: 24px; margin: 10px 0;"><<print Math.floor(_settlement.toolReserves)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="toolOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your tools: <<print $Tools || 0>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #8fc785;">Send to Settlement:</p> <<if $Tools >= 5>> <<button "Send 5">> <<set $Tools -= 5>> <<set _settlement.toolReserves += 5>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Tools >= 1>> <<button "Send 1">> <<set $Tools -= 1>> <<set _settlement.toolReserves += 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #e78f8f;">Take from Settlement:</p> <<if _settlement.toolReserves >= 5>> <<button "Take 5">> <<set _settlement.toolReserves -= 5>> <<set $Tools = ($Tools || 0) + 5>> <<goto "SettlementOverview">> <</button>> <</if>> <<if _settlement.toolReserves >= 1>> <<button "Take 1">> <<set _settlement.toolReserves -= 1>> <<set $Tools = ($Tools || 0) + 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <i>Tools are made in the forge and are useful for maintinance or selling</i> </div> </div> </div> <</if>> <!-- Mead Resources --> <div class="resource-card" style="background: rgba(30, 30, 30, 0.7); border-radius: 5px; padding: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; cursor: pointer;" onclick="document.getElementById('meadOptions').style.display = document.getElementById('meadOptions').style.display === 'none' ? 'block' : 'none';"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Mead.png" style="width: 40px; height: 40px; object-fit: contain;"> <h3>Mead</h3> </div> <div style="font-size: 24px; margin: 10px 0;"><<print Math.floor(_settlement.meadReserves || 0)>></div> <div style="font-size: 20px;">▼</div> </div> <div id="meadOptions" style="display: none; margin-top: 10px; border-top: 1px solid #555; padding-top: 10px;"> <div style="margin-top: 5px; font-size: 0.9em; color: #aaa;">Your mead: <<print $Mead || 0>></div> <div style="display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px;"> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #8fc785;">Send to Settlement:</p> <<if $Mead >= 5>> <<button "Send 5 Mead">> <<set $Mead -= 5>> <<set _settlement.meadReserves = (_settlement.meadReserves || 0) + 5>> <<set _settlement.Happiness = Math.min(100, (_settlement.Happiness || 0) + 5)>> <<goto "SettlementOverview">> <</button>> <</if>> <<if $Mead >= 1>> <<button "Send 1 Mead">> <<set $Mead -= 1>> <<set _settlement.meadReserves = (_settlement.meadReserves || 0) + 1>> <<set _settlement.Happiness = Math.min(100, (_settlement.Happiness || 0) + 1)>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <div style="flex: 1; min-width: 120px;"> <p style="margin: 0 0 5px 0; font-weight: bold, color: #e78f8f;">Take from Settlement:</p> <<if (_settlement.meadReserves || 0) >= 5>> <<button "Take 5 Mead">> <<set _settlement.meadReserves -= 5>> <<set $Mead = ($Mead || 0) + 5>> <<goto "SettlementOverview">> <</button>> <</if>> <<if (_settlement.meadReserves || 0) >= 1>> <<button "Take 1 Mead">> <<set _settlement.meadReserves -= 1>> <<set $Mead = ($Mead || 0) + 1>> <<goto "SettlementOverview">> <</button>> <</if>> </div> </div> <div style="margin-top: 10px; font-style: italic; color: #aaa;"> <p>Sending mead increases the settlement's happiness.</p> </div> <i>Mead is made in a brewery, it can be sold in a tavern or given to the villagers to boose happiness</i> </div> </div> </div> </div> <!-- BUILDINGS SECTION: With repair functionality and construction progress bars --> <div class="raid-section"> <h2>Buildings</h2> <!-- Display standard buildings (houses, etc.) --> <<if Object.keys(_buildingSummary).length > 0>> <<for _type, _info range _buildingSummary>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/House.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3><<print _type>> (<<print _info.count>>)</h3> </div> <p>Capacity: <<print _info.capacity>> residents</p> </div> <</for>> <<else>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/House.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Housing</h3> </div> <p>No housing available in this settlement.</p> </div> <</if>> <!-- Display custom buildings including repair options for damaged buildings --> <<if _settlement.buildings>> <!-- Check for houses under construction --> <<if _settlement.buildings.houses && _settlement.buildings.houses.length > 0>> <<for _i = 0; _i < _settlement.buildings.houses.length; _i++>> <<if _settlement.buildings.houses[_i].underConstruction>> <<set _house = _settlement.buildings.houses[_i]>> /* Defensive: Ensure we have valid values */ <<if typeof _house.completionDay === 'undefined' || isNaN(_house.completionDay)>> <<set _house.completionDay = $Day + 3>> <<set _settlement.buildings.houses[_i] = _house>> <</if>> <<set _daysRemaining = Math.max(0, _house.completionDay - $Day)>> <<set _progressValue = Math.max(0, Math.min(3, 3 - _daysRemaining))>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3><<print _house.name>> (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> <p style="color: #888; font-size: 0.9em;">Debug: Completion Day <<print _house.completionDay>>, Current Day <<print $Day>></p> </div> <</if>> <</for>> <</if>> <!-- LUMBER MILL --> <<if _settlement.buildings.lumberMill && _settlement.buildings.lumberMill.damaged>> <div class="building-section"> <h3>Lumber Mill (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Lumber Mill">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.lumberMill && _settlement.buildings.lumberMill.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.lumberMill.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Lumber Mill (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.lumberMill>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Logs.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Lumber Mill</h3> </div> <<set _staffCount = _settlement.buildings.lumberMill.staff ? _settlement.buildings.lumberMill.staff.length : 0>> <<set _maxStaff = _settlement.buildings.lumberMill.maxStaff || 3>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Generates wood over time</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "lumberMill">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "lumberMill">> <<set $dismantleName = "Lumber Mill">> <<set $dismantleWoodReturn = 100>> <<set $dismantleStoneReturn = 50>> <<set $dismantleGoldReturn = 0>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- FARM --> <<if _settlement.buildings.farm && _settlement.buildings.farm.damaged>> <div class="building-section"> <h3>Farm (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Farm">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.farm && _settlement.buildings.farm.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.farm.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Farm (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.farm>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Farm.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Farm</h3> </div> <<set _staffCount = _settlement.buildings.farm.staff ? _settlement.buildings.farm.staff.length : 0>> <<set _maxStaff = _settlement.buildings.farm.maxStaff || 3>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Produces grain over time</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "farm">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "farm">> <<set $dismantleName = "Farm">> <<set $dismantleWoodReturn = 100>> <<set $dismantleStoneReturn = 0>> <<set $dismantleGoldReturn = 50>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- TAVERN --> <<if _settlement.buildings.tavern && _settlement.buildings.tavern.damaged>> <div class="building-section"> <h3>Tavern (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Tavern">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.tavern && _settlement.buildings.tavern.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.tavern.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Tavern (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.tavern>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Barrel.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Tavern</h3> </div> <<set _staffCount = _settlement.buildings.tavern.staff ? _settlement.buildings.tavern.staff.length : 0>> <<set _maxStaff = _settlement.buildings.tavern.maxStaff || 3>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Generates gold and improves happiness</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "tavern">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "tavern">> <<set $dismantleName = "Tavern">> <<set $dismantleWoodReturn = 50>> <<set $dismantleStoneReturn = 50>> <<set $dismantleGoldReturn = 50>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- FORGE --> <<if _settlement.buildings.forge && _settlement.buildings.forge.damaged>> <div class="building-section"> <h3>Forge (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Forge">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.forge && _settlement.buildings.forge.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.forge.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Forge (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.forge>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Tools.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Forge</h3> </div> <<set _staffCount = _settlement.buildings.forge.staff ? _settlement.buildings.forge.staff.length : 0>> <<set _maxStaff = _settlement.buildings.forge.maxStaff || 2>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Produces tools over time</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "forge">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "forge">> <<set $dismantleName = "Forge">> <<set $dismantleWoodReturn = 75>> <<set $dismantleStoneReturn = 100>> <<set $dismantleGoldReturn = 0>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- CULT --> <<if _settlement.buildings.cult && _settlement.buildings.cult.damaged>> <div class="building-section"> <h3>Cult (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Cult">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.cult && _settlement.buildings.cult.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.cult.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Cult (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.cult>> <div class="building-section"> <h3>Cult</h3> <<set _staffCount = _settlement.buildings.cult.staff ? _settlement.buildings.cult.staff.length : 0>> <<set _maxStaff = _settlement.buildings.cult.maxStaff || 1>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <!-- Succubus hunger display & defaulting --> <<if _staffCount > 0>> <<set _succubus = _settlement.buildings.cult.staff[0]>> <<if typeof _succubus.hunger === 'undefined'>> <<set _succubus.hunger = 7>> <<set _settlement.buildings.cult.staff[0] = _succubus>> <!-- Do not persist here to avoid accidentally overwriting runtime hunger changes. ProcessSettlements is responsible for persisting daily hunger changes. --> <</if>> <<set _hungerPct = Math.round((_succubus.hunger / 7) * 100)>> <p><strong>Succubus Hunger:</strong> <<print _succubus.hunger>> / 7</p> <<print `<progress value="${_succubus.hunger}" max="7" style="width: 100%; height: 14px;"></progress>`>> <!-- Warning if hunger is low --> <<if _succubus.hunger < 2>> <div style="background: #3a0b0b; color: #ffdada; padding: 8px; border-radius: 6px; margin-top: 8px; border: 1px solid #600;"> <strong>Warning:</strong> The succubus is starving (<<print _succubus.hunger>>/7). Feed her soon or her behaviour may change. </div> <</if>> <</if>> <p>Effect: Increases corruption or devotion in the settlement</p> <<if _staffCount is 0>> <p><em>Requires a Succubus from the garrison</em></p><</if>> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "cult">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "cult">> <<set $dismantleName = "Cult">> <<set $dismantleWoodReturn = 0>> <<set $dismantleStoneReturn = 100>> <<set $dismantleGoldReturn = 50>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- GUARD TOWER --> <<if _settlement.buildings.guardTower && _settlement.buildings.guardTower.damaged>> <div class="building-section"> <h3>Guard Tower (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Guard Tower">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.guardTower && _settlement.buildings.guardTower.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.guardTower.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Guard Tower (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.guardTower>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/GuardTower.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Guard Tower</h3> </div> <<set _staffCount = _settlement.buildings.guardTower.staff ? _settlement.buildings.guardTower.staff.length : 0>> <<set _maxStaff = _settlement.buildings.guardTower.maxStaff || 1>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Improves defense against raids</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "guardTower">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "guardTower">> <<set $dismantleName = "Guard Tower">> <<set $dismantleWoodReturn = 75>> <<set $dismantleStoneReturn = 0>> <<set $dismantleGoldReturn = 0>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- MILL --> <<if _settlement.buildings.mill && _settlement.buildings.mill.damaged>> <div class="building-section"> <h3>Mill (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Mill">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.mill && _settlement.buildings.mill.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.mill.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Mill (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.mill>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Bread.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Mill</h3> </div> <<set _staffCount = _settlement.buildings.mill.staff ? _settlement.buildings.mill.staff.length : 0>> <<set _maxStaff = _settlement.buildings.mill.maxStaff || 2>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Converts grain into food (2 grain + 1 day = 1 food per worker)</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "mill">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "mill">> <<set $dismantleName = "Mill">> <<set $dismantleWoodReturn = 60>> <<set $dismantleStoneReturn = 30>> <<set $dismantleGoldReturn = 0>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <!-- BREWERY --> <<if _settlement.buildings.brewery && _settlement.buildings.brewery.damaged>> <div class="building-section"> <h3>Brewery (Damaged)</h3> <p>This building is damaged and non-operational.</p> <<button "Repair Brewery">> <!-- Add repair logic here --> <</button>> </div> <<elseif _settlement.buildings.brewery && _settlement.buildings.brewery.underConstruction>> <<set _daysRemaining = Math.max(0, _settlement.buildings.brewery.completionDay - $Day)>> <<set _progressValue = Math.max(0, 3 - _daysRemaining)>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Building_materials.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Brewery (Under Construction)</h3> </div> <p>Construction Progress:</p> <progress value="<<print _progressValue>>" max="3" style="width: 100%; height: 20px;"></progress> <p>Days remaining: <<print _daysRemaining>></p> </div> <<elseif _settlement.buildings.brewery>> <div class="building-section"> <div style="display: flex; align-items: center; gap: 15px;"> <img src="Images/Icons/Barrel.png" style="width: 60px; height: 60px; object-fit: contain;"> <h3>Brewery</h3> </div> <<set _staffCount = _settlement.buildings.brewery.staff ? _settlement.buildings.brewery.staff.length : 0>> <<set _maxStaff = _settlement.buildings.brewery.maxStaff || 3>> <p>Status: <<if _staffCount > 0>>Operational<<else>>Non-operational<</if>></p> <p>Staff: <<print _staffCount>>/<<print _maxStaff>></p> <p>Effect: Converts grain into mead (5 grain + 3 days = 1 mead per worker)</p> <div style="display: flex; gap: 10px;"> <<button "Manage Staff">> <<set $currentBuilding = "brewery">> <<goto "ManageBuildingStaff">> <</button>> <<button "Dismantle">> <<set $dismantleBuilding = "brewery">> <<set $dismantleName = "Brewery">> <<set $dismantleWoodReturn = 75>> <<set $dismantleStoneReturn = 40>> <<set $dismantleGoldReturn = 25>> <<goto "DismantleBuildingConfirm">> <</button>> </div> </div> <</if>> <</if>> </div> <!-- CONSTRUCTION SECTION: For building new structures --> <div class="construction-section"> <h2>Construction</h2> <p>Build new structures to improve your settlement.</p> <button id="toggleConstructionBtn" onclick="document.getElementById('constructionOptions').style.display = document.getElementById('constructionOptions').style.display === 'none' ? 'block' : 'none';"> Show/Hide Construction Options </button> <!-- Updated construction options section with 2-column grid --> <div id="constructionOptions" class="construction-options"> <!-- Settlement Size Info --> <div style="background: rgba(40, 40, 40, 0.8); border-radius: 5px; padding: 10px; margin-bottom: 15px; border: 1px solid #666;"> <h4 style="color: #ffd700; margin: 0 0 10px 0;">Settlement Size: <<print _settlement.size>></h4> <p style="margin: 5px 0; color: #ccc;">Facilities: <<print _facilitiesCount>>/<<print _currentLimits.maxFacilities>> (Excludes Cult & Guard Tower)</p> <p style="margin: 5px 0; color: #ccc;">Extra Houses: <<print _customHousesCount>>/<<print _currentLimits.maxExtraHouses>></p> </div> <!-- 2-Column Grid for Construction Options --> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <!-- House Construction Option --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Building_materials.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>House</h4> </div> <p>Provides housing for up to 3 villagers.</p> <p class="cost">Costs: 100 Wood, 50 Stone</p> <p>Construction Time: 3 days</p> <<silently>> <!-- Calculate how many houses already exist --> <<set _houseCount = 0>> <<if _buildingSummary.House>> <<set _houseCount = _buildingSummary.House.count>> <</if>> <!-- Calculate next house number --> <<set _nextHouseNumber = _houseCount + 1>> <!-- Check if any houses are under construction --> <<set _housesUnderConstruction = 0>> <<if _settlement.buildings && _settlement.buildings.houses>> <<for _i = 0; _i < _settlement.buildings.houses.length; _i++>> <<if _settlement.buildings.houses[_i].underConstruction>> <<set _housesUnderConstruction++>> <</if>> <</for>> <</if>> <!-- Check size limits --> <<set _canBuildMoreHouses = _customHousesCount < _currentLimits.maxExtraHouses>> <<set _canAffordHouse = $Wood >= 100 && $Stone >= 50>> <<set _canBuildHouse = _canBuildMoreHouses && _canAffordHouse && _housesUnderConstruction === 0>> <</silently>> <<if _housesUnderConstruction > 0>> <p style="color: orange">A house is already under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build House</button> <<elseif !_canBuildMoreHouses>> <p style="color: orange">Maximum houses reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxExtraHouses>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build House</button> <<elseif _canBuildHouse>> <<button "Build House">> <<set $Wood -= 100>> <<set $Stone -= 50>> <!-- Initialize the houses array if it doesn't exist --> <<if !_settlement.buildings>> <<set _settlement.buildings = {}>> <</if>> <<if !_settlement.buildings.houses>> <<set _settlement.buildings.houses = []>> <</if>> <!-- Add the new house under construction --> <<run _settlement.buildings.houses.push({ underConstruction: true, completionDay: $Day + 3, name: "House " + _nextHouseNumber })>> <!-- Initialize populatedBuildings if it doesn't exist --> <<if !_settlement.populatedBuildings>> <<set _settlement.populatedBuildings = {}>> <</if>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build House</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Lumber Mill --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Logs.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Lumber Mill</h4> </div> <p>Generates wood resources over time.</p> <p class="cost">Costs: 200 Wood, 100 Stone</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasLumberMill = _settlement.buildings && _settlement.buildings.lumberMill>> <<set _lumberMillUnderConstruction = _hasLumberMill && _settlement.buildings.lumberMill.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildLumberMill = !_hasLumberMill && !_facilitiesAtLimit && ($Wood >= 200 && $Stone >= 100)>> <</silently>> <<if _lumberMillUnderConstruction>> <p style="color: orange">Lumber Mill is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Lumber Mill</button> <<elseif _hasLumberMill>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Lumber Mill</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Lumber Mill</button> <<elseif _canBuildLumberMill>> <<button "Build Lumber Mill">> <<set $Wood -= 200>> <<set $Stone -= 100>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.lumberMill = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 3 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Lumber Mill</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Tavern --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Mead.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Tavern</h4> </div> <p>Generates gold and improves happiness.</p> <p class="cost">Costs: 100 Wood, 100 Stone, 100 Gold</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasTavern = _settlement.buildings && _settlement.buildings.tavern && (_settlement.buildings.tavern.built || _settlement.buildings.tavern.autoBuilt)>> <<set _tavernUnderConstruction = _settlement.buildings && _settlement.buildings.tavern && _settlement.buildings.tavern.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildTavern = !_hasTavern && !_facilitiesAtLimit && ($Wood >= 100 && $Stone >= 100 && $Gold >= 100)>> <</silently>> <<if _tavernUnderConstruction>> <p style="color: orange">Tavern is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Tavern</button> <<elseif _hasTavern>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Tavern</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Tavern</button> <<elseif _canBuildTavern>> <<button "Build Tavern">> <<set $Wood -= 100>> <<set $Stone -= 100>> <<set $Gold -= 100>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.tavern = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 3 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Tavern</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Farm --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Farm.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Farm</h4> </div> <p>Produces more grain over time.</p> <p class="cost">Costs: 200 Wood, 100 Gold</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasFarm = _settlement.buildings && _settlement.buildings.farm && (_settlement.buildings.farm.built || _settlement.buildings.farm.autoBuilt)>> <<set _farmUnderConstruction = _settlement.buildings && _settlement.buildings.farm && _settlement.buildings.farm.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildFarm = !_hasFarm && !_facilitiesAtLimit && ($Wood >= 200 && $Gold >= 100)>> <</silently>> <<if _farmUnderConstruction>> <p style="color: orange">Farm is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Farm</button> <<elseif _hasFarm>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Farm</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Farm</button> <<elseif _canBuildFarm>> <<button "Build Farm">> <<set $Wood -= 200>> <<set $Gold -= 100>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.farm = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 3 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Farm</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Forge --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Tools.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Forge</h4> </div> <p>Produces tools for maintenance and equipment.</p> <p class="cost">Costs: 150 Wood, 200 Stone</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasForge = _settlement.buildings && _settlement.buildings.forge && (_settlement.buildings.forge.built || _settlement.buildings.forge.autoBuilt)>> <<set _forgeUnderConstruction = _settlement.buildings && _settlement.buildings.forge && _settlement.buildings.forge.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildForge = !_hasForge && !_facilitiesAtLimit && ($Wood >= 150 && $Stone >= 200)>> <</silently>> <<if _forgeUnderConstruction>> <p style="color: orange">Forge is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Forge</button> <<elseif _hasForge>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Forge</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Forge</button> <<elseif _canBuildForge>> <<button "Build Forge">> <<set $Wood -= 150>> <<set $Stone -= 200>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.forge = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 2 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Forge</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Brewery --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Barrel.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Brewery</h4> </div> <p>Converts grain into mead over time (5 grain + 3 days = 1 mead per worker).</p> <p class="cost">Costs: 150 Wood, 80 Stone, 50 Gold</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasBrewery = _settlement.buildings && _settlement.buildings.brewery>> <<set _breweryUnderConstruction = _hasBrewery && _settlement.buildings.brewery.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildBrewery = !_hasBrewery && !_facilitiesAtLimit && ($Wood >= 150 && $Stone >= 80 && $Gold >= 50)>> <</silently>> <<if _breweryUnderConstruction>> <p style="color: orange">Brewery is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Brewery</button> <<elseif _hasBrewery>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Brewery</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Brewery</button> <<elseif _canBuildBrewery>> <<button "Build Brewery">> <<set $Wood -= 150>> <<set $Stone -= 80>> <<set $Gold -= 50>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.brewery = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 3, processQueue: [] }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Brewery</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Mill --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/Bread.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Mill</h4> </div> <p>Converts grain into food (2 grain + 1 day = 1 food per worker).</p> <p class="cost">Costs: 120 Wood, 60 Stone</p> <p>Construction Time: 3 days</p> <<silently>> <<set _hasMill = _settlement.buildings && _settlement.buildings.mill>> <<set _millUnderConstruction = _hasMill && _settlement.buildings.mill.underConstruction>> <<set _facilitiesAtLimit = _facilitiesCount >= _currentLimits.maxFacilities>> <<set _canBuildMill = !_hasMill && !_facilitiesAtLimit && ($Wood >= 120 && $Stone >= 60)>> <</silently>> <<if _millUnderConstruction>> <p style="color: orange">Mill is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Mill</button> <<elseif _hasMill>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Mill</button> <<elseif _facilitiesAtLimit>> <p style="color: orange">Facility limit reached for <<print _settlement.size>> settlement (<<print _currentLimits.maxFacilities>>)</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Mill</button> <<elseif _canBuildMill>> <<button "Build Mill">> <<set $Wood -= 120>> <<set $Stone -= 60>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.mill = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 2, processQueue: [] }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Mill</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Cult (Always Available) --> <div class="construction-option"> <h4>Cult</h4> <p>Builds corruption at the settlement.</p> <p class="cost">Costs: 200 Stone, 100 Gold</p> <p>Construction Time: 3 days</p> <p style="color: #90EE90; font-style: italic;">Not limited by settlement size</p> <<silently>> <<set _hasCult = _settlement.buildings && _settlement.buildings.cult>> <<set _cultUnderConstruction = _hasCult && _settlement.buildings.cult.underConstruction>> <<set _canBuildCult = !_hasCult && ($Stone >= 200 && $Gold >= 100)>> <</silently>> <<if _cultUnderConstruction>> <p style="color: orange">Cult is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Cult</button> <<elseif _hasCult>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Cult</button> <<elseif _canBuildCult>> <<button "Build Cult">> <<set $Stone -= 200>> <<set $Gold -= 100>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.cult = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 1 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Cult</button> <p style="color: red">Insufficient resources</p> <</if>> </div> <!-- Guard Tower (Always Available) --> <div class="construction-option"> <div style="display: flex; align-items: center; gap: 10px;"> <img src="Images/Icons/GuardTower.png" style="width: 40px; height: 40px; object-fit: contain;"> <h4>Guard Tower</h4> </div> <p>Helps protect against raids and improves security.</p> <p class="cost">Costs: 150 Wood</p> <p>Construction Time: 3 days</p> <p style="color: #90EE90; font-style: italic;">Not limited by settlement size</p> <<silently>> <<set _hasGuardTower = _settlement.buildings && _settlement.buildings.guardTower>> <<set _guardTowerUnderConstruction = _hasGuardTower && _settlement.buildings.guardTower.underConstruction>> <<set _canBuildGuardTower = !_hasGuardTower && ($Wood >= 150)>> <</silently>> <<if _guardTowerUnderConstruction>> <p style="color: orange">Guard Tower is under construction</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Guard Tower</button> <<elseif _hasGuardTower>> <p style="color: orange">Already built</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Guard Tower</button> <<elseif _canBuildGuardTower>> <<button "Build Guard Tower">> <<set $Wood -= 150>> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.guardTower = { underConstruction: true, completionDay: $Day + 3, staff: [], maxStaff: 1 }>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Build Guard Tower</button> <p style="color: red">Insufficient resources</p> <</if>> </div> </div> </div> </div> <!-- HOUSES SECTION: COMPLETELY REWRITTEN TO FIX LOOPING ISSUES --> <<if _settlement.populatedBuildings && Object.keys(_settlement.populatedBuildings).length > 0>> <div class="raid-section"> <h2>Houses</h2> <i>You can manage indervidual villagers by visisting the settlement</i> <!-- Create a full list of all buildings (even empty ones) --> <<silently>> <<set _allBuildings = {}>> <!-- Add buildings from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<set _allBuildings[_buildingId] = _residents>> <</for>> <</if>> <!-- Add empty buildings from buildingSummary --> <<if _buildingSummary>> <<for _type, _info range _buildingSummary>> <<for _i = 0; _i < _info.count; _i++>> <<set _buildingName = _type + " " + (_i + 1)>> <<if !_allBuildings[_buildingName]>> <<set _allBuildings[_buildingName] = []>> <</if>> <</for>> <</for>> <</if>> <</silently>> <!-- Display each building one by one --> <<if Object.keys(_allBuildings).length > 0>> <<for _buildingId, _residents range _allBuildings>> <div class="building-section"> <h3><<print _buildingId>></h3> <<if Array.isArray(_residents) && _residents.length > 0>> <p>Residents: <<print _residents.length>></p> <div class="raider-container"> <<for _residentIndex = 0; _residentIndex < _residents.length; _residentIndex++>> <<set _villager = _residents[_residentIndex]>> <div class="raider-card"> <img @src="_villager.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <<silently>> <!-- Prefer displaying the villager's name if present, otherwise show job, otherwise fallback to "Villager" --> <<set _displayLabel = "Villager">> <<if _villager.name && String(_villager.name).trim() !== "">> <<set _displayLabel = _villager.name>> <<elseif _villager.job && String(_villager.job).trim() !== "">> <<set _displayLabel = _villager.job>> <</if>> <</silently>> <p><<print _displayLabel>></p> <<silently>> <!-- Determine if villager is assigned to a building and capture which one --> <<set _jobBuilding = null>> <<set _villagerIdToCheck = _villager.NPCID || _villager.prisonerId>> <<set _buildingNames = { lumberMill: "Lumber Mill", farm: "Farm", tavern: "Tavern", forge: "Forge", mill: "Mill", brewery: "Brewery", cult: "Cult", guardTower: "Guard Tower" }>> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && _building.staff.some(s => (s.NPCID === _villagerIdToCheck || s.prisonerId === _villagerIdToCheck))>> <<set _jobBuilding = _buildingNames[_buildingKey] || _buildingKey>> <<break>> <</if>> <</for>> <</if>> <</silently>> <<if _jobBuilding>> <p style="color: orange">working at <<print _jobBuilding>></p> <</if>> <!-- Manage button removed: villager management now handled in the new management area --> </div> <</for>> </div> <<else>> <p>Status: Empty</p> <</if>> </div> <</for>> <<else>> <div class="building-section"> <h3>No Houses</h3> <p>No housing structures found in this settlement.</p> </div> <</if>> </div> <<else>> <div class="raid-section"> <h2>Population</h2> <p>No villagers in this settlement.</p> </div> <</if>> <!-- Fix the Garrison Forces section with debugging --> <<if _settlement.garrison && _settlement.garrison.length>> <div class="raid-section"> <h2>Garrison</h2> <!-- Generate unique IDs for any garrison members that don't have one --> <<for _i to 0; _i < _settlement.garrison.length; _i++>> <<if !_settlement.garrison[_i].NPCID>> <<set _settlement.garrison[_i].NPCID = "garrison_" + _i + "_" + Math.random().toString(36).substring(2, 10)>> <</if>> <</for>> <!-- BUTTON: Recall All Combat Specialists (except those assigned to special buildings) --> <<button "Recall all Combat Units">> <<for _i to _settlement.garrison.length - 1; _i >= 0; _i-->> <<set _unit = _settlement.garrison[_i]>> <<set _isAssigned = false>> <!-- Check if assigned to guard tower --> <<if _settlement.buildings && _settlement.buildings.guardTower && _settlement.buildings.guardTower.staff>> <<for _j to 0; _j < _settlement.buildings.guardTower.staff.length; _j++>> <<if _settlement.buildings.guardTower.staff[_j].NPCID && _unit.NPCID && _settlement.buildings.guardTower.staff[_j].NPCID === _unit.NPCID>> <<set _isAssigned = true>> <<break>> <</if>> <</for>> <</if>> <!-- Check if assigned to cult --> <<if !_isAssigned && _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff>> <<for _j to 0; _j < _settlement.buildings.cult.staff.length; _j++>> <<if _settlement.buildings.cult.staff[_j].NPCID && _unit.NPCID && _settlement.buildings.cult.staff[_j].NPCID === _unit.NPCID>> <<set _isAssigned = true>> <<break>> <</if>> <</for>> <</if>> <<if (_unit.specialization === "Combat" || !_unit.specialization) && !_isAssigned>> <<run $BarraksOccupance.push(_unit)>> <<run _settlement.garrison.splice(_i, 1)>> <</if>> <</for>> <<goto "SettlementOverview">> <</button>> <div class="raider-container"> <<for _i to 0; _i < _settlement.garrison.length; _i++>> <<set _currentSoldier = _settlement.garrison[_i]>> <<set _isGuardTowerStaff = false>> <<set _isCultStaff = false>> <!-- Ensure soldier has NPCID --> <<if !_currentSoldier.NPCID>> <<set _currentSoldier.NPCID = "garrison_" + _i + "_" + Math.random().toString(36).substring(2, 10)>> <</if>> <!-- Check if this soldier is assigned to guard tower --> <<if _settlement.buildings && _settlement.buildings.guardTower && _settlement.buildings.guardTower.staff>> <<for _j to 0; _j < _settlement.buildings.guardTower.staff.length; _j++>> <<if _settlement.buildings.guardTower.staff[_j].NPCID && _currentSoldier.NPCID && _settlement.buildings.guardTower.staff[_j].NPCID === _currentSoldier.NPCID>> <<set _isGuardTowerStaff = true>> <<break>> <</if>> <</for>> <</if>> <!-- Check if this soldier is assigned to cult --> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff>> <<for _j to 0; _j < _settlement.buildings.cult.staff.length; _j++>> <<if _settlement.buildings.cult.staff[_j].NPCID && _currentSoldier.NPCID && _settlement.buildings.cult.staff[_j].NPCID === _currentSoldier.NPCID>> <<set _isCultStaff = true>> <<break>> <</if>> <</for>> <</if>> <div class="raider-card"> <img @src="_currentSoldier.ImagePath" alt="<<_currentSoldier.name>>" style="width: 200px; height: 200px; object-fit: cover;"> <h3><<print _currentSoldier.name>></h3> <p>Armor: <<print _currentSoldier.armor>></p> <p>Weapon: <<print _currentSoldier.weapon>></p> <p>Specialization: <<print _currentSoldier.specialization || "None">></p> <p>Health: <<print _currentSoldier.health>>/100</p> <<if _isGuardTowerStaff>> <p style="color: orange">Assigned to Guard Tower</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Cannot Recall</button> <<elseif _isCultStaff>> <p style="color: orange">Assigned to Cult</p> <button disabled style="opacity: 0.5; cursor: not-allowed;">Cannot Recall</button> <<else>> <<capture _i>> <<button "Recall">> <<run $BarraksOccupance.push(_settlement.garrison[_i])>> <<run _settlement.garrison.splice(_i, 1)>> <<goto "SettlementOverview">> <</button>> <</capture>> <</if>> </div> <</for>> </div> </div> <</if>> <div style="text-align: center"> <<button "Return">><<goto "CapturedLocations">><</button>><br> <<button "Go to Dungeon">> <<goto "Dungeon2">> <</button>> <<if $LivingQuarters is true>> <<button "Go to the servant quaters">> <<goto "Quarters">> <</button>> <</if>> <!-- Add this below the location card but above the "Visit Settlement" button --> <<if _settlement.pendingEvent>> <div class="event-section" style="margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; border: 2px solid #ff9900;"> <h2>⚠️ Urgent Matter Requires Your Attention</h2> <p><<print _settlement.pendingEvent.description>></p> <<switch _settlement.pendingEvent.type>> <<case "theft">> <div class="decision-options"> <h3>How will you handle this situation?</h3> <<if $DungeonOccupance.length < $CellsCount>> <div class="decision-option"> <h4>Send to Dungeon</h4> <p>Imprison the thief in your castle dungeon.</p> <p><strong>Effect:</strong> Increases fear (+10), reduces corruption (-15)</p> <<button "Send to Dungeon">> <!-- Prisoner setup --> <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<set _culprit = _settlement.pendingEvent.culprit>> <<set _int = random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: _culprit.name || "Thief", sex: _culprit.sex === "Male" ? "male" : "female", hairColor: _culprit.hairColor || "Brown", ImagePath: _culprit.sex === "Male" ? "Images/Castle/Dungon/Men/Bandit/" + _int + ".png" : "Images/Castle/Dungon/Women/Bandit/" + _int + ".png", corruption: _culprit.corruption || 0, status: "Clothed", originSettlementId: $currentSettlementId, originalNPCID: _culprit.NPCID }>> <!-- Remove villager from settlement --> <<run _settlement.capturedVillagers.splice(_settlement.pendingEvent.culpritIndex, 1)>> <!-- Remove from any building assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && _building.staff.some(s => s.NPCID === _culprit.NPCID)>> <<set _building.staff = _building.staff.filter(s => s.NPCID !== _culprit.NPCID)>> <</if>> <</for>> <</if>> <!-- Remove from populated buildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(v => v.NPCID !== _culprit.NPCID)>> <</if>> <</for>> <</if>> <!-- Apply settlement effects --> <<set _settlement.state = Math.max(-10, _settlement.state - 10)>> <!-- Increase fear --> <<set _settlement.corruption = Math.max(0, _settlement.corruption - 15)>> <!-- Reduce corruption --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "Dungeon2">> <</button>> </div> <</if>> <div class="decision-option"> <div class="decision-option"> ``` <p><strong>Effect:</strong> Greatly increases fear (+20), reduces corruption (-25), decreases happiness (-10)</p> <<button "Execute">> <<set _culprit = _settlement.pendingEvent.culprit>> <!-- Remove villager from settlement --> <<run _settlement.capturedVillagers.splice(_settlement.pendingEvent.culpritIndex, 1)>> <!-- Remove from any building assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff>> <<set _building.staff = _building.staff.filter(s => s.NPCID !== _culprit.NPCID)>> <</if>> <</for>> <</if>> <!-- Remove from populated buildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(v => v.NPCID !== _culprit.NPCID)>> <</if>> <</for>> <</if>> <!-- Apply settlement effects --> <<set _settlement.state = Math.max(-10, _settlement.state - 20)>> <!-- Greatly increase fear --> <<set _settlement.corruption = Math.max(0, _settlement.corruption - 25)>> <!-- Significantly reduce corruption --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 10)>> <!-- Decrease happiness --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Forgive the Offense</h4> <p>Show mercy but require the thief to make amends.</p> <p><strong>Effect:</strong> Increases devotion (+8), increases corruption (+10)</p> <<button "Forgive">> <!-- Apply settlement effects --> <<set _settlement.state = Math.min(10, _settlement.state + 8)>> <!-- Increase devotion --> <<set _settlement.corruption = Math.min(100, _settlement.corruption + 10)>> <!-- Increase corruption --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "fight">> <div class="decision-options"> <h3>How will you handle this situation?</h3> <div class="decision-option"> <h4>Punish the Aggressor</h4> <p>Only punish the person who started the fight.</p> <p><strong>Effect:</strong> Slightly increases fear (+5), slightly increases corruption (+5)</p> <<button "Punish Aggressor">> <!-- Apply settlement effects --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Slightly increase fear --> <<set _settlement.corruption = Math.min(100, _settlement.corruption + 5)>> <!-- Slightly increase corruption --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Punish Both Fighters</h4> <p>Hold both parties responsible for the disturbance.</p> <p><strong>Effect:</strong> Moderately increases fear (+10), decreases corruption (-5)</p> <<button "Punish Both">> <!-- Apply settlement effects --> <<set _settlement.state = Math.max(-10, _settlement.state - 10)>> <!-- Moderately increase fear --> <<set _settlement.corruption = Math.max(0, _settlement.corruption - 5)>> <!-- Decrease corruption --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Make Them Work Together</h4> <p>Force the fighters to cooperate on a community project.</p> <p><strong>Effect:</strong> Increases happiness (+5), increases devotion (+3)</p> <<button "Work Together">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 5)>> <!-- Increase happiness --> <<set _settlement.state = Math.min(10, _settlement.state + 3)>> <!-- Increase devotion --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "accident">> <div class="decision-options"> <h3>How will you handle this situation?</h3> <div class="decision-option"> <h4>Have Garrison Inspect <<print _settlement.pendingEvent.facilityName>></h4> <p>Order your garrison to check the facility for safety concerns.</p> <p><strong>Effect:</strong> Increases happiness (+10), increases devotion (+5)</p> <<button "Send Garrison">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 10)>> <!-- Increase happiness --> <<set _settlement.state = Math.min(10, _settlement.state + 5)>> <!-- Increase devotion --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Order Overtime Work</h4> <p>Demand the workers make up for lost production immediately.</p> <p><strong>Effect:</strong> Decreases happiness (-10), produces resources immediately</p> <<button "Order Overtime">> <!-- Calculate resource production based on facility type --> <<switch _settlement.pendingEvent.facility>> <<case "farm">> <<set $Grain = ($Grain || 0) + 50>> <<set _resourceType = "Grain">> <<case "lumberMill">> <<set $Wood = ($Wood || 0) + 50>> <<set _resourceType = "Wood">> <<case "tavern">> <<set $Gold = ($Gold || 0) + 50>> <<set _resourceType = "Gold">> <<case "forge">> <<set $Tools = ($Tools || 0) + 50>> <<set _resourceType = "Tools">> <</switch>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 10)>> <!-- Decrease happiness --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<script>> UI.alert("You received 50 " + State.temporary._resourceType + " from the overtime work."); <</script>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Upgrade Safety Measures</h4> <p>Invest in better equipment and training.</p> <p><strong>Effect:</strong> Costs 30 Gold, prevents future accidents</p> <<if $Gold >= 30>> <<button "Upgrade Safety">> <<set $Gold -= 30>> <!-- Pay for the upgrades --> <!-- Add safety upgrade to the facility --> <<set _settlement.buildings[_settlement.pendingEvent.facility].safetyUpgraded = true>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 5)>> <!-- Small happiness boost --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Gold</button> <</if>> </div> </div> <<case "disease">> <div class="decision-options"> <h3>How will you handle this situation?</h3> <div class="decision-option"> <h4>Impose Quarantine</h4> <p>Separate the sick from the healthy to prevent spread.</p> <p><strong>Effect:</strong> Halts production for 3 days, prevents population loss</p> <<button "Impose Quarantine">> <!-- Apply quarantine effect --> <<set _settlement.quarantineEndDay = $Day + 3>> <!-- Apply settlement effects --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Slightly increase fear --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Provide Medical Care</h4> <p>Use your resources to treat the sick.</p> <p><strong>Effect:</strong> Costs 20 Herbs, increases devotion (+10)</p> <<if $Herbs >= 20>> <<button "Provide Care">> <<set $Herbs -= 20>> <!-- Use medical supplies --> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 10)>> <!-- Increase happiness --> <<set _settlement.state = Math.min(10, _settlement.state + 10)>> <!-- Increase devotion --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Herbs</button> <</if>> </div> <div class="decision-option"> <h4>Let Nature Take Its Course</h4> <p>Do nothing and let the disease run its natural course.</p> <p><strong>Effect:</strong> 50% chance to lose 1-3 villagers, greatly decreases happiness (-20)</p> <<button "Do Nothing">> <!-- Determine if villagers die --> <<if random(1, 2) === 1 && _settlement.capturedVillagers && _settlement.capturedVillagers.length > 0>> <<set _casualties = Math.min(random(1, 3), _settlement.capturedVillagers.length)>> <<for _i = 0; _i < _casualties; _i++>> <<if _settlement.capturedVillagers.length > 0>> <<set _casualtyIndex = random(0, _settlement.capturedVillagers.length - 1)>> <<set _casualty = _settlement.capturedVillagers[_casualtyIndex]>> <!-- Remove from any building assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff>> <<set _building.staff = _building.staff.filter(s => s.NPCID !== _casualty.NPCID)>> <</if>> <</for>> <</if>> <!-- Remove from populated buildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(v => v.NPCID !== _casualty.NPCID)>> <</if>> <</for>> <</if>> <!-- Remove villager from settlement --> <<run _settlement.capturedVillagers.splice(_casualtyIndex, 1)>> <</if>> <</for>> <<set _deathMessage = _casualties === 1 ? "1 villager has died from the illness." : _casualties + " villagers have died from the illness.">> <<script>> UI.alert(State.temporary._deathMessage); <</script>> <</if>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 20)>> <!-- Greatly decrease happiness --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Slightly increase fear --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "religious">> <div class="decision-options"> <h3>How will you handle this situation?</h3> <div class="decision-option"> <h4>Enforce Your Own Religion</h4> <p>Mandate that all villagers worship as you dictate.</p> <p><strong>Effect:</strong> Increases corruption (+15), increases devotion if successful (+10)</p> <<button "Enforce Religion">> <!-- Roll for success --> <<if random(1, 100) <= 70>> <!-- 70% success chance --> <<set _settlement.state = Math.min(10, _settlement.state + 10)>> <!-- Increase devotion --> <<set _settlement.corruption = Math.min(100, _settlement.corruption + 15)>> <!-- Increase corruption --> <<script>> UI.alert("Your religious enforcement was successful. The villagers have accepted your dictates."); <</script>> <<else>> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Slightly increase fear --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 10)>> <!-- Decrease happiness --> <<script>> UI.alert("Your religious enforcement was met with resistance. Some villagers are practicing in secret."); <</script>> <</if>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Allow Religious Freedom</h4> <p>Let the villagers practice their own faiths.</p> <p><strong>Effect:</strong> Increases happiness (+15), decreases devotion (-5)</p> <<button "Allow Freedom">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 15)>> <!-- Increase happiness --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Decrease devotion --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Build a Temple</h4> <p>Construct a place of worship to unify the settlement.</p> <p><strong>Effect:</strong> Costs 100 Wood, 50 Stone, permanently increases happiness</p> <<if $Wood >= 100 && $Stone >= 50>> <<button "Build Temple">> <<set $Wood -= 100>> <!-- Use wood --> <<set $Stone -= 50>> <!-- Use stone --> <!-- Add temple to settlement --> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<set _settlement.buildings.temple = { built: true, happiness_bonus: 5 }> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 10)>> <!-- Immediate happiness boost --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Resources</button> <</if>> </div> </div> <<case "trade">> <div class="decision-options"> <h3>A merchant offers these special deals:</h3> <div class="decision-option"> <h4>Luxury Goods</h4> <p>Buy exotic items to improve village morale.</p> <p><strong>Cost:</strong> 50 Gold</p> <p><strong>Effect:</strong> Increases happiness (+20)</p> <<if $Gold >= 50>> <<button "Buy Luxuries">> <<set $Gold -= 50>> <!-- Pay for luxuries --> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 20)>> <!-- Boost happiness --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Gold</button> <</if>> </div> <div class="decision-option"> <h4>Agricultural Supplies</h4> <p>Purchase seeds and farming tools.</p> <p><strong>Cost:</strong> 30 Gold</p> <p><strong>Effect:</strong> Permanently improves farm output by 10%</p> <<if $Gold >= 30>> <<button "Buy Farm Supplies">> <<set $Gold -= 30>> <!-- Pay for supplies --> <!-- Apply farm improvement --> <<if !_settlement.buildings>><<set _settlement.buildings = {}>><</if>> <<if !_settlement.buildings.farm>><<set _settlement.buildings.farm = {}>><</if>> <<set _settlement.buildings.farm.outputBonus = (_settlement.buildings.farm.outputBonus || 0) + 10>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Gold</button> <</if>> </div> <div class="decision-option"> <h4>Special Weapons</h4> <p>Acquire better weapons for your garrison.</p> <p><strong>Cost:</strong> 40 Gold</p> <p><strong>Effect:</strong> Improves garrison combat effectiveness</p> <<if $Gold >= 40 && _settlement.garrison && _settlement.garrison.length > 0>> <<button "Buy Weapons">> <<set $Gold -= 40>> <!-- Pay for weapons --> <!-- Upgrade garrison weapons --> <<for _i = 0; _i < _settlement.garrison.length; _i++>> <<if _settlement.garrison[_i].weapon === "Dagger">> <<set _settlement.garrison[_i].weapon = "Sword">> <<elseif _settlement.garrison[_i].weapon === "Sword">> <<set _settlement.garrison[_i].weapon = "Long Sword">> <</if>> <</for>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Gold or No Garrison</button> <</if>> </div> <div class="decision-option"> <h4>Decline All Offers</h4> <p>Send the merchant away without trading.</p> <p><strong>Effect:</strong> None</p> <<button "Decline">> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "construction">> <div class="decision-options"> <h3>The <<print _settlement.pendingEvent.buildingName>> has structural issues. How will you respond?</h3> <div class="decision-option"> <h4>Reinforce the Structure</h4> <p>Spend additional resources to properly fix the issue.</p> <p><strong>Cost:</strong> 50 Wood, 30 Stone</p> <p><strong>Effect:</strong> Permanently prevents future issues</p> <<if $Wood >= 50 && $Stone >= 30>> <<button "Reinforce Structure">> <<set $Wood -= 50>> <!-- Use wood --> <<set $Stone -= 30>> <!-- Use stone --> <!-- Apply building improvement --> <<set _settlement.buildings[_settlement.pendingEvent.building].reinforced = true>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 5)>> <!-- Small happiness boost --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Resources</button> <</if>> </div> <div class="decision-option"> <h4>Quick Patch Job</h4> <p>Apply minimal fixes to keep the building functional.</p> <p><strong>Cost:</strong> 20 Wood</p> <p><strong>Effect:</strong> 30% chance of future issues</p> <<if $Wood >= 20>> <<button "Quick Patch">> <<set $Wood -= 20>> <!-- Use wood --> <!-- Apply building state --> <<set _settlement.buildings[_settlement.pendingEvent.building].quickPatched = true>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Wood</button> <</if>> </div> <div class="decision-option"> <h4>Demolish and Rebuild</h4> <p>Tear down the structure and build it properly from scratch.</p> <p><strong>Effect:</strong> Building will be unavailable for 3 days then function perfectly</p> <<button "Demolish and Rebuild">> <!-- Set building as under reconstruction --> <<set _settlement.buildings[_settlement.pendingEvent.building].underReconstruction = true>> <<set _settlement.buildings[_settlement.pendingEvent.building].reconstructionCompleteDay = $Day + 3>> <!-- Save staff temporarily if any --> <<if _settlement.buildings[_settlement.pendingEvent.building].staff && _settlement.buildings[_settlement.pendingEvent.building].staff.length > 0>> <<set _settlement.buildings[_settlement.pendingEvent.building].storedStaff = _settlement.buildings[_settlement.pendingEvent.building].staff.slice()>> <<set _settlement.buildings[_settlement.pendingEvent.building].staff = []>> <</if>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "lostChild">> <div class="decision-options"> <h3>A child has gone missing from the settlement. How will you respond?</h3> <div class="decision-option"> <h4>Order a Search Party</h4> <p>Mobilize the villagers to search for the missing child.</p> <p><strong>Effect:</strong> 70% chance to find the child, halts production for 1 day</p> <<button "Search Party">> <!-- Determine search success --> <<if random(1, 100) <= 70>> <!-- 70% success chance --> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 15)>> <!-- Happiness boost --> <<set _settlement.state = Math.min(10, _settlement.state + 5)>> <!-- Increase devotion --> <<script>> UI.alert("The search party successfully found the child! The villagers are grateful for your leadership."); <</script>> <<else>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 20)>> <!-- Happiness decrease --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Slightly increase fear --> <<script>> UI.alert("Despite the search efforts, the child could not be found. The villagers are distraught."); <</script>> <</if>> <!-- Set production halt for 1 day --> <<set _settlement.productionHaltDay = $Day + 1>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Send Garrison to Search</h4> <p>Use your trained soldiers to find the child.</p> <p><strong>Effect:</strong> 90% chance to find the child if you have garrison</p> <<if _settlement.garrison && _settlement.garrison.length > 0>> <<button "Send Garrison">> <!-- Determine search success --> <<if random(1, 100) <= 90>> <!-- 90% success chance with garrison --> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 15)>> <!-- Happiness boost --> <<set _settlement.state = Math.min(10, _settlement.state + 8)>> <!-- Significant devotion increase --> <<script>> UI.alert("Your garrison quickly located and rescued the child! The villagers are impressed with your care."); <</script>> <<else>> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 15)>> <!-- Happiness decrease --> <<script>> UI.alert("Despite your garrison's efforts, they could not find the child. The villagers are saddened."); <</script>> <</if>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">No Garrison Available</button> <</if>> </div> <div class="decision-option"> <h4>Ignore the Problem</h4> <p>Let the villagers handle it themselves.</p> <p><strong>Effect:</strong> Greatly decreases happiness (-25), increases fear (+10)</p> <<button "Ignore">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 25)>> <!-- Significant happiness decrease --> <<set _settlement.state = Math.max(-10, _settlement.state - 10)>> <!-- Increase fear --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "festival">> <div class="decision-options"> <h3>The villagers want to hold a small festival. What is your decision?</h3> <div class="decision-option"> <h4>Approve and Fund the Festival</h4> <p>Allow the celebration and contribute resources.</p> <p><strong>Cost:</strong> 20 Gold, 10 Food</p> <p><strong>Effect:</strong> Greatly increases happiness (+25), increases devotion (+10)</p> <<if $Gold >= 20 && $settlement.foodReserves >= 10>> <<button "Approve and Fund">> <<set $Gold -= 20>> <!-- Use gold --> <<set $settlement.foodReserves -= 10>> <!-- Use food --> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 25)>> <!-- Significant happiness boost --> <<set _settlement.state = Math.min(10, _settlement.state + 10)>> <!-- Increase devotion --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Insufficient Resources</button> <</if>> </div> <div class="decision-option"> <h4>Allow but Don't Fund</h4> <p>Let them celebrate with their own resources.</p> <p><strong>Effect:</strong> Moderately increases happiness (+15)</p> <<button "Allow Festival">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 15)>> <!-- Moderate happiness boost --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Deny Permission</h4> <p>Forbid the festival to maintain focus on work.</p> <p><strong>Effect:</strong> Decreases happiness (-15), increases fear (+5)</p> <<button "Deny Festival">> <!-- Apply settlement effects --> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 15)>> <!-- Happiness decrease --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Increase fear --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <<case "leadership">> <div class="decision-options"> <h3>Two villagers are disputing over who should lead the settlement under your authority. How will you resolve this?</h3> <div class="decision-option"> <h4>Appoint <<print _settlement.pendingEvent.candidate1.job || "First Candidate">></h4> <p>Choose the first candidate as settlement leader.</p> <p><strong>Effect:</strong> Creates a formal leadership structure</p> <<button "Appoint First Candidate">> <!-- Set leader status --> <<set _settlement.leader = _settlement.pendingEvent.candidate1>> <<set _settlement.pendingEvent.candidate1.isLeader = true>> <!-- Apply settlement effects based on candidate traits --> <<if _settlement.pendingEvent.candidate1.job === "Farmer" || _settlement.pendingEvent.candidate1.job === "Miller">> <<set _settlement.foodProductionBonus = (_settlement.foodProductionBonus || 0) + 10>> <!-- Food production bonus --> <<script>> UI.alert("Your appointed leader's agricultural expertise will improve food production."); <</script>> <<elseif _settlement.pendingEvent.candidate1.job === "Blacksmith" || _settlement.pendingEvent.candidate1.job === "Lumber Jack">> <<set _settlement.resourceProductionBonus = (_settlement.resourceProductionBonus || 0) + 10>> <!-- Resource production bonus --> <<script>> UI.alert("Your appointed leader's crafting expertise will improve resource production."); <</script>> <<else>> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 10)>> <!-- Happiness bonus --> <<script>> UI.alert("Your appointed leader's charisma will improve settlement morale."); <</script>> <</if>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Appoint <<print _settlement.pendingEvent.candidate2.job || "Second Candidate">></h4> <p>Choose the second candidate as settlement leader.</p> <p><strong>Effect:</strong> Creates a formal leadership structure</p> <<button "Appoint Second Candidate">> <!-- Set leader status --> <<set _settlement.leader = _settlement.pendingEvent.candidate2>> <<set _settlement.pendingEvent.candidate2.isLeader = true>> <!-- Apply settlement effects based on candidate traits --> <<if _settlement.pendingEvent.candidate2.job === "Farmer" || _settlement.pendingEvent.candidate2.job === "Miller">> <<set _settlement.foodProductionBonus = (_settlement.foodProductionBonus || 0) + 10>> <!-- Food production bonus --> <<script>> UI.alert("Your appointed leader's agricultural expertise will improve food production."); <</script>> <<elseif _settlement.pendingEvent.candidate2.job === "Blacksmith" || _settlement.pendingEvent.candidate2.job === "Lumber Jack">> <<set _settlement.resourceProductionBonus = (_settlement.resourceProductionBonus || 0) + 10>> <!-- Resource production bonus --> <<script>> UI.alert("Your appointed leader's crafting expertise will improve resource production."); <</script>> <<else>> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 10)>> <!-- Happiness bonus --> <<script>> UI.alert("Your appointed leader's charisma will improve settlement morale."); <</script>> <</if>> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> <div class="decision-option"> <h4>Rule Directly</h4> <p>Deny both candidates and maintain direct control.</p> <p><strong>Effect:</strong> Increases devotion (+5), increases fear (+5)</p> <<button "Rule Directly">> <!-- Apply settlement effects --> <<set _settlement.state = Math.min(10, _settlement.state + 5)>> <!-- Increase devotion --> <<set _settlement.state = Math.max(-10, _settlement.state - 5)>> <!-- Also increase fear --> <!-- Clear the event --> <<set _settlement.pendingEvent = null>> <<goto "SettlementOverview">> <</button>> </div> </div> <</if>> </div> <!-- Raze Settlement Section --> <div style="text-align: center; margin: 20px 0; padding: 15px; background: rgba(50, 0, 0, 0.7); border: 2px solid #ff4444; border-radius: 8px;"> <h3 style="color: #ff6666;">Dangerous Action</h3> <p style="color: #ffcccc;">Completely destroy this settlement and all its inhabitants.</p> <<button "Raze Settlement">> <<set $razeConfirmStep = 1>> <<goto "RazeSettlementConfirm">> <</button>> <p style="color: #ff9999; font-size: 0.9em; font-style: italic;"> Warning: This action is permanent and cannot be undone! </p> </div> <</nobr>> <!-- DEBUG: Settlement Data Display (for testing) --> <div class="debug-section" style="margin: 30px 0; padding: 15px; background: rgba(40, 40, 40, 0.9); border-radius: 8px; border: 1px dashed #666;"> <h2 style="color: #ff9966;">Debug: Settlement Data</h2> <button id="toggleDebugBtn" onclick="document.getElementById('settlementDebug').style.display = document.getElementById('settlementDebug').style.display === 'none' ? 'block' : 'none';"> Show/Hide Raw Settlement Data </button> <div id="settlementDebug" style="display: none; margin-top: 15px;"> <pre style="background: rgba(0, 0, 0, 0.7); padding: 10px; border-radius: 5px; max-height: 500px; overflow: auto; font-family: monospace; white-space: pre-wrap; word-break: break-all; color: #7FFF7F; font-size: 12px;"><<print JSON.stringify(_settlement, null, 2)>></pre> </div> </div>
<<nobr>> <style> .location-card { display: flex; background: rgba(0, 0, 0, 0.7); border: 2px solid #333; border-radius: 8px; padding: 20px; margin: 20px 0; } .location-image { flex: 0 0 300px; } .location-image img { width: 300px; height: 300px; object-fit: cover; border-radius: 4px; } .location-info { flex: 1; padding-left: 20px; } .info-label { font-weight: bold; color: #ccc; margin-right: 10px; } </style> <h1>Settlement Reports - Day <<print $Day>></h1> <<for _settlement range $CapturedLocations>> <<set _reports = $settlementReports[$Day] || []>> <<set _report = _reports.length ? _reports.find(r => r.name === _settlement.name) : null>> <div class="location-card"> <div class="location-image"> <img @src="_settlement.imagePath" alt="Location Image"> </div> <div class="location-info"> <h1><<print _settlement.name>></h1> <p><span class="info-label">Location Type:</span> <<print _settlement.type>></p> <p><span class="info-label">Population:</span> <<print _report ? (_report.endingPopulation || _report.startingPopulation) : 0>></p> <p><span class="info-label">Garrison Size:</span> <<print _settlement.garrison ? _settlement.garrison.length : 0>></p> <p><span class="info-label">Happiness:</span> <<print Number(_settlement.Happiness) || 0>>%</p> <<print `<progress value="${_settlement.Happiness}" max="100" style="width: 100%; height: 20px;"></progress>`>> <p><span class="info-label">Corruption:</span> <<print _settlement.corruption || 0>>%</p> <<print `<progress value="${_settlement.corruption}" max="100" style="width: 100%; height: 20px;"></progress>`>> <p><span class="info-label">Export:</span> <<print _settlement.Export>></p> </div> </div> <div class="daily-report"> <h3>Day <<print $Day>> Events</h3> <<if _report && _report.events && _report.events.length > 0>> <div class="report-stats"> <p><strong>Starting:</strong> <<print _report.startingPopulation>> population, <<print _report.startingFood>>% food</p> <p><strong>Ending:</strong> <<print _report.endingPopulation || _report.startingPopulation>> population, <<print _report.endingFood>>% food</p> </div> <h4>Daily Events:</h4> <<for _event range _report.events>> <div class="event-entry"><<print _event>></div> <</for>> <<else>> <p>No events recorded for this day.</p> <</if>> </div> <</for>> <style> .daily-report { background: rgba(0, 0, 0, 0.7); border: 2px solid #333; border-radius: 8px; padding: 20px; margin: 20px 0; } .report-stats { border-left: 3px solid #666; padding: 10px; margin: 10px 0; } .event-entry { padding: 5px 10px; margin: 5px 0; background: rgba(255, 255, 255, 0.1); border-radius: 4px; } </style> <div style="text-align: center; margin-top: 20px;"> <<button "Close">><<goto "Chambers">><</button>> </div> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Tav">> <<set $ReturnPassage to passage()>> <<set $BackgroundPath to "Images/Forrest/Scarldale/Tavern/2.png">> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <div class="text-box"> <h2>Inside the Tavern</h2> <div class="npc-container"> <<for _npc range _building>> <<set _npc.found = true>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> <div class="npc-button"> <<capture _npc>> <<if _npc.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + (_npc.sex === "male" ? "him" : "her")>> <<set $ImagePath to _npc.ImagePath>> <<set $currentNPC to _npc>> <<goto "TalkToNPC">> <</button>> <</if>> <</capture>> </div> </div> <</for>> </div> </div> <div class="navigation"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <style> .people-counter { background: #2d2d2d; color: white; padding: 10px; margin-bottom: 20px; border-radius: 5px; text-align: center; } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-bottom: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; gap: 10px; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } .npc-button { margin-top: 10px; } </style> <</nobr>>
<<nobr>> <<widget "buildingStats">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<set _buildingCounts to {}>> <<set _totalBuildings to _currentData.hotspots.length>> <!-- Add custom buildings to the total count --> <<set _customBuildingsCount to 0>> <<if _settlement.buildings>> <<set _customBuildingsCount to Object.keys(_settlement.buildings).length>> <</if>> <div class="building-stats"> <p>Buildings: <<print _totalBuildings + _customBuildingsCount>></p> <p>Population: <<print _settlement.capturedVillagers ? _settlement.capturedVillagers.length : 0>></p> <p>Garrison: <<print _settlement.garrison ? _settlement.garrison.length : 0>></p> </div> <</if>> <</widget>> <<set $SettlementLocation to "Outside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $ImagePath to _settlement.imagePath>> <<include "LoadBuildingData">> <!-- Random cult visitor assignment (happens once per settlement visit) --> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff && _settlement.buildings.cult.staff.length > 0>> <!-- Use a session-based flag to prevent re-rolling during same settlement visit --> <!-- Note: Need to check if undefined OR if different location (handles 0 vs null properly) --> <<if typeof $CurrentSettlementVisitId === 'undefined' || $CurrentSettlementVisitId !== $currentLocationid>> <!-- New settlement visit - assign visitor --> <<set $CurrentSettlementVisitId to $currentLocationid>> <<set _allVillagers to []>> <!-- Collect all villagers from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _bId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<for _r range _residents>> <<set _allVillagers.push(_r)>> <</for>> <</if>> <</for>> <</if>> <!-- 30% chance of ONE visitor being at the cult --> <<if _allVillagers.length > 0 && random(1, 100) <= 30>> <<set $CapturedLocations[$currentLocationid].buildings.cult.currentVisitor to _allVillagers[random(0, _allVillagers.length - 1)]>> <<else>> <<set $CapturedLocations[$currentLocationid].buildings.cult.currentVisitor to null>> <</if>> <</if>> <<else>> <!-- No succubus assigned, clear any visitor --> <<if _settlement.buildings && _settlement.buildings.cult>> <<set $CapturedLocations[$currentLocationid].buildings.cult.currentVisitor to null>> <</if>> <</if>> <!-- Random NPCs out of village assignment (happens once per settlement visit) --> <<if typeof $CurrentSettlementVisitId === 'undefined' || $CurrentSettlementVisitId !== $currentLocationid>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<set _outReasons = ["Foraging", "Exploring", "Hunting", "Visiting neighbors", "Gathering wood", "Fishing", "At the market"]>> <!-- Initialize out list if needed --> <<if !$CapturedLocations[$currentLocationid].npcsOut>> <<set $CapturedLocations[$currentLocationid].npcsOut = []>> <</if>> <<set $CapturedLocations[$currentLocationid].npcsOut = []>> <<if !_isWorkTime && _settlement.populatedBuildings>> <<for _buildingName, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents) && _residents.length > 1>> <!-- Only check houses with multiple residents --> <<for _resident range _residents>> <<set _residentId = _resident.NPCID || _resident.prisonerId>> <!-- Check if at cult --> <<set _isAtCult = false>> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentVisitor>> <<set _cultVisitorId = _settlement.buildings.cult.currentVisitor.NPCID || _settlement.buildings.cult.currentVisitor.prisonerId>> <<if _cultVisitorId === _residentId>> <<set _isAtCult = true>> <</if>> <</if>> <!-- 20% chance to be out if not at cult and not alone --> <<if !_isAtCult && random(1, 100) <= 20>> <<set _randomReason = _outReasons[random(0, _outReasons.length - 1)]>> <<run $CapturedLocations[$currentLocationid].npcsOut.push({ npc: _resident, reason: _randomReason, building: _buildingName })>> <</if>> <</for>> <</if>> <</for>> <</if>> <</if>> <div class="text-box"> <h1><<print _settlement.name>></h1> <hr> <<set $ImagePath to _settlement.imagePath>> <<buildingStats>> <hr> <<set _hasGuardHouse to false>> <<if _settlement.populatedBuildings>> <<for _buildingId, _building range _settlement.populatedBuildings>> <<if _buildingId.includes("Guard House")>> <<set _hasGuardHouse to true>> <</if>> <</for>> <</if>> <<if $Position is "VisistStart">> <<set $Position to "null">> <<if _settlement.hasCult is true>> <div class="text-box"> You step into the settlement, It is silent and a grim feeling comes over you... <<You>>I should investigate the houses, someone must be around<</You>> <<set _settlement.hasCult to false>> </div> <<elseif _settlement.hasRevolted is true>> <div class="text-box"> You approach _settlement.name and one of your guards presents themselves <<say '_unit.name' _unit.ImagePath>>Greeting, Lord welcome to _settlement.name. We have returned the surviving villagers to their homes. The organiser of the insurction has been captured<</say>><br><br> <<else>> <<if _settlement.garrison.length gt 0>> <<set _randomIndex to random(0, _settlement.garrison.length - 1)>> <<set _unit to _settlement.garrison[_randomIndex]>> The settlement comes into view, and you see one of your loyal guards joggin over to you <<say '_unit.name' _unit.ImagePath>>Greeting, Lord welcome to _settlement.name<</say>><br><br> <<You>>I've come to see my settlement, and my people<</You>> <<else>> The settlement comes into view, the lack of guards trubbles you as you realise how undefended this place is, you make a mental note to send foces to garrison this area soon <</if>> <</if>> <i>Saving is unavailable here, the game auto-saved before you set out</i> <</if>> <h2>Welcome to <<print _settlement.name>></h2> <!-- Simple settlement image display without hotspots --> <div class="settlement-image"> <img @src=_settlement.imagePath alt="Settlement Image"> </div><br><br> <<button "Wait 2 hours">> <<set $Time to $Time + 2>> <<goto "SettlementVisit">> <</button>> <!-- NPCs Out of Village Section --> <<if _settlement.npcsOut && _settlement.npcsOut.length > 0>> <div class="npcs-out-section"> <h3>Villagers Currently Away</h3> <p style="color: #aaa; font-style: italic;">Some villagers are out and about:</p> <div class="npcs-out-list"> <<for _outInfo range _settlement.npcsOut>> <div class="npc-out-item"> <<if _outInfo.npc.ImagePath>> <img @src="_outInfo.npc.ImagePath" class="npc-avatar-small" alt="NPC"> <<else>> <div class="npc-avatar-small default-avatar"></div> <</if>> <span class="npc-out-info"> <strong><<print _outInfo.npc.name || _outInfo.npc.job || "Villager">></strong> <span style="color: #88cc88;"> - <<print _outInfo.reason>></span> </span> </div> <</for>> </div> </div> <</if>> <!-- All Buildings Section --> <div class="all-buildings-section"> <h2>All Settlement Buildings</h2> <div class="building-list"> <!-- Add Garrison as the first building if there are guards --> <<if _settlement.garrison && _settlement.garrison.length > 0>> <div class="building-item"> <div class="building-icon garrison-icon"></div> <div class="building-details"> <h3>Garrison</h3> <p>Guards: <<print _settlement.garrison.length>> soldier(s)</p> <<if _settlement.garrison && _settlement.garrison.length > 0>> <div class="npc-list"> <h4>Personnel:</h4> <<for _guard range _settlement.garrison>> <div class="garrison-member"> <<if _guard.ImagePath>> <img @src="_guard.ImagePath" class="npc-avatar" alt="Guard"> <<else>> <div class="npc-avatar default-avatar"></div> <</if>> <span class="npc-name"><<print _guard.name>></span> </div> <</for>> </div> <</if>> </div> <div class="building-action"> <<button "Visit">> <<set $currentBuildingType = "Garrison">> <<goto "Settlement_Garrison">> <</button>> </div> </div> <</if>> <!-- List standard buildings from building data --> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData && _currentData.hotspots>> <<for _hotspot range _currentData.hotspots>> <div class="building-item"> <div class="building-icon house-icon"></div> <div class="building-details"> <h3><<print _hotspot.tooltip>></h3> <!-- Fix for House display section --> <<if _settlement.populatedBuildings && _settlement.populatedBuildings[_hotspot.tooltip]>> <<set _houseOccupants = _settlement.populatedBuildings[_hotspot.tooltip]>> <<set _currentOccupants = []>> <!-- Find who is actually at home based on time --> <<for _resident range _houseOccupants>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <!-- Check if resident is assigned to any building staff --> <<set _hasJob = false>> <<set _residentId = _resident.NPCID || _resident.prisonerId>> <<if _settlement.buildings>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId = _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _hasJob = true>> <<set _resident.assignedBuilding = _bldgKey>> <<break>> <</if>> <</for>> <</if>> <<if _hasJob>><<break>><</if>> <</for>> <</if>> <!-- Check if resident is at the cult --> <<set _isAtCult = false>> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentVisitor>> <<set _cultVisitorId = _settlement.buildings.cult.currentVisitor.NPCID || _settlement.buildings.cult.currentVisitor.prisonerId>> <<if _cultVisitorId === _residentId>> <<set _isAtCult = true>> <</if>> <</if>> <!-- Check if resident is out of village --> <<set _isOut = false>> <<if _settlement.npcsOut>> <<for _outNpc range _settlement.npcsOut>> <<set _outNpcId = _outNpc.npc.NPCID || _outNpc.npc.prisonerId>> <<if _outNpcId === _residentId>> <<set _isOut = true>> <<break>> <</if>> <</for>> <</if>> <!-- Show resident if: (no job OR not work hours) AND not at cult AND not out --> <<if (!_hasJob || !_isWorkTime) && !_isAtCult && !_isOut>> <<set _currentOccupants.push(_resident)>> <</if>> <</for>> <p>Status: Occupied (<<print _houseOccupants.length>> resident<<if _houseOccupants.length > 1>>s<</if>><<if _currentOccupants.length !== _houseOccupants.length>>, <<print _currentOccupants.length>> currently present<</if>>)</p> <<if _currentOccupants.length>> <div class="npc-list"> <h4>Currently at Home:</h4> <<for _resident range _currentOccupants>> <div class="npc-item"> <<if _resident.ImagePath>> <img @src="_resident.ImagePath" class="npc-avatar" alt="Resident"> <<else>> <div class="npc-avatar default-avatar"></div> <</if>> <span class="npc-name"> <<if _resident.name && _resident.name !== "Unknown">> <<= _resident.name>> <<else>> <em><<= _resident.job || "Villager">></em> <</if>> <<if _resident.assignedBuilding>> <span class="job-tag">(<<print _resident.assignedBuilding.charAt(0).toUpperCase() + _resident.assignedBuilding.slice(1)>> worker)</span> <</if>> </span> </div> <</for>> </div> <<else>> <p><em>All residents are currently away (at work or cult)</em></p> <</if>> <<else>> <p>Status: Empty</p> <</if>> </div> <div class="building-action"> <<capture _hotspot>> <<button "Visit">> <<set $clickedBuilding = _hotspot.tooltip>> <<set $selectedBuilding = _hotspot.tooltip>> <<set $SettlementHouse = _hotspot.tooltip>> <<goto "SettlementHouseVisit">> <</button>> <</capture>> </div> </div> <</for>> <</if>> <!-- List custom buildings from the buildings object --> <<if _settlement.buildings>> <<for _buildingType, _buildingData range _settlement.buildings>> <<set _displayName = "">> <<set _iconClass = "">> <<set _passageName = "">> <<set _canVisit = false>> <<switch _buildingType>> <<case "lumberMill">> <<set _displayName = "Lumber Mill">> <<set _iconClass = "lumbermill-icon">> <<set _passageName = "Settlement_LumberMill">> <<case "tavern">> <<set _displayName = "Tavern">> <<set _iconClass = "tavern-icon">> <<set _passageName = "Settlement_Tavern">> <<case "cult">> <<set _displayName = "Cult">> <<set _iconClass = "cult-icon">> <<set _passageName = "Settlement_Cult">> <<set _canVisit = true>> <<case "guardTower">> <<set _displayName = "Watch Tower">> <<set _iconClass = "watchtower-icon">> <<set _passageName = "Settlement_WatchTower">> <<set _canVisit = true>> <<case "farm">> <<set _displayName = "Farm">> <<set _iconClass = "farm-icon">> <<set _passageName = "Settlement_Farm">> <<case "forge">> <<set _displayName = "Forge">> <<set _iconClass = "forge-icon">> <<set _passageName = "Settlement_Forge">> <<case "brewery">> <<set _displayName = "Brewery">> <<set _iconClass = "brewery-icon">> <<set _passageName = "Settlement_Brewery">> <<case "mill">> <<set _displayName = "Mill">> <<set _iconClass = "mill-icon">> <<set _passageName = "Settlement_Mill">> <<default>> <<set _displayName = _buildingType.charAt(0).toUpperCase() + _buildingType.slice(1)>> <<set _iconClass = "generic-icon">> <<set _passageName = "Settlement_" + _buildingType.charAt(0).toUpperCase() + _buildingType.slice(1)>> <</switch>> <<capture _buildingType, _buildingData, _passageName, _canVisit, _displayName, _iconClass>> <div class="building-item"> <div class="building-icon <<print _iconClass>>"></div> <div class="building-details"> <h3><<print _displayName>></h3> <<if typeof $Time !== 'undefined'>> <<if $Time > 2 && $Time < 6>> <!-- Work hours are between 3-5 --> <<if _buildingData.staff && _buildingData.staff.length>> <p>Status: Active (<<print _buildingData.staff.length>> worker<<if _buildingData.staff.length > 1>>s<</if>>)</p> <div class="npc-list"> <h4>Current Staff:</h4> <<for _staffMember range _buildingData.staff>> <div class="npc-item"> <<if _staffMember.ImagePath>> <img @src="_staffMember.ImagePath" class="npc-avatar" alt="Worker"> <<else>> <div class="npc-avatar default-avatar"></div> <</if>> <span class="npc-name"> <<if _staffMember.name && _staffMember.name !== "Unknown">> <<print _staffMember.name>> <<else>> <em><<print _staffMember.job || "Worker">></em> <</if>> </span> </div> <</for>> </div> <<else>> <p>Status: Inactive (No staff assigned)</p> <</if>> <<else>> <!-- Special handling for Watch Tower and Cult - always active if staffed --> <<if _buildingType === "guardTower" || _buildingType === "cult">> <<if _buildingData.staff && _buildingData.staff.length>> <p>Status: Active (<<print _buildingData.staff.length>> guard<<if _buildingData.staff.length > 1>>s<</if>>)</p> <div class="npc-list"> <h4>Current Staff:</h4> <<for _staffMember range _buildingData.staff>> <div class="npc-item"> <<if _staffMember.ImagePath>> <img @src="_staffMember.ImagePath" class="npc-avatar" alt="Worker"> <<else>> <div class="npc-avatar default-avatar"></div> <</if>> <span class="npc-name"> <<if _staffMember.name && _staffMember.name !== "Unknown">> <<print _staffMember.name>> <<else>> <em><<print _staffMember.job || "Worker">></em> <</if>> </span> </div> <</for>> </div> <!-- Show cult visitor if cult building and visitor exists --> <<if _buildingType === "cult" && _settlement.buildings.cult.currentVisitor>> <div class="npc-list" style="margin-top: 10px; border-top: 1px solid #888; padding-top: 8px;"> <h4>Visitor:</h4> <<set _cultVisitor to _settlement.buildings.cult.currentVisitor>> <div class="npc-item"> <<if _cultVisitor.ImagePath>> <img @src="_cultVisitor.ImagePath" class="npc-avatar" alt="Visitor"> <<else>> <div class="npc-avatar default-avatar"></div> <</if>> <span class="npc-name"> <<if _cultVisitor.name && _cultVisitor.name !== "Unknown">> <<print _cultVisitor.name>> <<else>> <em><<print _cultVisitor.job || "Villager">></em> <</if>> </span> </div> </div> <</if>> <<else>> <p>Status: Inactive (No staff assigned)</p> <</if>> <<else>> <p>Status: Closed (Outside of work hours)</p> <</if>> <</if>> <<else>> <p>Status: Unknown</p> <</if>> </div> <div class="building-action"> <<if _canVisit>> <<button "Visit">> <<set $currentBuildingId = _buildingType>> <<set $currentBuildingType = _buildingType>> <<goto _passageName>> <</button>> <<else>> <i>Not visitable yet</i> <</if>> </div> </div> <</capture>> <</for>> <</if>> <<if !_currentData && !_settlement.buildings && !(_settlement.garrison && _settlement.garrison.length > 0)>> <p class="no-buildings-message">No buildings available in this settlement.</p> <</if>> </div> </div> <br> <<button "Return to the castle">> <!-- Clear the session flag so it re-rolls on next settlement visit --> <<set $CurrentSettlementVisitId to null>> <<if _settlement.buildings && _settlement.buildings.cult>> <<set $CapturedLocations[$currentLocationid].buildings.cult.currentVisitor to null>> <</if>> <<goto "Base Intro">> <</button>> </div> <style> /* NPCs Out Section Styles */ .npcs-out-section { margin: 20px 0; padding: 15px; background: rgba(40, 50, 40, 0.6); border: 1px solid #668866; border-radius: 8px; } .npcs-out-section h3 { margin-top: 0; color: #88cc88; } .npcs-out-list { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; } .npc-out-item { display: flex; align-items: center; padding: 8px; background: rgba(0, 0, 0, 0.3); border-radius: 5px; gap: 10px; } .npc-avatar-small { width: 40px; height: 40px; border-radius: 4px; border: 1px solid #666; object-fit: cover; flex-shrink: 0; } .npc-out-info { display: flex; flex-direction: column; line-height: 1.3; } /* Settlement image display */ .settlement-image { width: 100%; text-align: center; } .settlement-image img { max-width: 800px; max-height: 600px; width: auto; height: auto; border-radius: 8px; border: 2px solid #333; } /* Building List Styles */ .all-buildings-section { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .building-list { display: flex; flex-direction: column; gap: 10px; margin-top: 15px; } .building-item { display: flex; align-items: center; background: rgba(50, 50, 50, 0.7); border: 1px solid #555; border-radius: 5px; padding: 10px 15px; transition: background-color 0.2s; } .building-item:hover { background: rgba(60, 60, 60, 0.8); } .building-icon { width: 40px; height: 40px; border-radius: 5px; background-size: cover; background-position: center; margin-right: 15px; flex-shrink: 0; } /* Building icon styles */ .house-icon { background-image: url('Images/Icons/House.png'); background-color: #5b4c29; } .garrison-icon { background-image: url('Images/Icons/Garrison.png'); background-color: #553333; background-size: contain; background-repeat: no-repeat; } .lumbermill-icon { background-image: url('Images/Icons/Logs.png'); background-color: #335533; } .tavern-icon { background-image: url('Images/Icons/Mead.png'); background-color: #5b4c29; } .farm-icon { background-image: url('Images/Icons/Farm.png'); background-color: #556633; background-size: contain; background-repeat: no-repeat; } .watchtower-icon { background-image: url('Images/Icons/GuardTower.png'); background-color: #333355; } .cult-icon { background-image: url('Images/Buildings/Cult.png'); background-color: #553355; } .forge-icon { background-image: url('Images/Icons/Tools.png'); background-color: #553333; } .brewery-icon { background-image: url('Images/Icons/Barrel.png'); background-color: #5b4c29; background-size: contain; background-repeat: no-repeat; } .mill-icon { background-image: url('Images/Icons/Bread.png'); background-color: #a58e57; } .generic-icon { background-image: url('Images/Buildings/Generic.png'); background-color: #555; } .building-details { flex-grow: 1; } .building-details h3 { margin: 0 0 5px 0; color: #ffd700; font-size: 18px; } .building-details p { margin: 0; color: #ddd; font-size: 14px; } .building-action { flex-shrink: 0; } .building-action button { padding: 5px 15px; background: #2c2c2c; border: 1px solid #777; color: #fff; border-radius: 3px; cursor: pointer; transition: background-color 0.2s; } .building-action button:hover { background: #3c3c3c; } .no-buildings-message { text-align: center; color: #aaa; font-style: italic; padding: 20px; } /* Building stats styling */ .building-stats { background: rgba(0, 0, 0, 0.5); padding: 10px 15px; border-radius: 5px; display: inline-block; margin-bottom: 15px; } .building-stats p { margin: 5px 0; color: #ddd; } /* Debug section styling */ .debug-section { margin-top: 40px; border-top: 1px dashed #666; padding-top: 20px; } .debug-section summary { cursor: pointer; padding: 8px; background: rgba(30, 30, 30, 0.8); border-radius: 4px; color: #ccc; font-family: monospace; display: inline-block; } .debug-section summary:hover { background: rgba(40, 40, 40, 0.8); color: #fff; } .debug-content { margin-top: 15px; background: rgba(20, 20, 20, 0.9); padding: 15px; border-radius: 5px; font-family: monospace; white-space: pre-wrap; word-break: break-word; } .debug-content h3 { color: #88ccff; margin: 15px 0 5px 0; border-bottom: 1px solid #444; padding-bottom: 5px; } .debug-content h3:first-child { margin-top: 0; } .debug-content pre { background: rgba(0, 0, 0, 0.5); padding: 10px; border-radius: 3px; overflow: auto; max-height: 300px; color: #ddd; } .debug-content ul { list-style-type: none; padding-left: 0; margin: 0; } .debug-content li { padding: 3px 5px; border-bottom: 1px dotted #333; } .debug-content li:hover { background: rgba(255, 255, 255, 0.05); } /* NPC display styles */ .npc-list { margin-top: 8px; padding-top: 5px; border-top: 1px dotted #666; } .npc-list h4 { margin: 0 0 5px 0; font-size: 14px; color: #aaa; } .npc-item { display: flex; align-items: center; margin-bottom: 3px; } .npc-avatar { width: 30px; height: 30px; border-radius: 50%; border: 1px solid #777; margin-right: 8px; object-fit: cover; } .npc-name { font-size: 13px; color: #ddd; } .garrison-member { display: flex; align-items: center; margin-bottom: 5px; background: rgba(40, 40, 40, 0.6); padding: 5px; border-radius: 3px; } .default-avatar { background-color: #444; background-image: url('Images/Icons/Person.png'); background-size: contain; background-position: center; background-repeat: no-repeat; width: 30px; height: 30px; border-radius: 50%; border: 1px solid #777; display: inline-block; } .job-tag { font-size: 11px; color: #aaa; font-style: italic; margin-left: 4px; } </style> <<script>> $(document).ready(function() { $('.hotspot').on('click', function() { let building = $(this).find('.tooltip').text().trim(); State.variables.clickedBuilding = building; State.variables.selectedBuilding = building; Engine.play($(this).attr('data-passage')); }); }); <</script>> <<run document.body.style.background = ''; document.body.style.backgroundImage = 'none'; $('#passage, #story, body').css('background',''); document.body.className = document.body.className.replace(/\\bbg-\\S+\\b/g,'')>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _buildingId to $selectedBuilding>> <div id="peek-animation" style="text-align: center; margin: 20px;"> Chance of being caught: 40<br> Lucy's skill: $LucyPower<br> <<if $LucyPower lt 15>> Your chance of getting caught is <b>high</b><br> <<elseif $LucyPower lt 21>> Your chance of getting caught is <b>medium</b><br> <<else>> Your chance of being caught is <b>low</b><br> <</if>> <<button "Attempt to peek through window">> <<set _roll to random(1, 40)>> <<replace "#peek-animation">> <div class="roll-container"> <div class="roll-text">🎲 Checking if you're spotted...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>10</span> <span>20</span> <span>30</span> <span>40</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll * 2.5}%`; }, 100)>> <</replace>> <<replace "#peek-result">> <<if _roll <= $LucyPower>> <div class="success-message"> You peer through the windows without being spotted. After some time, you are sure you have seen everyone who is inside. (Stealth Check: _roll)<br><br> <<if _location.populatedBuildings[_buildingId]>> <div class="npc-container"> <<for _npc range _location.populatedBuildings[_buildingId]>> <<set _npc.found = true>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> </div> <</for>> </div> <</if>> <div style="text-align: center; margin-top: 20px;"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> </div> <<else>> <div class="fail-message"> Someone spots you looking through the window! Before you can react they run out to you. (Failed Stealth Check: _roll)<br><br> <<button "Continue">> <<set _building to _location.populatedBuildings[$selectedBuilding]>> <<set _residents to _building.filter(item => item.NPCID !== undefined)>> <<if _residents && _residents.length > 0>> <<set $currentNPC to _residents[random(0, _residents.length - 1)]>> <<set $ImagePath to $currentNPC.ImagePath>> <</if>> <<goto "SettlementCaught">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="peek-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } .npc-container { display: flex; justify-content: center; gap: 20px; margin-top: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } </style> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="settler-profile" style="text-align: center; padding: 20px;"> <img @src="$currentVillager.ImagePath" style="width: 300px; height: 300px; object-fit: cover; border-radius: 8px;"> <h2><<print $currentVillager.job || "Villager">></h2> <p>Current Settlement: <<print $currentSettlementForTransfer.name>></p> <<button "Send to New Settlement">> <<set $currentVillagerForTransfer = $currentVillager>> <<goto "SelectSettlementTransfer">> <</button>> <<button "Send to Dungeon">> <<set _settlement = $currentSettlementForTransfer>> <<set _npcId = $currentVillager.NPCID>> /* Entferne aus capturedVillagers */ <<set _index = _settlement.capturedVillagers.findIndex(v => v.NPCID === _npcId)>> <<if _index !== -1>> <<run _settlement.capturedVillagers.splice(_index, 1)>> <</if>> /* Entferne aus allen Gebäuden */ <<for _buildingId, _residents range _settlement.populatedBuildings>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _npcId)>> <<if _resIndex !== -1>> <<run _residents.splice(_resIndex, 1)>> <</if>> <</for>> /* Dungeon erstellen */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<set _int = random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, NPCID: _npcId, name: $currentVillager.name || $currentVillager.job || "Villager", sex: $currentVillager.sex || "Female", job: $currentVillager.job, hiddenJob: $currentVillager.hiddenJob, hairColor: $currentVillager.hairColor || "Brown", corruption: $currentVillager.corruption || 0, originSettlementId: $currentVillager.settlementId, status: "Clothed", ImagePath: $currentVillager.sex === "Male" ? "Images/Castle/Dungon/Men/Bandit/" + _int + ".png" : "Images/Castle/Dungon/Woman/" + ($currentVillager.hairColor || "Brown") + "/Clothed/" + _int + ".png" }>> <<if !Array.isArray($DungonOccupance)>><<set $DungonOccupance = []>><</if>> <<run $DungonOccupance.push($CurrentCaptive)>> <<set $currentVillagerForTransfer = $CurrentCaptive>> <<goto "Dungeon2">> <</button>> <<button "Return">> <<goto "SettlementOverview">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> Unable to resist, you give in to her attacks and fall back into her trance<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Behind/1.webm" type="video/webm"> </video><br><br> Unable to resist further, you fuck Lilura before flipping her over<br><br> <video autoplay loop> <source src="Images/Forrest/Exploring/Cemetery/Lilura/Behind/2.webm" type="video/webm"> </video><br><br> [[Cum|GhoulQuestAlterCum]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You manage to resist her attack, pushing through the vsion and the lust<br><br> Taking all the strength you have left you charge at the demon and knock her to her feet<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/17.png" width="700" height="700"> </div><br><br> She looks up at you, defeated. With your remaing strength you take the rusted dagger and plunge it into her heart<br><br> Watching her die was not as satisfying as you hoped, but you feel the souls she had stolen from mortal men flow into you<br><br> You know this may not be over, as a demon, you are not able to fully kill her... But for now at least she is gone<br><br> <<set $Souls to $Souls + 4>> <<set $ReplayQuestActive to false>> <<link "Go home">> <<script>> UI.alert("Quest complete! <br>The demon attacking the village is dead, for now"); <</script>> <<run $Quests.delete("Search for the thing near the cemetery in the swamp")>> <<run Engine.play('Resporn')>> <</link>> </div> <</nobr>> <<set $TavQuestComplete to true>>
<div class="text-box"> <<set $ImagePath to "Images/Forrest/Exploring/Cemetery/16.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <span style="color: red">Lilura: Look at me...</span><br><br> Your vision start to fail as she tries to break your mind and trance you<br><br> <div id="timer">10</div> <div id="choice-button" class="choice-button">Resist</div> <<script>>$(document).ready(() => {const button = $('#choice-button');let currentState = 'resist';let transitionSpeed = 500;let giveInDuration = 500;let resistDuration = 500;let timeLeft = 10;let buttonInterval;let timerInterval;button.on('click', () => {if (currentState === 'resist') {clearInterval(buttonInterval);clearInterval(timerInterval);Engine.play('SliderGameWon');} else {clearInterval(buttonInterval);clearInterval(timerInterval);Engine.play('GhoulQuestAlterCum');}});function toggleText() {if (currentState === 'resist') {button.fadeOut(transitionSpeed/2, () => {button.text('Submit');currentState = 'give-in';button.fadeIn(transitionSpeed/2);setTimeout(() => {button.fadeOut(transitionSpeed/2, () => {button.text('Resist');currentState = 'resist';button.fadeIn(transitionSpeed/2);});}, giveInDuration);});}};toggleText();buttonInterval = setInterval(toggleText, transitionSpeed + giveInDuration + resistDuration);timerInterval = setInterval(() => {timeLeft--;$('#timer').text(timeLeft);if (timeLeft <= 0) {clearInterval(buttonInterval);clearInterval(timerInterval);Engine.play('GhoulQuestAlterCum');}}, 1000);});<</script>> </div>
<<nobr>> <div class="text-box"> <<set _rand to (0, 2)>> Thrashing in the shallow water you roll to find her ontop of you, pinning you down and exploring your body for its warmth<br><br> <<if _rand is 0>> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/4.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<if _rand is 1>> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/13.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<if _rand is 2>> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/5.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<set _successChance to $PlayerEnergy>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Check Escape Attempt">> <<set _roll to random(1, 100)>> <<set _monsterChance to _successChance>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> <<set $PlayerEnergy to $PlayerEnergy - 30>> You make it to dry ground, the creature made of slime stares at you longingly from the water, unable to leave (Scored: _roll%)<br><br> <<button "Leave the area">> <<set $Position to $OldPosition>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> </div> <<else>> <div class="fail-message"> You try to flee to the bank, but trip on an unseen rock in the dark waters, you crash down onto the ground (scored: _roll%)<br><br> <<button "Continue">> <<goto "SlimeFailed">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>><div class="text-box"> <<set _successChance to $PlayerEnergy>> You make a break for the exit, trying to thrash through the knee deep water<br><br> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Check Escape Attempt">> <<set _roll to random(1, 100)>> <<set _monsterChance to _successChance>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> <<set $PlayerEnergy to $PlayerEnergy - 30>> You make it to dry ground, the creature made of slime stares at you longingly from the water, unable to leave (Scored: _roll%)<br><br> <<button "Leave the area">> <<set $Position to $OldPosition>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> </div> <<else>> <div class="fail-message"> <<set $EnemyHealth to $EnemyHealth - 10>> <<if $PlayerEnergy gt 30>> <<set $PlayerEnergy to $PlayerEnergy - 30>> You try to flee to the bank, but trip on an unseen rock in the dark waters, you crash down onto the ground (scored: _roll%)<br> <<button "Continue">> <<goto "SlimeCG">> <</button>> <<else>> <<set $PlayerEnergy to 0>> You try to flee to the bank, but trip on an unseen rock in the dark waters, you crash down onto the ground (scored: _roll%)<br><br> <<button "Continue">> <<goto "SlimeFailed">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;')>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div><</nobr>>
<<nobr>> <div class="text-box"> You slump to the ground, exhausted. With your hands stuck in slime, you are powerless to stop the girl from enjoying your body, sapping your heat and strength away <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You feel the creature envelop you sapping away your heat and strength <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/2.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/3.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> After a while, the sime returns to the waterm leaving you exhausted but alive<br><br> <<button "Drag yourself out the water">> <<set $Position to $OldPosition>> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> With a thought, flames explode from your palm inglufing the creature in fire, you can hear bubbling as she thrashes and boils. After a few moments of panic she drops down, returning to the safty of the pool. You take the oppertunity to search through the water and find some raggid pelts from unlucky animals which crawled down here<br><br> + 2 pelts<br><br> <<set $Pelts to $Pelts += 2>> <<set $Position to $OldPosition>> <<button "Exit the water">> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _successChance to $PlayerEnergy>> <<if $Position is "null">> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/11.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Your arm and sword sink into the creature, you feel your strength leaving you as you struggle to pull your arm free. With your energy failing, you have _successChance% of breaking from the monster<br><br> <</if>> <<if $Position is "stuck1">> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/12.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Things start to look grim as your other arm becomes stuck to her body, trapping you between the feminine monster, and the wall<br><br> Pinned in position, the creature reforms facing away from you, pressing "her" body into yours while attempting to free your cock. You continue fighting to free yourself from her as you loose more of your strength fall.<br><br> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/9.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<if $Position is "stuck2">> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/10.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You feel her press closer into you, as you sink into her. Pressed between a cold wall and a colder fluid body wrapping around you<br><br> Her arms merge with yours and you feel yourself become more restrained<br><br> <</if>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Try to break free">> <<set _roll to random(1, 100)>> <<set _monsterChance to _successChance>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> You are able to free your arm and sword from the creature (Scored: _roll%)<br><br> <<button "Continue">> <<goto "SlimeSwordSuccess">> <</button>> </div> <<else>> <div class="fail-message"> <<if $PlayerEnergy gt 20>><<set $PlayerEnergy to $PlayerEnergy - 20>><<else>> <<set $PlayerEnergy to 0>><</if>> You fail to free your arm (scored: _roll%)<br> <<if $PlayerEnergy <= 0>> You struggle to recover, sapped of your energy and strength <br><br> <<button "Continue">> <<goto "SlimeFailed">> <</button>> <<else>> <br><br> <<button "Continue">> <<if $Position is "null">> <<set $Position to "stuck1">> <<elseif $Position is "stuck1">> <<set $Position to "stuck2">> <<elseif $Position is "stuck2">> <<set $Position to "stuck3">> <<else>> <</if>> <<goto "SlimeSwordFail">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to "Images/Crypt/Enemy/Slime/7.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <div class="health-bar"> <progress @value=" $EnemyHealth" max="100"></progress><br> </div> Despite being made of fluid, the attack stuns the creature, giving you an opening<br> <hr> <<set _successChance to 20 + $PlayerPower>> <<button "Sword Attack Again (success chance _successChance%)">> <<goto "SlimeSword">> <</button>> <<if ($PlayerMagic >= 20) and ($PlayerSpells.includes("Fire")) or ($PlayerSpells.includes("Inferno"))>><<button "Fire">><<run Engine.play('SlimeFire')>><</button>><</if>> <<set _successChance to $PlayerEnergy>> <<button "Try dodge and flee (success chance _successChance%)">> <<goto "SlimeDodge">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _successChance to 20 + $PlayerPower>> You swing your sword at the monster, putting your power into the swing, you have a _successChance success chance<br><br> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<button "Check Monster Attack">> <<set _roll to random(1, 100)>> <<set _monsterChance to _successChance>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { const fill = document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> <<set $EnemyHealth to $EnemyHealth - 34>> <<if $PlayerEnergy gt 10>><<set $PlayerEnergy to $PlayerEnergy - 10>><<else>> <<set $PlayerEnergy to 0>><</if>> <<if $EnemyHealth <= 0>> <div class="success-message">The monster collapses!</div> <<run setTimeout(() => Engine.play("SlimeWin"), 500)>> <<return>> <</if>> Your blow lands well, slicing through the creature! (Scored: _roll%)<br><br> <<button "Continue">> <<goto "SlimeSwordSuccess">> <</button>> </div> <<else>> <div class="fail-message"> <<set $EnemyHealth to $EnemyHealth - 10>> <<if $PlayerEnergy gt 20>><<set $PlayerEnergy to $PlayerEnergy - 20>><<else>> <<set $PlayerEnergy to 0>><</if>> <<if $EnemyHealth <= 0>> <div class="success-message">The monster collapses!</div> <<run setTimeout(() => Engine.play("SlimeWin"), 500)>> <<return>> <</if>> Your swing goes badly, slicing into the creature and getting stuck! (scored: _roll%)<br> <<if $PlayerEnergy <= 0>> You struggle to recover, sapped of your energy and strength<br><br> <<button "Continue">> <<if $Position is "null">> <<set $Position to "stuck1">> <<elseif $Position is "stuck1">> <<set $Position to "stuck2">> <<elseif $Position is "stuck2">> <<set $Position to "stuck3">> <<else>> <</if>> <<goto "SlimeFailed">> <</button>> <<else>> <br><br> <<button "Continue">> <<goto "SlimeSwordFail">> <</button>> <</if>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </div> <</nobr>>
<<nobr>> <div class="text-box"> Having taken too much damage, the creature slides back into the depths, returning to the safty of the pool. You take the oppertunity to search through the water and find some raggid pelts from unlucky animals which crawled down here<br><br> + 2 pelts<br><br> <<set $Pelts to $Pelts += 2>> <<set $Position to $OldPosition>> <<button "Exit the water">> <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> <<set $executionLock to false>> <<goto "CryptExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="town-menu"> <h1>Harbor’s End Highstreet</h1> <<if ($Time lt 9) and ($Quests.includes("Obtain a silver weapon"))>> <<You>>I should wait till dark to sneak into people's homes<</You>> <</if>> <<if $Time >= 9>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[It's too late, I need to go back to the castle|Base Intro]] </div> <<else>> <<if $VisitedBathHouse is true>> <div class="menu-item disabled" data-image="Images/Town/BathHouse/Rooms/2.png"> You have already visisted the bath house today </div> <<else>> <div class="menu-item" data-image="Images/Town/BathHouse/Rooms/2.png"> [[Bath House]] </div> <</if>> <div class="menu-item" data-image="Images/Town/3.png"> [[Store]] </div> <div class="menu-item" data-image="Images/Town/Demo/4.png"> [[Ally way|TownAllyWay]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Return to the gates|TownOLD]] </div> <</if>> </div> <<set $CloakDisabled to true>> <style> .town-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .town-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .town-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } .menu-item.disabled { opacity: 0.5; cursor: not-allowed; } .menu-item.disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .town-image { text-align: center; margin-top: 20px; } .town-image img { max-width: 100%; height: auto; border-radius: 5px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>>
<<nobr>> <<set $BackgroundPath to "Images/Town/5.png">> <div class="text-box"> The Coast<br><br> <<if $PlayerSpells.includes("Cloak")>> <<if $Cloaked is true>>You enter the <<button "Town">> <<set $OldPosition to "Entrance">> <<set _TownLocation to "Images/Town/Maps/Enterance/5.jpeg">> <<set $ForestLocation to _TownLocation>> <<goto "Town">> <</button>> <<else>> <<set $Cloaked to true>> You cast your cloak spell enter the town<br> <<button "Enter">> <<set $OldPosition to "Entrance">> <<set _TownLocation to "Images/Town/Maps/Enterance/5.jpeg">> <<set $ForestLocation to _TownLocation>> <<goto "Town">> <</button>> <</if>> <<else>> You need to find a way to hide your identity before entering town.<br> <<if $QuestCloak is false>> <<script>> UI.alert("New Quest! <br>Find a way to hide your identity"); <</script>> <<set $QuestCloak to true>> <<run $Quests.push("Find a way to hide your identity")>> <</if>> <</if>> <br> <<button "Return to the castle">><<goto "Base Intro">><</button>> </div> <</nobr>> <<addclass "#right-ui-bar" "stowed">>
<<nobr>> <<set $spellEffects to { "fire": { "descriptions": [ "unleashes a blazing fireball", "conjures flames that dance through the air", "summons a torrent of fire", "creates a burning inferno", "casts scorching flames" ], "images": [] }, "trance": { "descriptions": [ "corrupt their mind", "break down their will", "tempt them" ], "images": [ "Images/Combat/Trance/1.gif", "Images/Combat/Trance/2.gif", "Images/Combat/Trance/3.gif", "Images/Combat/Trance/4.gif", "Images/Combat/Trance/5.gif", "Images/Combat/Trance/6.gif", "Images/Combat/Trance/7.gif", "Images/Combat/Trance/8.gif", "Images/Combat/Trance/9.gif", "Images/Combat/Trance/10.gif" ] }, "disrobe": { "descriptions": [ "cast the disrobe spell, corrupting their mind and forcing them to remove their armour", "cast disrobe causing them to loose themself and remove their armour", "corrupt their mind convincing them to remove their armour" ], "images": [ "Images/Combat/Trance/1.gif", "Images/Combat/Trance/2.gif", "Images/Combat/Trance/3.gif", "Images/Combat/Trance/4.gif", "Images/Combat/Trance/5.gif", "Images/Combat/Trance/6.gif", "Images/Combat/Trance/7.gif", "Images/Combat/Trance/8.gif", "Images/Combat/Trance/9.gif", "Images/Combat/Trance/10.gif" ] } }>> <<set $enemySpellEffects to { "tease": { "descriptions": [ "shows off her body" ], "images": [ "Images/Combat/Tease/1.webp", "Images/Combat/Tease/2.webp", "Images/Combat/Tease/3.webp", "Images/Combat/Tease/4.webp", "Images/Combat/Tease/5.webp", "Images/Combat/Tease/6.webp" ] }, "trance": { "descriptions": [ "weaves a hypnotic spell", "casts an enchanting trance", "conjures mesmerizing magic", "creates a bewitching aura", "summons mind-bending power" ], "images": [ "Images/Combat/Trance/1.gif", "Images/Combat/Trance/2.gif", "Images/Combat/Trance/3.gif", "Images/Combat/Trance/4.gif", "Images/Combat/Trance/5.gif", "Images/Combat/Trance/6.gif", "Images/Combat/Trance/7.gif", "Images/Combat/Trance/8.gif", "Images/Combat/Trance/9.gif", "Images/Combat/Trance/10.gif" ] }, "dominate": { "descriptions": [ "attempts to dominate your mind", "weaves a spell of control", "tries to bend you to their will", "casts a domination enchantment", "seeks to make you their puppet" ], "images": [] }, "corruption": { "descriptions": [ "spreads dark corruption", "unleashes corrupting energy", "casts a spell of decay", "summons twisted magic", "conjures malevolent power" ], "images": [] } }>> <</nobr>>
<div class="text-box"> <<nobr>> Heal - Restors 15 health, costs 10 magic<br><br> Fire - Cast a fireball at the enemy during combat, costs 20 magic<br><br> Trance - Casting trance during combat gives your enemy lustful visions, making them believe they are in thr throws of passion rather can combat. It causes corruption damage based on your magical power and their health, a fully corrupt opponent will submit to you, for a short time<br><br> Cloak - Change how people see you (toggled on left panel) allowing you to enter areas where you usually can't, or trick people who should fear you<br><br> Tear - Once you have built the portal, you can use the tear spell in certain places to create a rip in the void. Alowing you to travel from your castle to that location instantly<br><br> Dominate - Temporally bend someone to your will, requires victem to be weaked, either sleeping, beaten in combat, etc<br><br> Drain - An improved version of the healing spell it uses all your remaining magic to steal the life force of an enemy during combat. Whatever magic you have will be taken from the enemy's heath and and added to yours<br><br> Stalk - Use to vanish before mortals, allowing you to follow them undetected<br><br> Possess - Merge a corrupted soul with a demon, only used certain characters<br><br> [[Back|Spells Shop]] <</nobr>> </div>
<<nobr>> <div class="text-box"> <<button "Spells Guide">> <<goto "Spells Guide">> <</button>><br><br> <h2>Combat Spells</h2> <div id="combat-spells" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<if !$PlayerSpells.includes("Fire")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Fire.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Fire Spell</h3> <p>Cost: 100 Gold</p> <<if $Gold >= 100>> <<button "Purchase Fire Spell">> <<set $Gold to $Gold - 100>> <<run $PlayerSpells.push("Fire")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Drain")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Drain.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Drain Spell</h3> <p>Cost: 150 Gold</p> <<if $Gold >= 150>> <<button "Purchase Drain Spell">> <<set $Gold to $Gold - 150>> <<run $PlayerSpells.push("Drain")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Trance")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Trance.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Trance Spell</h3> <p>Cost: 100 Gold</p> <<if $Gold >= 100>> <<button "Purchase Trance Spell">> <<set $Gold to $Gold - 100>> <<run $PlayerSpells.push("Trance")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Disrobe")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Disrobe.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Disrobe Spell</h3> <p>Cost: 150 Gold</p> <<if $Gold >= 150>> <<button "Purchase Disrobe Spell">> <<set $Gold to $Gold - 150>> <<run $PlayerSpells.push("Disrobe")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> </div> <h2>Quest Spells</h2> <div id="quest-spells" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<if !$PlayerSpells.includes("Cloak")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Cloak.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Cloak Spell</h3> <p>Cost: 150 Gold</p> <<if $Gold >= 150>> <<button "Purchase Cloak Spell">> <<set $Gold to $Gold - 150>> <<set $LucySeen to false>> <<run $PlayerSpells.push("Cloak")>> <<run $Quests.delete("Find a way to hide your identity")>> <<run Engine.play('Spells Shop')>> <<script>> UI.alert("Quest complete!\nYou can now hide your identity!\n(The cloak spell has been added to the left panel above the save button)"); <</script>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if $PortalRoomUnlocked and !$PlayerSpells.includes("Tear")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Tear.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Tear Spell</h3> <p>Cost: 100 Gold</p> <<if $Gold >= 100>> <<button "Purchase Tear Spell">> <<set $Gold to $Gold - 100>> <<run $PlayerSpells.push("Tear")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Stalk")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Stalk.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Stalk Spell</h3> <p>Cost: 200 Gold</p> <<if $Gold >= 200>> <<button "Purchase Stalk Spell">> <<set $Gold to $Gold - 200>> <<run $PlayerSpells.push("Stalk")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Dominate")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Dominate.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dominate Spell</h3> <p>Cost: 150 Gold</p> <<if $Gold >= 150>> <<button "Purchase Dominate Spell">> <<set $Gold to $Gold - 150>> <<run $PlayerSpells.push("Dominate")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> <<if !$PlayerSpells.includes("Possess")>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Items/Spells/Possess.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Possess Spell</h3> <p>Cost: 200 Gold</p> <<if $Gold >= 200>> <<button "Purchase Possess Spell">> <<set $Gold to $Gold - 200>> <<run $PlayerSpells.push("Possess")>> <<run Engine.play('Spells Shop')>> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Leave">> <<goto "Forest Shack">> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _charImg to "Images/Crypt/Spider/Caught/1.png">> You hear the clicking grow louder behind you, but it's too late. The massive arachness drops from above, its eight legs surrounding you as its multiple eyes gleam in the darkness.<br><br> Before you can pull away, she pins you down with her sink <div class="Random-image"> <img @src=_charImg alt="Guest Image"> </div> <<say 'Arachness' _charImg>>I do love it when my prey tries to run away... Now where were we?<</say>> <<set _rand to random(2, 5)>> <<set _imagePath to "Images/Crypt/Spider/hj/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Arachness' _charImg>>Oh, I remember...<</say>> <<set _rand to random(1, 3)>> <<set _imagePath to "Images/Crypt/Spider/bj/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Arachness' _charImg>>Ummm<</say>> <<set _rand to random(4, 5)>> <<set _imagePath to "Images/Crypt/Spider/bj/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<You>>Oh... Fucck<</You>> <<say 'Arachness' _charImg>>Ummm delishous... But I'm not done with you<</say>> <<set _rand to random(1, 5)>> <<set _imagePath to "Images/Crypt/Spider/sex/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Arachness' _charImg>>That was quite the performance... But now, I've worked up an appetite<</say>> <<set _rand to random(2, 6)>> <<set _imagePath to "Images/Crypt/Spider/Caught/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "You die">><<set $PlayerHealth to 0>><<goto "Resporn">><</button>> </div> <</nobr>>
<<nobr>> <<if not $executionLock>> <<set $executionLock to true>> /* Move player */ <<if $Position is "left">> <<set $playerX -= 1>> <<elseif $Position is "right">> <<set $playerX += 1>> <<elseif $Position is "top">> <<set $playerY -= 1>> <<elseif $Position is "bottom">> <<set $playerY += 1>> <</if>> <<set $CryptLocation to $dungeonPaths[$playerY + '-' + $playerX]>> /* Random web trap check - 15% chance per move */ <<set _eventChance to random(1, 100)>> <<if _eventChance <= 15>> <<set _webTrapChance to random(1, 100)>> <<if _webTrapChance <=50>> <<set $executionLock to false>> <<goto "SpiderWebTrap">> <<else>> <<set $executionLock to false>> <<goto "SpiderWebVictim">> <</if>> <<else>> /* Only do spider movement and continue if NOT trapped */ /* Spider movement logic */ <<if $spiderActive>> <<set $spiderMoveCounter += 1>> <<if $spiderMoveCounter >= $spiderMoveFrequency>> <<set $spiderMoveCounter to 0>> /* Store spider's last position */ <<set $spiderLastX to $spiderX>> <<set $spiderLastY to $spiderY>> /* Get spider's current cell and valid moves */ <<set _spiderCell to $dungeon[$spiderY][$spiderX]>> <<set _validSpiderMoves to []>> /* Check each direction for valid moves */ <<if _spiderCell.connections.includes('top') and $spiderY > 0>> <<run _validSpiderMoves.push({x: $spiderX, y: $spiderY - 1, direction: 'top'})>> <</if>> <<if _spiderCell.connections.includes('bottom') and $spiderY < $dungeonSize - 1>> <<run _validSpiderMoves.push({x: $spiderX, y: $spiderY + 1, direction: 'bottom'})>> <</if>> <<if _spiderCell.connections.includes('left') and $spiderX > 0>> <<run _validSpiderMoves.push({x: $spiderX - 1, y: $spiderY, direction: 'left'})>> <</if>> <<if _spiderCell.connections.includes('right') and $spiderX < $dungeonSize - 1>> <<run _validSpiderMoves.push({x: $spiderX + 1, y: $spiderY, direction: 'right'})>> <</if>> /* Spider AI: Move towards player with some randomness */ /* If player is trapped in web, spider becomes more aggressive */ <<set _huntingMode to false>> <<if def $webTrapActive and $webTrapActive>> <<set _huntingMode to true>> <</if>> <<if _validSpiderMoves.length > 0>> <<set _bestMoves to []>> <<set _currentDistance to Math.abs($spiderX - $playerX) + Math.abs($spiderY - $playerY)>> /* Find moves that get closer to player */ <<for _move range _validSpiderMoves>> <<set _newDistance to Math.abs(_move.x - $playerX) + Math.abs(_move.y - $playerY)>> <<if _newDistance < _currentDistance>> <<run _bestMoves.push(_move)>> <</if>> <</for>> /* If no moves get closer, use all valid moves (random movement) */ <<if _bestMoves.length is 0>> <<set _bestMoves to _validSpiderMoves>> <</if>> /* Hunting mode: 90% towards player, normal: 70% towards player, 30% random */ <<set _huntChance to _huntingMode ? 90 : 70>> <<if random(1, 100) <= _huntChance and _bestMoves.length > 0>> <<set _chosenMove to _bestMoves.random()>> <<else>> <<set _chosenMove to _validSpiderMoves.random()>> <</if>> /* Don't move back to the exact same position unless forced or hunting */ <<if _validSpiderMoves.length > 1 and not _huntingMode>> <<set _filteredMoves to _validSpiderMoves.filter(move => !(move.x === $spiderLastX && move.y === $spiderLastY))>> <<if _filteredMoves.length > 0>> <<if random(1, 100) <= _huntChance>> <<set _filteredBestMoves to _bestMoves.filter(move => !(move.x === $spiderLastX && move.y === $spiderLastY))>> <<if _filteredBestMoves.length > 0>> <<set _chosenMove to _filteredBestMoves.random()>> <<else>> <<set _chosenMove to _filteredMoves.random()>> <</if>> <<else>> <<set _chosenMove to _filteredMoves.random()>> <</if>> <</if>> <</if>> /* Execute spider move */ <<set $spiderX to _chosenMove.x>> <<set $spiderY to _chosenMove.y>> <</if>> <</if>> <</if>> <<set $executionLock to false>> /* Check if spider caught player after movement */ <<if $spiderActive and $spiderX is $playerX and $spiderY is $playerY>> <<goto "SpiderCaptured">> <<else>> <<goto "Spider_CryptExplore">> <</if>> <</if>> <</if>> <</nobr>>
<<nobr>> <<if def $webTrapActive>> <<set $webTrapActive to false>> <<set $webCutProgress to 0>> <<set $webNoiseLevel to 0>> <<set $webCuttingActive to false>> <</if>> <<set $CryptLoad to 0>> <<set setup.buildingData = new Map()>> <<set $executionLock to false>> /* Initialize spider system if needed */ <<if not def $spiderActive>> <<set $spiderActive to true>> <<set $spiderChasing to false>> <<set $spiderChaseTimer to 0>> <<set $spiderX to 3>> <<set $spiderY to 3>> <<set $spiderLastKnownX to -1>> <<set $spiderLastKnownY to -1>> <<set $spiderSearchTimer to 0>> <<set $spiderPatrolDirection to "">> <<set $spiderPatrolSteps to 0>> <<set $spiderMaxPatrolSteps to Math.floor(Math.random() * 3) + 2>> /* NEW: Auto-movement timer */ <<set $spiderMoveTimer to 0>> <<set $spiderMoveInterval to 3>> /* Spider moves every 3 seconds */ <</if>> /* Check if spider caught player */ <<if $spiderActive and $spiderX is $playerX and $spiderY is $playerY>> <<goto "SpiderCaptured">> <</if>> <<include "CryptLocationData">> <div class="image-container repair-mode"> <<set _imagePath to $CryptLocation>> <img @src=_imagePath alt="Dungeon Location" width="800" height="800"> /* RANDOM NOISE EVENTS - Only when not chasing */ <<if $spiderActive and not $spiderChasing>> <<set _randomEventChance to 0.08>> <<set _noiseEvent to false>> <<set _eventDescription to "">> /* Higher chance in certain room types */ <<if $CryptLocation.includes("Tomb") or $CryptLocation.includes("Burial")>> <<set _randomEventChance to 0.12>> <<elseif $CryptLocation.includes("Chamber") or $CryptLocation.includes("Hall")>> <<set _randomEventChance to 0.10>> <</if>> /* Movement increases chance */ <<if def $Position and $Position neq "">> <<set _randomEventChance += 0.05>> <</if>> <<if Math.random() < _randomEventChance>> <<set _noiseEvent to true>> <<set _eventRoll to Math.floor(Math.random() * 10)>> <<switch _eventRoll>> <<case 0>> <<set _eventDescription to "Your foot catches on a loose stone, sending it skittering across the floor with a loud CLACK!">> <<case 1>> <<set _eventDescription to "You accidentally brush against an ancient urn, causing it to wobble and scrape against the stone with a grinding noise.">> <<case 2>> <<set _eventDescription to "A pile of old bones shifts under your weight, creating a disturbing rattle that echoes through the corridors.">> <<case 3>> <<set _eventDescription to "Your shoulder bumps into a hanging chain, setting it swinging with metallic clinks that seem to go on forever.">> <<case 4>> <<set _eventDescription to "You step on what feels like pottery shards, the crunch unnaturally loud in the silence.">> <<case 5>> <<set _eventDescription to "A loose piece of masonry falls from above as you pass, hitting the ground with a sharp crack.">> <<case 6>> <<set _eventDescription to "Your hand brushes against a dusty shelf, sending several small objects clattering to the floor.">> <<case 7>> <<set _eventDescription to "You accidentally kick a skull, sending it rolling across the stone with hollow, echoing thuds.">> <<case 8>> <<set _eventDescription to "An old wooden beam creaks ominously as you pass beneath it, the sound carrying far in the stillness.">> <<case 9>> <<set _eventDescription to "You disturb a pile of ancient coins, their metallic cascade creating a symphony of noise.">> <</switch>> /* Start the chase */ <<set $spiderChasing to true>> <<set $spiderChaseTimer to 0>> <div class="noise-event-alert"> <h3 style="color: #ff6600;">💥 CLUMSY ACCIDENT! 💥</h3> <p><em><<print _eventDescription>></em></p> <p style="color: red;"><strong>The noise echoes through the crypt... something stirs in the darkness!</strong></p> </div> <</if>> <</if>> /* IMPROVED SPIDER AI WITH MAP KNOWLEDGE */ <<if $spiderActive>> /* Function to check if spider can move in a direction */ <<set _canSpiderMove to function(fromX, fromY, direction) { if (!State.variables.dungeon || !State.variables.dungeon[fromY] || !State.variables.dungeon[fromY][fromX]) { return false; } var cell = State.variables.dungeon[fromY][fromX]; var newX = fromX; var newY = fromY; switch(direction) { case "left": newX = fromX - 1; break; case "right": newX = fromX + 1; break; case "top": newY = fromY - 1; break; case "bottom": newY = fromY + 1; break; } /* Check bounds */ if (newX < 0 || newX >= State.variables.dungeonSize || newY < 0 || newY >= State.variables.dungeonSize) { return false; } /* Check if current cell has connection in that direction */ return cell.connections && cell.connections.includes(direction); }>> /* Function to get valid moves for spider */ <<set _getValidSpiderMoves to function(x, y) { var moves = []; var directions = ["left", "right", "top", "bottom"]; for (var i = 0; i < directions.length; i++) { var dir = directions[i]; if (State.temporary.canSpiderMove(x, y, dir)) { var newX = x; var newY = y; switch(dir) { case "left": newX = x - 1; break; case "right": newX = x + 1; break; case "top": newY = y - 1; break; case "bottom": newY = y + 1; break; } moves.push({ direction: dir, x: newX, y: newY, distance: Math.abs(newX - State.variables.playerX) + Math.abs(newY - State.variables.playerY) }); } } return moves; }>> /* SPIDER MOVEMENT LOGIC - Now uses map knowledge */ <<if $spiderChasing>> /* CHASING BEHAVIOR - Move toward player using valid paths only */ <<set _validMoves to _getValidSpiderMoves($spiderX, $spiderY)>> <<if _validMoves.length > 0>> /* Find the move that gets closest to player */ <<set _bestMove to _validMoves[0]>> <<for _move range _validMoves>> <<if _move.distance < _bestMove.distance>> <<set _bestMove to _move>> <</if>> <</for>> /* Execute the best move */ <<set $spiderX to _bestMove.x>> <<set $spiderY to _bestMove.y>> <</if>> /* Update last known position */ <<set $spiderLastKnownX to $playerX>> <<set $spiderLastKnownY to $playerY>> <<else>> <<if $spiderLastKnownX >= 0 and $spiderLastKnownY >= 0>> /* SEARCH BEHAVIOR - Move toward last known position */ <<set $spiderSearchTimer += 1>> <<if $spiderSearchTimer < 6>> <<set _validMoves to _getValidSpiderMoves($spiderX, $spiderY)>> <<if _validMoves.length > 0>> /* Find move that gets closest to last known position */ <<set _bestSearchMove to _validMoves[0]>> <<for _move range _validMoves>> <<set _searchDistance to Math.abs(_move.x - $spiderLastKnownX) + Math.abs(_move.y - $spiderLastKnownY)>> <<set _bestSearchDistance to Math.abs(_bestSearchMove.x - $spiderLastKnownX) + Math.abs(_bestSearchMove.y - $spiderLastKnownY)>> <<if _searchDistance < _bestSearchDistance>> <<set _bestSearchMove to _move>> <</if>> <</for>> /* Execute search move */ <<set $spiderX to _bestSearchMove.x>> <<set $spiderY to _bestSearchMove.y>> <</if>> <<else>> /* Give up search, return to patrol mode */ <<set $spiderLastKnownX to -1>> <<set $spiderLastKnownY to -1>> <<set $spiderSearchTimer to 0>> <<set $spiderPatrolDirection to "">> <<set $spiderPatrolSteps to 0>> <</if>> <<else>> /* PATROL BEHAVIOR - Random movement using valid paths */ <<if Math.random() < 0.4>> <<set _validMoves to _getValidSpiderMoves($spiderX, $spiderY)>> <<if _validMoves.length > 0>> <<set _randomMove to _validMoves[Math.floor(Math.random() * _validMoves.length)]>> <<set $spiderX to _randomMove.x>> <<set $spiderY to _randomMove.y>> <</if>> <</if>> <</if>> <</if>> <</if>> /* SPIDER DETECTION SYSTEM */ <<if $spiderActive and not $spiderChasing>> <<set _playerSpiderDistance to Math.abs($playerX - $spiderX) + Math.abs($playerY - $spiderY)>> <<set _canHear to false>> <<set _hearingChance to 0>> /* Distance-based hearing */ <<if _playerSpiderDistance <= 3>> <<set _canHear to true>> <<if _playerSpiderDistance <= 1>> <<set _hearingChance to 0.7>> <<elseif _playerSpiderDistance <= 2>> <<set _hearingChance to 0.4>> <<else>> <<set _hearingChance to 0.2>> <</if>> /* Movement increases hearing chance */ <<if def $Position and $Position neq "">> <<set _hearingChance += 0.3>> <</if>> <</if>> /* Water locations are always loud */ <<if $SlimeSpawnLocations and $SlimeSpawnLocations.includes($CryptLocation)>> <<set _canHear to true>> <<set _hearingChance to 0.8>> <</if>> /* Spider detection */ <<if _canHear and Math.random() < _hearingChance>> <<set $spiderChasing to true>> <<set $spiderChaseTimer to 0>> <div style="background: linear-gradient(45deg, rgba(255, 0, 0, 0.9), rgba(150, 0, 0, 0.9)); border: 3px solid red; padding: 15px; margin: 15px 0; border-radius: 10px; text-align: center;"> <h3 style="color: red;">⚠️ THE SPIDER HEARD YOU! ⚠️</h3> <p>The giant spider has detected your movement and is now hunting you!</p> </div> <</if>> <</if>> /* PROXIMITY INDICATORS AND WARNINGS */ <<set _playerSpiderDistance to Math.abs($playerX - $spiderX) + Math.abs($playerY - $spiderY)>> <<if _playerSpiderDistance <= 4>> <<set _deltaX to $spiderX - $playerX>> <<set _deltaY to $spiderY - $playerY>> <<set _currentCell to $dungeon[$playerY][$playerX]>> /* Determine primary direction to spider */ <<set _indicatorClass to "">> <<set _showIndicator to false>> <<if Math.abs(_deltaX) > Math.abs(_deltaY)>> <<if _deltaX > 0>> /* Spider is to the right */ <<if _currentCell.connections.includes("right")>> <<set _indicatorClass to "spider-indicator-right">> <<set _showIndicator to true>> <</if>> <<else>> /* Spider is to the left */ <<if _currentCell.connections.includes("left")>> <<set _indicatorClass to "spider-indicator-left">> <<set _showIndicator to true>> <</if>> <</if>> <<else>> <<if _deltaY > 0>> /* Spider is below */ <<if _currentCell.connections.includes("bottom")>> <<set _indicatorClass to "spider-indicator-bottom">> <<set _showIndicator to true>> <</if>> <<else>> /* Spider is above */ <<if _currentCell.connections.includes("top")>> <<set _indicatorClass to "spider-indicator-top">> <<set _showIndicator to true>> <</if>> <</if>> <</if>> /* Only show indicator if there's a valid path in that direction */ <<if _showIndicator>> <<set _intensity to "">> <<if _playerSpiderDistance <= 1>> <<set _intensity to "critical">> <<elseif _playerSpiderDistance <= 2>> <<set _intensity to "close">> <<elseif _playerSpiderDistance <= 3>> <<set _intensity to "near">> <<else>> <<set _intensity to "distant">> <</if>> <div @class="'spider-proximity-indicator ' + _indicatorClass + ' intensity-' + _intensity"> <div class="sound-wave wave-1"></div> <div class="sound-wave wave-2"></div> <div class="sound-wave wave-3"></div> </div> <</if>> <</if>> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($CryptLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</endwidget>> <<createHotspots>> </div> <<set _currentCell to $dungeon[$playerY][$playerX]>> /* Text spider proximity warning - only if path exists */ <<if $spiderActive>> <<set _deltaX to $spiderX - $playerX>> <<set _deltaY to $spiderY - $playerY>> <<set _currentCell to $dungeon[$playerY][$playerX]>> <<set _canSenseSpider to false>> /* Check if player can sense spider through available paths */ <<if Math.abs(_deltaX) > Math.abs(_deltaY)>> <<if _deltaX > 0 and _currentCell.connections.includes("right")>> <<set _canSenseSpider to true>> <<elseif _deltaX < 0 and _currentCell.connections.includes("left")>> <<set _canSenseSpider to true>> <</if>> <<else>> <<if _deltaY > 0 and _currentCell.connections.includes("bottom")>> <<set _canSenseSpider to true>> <<elseif _deltaY < 0 and _currentCell.connections.includes("top")>> <<set _canSenseSpider to true>> <</if>> <</if>> <<if _canSenseSpider>> <div class="spider-warning"> <<if _playerSpiderDistance <= 1>> <span style="color: red; font-weight: bold;">⚠️ You hear the spider's legs scraping against stone very close by!</span> <<elseif _playerSpiderDistance <= 2>> <span style="color: orange; font-weight: bold;">⚠️ The clicking of the spider's movement echoes nearby...</span> <<elseif _playerSpiderDistance <= 3>> <span style="color: yellow;">You hear distant skittering sounds.</span> <</if>> </div> <</if>> <</if>> <div class="navigation-buttons"> <div class="nav-row"> <<if _currentCell.connections.includes('top')>> <<button "Up">> <<set $Position to "top">><<goto "Spider_CryptExploreRelay">> <</button>> <</if>> </div> <div class="nav-row"> <<if _currentCell.connections.includes('left')>> <<button "Left">> <<set $Position to "left">><<goto "Spider_CryptExploreRelay">> <</button>> <</if>> <<if _currentCell.connections.includes('right')>> <<button "Right">> <<set $Position to "right">><<goto "Spider_CryptExploreRelay">> <</button>> <</if>> </div> <div class="nav-row"> <<if _currentCell.connections.includes('bottom')>> <<button "Down">> <<set $Position to "bottom">><<goto "Spider_CryptExploreRelay">> <</button>> <</if>> </div> <<if _imagePath.includes("Chamber")>> <<goto "SpiderEscapeSuccess">> <</if>> </div> <style> .spider-alert { background: rgba(139, 0, 0, 0.9); border: 3px solid #ff0000; padding: 15px; margin: 15px 0; border-radius: 10px; text-align: center; animation: alert-pulse 1s infinite alternate; } .chase-warning { background: rgba(139, 0, 0, 0.8); border: 2px solid #ff0000; padding: 20px; margin: 20px 0; border-radius: 10px; text-align: center; } .chase-options { margin-top: 15px; } @keyframes alert-pulse { 0% { box-shadow: 0 0 10px #ff0000; } 100% { box-shadow: 0 0 30px #ff0000; } } .spider-warning { background: rgba(0, 0, 0, 0.8); padding: 10px; margin: 10px 0; border: 2px solid #8b0000; text-align: center; border-radius: 5px; } .navigation-buttons { display: flex; flex-direction: column; align-items: center; gap: 5px; margin-top: 20px; } .nav-row { display: flex; gap: 10px; } .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; width: 800px !important; height: 800px !important; border: 2px solid white !important; } .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: transparent !important; border-radius: 50% !important; border: none !important; } .hotspot .tooltip { opacity: 0; visibility: hidden; position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: opacity 0.3s, visibility 0.3s; } .hotspot:hover { background-color: rgba(255, 255, 255, 0.2) !important; border: 2px solid white !important; } .hotspot:hover .tooltip { opacity: 1; visibility: visible; } .circle.hidden { opacity: 0.1; } /* Spider Proximity Indicator Styles */ .spider-proximity-indicator { position: absolute; pointer-events: none; z-index: 10; } .sound-wave { position: absolute; border: 2px solid #ff0000; border-radius: 50%; animation: pulse-wave 2s infinite; } .sound-wave.wave-1 { animation-delay: 0s; } .sound-wave.wave-2 { animation-delay: 0.7s; } .sound-wave.wave-3 { animation-delay: 1.4s; } /* Directional positioning */ .spider-indicator-top { top: -20px; left: 50%; transform: translateX(-50%); } .spider-indicator-bottom { bottom: -20px; left: 50%; transform: translateX(-50%); } .spider-indicator-left { left: -20px; top: 50%; transform: translateY(-50%); } .spider-indicator-right { right: -20px; top: 50%; transform: translateY(-50%); } /* Intensity-based sizing and animation speed */ .intensity-critical .sound-wave { width: 60px; height: 60px; margin: -30px; animation-duration: 0.8s; border-color: #ff0000; box-shadow: 0 0 20px #ff0000; } .intensity-close .sound-wave { width: 50px; height: 50px; margin: -25px; animation-duration: 1.2s; border-color: #ff3333; box-shadow: 0 0 15px #ff3333; } .intensity-near .sound-wave { width: 40px; height: 40px; margin: -20px; animation-duration: 1.6s; border-color: #ff6666; box-shadow: 0 0 10px #ff6666; } .intensity-distant .sound-wave { width: 30px; height: 30px; margin: -15px; animation-duration: 2.0s; border-color: #ff9999; box-shadow: 0 0 5px #ff9999; } @keyframes pulse-wave { 0% { transform: scale(0.1); opacity: 1; } 50% { opacity: 0.8; } 100% { transform: scale(1); opacity: 0; } } /* Additional pulsing effect for critical proximity */ .intensity-critical { animation: danger-pulse 1s infinite alternate; } @keyframes danger-pulse { 0% { filter: drop-shadow(0 0 5px #ff0000); } 100% { filter: drop-shadow(0 0 15px #ff0000); } } .noise-event-alert { background: linear-gradient(45deg, rgba(255, 102, 0, 0.9), rgba(204, 102, 0, 0.9)); border: 3px solid #ff6600; padding: 15px; margin: 15px 0; border-radius: 10px; text-align: center; animation: noise-pulse 1.5s infinite alternate; box-shadow: 0 0 20px rgba(255, 102, 0, 0.5); } @keyframes noise-pulse { 0% { box-shadow: 0 0 20px rgba(255, 102, 0, 0.5); transform: scale(1); } 100% { box-shadow: 0 0 40px rgba(255, 102, 0, 0.8); transform: scale(1.02); } } </style> <<script>> $(document).ready(function() { if (window.spiderMoveInterval) { clearInterval(window.spiderMoveInterval); } window.spiderMoveInterval = setInterval(function() { if (!State.variables.spiderActive) return; if (!State.variables.spiderChasing && State.variables.spiderLastKnownX < 0) return; var spider = State.variables; var dungeon = spider.dungeon; if (!dungeon || !dungeon[spider.spiderY] || !dungeon[spider.spiderY][spider.spiderX]) return; var cell = dungeon[spider.spiderY][spider.spiderX]; var moves = []; var dirs = ["left", "right", "top", "bottom"]; for (var i = 0; i < dirs.length; i++) { var dir = dirs[i]; if (cell.connections && cell.connections.includes(dir)) { var newX = spider.spiderX; var newY = spider.spiderY; if (dir === "left") newX--; else if (dir === "right") newX++; else if (dir === "top") newY--; else if (dir === "bottom") newY++; if (newX >= 0 && newX < spider.dungeonSize && newY >= 0 && newY < spider.dungeonSize) { moves.push({ x: newX, y: newY, dist: Math.abs(newX - spider.playerX) + Math.abs(newY - spider.playerY) }); } } } if (moves.length === 0) return; var bestMove = moves[0]; for (var j = 1; j < moves.length; j++) { if (moves[j].dist < bestMove.dist) { bestMove = moves[j]; } } spider.spiderX = bestMove.x; spider.spiderY = bestMove.y; if (spider.spiderX === spider.playerX && spider.spiderY === spider.playerY) { Engine.play("SpiderCaptured"); } }, 3000); $(document).on('keydown', function(e) { var dirs = {37: 'left', 38: 'top', 39: 'right', 40: 'bottom'}; if (dirs[e.which]) { var cell = State.variables.dungeon[State.variables.playerY][State.variables.playerX]; if (cell && cell.connections && cell.connections.includes(dirs[e.which])) { State.variables.Position = dirs[e.which]; Engine.play('Spider_CryptExploreRelay'); } } }); }); $(document).one(':passagestart', function() { if (window.spiderMoveInterval) { clearInterval(window.spiderMoveInterval); } }); <</script>> /* Clear movement variable after processing */ <<set $Position to "">> /* Debug info with class for JavaScript updates */ <div class="debug-info" style="background: rgba(0,0,0,0.8); color: white; padding: 10px; margin: 10px 0; font-family: monospace;"> <strong>DEBUG INFO:</strong><br> Player Position: (<<print $playerX>>, <<print $playerY>>)<br> Spider Position: (<<print $spiderX>>, <<print $spiderY>>)<br> Distance: <<print Math.abs($playerX - $spiderX) + Math.abs($playerY - $spiderY)>><br> Spider Active: <<print $spiderActive>><br> Spider Chasing: <<print $spiderChasing>><br> <<if def $spiderLastKnownX and $spiderLastKnownX >= 0>>Last Known Player Pos: (<<print $spiderLastKnownX>>, <<print $spiderLastKnownY>>)<br><</if>> <<if def $spiderSearchTimer>>Search Timer: <<print $spiderSearchTimer>><br><</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' )>> <</nobr>>
<<nobr>> <<set _selectedName = Story.get("CryptNames").text.split("\n").filter(name => name.trim() !== "").random()>> <div id="loading-screen" class="loading-overlay"> <div class="loading-content"> <div class="loading-spinner"></div> <div class="loading-text">Generating Crypt...</div> </div> </div> <<set $NewCrypt to true>> <<set setup.visitedPositions = new Set()>> <<set _img to random(1, 36)>> <<set $BackgroundPath to "Images/Crypt/Chamber/Dynamic/" + _img + ".png">> <<set _dungeonGenerated to false>> <<set _retryCount to 0>> <<set _maxRetries to 10>> <<set $CruptMapFound to false>> <<widget "generateAndValidate">> <<set $dungeon to window.generateDungeon()>> <<set $chamberLocation to window.selectChamberLocation($dungeon)>> <<set _pathInfo to []>> <<for _row = 0; _row < $dungeonSize; _row++>> <<for _col = 0; _col < $dungeonSize; _col++>> <<set _connections = $dungeon[_row][_col].connections>> <<if _row === $chamberLocation.row && _col === $chamberLocation.col>> <<set _imagePath to getChamberImage(_connections)>> <<else>> <<set _imagePath to getImagePath(_connections)>> <</if>> <<run _pathInfo.push({ row: _row, col: _col, path: _imagePath, connections: _connections, isChamber: (_row === $chamberLocation.row && _col === $chamberLocation.col) })>> <</for>> <</for>> <<set $pathInfo to _pathInfo>> <<set $dungeonPaths to {}>> <<for _cell range _pathInfo>> <<set $dungeonPaths[_cell.row + '-' + _cell.col] to _cell.path>> <</for>> <<set _errors to window.validateDungeon($dungeon, _pathInfo, $chamberLocation)>> <<if _errors && _errors.length === 0>> <<set _dungeonGenerated to true>> <<run $("#loading-screen").fadeOut()>> <<run $(".crypt-info").show()>> <<else>> <<set _retryCount += 1>> <<if _retryCount < _maxRetries>> <<timed 100ms>><<generateAndValidate>><</timed>> <<else>> <<goto "CryptDifficulty">> <</if>> <</if>> <<endwidget>> /* Set initial dungeon parameters */ <<if $MaxNotiriaty is 2>> <<set $dungeonSize to random(0, 9) > 3 ? 4 : 4>> <<elseif $MaxNotiriaty <= 4>> <<set $dungeonSize to random(0, 9) <= 3 ? 4 : (random(0, 9) <= 7 ? 6 : 8)>> <<else>> <<set $dungeonSize to random(0, 9) <= 2 ? 4 : (random(0, 9) <= 5 ? 6 : 8)>> <</if>> <<set $CryptSpawnRate to random(3, 5)>> <<set $cryptDifficulty = "Unknown">> <<if $dungeonSize is 4>> <<if $CryptSpawnRate <= 4>> <<set $cryptDifficulty = "Easy">> <<else>> <<set $cryptDifficulty = "Medium">> <</if>> <<elseif $dungeonSize is 6>> <<if $CryptSpawnRate is 3>> <<set $cryptDifficulty = "Easy">> <<else>> <<set $cryptDifficulty = "Medium">> <</if>> <<else>> <<if $CryptSpawnRate is 3>> <<set $cryptDifficulty = "Medium">> <<else>> <<set $cryptDifficulty = "Hard">> <</if>> <</if>> <<timed 500ms>><<generateAndValidate>><</timed>> <div class="text-box"> <<set _rand to random(1, 2)>> <<set _imagePath to "Images/Crypt/Spider/Start/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> [[Wake Up and Escape|Spider_GameInit]] </div> <style> .story-text { background: rgba(0, 0, 0, 0.7); padding: 15px; margin: 15px 0; border-left: 4px solid #8b0000; font-style: italic; color: #ddd; } .story-text p { margin: 10px 0; line-height: 1.4; } </style> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/2.jpg", { hotspots: [ { x: 649, y: 287, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/1.jpg", { hotspots: [ { x: 503, y: 269, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/2.jpg", { hotspots: [ { x: 123, y: 449, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 349, y: 667, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/1.jpg", { hotspots: [ { x: 421, y: 298, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 403, y: 692, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/2.jpg", { hotspots: [ { x: 313, y: 358, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 397, y: 369, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/Cross/3.jpg", { hotspots: [ { x: 317, y: 127, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { x: 447, y: 125, tooltip: "Search Broken Urn", passage: "CryptUrnSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/L-R/2.jpg", { hotspots: [ { x: 142, y: 455, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/L-R/7.jpg", { hotspots: [ { x: 357, y: 316, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { x: 380, y: 484, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/1.jpg", { hotspots: [ { x: 669, y: 95, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 400, y: 414, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/2.jpg", { hotspots: [ { x: 362, y: 309, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T/3.jpg", { hotspots: [ { x: 536, y: 123, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { x: 616, y: 611, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 357, y: 330, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/1.jpg", { hotspots: [ { x: 478, y: 175, tooltip: "Search Coffin", passage: "CryptSearchCoffin", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/1.jpg", { hotspots: [ { x: 263, y: 151, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 417, y: 498, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { x: 411, y: 130, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/3.jpg", { hotspots: [ { x: 121, y: 456, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/1.jpg", { hotspots: [ { x: 331, y: 189, tooltip: "Search Coffin", passage: "CryptSearchCoffin", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/2.jpg", { hotspots: [ { x: 360, y: 134, tooltip: "Search Urn", passage: "CryptSearchUrn", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/5.jpg", { hotspots: [ { x: 294, y: 256, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 401, y: 364, tooltip: "Search Corpse", passage: "CryptSearchCorpse", position: "position" }, { x: 266, y: 494, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/3.jpg", { hotspots: [ { x: 281, y: 283, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-L/6.jpg", { hotspots: [ { x: 30, y: 635, tooltip: "Search Sacks", passage: "CryptSackSearch", position: "position" }, { x: 399, y: 349, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" }, { x: 170, y: 600, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { x: 52, y: 712, tooltip: "Search cell", passage: "CryptCellSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/4.jpg", { hotspots: [ { x: 58, y: 40, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" }, { x: 141, y: 148, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/5.jpg", { hotspots: [ { x: 556, y: 97, tooltip: "Search Tomb", passage: "CryptTombSearch", position: "position" }, { x: 268, y: 271, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/B-R/6.jpg", { hotspots: [ { x: 360, y: 333, tooltip: "Search Table", passage: "CryptSearchTable", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/4.jpg", { hotspots: [ { x: 279, y: 426, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/5.jpg", { hotspots: [ { x: 434, y: 681, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-B/6.jpg", { hotspots: [ { x: 526, y: 196, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { x: 548, y: 348, tooltip: "Search Corps", passage: "CryptSearchCorpse", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-L/6.jpg", { hotspots: [ { x: 401, y: 518, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <<run setup.buildingData.set("Images/Crypt/Maps/T-R/3.jpg", { hotspots: [ { x: 93, y: 107, tooltip: "Search Sacks", passage: "CryptSackSearch", position: "position" }, { x: 228, y: 229, tooltip: "Search Skeleton", passage: "CryptSkeletonSearch", position: "position" }, { x: 84, y: 592, tooltip: "Search Chest", passage: "CryptChestSearch", position: "position" } ] })>> <</nobr>>
<<nobr>> <div class="text-box"> Continuing through the forest, you follow the path as the forest gets darker and darker.<br><br> Picking up the space a bit you start moving back to the entrance of the forest as the trees feel like they closing in.<br><br> You spin around looking behind but the path is empty.... A twig snaps and you spin again, staing into the dark trees flanking the path.<br><br> You don't notice the large mass above you, silently lowering itself down to you...<br><br> As you turn back to continue up the path, you feel a sharp sting in your back. A wave a numbness spreads from the sting, your legs grow week and then give way under you. You slump like a sack of grain but before you slam against the ground something catches you and effortlessly lifts you into the air. <<button "You black out">><<fadeToPassage "SpiderWakeUp">><</button>> <<set $RandomSpiderQuestStarted to true>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You escape into the open air, stepping through the entrance of the crypt and closing the entrance behind you.<br><br> As you collect yourself, you look around and see a small pile, bags, weapons and other trinkets lay in the pile, the Arackness must have removed them from her prey and tossed them asside. Digging through the pile you find the weapons and items she took from you, as well as a few other items of value from other, less fortunate captives<br><br> <<set _foundGold to (100, 300)>> <<set $Gold to $Gold + _foundGold>> <<set _foundPotion to (1, 2)>> <<set $HealingPotion to $HealingPotion + _foundPotion>> You take back your equipment, along with _foundGold gold and <<if _foundPotion is 1>> a healing potion <<else>> healing 2 healing potions<</if>><br><br> <<button "Return to the castle">><<goto "Base Intro">><</button>> </div> <</nobr>>
<<nobr>> <<if not def $playerX>> <<set $playerX to 0>> <<set $playerY to 0>> <<set _startCell to $dungeon[0][0]>> <<set $CryptLocation to $dungeonPaths['0-0']>> <<set $CryptSearchLogs to []>> /* Spider initialization */ <<set $spiderActive to true>> <<set $spiderMoveCounter to 0>> <<set $spiderMoveFrequency to $CryptSpawnRate>> /* Spider moves every X player moves */ /* Spawn spider far from player (0,0) */ <<set _validSpawnPositions to []>> <<set _minDistance to Math.floor($dungeonSize / 2)>> /* Minimum distance from player */ <<for _row = 0; _row < $dungeonSize; _row++>> <<for _col = 0; _col < $dungeonSize; _col++>> <<set _distance to Math.abs(_row - 0) + Math.abs(_col - 0)>> /* Manhattan distance */ <<if _distance >= _minDistance>> <<run _validSpawnPositions.push({x: _col, y: _row})>> <</if>> <</for>> <</for>> <<if _validSpawnPositions.length > 0>> <<set _spawnPos to _validSpawnPositions.random()>> <<set $spiderX to _spawnPos.x>> <<set $spiderY to _spawnPos.y>> <<else>> /* Fallback: spawn at opposite corner */ <<set $spiderX to $dungeonSize - 1>> <<set $spiderY to $dungeonSize - 1>> <</if>> <<set $spiderLastX to $spiderX>> <<set $spiderLastY to $spiderY>> <</if>> <<goto "Spider_CryptExplore">> <</nobr>>
<<nobr>> <<set $spiderActive to false>> <<set $webTrapActive to false>> <div class="trap-capture-scene"> <<set _imagePath to "Images/Crypt/Spider/Caught/1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <div class="capture-text"> <h2>Caught in Your Own Trap!</h2> <p>Your frantic cutting attracted the spider's attention! The massive creature scuttles into view, its eight eyes gleaming with predatory satisfaction as it sees you helplessly tangled in its web.</p> <<if $webNoiseLevel >= 80>> <p>"Such a noisy little morsel," the spider hisses, clicking its mandibles. "Did you really think all that thrashing about would go unnoticed? Your desperation led me right to you."</p> <<elseif $webNoiseLevel >= 50>> <p>"I heard your blade working against my silk," the spider purrs menacingly. "The sound of metal on web is quite distinctive, you know. Thank you for the dinner bell."</p> <<else>> <p>"Even your careful movements couldn't hide you forever," the spider chuckles darkly. "I may have found you by chance, but now you're exactly where I want you - helpless and wrapped up like a present."</p> <</if>> <p>The spider approaches slowly, savoring your predicament. The web strands tighten around you as the creature begins to spin additional silk, ensuring you won't be escaping this time.</p> <p>Your knife lies just out of reach where you dropped it in your panic. The spider notices and kicks it away with one of its legs.</p> <p>"No more cutting tools for you, little prey. Now you'll learn what happens to those who dare enter my domain..."</p> </div> <div class="capture-stats"> <div class="stat-row"> <strong>Final Cutting Progress:</strong> <<print Math.floor($webCutProgress)>>% </div> <div class="stat-row"> <strong>Noise Level Reached:</strong> <<print Math.floor($webNoiseLevel)>>% </div> <div class="stat-row"> <strong>Spider Distance When Caught:</strong> <<print Math.abs($playerX - $spiderX) + Math.abs($playerY - $spiderY)>> spaces </div> </div> <div class="capture-options"> <button onclick="SugarCube.Engine.play('SpiderGameOver')">Accept Your Fate</button> <button onclick="SugarCube.Engine.play('Spider_GameInit')">Try Again</button> </div> </div> <style> .trap-capture-scene { text-align: center; background: rgba(20, 20, 20, 0.95); padding: 20px; border: 3px solid #8b0000; margin: 20px; border-radius: 10px; color: #fff; } .capture-text { background: rgba(139, 0, 0, 0.3); padding: 20px; margin: 20px 0; border-radius: 10px; text-align: left; } .capture-text h2 { color: #ff4444; text-shadow: 2px 2px 4px #000; margin-bottom: 15px; text-align: center; } .capture-text p { margin-bottom: 15px; line-height: 1.6; font-size: 16px; } .capture-stats { background: rgba(0, 0, 0, 0.6); padding: 15px; border-radius: 5px; margin: 20px 0; } .stat-row { margin: 8px 0; font-size: 16px; } .capture-options { margin-top: 30px; } .capture-options button { background: linear-gradient(45deg, #8b0000, #a52a2a); color: white; border: 2px solid #654321; padding: 15px 30px; font-size: 16px; font-weight: bold; border-radius: 8px; cursor: pointer; margin: 0 10px; transition: all 0.3s; } .capture-options button:hover { background: linear-gradient(45deg, #a52a2a, #dc143c); box-shadow: 0 0 20px rgba(139, 0, 0, 0.7); } </style> <</nobr>>
<<nobr>> <div class="text-box"> <<set _rand to random(1, 2)>> <<set _charImg to "Images/Crypt/Spider/Start/" + _rand + ".png">> Slowly, you come around, you try to move but tight cords keep you in place <<say 'Arachness' _charImg>>Oh good, you're awake<</say>> You look up into the eyes of a monster gasing down at you. An enormal arachness watching you with both interest and delight <div class="Random-image"> <img @src=_charImg alt="Guest Image"> </div> <<say 'Arachness' _charImg>>Normally my prey are out for soo much longer, but you're different<</say>> You become aware that your heart is pounding hard, even dispite the unease of your situation, you also feel a heat growing between your legs<br><br> The arackness laughts in acknowledgement of your realisation <<say 'Arachness' _imagePath>>Ha, someones happy to see me... Don't look so shocked, my venom works in two stages, firstly it knocks you out so I can bring you down here... Then it acts as an aphrodisiac, increasing your blood flow and heart rate<</say>> She expertly slices though the silk web holding you at bay and takes hold of your manhood <<set _imagePath to "Images/Crypt/Spider/hj/1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<say 'Arachness' _charImg>>By now a normal pray would be begging for release... I normally don't indulge in their final requests but in your case, I think I'd like to play with my food<</say>> The lowers herself to your hardening member and begins to play with you <<set _imagePath to "Images/Crypt/Spider/bj/2.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> You quickly find yourself forgetting about your situation and giving into her skill as the aphrodisiac causes you to become weeker to her advances<br><br> After what feels like hours of pleasure, you hear a crash echo down the corridors of the crypt, the arachness pulls away, to your dissapointment <<say 'Arachness' _charImg>>Hummm, sorry little fly, I'll be back soon to finish, don't go anywhere, ha<</say>> <<button "She leaves">><<goto "Spider_CryptGeneration">><</button>> </div> <</nobr>>
<<nobr>> <<set $webTrapActive to true>> <<set $webCutProgress to 0>> <<set $webNoiseLevel to 0>> <<set $webCuttingActive to false>> <<set $webTrapTimer to 0>> <div class="web-trap-scene"> <<set _rand to random(1, 10)>> <<set _imagePath to "Images/Crypt/Spider/Fem/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <div class="trap-info"> <h2>A trapped corridor</h2> <p> You've entered a corridor thick with webs, you can see another one of the spider's playthings ahead, a woman who must have become stuck in the sticky webs and entangled when the arachness found her. You'll need to rip your way around her to progress, but without a blade that will be a noisy task</p> <div class="progress-bars"> <div class="progress-container"> <label>Cutting Progress:</label> <div class="progress-bar"> <div class="progress-fill cutting-progress" @style="'width: ' + $webCutProgress + '%'"></div> </div> <span class="progress-text"><<print $webCutProgress>>%</span> </div> <div class="progress-container"> <label>Noise Level:</label> <div class="progress-bar noise-bar"> <div class="progress-fill noise-progress" @style="'width: ' + $webNoiseLevel + '%'"></div> </div> <span class="progress-text"><<print $webNoiseLevel>>%</span> </div> </div> <div class="spider-distance"> <strong>Spider Distance:</strong> <<print Math.abs($playerX - $spiderX) + Math.abs($playerY - $spiderY)>> spaces away </div> </div> <div class="cutting-controls"> <div class="instructions"> <p><strong>Hold the button to cut the webs with your knife.</strong></p> <p>Cut slowly and quietly, or risk it all with fast, loud cutting!</p> </div> <button id="cutButton" class="cut-button"> <span class="button-text">Hold to Cut Webs</span> </button> <<if $webCutProgress >= 100>> <div class="escape-option"> <button class="escape-button" onclick="SugarCube.Engine.play('CryptExplore')"> Break Free! </button> </div> <</if>> </div> </div> <style> .web-trap-scene { text-align: center; background: rgba(20, 20, 20, 0.95); padding: 20px; border: 3px solid #8b4513; margin: 20px; border-radius: 10px; } .trap-info { background: rgba(139, 69, 19, 0.3); padding: 20px; margin: 20px 0; border-radius: 10px; color: #fff; } .trap-info h2 { color: #daa520; text-shadow: 2px 2px 4px #000; margin-bottom: 15px; } .progress-bars { display: flex; flex-direction: column; gap: 15px; margin: 20px 0; } .progress-container { display: flex; align-items: center; gap: 10px; } .progress-container label { min-width: 120px; text-align: left; font-weight: bold; } .progress-bar { flex: 1; height: 25px; background: rgba(0, 0, 0, 0.7); border: 2px solid #666; border-radius: 5px; overflow: hidden; position: relative; } .progress-fill { height: 100%; transition: width 0.3s ease; } .cutting-progress { background: linear-gradient(90deg, #4CAF50, #8BC34A); box-shadow: 0 0 10px rgba(76, 175, 80, 0.5); } .noise-progress { background: linear-gradient(90deg, #FFC107, #FF5722); box-shadow: 0 0 10px rgba(255, 193, 7, 0.5); } .progress-text { min-width: 50px; text-align: right; font-weight: bold; } .spider-distance { background: rgba(0, 0, 0, 0.6); padding: 10px; border-radius: 5px; margin: 15px 0; } .cutting-controls { margin-top: 30px; } .instructions { background: rgba(0, 0, 0, 0.6); padding: 15px; border-radius: 5px; margin-bottom: 20px; } .cut-button { background: linear-gradient(45deg, #8B4513, #A0522D); color: white; border: 3px solid #654321; padding: 20px 40px; font-size: 18px; font-weight: bold; border-radius: 10px; cursor: pointer; transition: all 0.3s; user-select: none; position: relative; overflow: hidden; } .cut-button:hover { background: linear-gradient(45deg, #A0522D, #CD853F); box-shadow: 0 0 20px rgba(139, 69, 19, 0.7); } .cut-button:active { background: linear-gradient(45deg, #654321, #8B4513); transform: scale(0.98); } .cut-button.cutting { animation: cutting-pulse 0.5s infinite; } @keyframes cutting-pulse { 0% { box-shadow: 0 0 10px rgba(139, 69, 19, 0.5); } 50% { box-shadow: 0 0 30px rgba(255, 193, 7, 0.8); } 100% { box-shadow: 0 0 10px rgba(139, 69, 19, 0.5); } } .escape-button { background: linear-gradient(45deg, #4CAF50, #8BC34A); color: white; border: 3px solid #2E7D32; padding: 15px 30px; font-size: 16px; font-weight: bold; border-radius: 8px; cursor: pointer; margin-top: 15px; transition: all 0.3s; } .escape-button:hover { background: linear-gradient(45deg, #66BB6A, #AED581); box-shadow: 0 0 20px rgba(76, 175, 80, 0.7); } </style> <</nobr>> <<script>> $(document).ready(function() { var cutButton = $('#cutButton'); var isMouseDown = false; var spiderAlerted = false; window.webTrapVars = { cuttingInterval: null, spiderMoveInterval: null, noiseDecayInterval: null }; function moveSpider() { if (!State.variables.dungeon) return; var validMoves = []; if (State.variables.spiderY > 0) validMoves.push({x: State.variables.spiderX, y: State.variables.spiderY - 1}); if (State.variables.spiderY < State.variables.dungeonSize - 1) validMoves.push({x: State.variables.spiderX, y: State.variables.spiderY + 1}); if (State.variables.spiderX > 0) validMoves.push({x: State.variables.spiderX - 1, y: State.variables.spiderY}); if (State.variables.spiderX < State.variables.dungeonSize - 1) validMoves.push({x: State.variables.spiderX + 1, y: State.variables.spiderY}); if (validMoves.length > 0) { var currentDist = Math.abs(State.variables.spiderX - State.variables.playerX) + Math.abs(State.variables.spiderY - State.variables.playerY); var bestMoves = []; for (var i = 0; i < validMoves.length; i++) { var move = validMoves[i]; var newDist = Math.abs(move.x - State.variables.playerX) + Math.abs(move.y - State.variables.playerY); if (newDist < currentDist) bestMoves.push(move); } var chosenMove; if (spiderAlerted || (Math.random() < 0.7 && bestMoves.length > 0)) { chosenMove = bestMoves.length > 0 ? bestMoves[Math.floor(Math.random() * bestMoves.length)] : validMoves[Math.floor(Math.random() * validMoves.length)]; } else { chosenMove = validMoves[Math.floor(Math.random() * validMoves.length)]; } State.variables.spiderX = chosenMove.x; State.variables.spiderY = chosenMove.y; } } window.webTrapFunctions = { moveSpider: moveSpider }; }); <</script>> <<script>> $(document).ready(function() { function updateDisplay() { $('.cutting-progress').css('width', State.variables.webCutProgress + '%'); $('.noise-progress').css('width', State.variables.webNoiseLevel + '%'); $('.progress-text').eq(0).text(Math.floor(State.variables.webCutProgress) + '%'); $('.progress-text').eq(1).text(Math.floor(State.variables.webNoiseLevel) + '%'); var distance = Math.abs(State.variables.playerX - State.variables.spiderX) + Math.abs(State.variables.playerY - State.variables.spiderY); var distanceText = '<strong>Spider Distance:</strong> ' + distance + ' spaces away'; if (window.spiderAlerted) { distanceText += '<span style="color: red; font-weight: bold;"> - HUNTING!</span>'; } else if (distance <= 2) { distanceText += '<span style="color: red;"> - DANGER!</span>'; } else if (distance <= 4) { distanceText += '<span style="color: orange;"> - Close</span>'; } $('.spider-distance').html(distanceText); if (State.variables.webCutProgress >= 100) $('.escape-option').show(); } window.webTrapFunctions.updateDisplay = updateDisplay; updateDisplay(); }); <</script>> <<script>> $(document).ready(function() { function checkGameState() { if (State.variables.webNoiseLevel >= 100 && !window.spiderAlerted) { window.spiderAlerted = true; State.variables.webNoiseLevel = 100; $('.trap-info h2').html('Spider Heard You!'); $('.trap-info p').html('<span style="color: red;">Too loud! Spider coming fast!</span>'); clearInterval(window.webTrapVars.spiderMoveInterval); window.webTrapVars.spiderMoveInterval = setInterval(function() { if (State.variables.webTrapActive) { window.webTrapFunctions.moveSpider(); window.webTrapFunctions.updateDisplay(); checkGameState(); } }, 800); } if (State.variables.webCutProgress >= 100) { State.variables.webTrapActive = false; cleanup(); Engine.play('Spider_CryptExplore'); return; } if (State.variables.spiderX === State.variables.playerX && State.variables.spiderY === State.variables.playerY) { cleanup(); Engine.play('SpiderTrapCaptured'); return; } } function cleanup() { if (window.webTrapVars.cuttingInterval) clearInterval(window.webTrapVars.cuttingInterval); if (window.webTrapVars.spiderMoveInterval) clearInterval(window.webTrapVars.spiderMoveInterval); if (window.webTrapVars.noiseDecayInterval) clearInterval(window.webTrapVars.noiseDecayInterval); } window.webTrapFunctions.checkGameState = checkGameState; window.webTrapFunctions.cleanup = cleanup; }); <</script>> <<script>> $(document).ready(function() { var cutButton = $('#cutButton'); var isMouseDown = false; function startCutting() { State.variables.webCuttingActive = true; window.webTrapVars.cuttingInterval = setInterval(function() { if (!isMouseDown || State.variables.webCutProgress >= 100) { stopCutting(); return; } State.variables.webCutProgress = Math.min(100, State.variables.webCutProgress + Math.random() * 3 + 3); State.variables.webNoiseLevel = Math.min(100, State.variables.webNoiseLevel + Math.random() * 6 + 6); window.webTrapFunctions.updateDisplay(); window.webTrapFunctions.checkGameState(); }, 100); } function stopCutting() { State.variables.webCuttingActive = false; if (window.webTrapVars.cuttingInterval) clearInterval(window.webTrapVars.cuttingInterval); } function scheduleNextSpiderMove() { var moveDelay; if (window.spiderAlerted) { moveDelay = 1000; // Fast when alerted } else if (State.variables.webNoiseLevel < 30) { moveDelay = 7000; // Very slow when quiet } else if (State.variables.webNoiseLevel < 60) { moveDelay = 5000; // Moderate when some noise } else { moveDelay = 4000; // Normal speed when noisy } window.webTrapVars.spiderMoveInterval = setTimeout(function() { if (State.variables.webTrapActive) { window.webTrapFunctions.moveSpider(); window.webTrapFunctions.updateDisplay(); window.webTrapFunctions.checkGameState(); scheduleNextSpiderMove(); // Schedule next move } }, moveDelay); } scheduleNextSpiderMove(); // Start the cycle window.webTrapVars.noiseDecayInterval = setInterval(function() { if (State.variables.webTrapActive && !State.variables.webCuttingActive && !window.spiderAlerted) { State.variables.webNoiseLevel = Math.max(0, State.variables.webNoiseLevel - Math.random() * 8 - 8); window.webTrapFunctions.updateDisplay(); } }, 500); cutButton.on('mousedown touchstart', function(e) { e.preventDefault(); if (State.variables.webCutProgress >= 100) return; isMouseDown = true; $(this).addClass('cutting'); startCutting(); }); $(document).on('mouseup touchend', function(e) { if (isMouseDown) { isMouseDown = false; cutButton.removeClass('cutting'); stopCutting(); } }); cutButton.on('contextmenu', function(e) { e.preventDefault(); }); $(window).on('beforeunload', function() { window.webTrapFunctions.cleanup(); }); }); <</script>>
<<nobr>> <div class="text-box"> <<set _rand to random(11, 14)>> <<set _charImg to "Images/Crypt/Spider/Fem/Sex/" + _rand + ".png">> <div class="Random-image"> <img @src=_charImg alt="Guest Image"> </div> <<say 'Woman' _charImg>>Mph!<</say>> <<You>>I don't have time for this<</You>> <<say 'Woman' _charImg>>Mmmph!<</say>> <<button "Leave her">><<goto "Spider_CryptExplore">><</button>><br> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _rand to random(1, 8)>> <<set _charImg to "Images/Crypt/Spider/Fem/Sex/" + _rand + ".png">> Continuing down the corridor, you come across one of the arachness' prisoners in an unusual position. The venom driving her to want nothing more than pleasure <div class="Random-image"> <img @src=_charImg alt="Guest Image"> </div> <<say 'Woman' _charImg>>Mph!<</say>> <<You>>I don't have time for this<</You>> <<say 'Woman' _charImg>>Mmmph!<</say>> <<button "Leave her">><<goto "Spider_CryptExplore">><</button>><br> </div> <</nobr>>
<<nobr>> <<set _Vid to random(1, 3)>> <<set _Img to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/" + _Img + ".png">> <<set $VidPath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/" + _Vid>> <<if $Position is "Lick">> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "Miss">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Behind">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Cg">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <</if>> <<if $Position is "Bj">> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Fcum">> <<set $VidPath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $Position + "/1">> <</if>> <div class="text-box"> <<if $Position isnot "Fcum">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<else>> <<set $Position to $OldPosition>> <</if>> <<set _GifPath to $VidPath + ".gif">> <<set _WebpPath to $VidPath + ".webp">> <div class="centered-image"> <img @src="_WebpPath" onerror="this.style.display='none'"> </div> <div class="centered-image"> <img @src="_GifPath" onerror="this.style.display='none'"> </div> <<if $NPCCum >= 100>> <<set $OldPosition to $Position>> <<set $Position to "Fcum">> <<link "She cums">><<set $NPCCum to 0>><<run Engine.show()>><</link>> <<elseif $PlayerCum >= 100>> <<if $PlayerCum lt 200>> <<set $HouseVisit to false>> You feel yourself getting close, you choose to cum: <br><br> On her <<link "face">><<set $Position to "Face">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "mouth">><<set $Position to "Mouth">><<set $PlayerCum to 200>><<run Engine.show()>><</link>><br> In her <<link "Pussy">><<set $Position to "Inside">><<set $PlayerCum to 200>><<run Engine.show()>><</link>> <<else>> The girl passes out with pleasure. It will take a while for the spell to wear off, you look at her and think of what to do<br><br> <<if $CellsCount > $DungonOccupance.length>> <<link "Take her to the castle">><<run Engine.play('StalkKidnap')>><</link>><br><br> <<else>> Your cells are too full for another prisoner<br><br> <</if>> <<link "you leave her">><<run Engine.play('Base Intro')>><</link>><br><br> <</if>> <<else>> <<link "Keep going">><<run Engine.play('StalkBedroomFuck2')>><</link>><br> <<link "Change position">><<run Engine.play('StalkBedroomFuck')>><</link>> <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <div class="text-box"> You sneek up behind the woman and wipser in her ear, dominating her mind for a short time<br><br> She looks confused for a moment, before turning to you and smilling<br><br> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <span style="color: #FF1493;">Woman: Hello my love, its so good to see you</span><br><br> <<You>>Undress and go to the bed, I'll meet you shortly<</You>><br><br> <span style="color: #FF1493;">Woman: Anything for you, love</span><br><br> She turns and walks away<br><br> <<if _Room is "Bedroom">> <<link "Return">><<run Engine.play("ForestStalkUpperHall")>><</link>> <<else>> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> <</if>> <<set $WomanLocation to "Dominated">> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _Img to random(1, 2)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/Ready/" + _Img + ".png">> <div class="text-box"> <span style="color: #FF1493;">Woman: What do you want to do?</span> <br><br> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <hr> Pleasure her<br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('StalkBedroomFuck2')>><</link>> <hr> Fuck her<br> <<link "Get on top">><<set $Position to "Miss">><<run Engine.play('StalkBedroomFuck2')>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.play('StalkBedroomFuck2')>><</link>><br> <<link "Let her ride you">><<set $Position to "Cg">><<run Engine.play('StalkBedroomFuck2')>><</link>> <hr> Pleasure Yourself<br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('StalkBedroomFuck2')>><</link>> <hr> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You follow the girl through the forest, while she cannot see you, you try your best to avoide stepping on any sticks. Eventually after some time you reach [[her home|RandomForestHome]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<set $ReturnPassage to "Forrest Explore">> <<nobr>> <div class="text-box"> <<set $Position to "null">> You spot a young woman walking in the forest<br><br> <<if $CurrentPlayer is "Overlord">> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set $NPCInt to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + $NPCInt + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $PlayerSpells.includes("Stalk")>><<link "Cast your stalk spell">> <<set $Position to "Stalk">> <<run Engine.play('RandomForestHome')>><</link>> <<else>> You dont have the right spell to follow her<br><br> <<button "Leave">> <<goto "ForestExplore">> <</button>> <</if>> <<if $CurrentPlayer is "Lucy">> <<set $NPCWants to [ "To help you", "To fuck you", "To rob you"]>> <<set _int to random(0, 2)>> <<set $NPCWants to $NPCWants[_int]>> You come across a man walking through the forest<br><br> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <span style="color: #8CC5F3;">Man: Hello!</span><br><br> You think for a moment about what you want from this man, and how you plan to get it... With your demonic powers, you can see into the mans soul and tell what he want's this can help you manipulate him<br><br> <div class="character-card"> <div class="character-image"> <img @src=_imagePath alt="Guest Image"> </div> <div class="character-info"> <p><span class="info-label">Wants: $NPCWants</span> <<print $Wants>></p> </p> <<link "Act innocent">><<set $Position to "Innocent">><<run Engine.play("LucyStalkMeet")>><</link>> <<link "Act lost">><<set $Position to "Lost">><<run Engine.play("LucyStalkMeet")>><</link>> <<link "Act playful">><<set $Position to "Playful">><<run Engine.play("LucyStalkMeet")>><</link>> <</if>><</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set $ItemLocation to "null">> <<set _int to random(0, 2)>> <<if _int == 0>> You find two lock picks <br><br> <<set $LockPicks to $LockPicks + 2>> <<elseif _int == 1>> <<set _int to random(10, 100)>> You find _int gold<br><br> <<set $Gold to $Gold + _int>> <<else>> You found nothing<br><br> <</if>> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $PlayerCum lt 200>> You knock the young woman out and pick her up, it will be a long walk carrying her back to the castle, but you are sure you can find a use for her<br><br> <<else>> In her unconscious state, you pick up the woman and her clothes and take her back to the dungeon<br><br> <</if>> <<link "Return to the castle">><<set $HouseVisit to false>><<run Engine.play("Base Intro")>><</link>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 15)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, NPCID: _npcId, name: "Villager", job: "Unknown", hiddenJob: "Unknown", sex: "Female", hairColor: $NPC, ImagePath: "Images/Castle/Dungon/Woman/" + $NPC + "/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>>
<<nobr>> <div class="text-box"> <<set $Souls to $Souls + 1>> <<if $ImagePath.includes("/Female/")>> <<if $PlayerCum lt 200>> Deciding to take a more mercyless approach, you stand and draw your dagger<br><br> As you approach, she hears you and turns. Her smile turns to horror but before she can scream, you are on her. You cover her mouth with one hand and cut her throat with the other... After a short moment, strength leaves her, her eyes roll back and her soul is yours<br><br> You pause to think on what you have done, slaying bandits and demons is nothing to you, but this... <br><br> <<set $WomanLocation to "dead">> <<else>> With the villager passed out and unable to defend herself you lean in for a kiss, enjoying the moment as you take her soul<br><br> <</if>> <<else>> Drawing a blade, you sneak up behind the man before covering his mouth with one hand and pushing the blade into his heart, his eyes go wide for a moment and you feel is soul enter your body<br><br> <<set $HusbandHome to false>> <<set $ManLocation to "dead">> <</if>> This act of violance wont go unnoticed, you know the villagers will blame the castle for this murder... Your influence over Scarldale slips<br><br> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> <<if $scarldale.influence != 0>> <<set $scarldale.influence -= 1>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _int to random (5, 25)>> taking out a small black jack, you sneak behind the man and knock him out cold, he wont be getting up for a few hours<br><br> You quickly search him and find _int gold<br><br> <<set $ManLocation to "dead">> <<set $Gold to $Gold + _int>> <<link "Return">><<run Engine.play($ReturnPassage)>><</link>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _NPCList to ["Blonde", "Brown", "Red"]>> <<set _int to random(0, 2)>> <<set $NPC to _NPCList[_int]>> <<set _int to random(1, 3)>> <<set $ImagePath to "Images/Forrest/Encounters/Human/Female/NPC/" + $NPC + "/" + _int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> [[Approach her|StalkTownApproach]]<br><br> <<if $PlayerSpells.includes("Stalk")>><<link "Cast your stalk spell">><<run Engine.play('StalkTownSpell')>><</link>><</if>> </div> <</nobr>>
<<nobr>> /* This is the starting passage that ensures proper initialization */ <<goto "Title">> <</nobr>>
<div class="text-box"> <<nobr>> You enter your room for the night, and remove your top clothes<br><br> After a short time you notice Alice, stood at the door, stairing at you<br><br> <<Alice>>I wanted to show you how grateful I am that you helped up...<</Alice>><br><br> She turns and reveals her open dress, letting it slip from her shoulders<br><br> <div align="center"> <img src="Images/Town/AliceHouse/4.png" width="700" height="700"> </div><br><br> <<Alice>>I've been saving myself, for a husband but after what you did today I know you are what I need<</Alice>><br><br> She lets her dress fall to the ground<br><br> <div align="center"> <img src="Images/Town/AliceHouse/5.png" width="700" height="700"> </div><br><br> You walk over to her and kneel, pressing your face between her ass cheeks and tasting her virgin cunt<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/10.webm" type="video/webm"> </video><br><br> Alice lets out a quiver and her kneels shake, its clear this is a first for her<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/11.webm" type="video/webm"> </video><br><br> After tasting her, you stand and allow her to return the favor, she drops to her knees and takes your cock in her mouth<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/12.webm" type="video/webm"> </video><br><br> You take her head and guide her to the bed, sitting down and watching her worship your manhood<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/13.webm" type="video/webm"> </video><br><br> After a while, you tell her to stop and take her onto the bed before pushing yourself inside her virgin cunt<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/14.webm" type="video/webm"> </video><br><br> <<Alice>>Oh my gods your too big, I...<</Alice>><br><br> You don't give her a chance to finish, you grab her head and fuck her hard<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/15.webm" type="video/webm"> </video><br><br> After taking her from behind, you can see her mind is starting to break. You pull out and let her take over<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/16.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/17.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/18.webm" type="video/webm"> </video><br><br> After a short time her tight hole is too much for you and you pull out of her<br><br> <<Alice>>Yes, feed me<</Alice>><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/19.webm" type="video/webm"> </video><br><br> You cum on Alice's face and she licks it off her hand, swallowing your seed and coming closer to corruption<br><br> Alice passes out, and you take her back to you castle, covering her with a rag on the back of your horse, you're sure her farther would understand<br><br> <<if $CellsCount == $DungonOccupance.length>> Your cells are already full, so you quickly remove the current captives...<br><br> <<if $DungonOccupance[0] == "Lucy">> <<run $DungonOccupance.splice(1, 1)>> <<else>> <<run $DungonOccupance.splice(0, 1)>> <</if>> <<set $Souls to $Souls + 1>> <</if>> <<set $AliceQuestStatus to "Over">> [[Ride home|Base Intro]] <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", hairColor: "Red", ImagePath: "Images/Castle/Dungon/Woman/5/2.png", corruption: 0, status: "Imprisoned" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You sleep on a cot in the living room before waking around midnight<br><br> You get out of bed and enter Alice's room, she wakes as you enter the room and sits up, you see the ring is still in her hand<br><br> <div align="center"> <img src="Images/Town/AliceHouse/3.png" width="700" height="700"> </div><br><br> <<Alice>>Please lay down next to me<</Alice>><br><br> Wordlessly, you lay next to the girl and she embraces you<br><br> You both share a kiss, before she stands before you and removes her nigh gown<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/1.webm" type="video/webm"> </video><br><br> <<Alice>>Thank you so much for helping me<</Alice>><br><br> She crawls to you and removes your clothes<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/2.webm" type="video/webm"> </video><br><br> You let Alice take the lead and watch her suck you<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/3.webm" type="video/webm"> </video><br><br> After shes satified with how hard and wet your cock is, she turns around<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/4.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/5.webm" type="video/webm"> </video><br><br> Alice removes her underwear, showing of her cunt and inviting you in<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/6.webm" type="video/webm"> </video><br><br> You take the lead and fuck her from behind<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/7.webm" type="video/webm"> </video><br><br> <<Alice>>Yes, gods... Fuck me!<</Alice>><br><br> You're not able to resist much longer and feel yourself starting to cum<br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/8.webm" type="video/webm"> </video><br><br> <<You>>Turn around<</You>> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/8.webm" type="video/webm"> </video><br><br> <<Alice>>Yes, feed me<</Alice>><br><br> <video autoplay loop> <source src="Images/Town/AliceHouse/Fuck/9.webm" type="video/webm"> </video><br><br> You cum on Alice's face and she licks it off her hand, swallowing your seed and coming closer to corruption<br><br> Alice passes out, and you take her back to you castle, covering her with a rag on the back of your horse<br><br> <<if $CellsCount == $DungonOccupance.length>> Your cells are already full, so you quickly remove the current captives...<br><br> <<if $DungonOccupance[0] == "Lucy">> <<run $DungonOccupance.splice(1, 1)>> <<else>> <<run $DungonOccupance.splice(0, 1)>> <</if>> <<set $Souls to $Souls + 1>> <</if>> <<set $AliceQuestStatus to "Over">> [[Ride home|Base Intro]] <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set $CurrentEnemy = { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", hairColor: "Red", ImagePath: "Images/Castle/Dungon/Woman/5/2.png", corruption: 0, status: "Imprisoned" }>> <<run State.variables.DungonOccupance.push($CurrentEnemy)>> <</nobr>> </div>
<<nobr>> <<set $SettlementLocation to "Outdoor">> <<set $ReturnPassage to passage()>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <div class="text-box"> <<if _location.outdoorNPCs && _location.outdoorNPCs.length > 0>> <div class="npc-container"> <<for _npc range _location.outdoorNPCs>> <<set _buildingId to _npc.building>> <<set _building to _location.populatedBuildings[_buildingId]>> <<set _buildingNPC to _building.find(n => n.NPCID === _npc.NPCID)>> /* Set both the outdoor NPC and building NPC as found */ <<set _npc.found = true>> <<if _buildingNPC>> <<set _buildingNPC.found = true>> <</if>> <div class="npc-card"> <div class="npc-image-container"> <img @src=_npc.ImagePath class="npc-image"> </div> <div class="npc-button"> <<capture _npc>> <<if _npc.interested lt 1>> <i>This person doesn't want to talk to you</i> <<else>> <<button "Talk to " + (_npc.sex === "male" ? "him" : "her")>> <<set $ImagePath to _npc.ImagePath>> <<set $currentNPC to _npc>> <<goto "TalkToNPC">> <</button>> <</if>> <</capture>> </div> </div> <</for>> </div> <<else>> <p>There's nobody outside at the moment.</p> <</if>> </div> <div class="navigation"> <<button "Return to Settlement">> <<goto "LucyScout">> <</button>> </div> <style> .people-counter { background: #2d2d2d; color: white; padding: 10px; margin-bottom: 20px; border-radius: 5px; text-align: center; } .npc-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-bottom: 20px; } .npc-card { display: flex; flex-direction: column; align-items: center; gap: 10px; } .npc-image-container { width: 300px; height: 300px; } .npc-image { width: 100%; height: 100%; object-fit: cover; } .npc-button { margin-top: 10px; } </style> <</nobr>>
<div class="text-box"> <<nobr>> <<if $Gold >= 50>> <<link "Minor Healing Potion - Costs 50 gold">><<set $Gold to $Gold - 50>><<set $MinorHealingPotion to $MinorHealingPotion + 1>><<run Engine.play('Store')>><</link>><<else>>Minor Healing Potion - Costs 50 gold (you cant afford this)<</if>><br><br> <<if $Gold >= 100>> <<link "Normal Healing Potion - Costs 100 gold">><<set $Gold to $Gold - 100>><<set $HealingPotion to $HealingPotion + 1>><<run Engine.play('Store')>><</link>><<else>>Normal Healing Potion - Costs 100 gold (you cant afford this)<</if>><br><br> <<if $Gold >= 50>> <<link "Magic Boost Potion - Costs 50 gold">><<set $Gold to $Gold - 50>><<set $MagicPotion to $MagicPotion + 1>><<run Engine.play('Store')>><</link>><<else>>Magic Boost Potion - Costs 50 gold (you cant afford this)<</if>><br><br> <<if $Gold >= 50>> <<link "Energy Boost Potion - Costs 50 gold">><<set $Gold to $Gold - 50>><<set $EnergyPotion to $EnergyPotion + 1>><<run Engine.play('Store')>><</link>><<else>>Energy Boost Potion - Costs 50 gold (you cant afford this)<</if>><br><br> <<button "Leave">> <<set $BackgroundPath to "Images/Town/5.png">> <<goto "Town">><</button>> <</nobr>> </div>
<<nobr>> You: <<if $CurrentPlayer is "Overlord">> <<if $Cloaked is false>> <<set _CharProfileIMG to "Images/Player/1.png">> <<else>> <<set _CharProfileIMG to "Images/Player/5.png">> <</if>> <</if>> <<if $CurrentPlayer is "LucyCloaked">> <<set _CharProfileIMG to "Images/Forrest/Encounters/Human/Female/5.png">> <</if>> <<if $CurrentPlayer is "Lucy">> <<set _CharProfileIMG to $LucyImg>> <</if>> <<if $CurrentPlayer is "Alice">> <<set _CharProfileIMG to $AliceImg>> <</if>> <<if $CurrentPlayer is "AliceCloaked">> <<set _CharProfileIMG to "Images/Castle/Alice/16.png">> <</if>> <<if $CurrentPlayer is "AliceTav">> <<set _CharProfileIMG to "Images/Town/Tavern/Alice/Alice.jpg">> <</if>> <<if $CurrentPlayer is "AliceTavA">> <<set _CharProfileIMG to "Images/Town/Tavern/Alice/AliceA.jpg">> <</if>> <<if $CurrentPlayer is "Vaelora">> <<set _CharProfileIMG to "Images/Forrest/Cult/Vaelora.png">> <</if>> <div class="CharacterIcon-image"> <img @src=_CharProfileIMG onerror="this.style.display='none'"> </div> <hr> Day: $Day<br> Time of day: <<if $Time <= 3>><<set $TimeShow to "Morning">><</if>> <<if ($Time >= 4) and ($Time <= 6)>><<set $TimeShow to "Afternoon">><</if>> <<if ($Time >= 7) and ($Time <= 9)>><<set $TimeShow to "Evening">><</if>> <<if $Time >= 10>><<set $TimeShow to "Night">><</if>> $TimeShow<br> <hr> <<if $CurrentPlayer is "Overlord">> Health: <div class="progress-container"> <progress @value="$PlayerHealth" max="100"></progress> </div> Energy: <div class="progress-container"> <progress class="energy-bar" @value="$PlayerEnergy" max="100"></progress> </div> Magic: <div class="progress-container"> <progress class="magic-bar" @value="$PlayerMagic" @max="$PlayerMaxMagic"></progress> </div> <<if $PlayerCorruption gt 0>> Corruption: <div class="progress-container"> <progress class="magic-bar" @value="$PlayerCorruption" max="100"></progress> </div> <</if>> <<elseif ($CurrentPlayer is "LucyCloaked") or ($CurrentPlayer is "Lucy")>> Lucy's Power:<br> <progress @value="$LucyPower" max="30"></progress><br> <<elseif $CurrentPlayer is "AliceCloaked">> Alice's Power:<br> <progress @value="$AlicePower" max="30"></progress><br> <</if>> <hr> Gold: $Gold<br> Souls: $Souls<br> Notoriety: $Notoriety <hr> <</nobr>>
<<set $ConsoleDebug to false>> <<script>> CombatSystem.addCard({ name: 'Heal', type: 'spell', image: 'Images/Items/Spells/Heal.png', energyCost: 0, magicCost: 8, damage: 0, effects: [{name: 'Heal', value: 20}], description: 'Basic healing magic' }); <</script>> <<include "WeaponData">> <<script>> // Player's available weapons (starts with just basic dagger) window.weaponSlots = { dagger: { name: 'Dagger Slot', weapons: ['basic_dagger'] }, medium: { name: 'Medium Slot', weapons: ['rusty_shortsword'] }, back: { name: 'Back Slot', weapons: [] } }; <</script>> <<character 'You' 'Images/Player/1.png'>> <<character 'Overlord' 'Images/Player/1.png'>> <<character 'Thoughts' 'Images/Player/1.png'>> <<character 'Lucy' 'Images/Forrest/Encounters/Human/Female/5.png'>> <<character 'Alice' 'Images/Forrest/Encounters/Human/Female/7.png'>> <<character 'Succubus_Lucy' 'Images/Castle/Dungon/Woman/4/6.png'>> <<character 'Succubus_Alice' 'Images/Castle/Dungon/Woman/5/7.png'>> <<character 'Unknown' 'Images/Forrest/Encounters/Human/Female/7.png'>> <<character 'Gnarlak' 'Images/Castle/Gnarlak/1.png'>> <<character 'Eduart' 'Images/Forrest/Exploring/Mine/2.png'>> <<character 'Brody' 'Images/Forrest/Scarldale/Tavern/Men/1.png'>> <<character 'Eisheth' 'Images/Forrest/Encounters/Cave/1.png'>> <<character 'Tender' 'Images/Town/Tavern/2.png'>> <<character 'Alexander' 'Images/Forrest/Scarldale/Tavern/3.png'>> <<character 'Succubus' 'Images/Crypt/Enemy/Succubus/1.png'>> <<character 'Lilura' 'Images/Forrest/Exploring/Cemetery/4.png'>> <<character 'Receptionist' 'Images/Town/BathHouse/1.png'>> <<character 'Mara' 'Images/Town/BathHouse/Mara.png'>> <<character 'Henry' 'Images/Forrest/Scarldale/Blacksmith/1.png'>> <<character 'Guard' 'Images/Forrest/Scarldale/guard.png'>> <<character 'Jon' 'Images/Forrest/Scarldale/VillageHall/1.png'>> <<character 'Priest' 'Images/Forrest/Scarldale/Church/1.png'>> <<character 'ShopKeep' 'Images/Forrest/Scarldale/Shop/1.png'>> <<character 'Ida' 'Images/Mountains/Ida/2.png'>> <<character 'Diana' 'Images/Mountains/Ironpeak/Hostel/Diana/1.png'>> <<character 'Alfric' 'Images/Town/Inn/2.png'>> <<character 'Worlock' 'Images/Forrest/Exploring/Shack/2.png'>> <<character 'Heather' 'Images/Town/Inn/Girls/1/Outfits/1.png'>> <<character 'Rose' 'Images/Town/Inn/Girls/2/Outfits/1.png'>> <<character 'Lena' 'Images/Town/Inn/Girls/3/Outfits/1.png'>> <<character 'Vaelora' 'Images/Forrest/Cult/Vaelora.png'>> <<character 'Elizabeth' 'Images/Forrest/Cult/Elizabeth/1.png'>> <<set $scarldale = { corruption: 0, influence: 5 }>> <<set $harborsEnd = { corruption: 0, influence: 5 }>> <<set $ironpeak = { corruption: 0, influence: 5 }>> <<set $RightBar to true>> <<set $DeathCardPlayed to false>> <<set $MagicianCardPlayed to false>> <<set $DeathCardDamage to 5>> <<set $FirstShackVisit to true>> /* Initialize Defences array */ <<set $Defences to []>> <<set $Defences[1] to null>> <<set $Defences[2] to null>> <<set $Defences[3] to null>> <<set $Defences[4] to null>> <<set $Defences[5] to null>> /* Initialize PlayerSpells array */ <<set $PlayerSpells to []>> /* Initialize other game variables */ <<set $combatCardsMax to 2>> <<set $MinorHealingPotion to 2>> <<set $EnergyPotion to 2>> <<set $DefenceCount to 1>> <<set $CellsCount to 2>> <<set $Wood to 500>> <<set $Stone to 500>> <<set $money to 250>> <<set $Gold to 250>> <<set $Day to 1>> <<set $Time to 1>> <<set $TimeShow to "Morning">> <<set $Souls to 2>> <<set $Notoriety to 0>> <<set $hired to []>> <<set $InnPurchased to false>> /* Initialize strings and null values */ <<set $Question to "null">> <<set $PlayerRangedWeapon to "null">> <<set $DefenceRoom1 to "null">> <<set $DefenceRoom2 to "null">> <<set $DefenceRoom3 to "null">> <<set $DefenceRoom4 to "null">> <<set $DefenceRoom5 to "null">> <<set $CurrentPlayer to "Null">> <<set $TavQuestName to "null">> <<set $ScarldaleTithe to "null">> <<set $CurrentEnemy to "null">> /* Initialize boolean flags */ <<set $CombatTutorialComplete to false>> <<set $BackWeaponSlot to false>> <<set $Cheats to false>> <<set $Cloaked to false>> <<set $InTown to false>> <<set $OwnesHorse to false>> <<set $Flower to false>> <<set $LucyDefend to false>> <<set $AliceDefend to false>> <<set $LucyCorrupt to false>> <<set $AliceCorrupt to false>> <<set $LucyBrothel to false>> <<set $AliceBrothel to false>> <<set $EishethMet to false>> <<set $LucyMet to false>> <<set $ForestShackDiscovered to false>> <<set $ForestMerchantDiscovered to false>> <<set $LumberMillBuilt to false>> <<set $BossFight to false>> <<set $BeingRaided to false>> <<set $Quest1 to false>> <<set $Quest2 to false>> <<set $Quest3 to false>> <<set $QuestCloak to false>> <<set $RiverUnlocked to false>> <<set $LucyQuest to false>> <<set $LucQuestFinished to false>> <<set $MaraAtBase to false>> <<set $MaraQuestFinished to false>> <<set $TavQuestComplete to false>> <<set $ScarldaleTavQuestCompleted to false>> <<set $Silver to false>> <<set $VisitedVault to false>> <<set $VisitedDungeon to false>> <<set $VisitedChambers to false>> <<set $VisitedDefences to false>> <<set $VisitedBathHouse to false>> <<set $VisitedMapRoom to false>> <<set $VisitedScarldale to false>> <<set $VisistedScarldaleBacksmith to false>> <<set $Tip to false>> <<set $Finished to false>> <<set $mute to false>> <<set $VoidEnemy to false>> <<set $MaraAsk to false>> <<set $videosMuted to true>> <<set $audioMuted to true>> <<set $BarracksUnlocked to false>> <<set $LibraryUnlocked to false>> <<set $ArmoryUnlocked to false>> <<set $HouseVisit to false>> <<set $ShackTear to false>> <<set $WolfDead to false>> /* Initialize true flags */ <<set $CombatCardOrder to true>> <<set $MediumWeaponSlot to true>> <<set $MaraChamberFirstVisit to true>> /* Initialize numeric values */ <<set $PlayerCorruption to 0>> <<set $AliceCorruption to 0>> <<set $LucyCorruption to 0>> <<set $LucyMetInt to 0>> <<set $LumberStaff to 1>> <<set $RaidTime to 0>> <<set $HealingPotion to 0>> <<set $MagicPotion to 0>> <<set $Pelts to 0>> <<set $Iron to 0>> <<set $LockPicks to 0>> <<set $ArmorDefence to 0>> <<set $DungonCaptives to 0>> <<set $prisonerIdCounter to 0>> <<set $TavQuestTime to 0>> <<set $TavQuest to 0>> <<set $Massage to 0>> <<set $NPCCum to 0>> <<set $TarotCardCount to 0>> /* Initialize Quest system */ <<set $Quests to []>> /* Initialize core inventory and tracking arrays */ <<set $Loot to []>> <<set $OwnedWeapons to []>> <<set $PurchasedMeleeWeapons to []>> /* Initialize location occupancy tracking */ <<set $DungonOccupance to []>> <<set $BarraksOccupance to []>> <<set $LibraryOccupance to []>> <<set $CultOccupance to []>> <<set $CourtyardOccupance to []>> <<set $InfinaryOccupance to []>> /* Initialize party and team management */ <<set $RaidingParty to []>> <<set $ExploreTeam to []>> <<set $selectedRaiders to []>> <<set $selectedTargets to []>> /* Initialize exploration and capture tracking */ <<set $capturedVillagers to []>> <<set $CapturedLocations to []>> <<set $VistedForestLocations to []>> <<set $CryptSearchLogs to []>> /* Initialize Tarot Card system */ <<set $TarotCardInvet to []>> /* Initialize special arrays */ <<set $PlayerSpellCards to []>> <<set $CombatCardEffects to []>> <<set $CellCorruption to [0, 0, 0, 0, 0]>> <<set $PlayerEquipment to ["Iron Sword"]>> <<set $RaidCaptives to []>> /* Initialize Chamber variables */ <<set $Chamber1 to "Empty">> <<set $Chamber2 to "Empty">> <<set $Chamber3 to "Empty">> /* Initialize Player stats */ <<set $PlayerHealth to 100>> <<set $PlayerEnergy to 100>> <<set $PlayerMagic to 20>> <<set $PlayerMaxMagic to 20>> <<set $PlayerCorruption to 0>> <<script>> window.updateSkill = function(staffId, skill, amount) { let hiredStaff = State.variables.hired; let staffIndex = hiredStaff.findIndex(s => s.id === staffId); if (staffIndex !== -1 && hiredStaff[staffIndex].skills[skill] !== undefined) { let newValue = Math.max(0, Math.min(10, hiredStaff[staffIndex].skills[skill] + amount)); State.variables.hired[staffIndex].skills[skill] = newValue; return true; } return false; }; <</script>> <<set $PuzzleMonth to 0>> <<set $PuzzleDay to 0>> <<set $PuzzleYear to 0>> <<script>> // Initialize JavaScript state arrays if (!State.variables.portalDestinations) { State.variables.portalDestinations = []; } if (!State.variables.TarotCards) { State.variables.TarotCards = []; } $(document).on(':passagestart', function() { const currentTags = passage().tags || []; const hasBackgroundTag = currentTags.length > 0; if (hasBackgroundTag) { // Clear any inline styles to let CSS rules work jQuery(document.body).removeAttr('style'); } }); <</script>>
<<if $CruptMapFound is true>> [[Crypt Map|CryptMap1]] <</if>> <<if (typeof $PlayerSpells !== 'undefined' && $PlayerSpells && $PlayerSpells.includes("Cloak")) and ($Cloaked is false) and ($CurrentPlayer is "Overlord")>> <<link "Cloak">><<set $Cloaked to true>><<run Engine.show()>> <<script>> UI.alert("You cast the cloak spell, masking your identity"); <</script>> <</link>><</if>> <<if ($Cloaked is true) and ($CloakDisabled is false)>> <<link "Remove Cloak">><<set $Cloaked to false>><<run Engine.show()>> <<script>> UI.alert("You remove your cloaked spell, allowing others to see who you really are"); <</script>> <</link>><</if>> <<if _currentPassageID isnot "Combat">> <<link "Menu">><<run $('.modal-overlay').show()>><</link>> <</if>> <<link "Skip to Night">><<set $Time to 9>><<run Engine.show()>><</link>> [[Walkthrough]] [[Roadmap]]
<<nobr>> <<set _currentPassageID to passage()>> <<if _currentPassageID is "Combat">> <div align="center">$CurrentEnemy <<set _EnemyImgPath to $ImagePath>> <img @src="_EnemyImgPath" width="200" height="200"> </div> Level:<br>$EnemyLevel<br> Health:<br><progress @value="$EnemyHealth" max="100"></progress><br> <<if $CombatBleeding is true>> $CurrentEnemy is bleeding $CombatBleedingValue per turn 🩸<br> <</if>> <<if $CombatEnemyVenom is true>> $CurrentEnemy is loosing strength as the venom takes hold ☠️<br> <</if>> <<if $enemyTraits.includes("soulless")>><<else>> Corruption:<br><progress @value="$EnemyCorruption" max="100"></progress><br> <</if>> <<if $EnemyChestArmour is true>> <<set _EnemyChestArmourImgPath to $EnemyChestArmourImgPath>> Chest:<br> <img @src="_EnemyChestArmourImgPath" width="100" height="100"><br> <</if>> <<if $EnemyHelmet is true>> Helmet:<br> <<set _EnemyHelmetImgPath to $EnemyHelmetImgPath>> <img @src="_EnemyHelmetImgPath" width="100" height="100"><br> <</if>> Traits:<br> <<for _trait range $enemyTraits>> <<print _trait>><br> <</for>> <<else>> <div style="font-family:Arial; font-size:22px; color:#FFFFFF; text-align:center; margin-bottom:20px;"> <strong>Castle Info</strong> </div> <hr> <h2>Chambers:</h2> Chamber 1: $Chamber1<br> Chamber 2: $Chamber2<br> Chamber 3: $Chamber3<br> Servant Quarters: Gnarlak<br> <hr> <h2>Defences: </h2> <<if typeof $Defences === 'undefined' || !$Defences || !$Defences[1]>> Defence 1: Empty<br><<else>> Defence 1: $Defences[1].name<br><</if>> <<if $DefenceCount >= 2>><<if typeof $Defences === 'undefined' || !$Defences || !$Defences[2]>> Defence 2: Empty<<else>> Defence 2: $Defences[2].name<br><</if>><</if>> <<if $DefenceCount >= 3>><<if typeof $Defences === 'undefined' || !$Defences || !$Defences[3]>> Defence 3: Empty<<else>> Defence 3: $Defences[3].name<br><</if>><</if>> <<if $DefenceCount >= 4>><<if typeof $Defences === 'undefined' || !$Defences || !$Defences[4]>> Defence 4: Empty<<else>> Defence 4: $Defences[4].name<br><</if>><</if>> <<if $DefenceCount >= 5>><<if typeof $Defences === 'undefined' || !$Defences || !$Defences[5]>> Defence 5: Empty<<else>> Defence 5: $Defences[5].name<br><</if>><</if>> <hr> <h2>Resources: </h2> <img src="Images/Icons/Wood.png" width="20" height="20" style="vertical-align:middle;"> Wood: $Wood<br> <img src="Images/Icons/Stone.png" width="20" height="20" style="vertical-align:middle;"> Stone: $Stone<br> <img src="Images/Icons/Grain.png" width="20" height="20" style="vertical-align:middle;"> Grain: $Grain<br> <img src="Images/Icons/Bread.png" width="20" height="20" style="vertical-align:middle;"> Food: $Food<br> <hr> <<if $InnPurchased is true>> Inn Stats:<br><br> Inn's Gold: $money<br> Staff:<br> <<for _i to 0; _i < $hired.length; _i++>> <<capture _staff>> <<set _staff to $hired[_i]>> <<print _staff.name>> <</capture>> <</for>> <hr> <</if>> <<if $RightBar is true>> <<link "Disable Auto Show">><<set $RightBar to false>><<run Engine.show()>><</link>><<else>> <<link "Enable Auto Show">><<set $RightBar to true>><<run Engine.show()>><</link>><</if>><br><br> <</if>> <</nobr>>
<h2>Strength Card</h2> Strength... the raw, unyielding power to crush those who stand in your way. With this card, you could move mountains, shatter stone with a single blow. But remember this well: the mightier you become, the greater the fall when fate decides to strike you down<br><br> Effects of carrying this card:<br> -Your strikes have a random chance to deal double damage<br> -Upon death, you lose 2 souls<br><br> Effects of buring the card:<br> -Add 5 power to the player for 5 days<br><br>
<<nobr>> <<include "LucyInteractions">> <<if $ChamberInteraction is false>> <div class="text-box"> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Lucy's Chambers</p><br> You are in Lucy's chamber<br><br> <div class="Random-image"> <<set _imagePath to $LucyImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>Hello $LucyName<</say>> <<if !$LucyPower>><<set $LucyPower to 0>><</if>> Lucy's Power:<br> <progress @value="$LucyPower" max="30"></progress><br><br> Lucy's Hunger:<br> <progress @value="$LucyHunger" max="5"></progress><br><br> <<if $LucyHunger is 0>> <i>Lucy is too week, she needs to consume a soul before she can be given a task</i><</if>> <<if $LucyHunger gt 0>> <<button "Give her a task">> <<goto "LucyTask">> <</button>><br><br> <<button "Fuck her">> <<goto "LucyFuck2">> <</button>><br><br> <<if $AliceCorrupt is true>> <<button "Summon Alice for a threeway">> <<goto "Succubus3Sum">> <</button>><br><br> <</if>> <<button "Play as Lucy">> <<set $Price to 50>> <<set $CurrentPlayer to "Lucy">> <<goto "LucyBase">> <</button>><br><br> <</if>> <<button "Change Lucy's Outfit">> <<set $Position to "null">> <<set $ImagePath to $LucyImg>> <<goto "LucyOutfit">> <</button>><br><br> Change what Lucy <<link "calls you">><<set $Servant to "Lucy">><<run Engine.play('ChangeName')>><</link>><br><br> <<button "Leave">> <<goto "Castle Chambers">> <</button>><br><br> <<set $LucyCum to 0>> <<set $AliceCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">> <<set $LucyNakedImages to [ "Images/Castle/Dungon/Woman/4/11.png", "Images/Castle/Dungon/Woman/4/12.png", "Images/Castle/Dungon/Woman/4/13.png"]>> <<set $LucySeduceManImages to [ "Images/Castle/Lucy/Combat/MF/seduce/1.png", "Images/Castle/Lucy/Combat/MF/seduce/2.png", "Images/Castle/Lucy/Combat/MF/seduce/3.png", "Images/Castle/Lucy/Combat/MF/seduce/4.webp", "Images/Castle/Lucy/Combat/MF/seduce/5.webp"]>> <<set $LucyBJImages to [ "Images/Castle/Lucy/Combat/MF/bj/1.webp", "Images/Castle/Lucy/Combat/MF/bj/2.webp", "Images/Castle/Lucy/Combat/MF/bj/3.webp", "Images/Castle/Lucy/Combat/MF/bj/4.webp", "Images/Castle/Lucy/Combat/MF/bj/5.webp"]>> <<set $LucySEXManImages to [ "Images/Castle/Lucy/Combat/MF/sex/1.webp", "Images/Castle/Lucy/Combat/MF/sex/2.webp", "Images/Castle/Lucy/Combat/MF/sex/3.webp"]>> <<set $LucyCumManImages to [ "Images/Castle/Lucy/Combat/MF/cum/1.webp", "Images/Castle/Lucy/Combat/MF/cum/2.webp"]>> <<set $LucyAnal to [ "Images/Castle/Lucy/Fuck/Anal/1.webm", "Images/Castle/Lucy/Fuck/Anal/2.webm", "Images/Castle/Lucy/Fuck/Anal/3.webm"]>> <<set $LucyBJ to [ "Images/Castle/Lucy/Fuck/Bj/1.webm", "Images/Castle/Lucy/Fuck/Bj/2.webm", "Images/Castle/Lucy/Fuck/Bj/3.webm"]>> <<set $LucyBehind to [ "Images/Castle/Lucy/Fuck/Behind/1.webm", "Images/Castle/Lucy/Fuck/Behind/2.webm", "Images/Castle/Lucy/Fuck/Behind/3.webm"]>> <<set $LucyCG to [ "Images/Castle/Lucy/Fuck/Cg/1.webm", "Images/Castle/Lucy/Fuck/Cg/2.webm", "Images/Castle/Lucy/Fuck/Cg/3.webm"]>> <<set $LucyCul to [ "Images/Castle/Lucy/Fuck/Cul/1.webm", "Images/Castle/Lucy/Fuck/Cul/2.webm", "Images/Castle/Lucy/Fuck/Cul/3.webm"]>> <<set $LucyHJ to [ "Images/Castle/Lucy/Fuck/Hj/1.webm", "Images/Castle/Lucy/Fuck/Hj/2.webm", "Images/Castle/Lucy/Fuck/Hj/3.webm"]>> <<set $LucyMiss to [ "Images/Castle/Lucy/Fuck/Miss/1.webm", "Images/Castle/Lucy/Fuck/Miss/2.webm", "Images/Castle/Lucy/Fuck/Miss/3.webm"]>> <<set $LucyProne to [ "Images/Castle/Lucy/Fuck/Prone/1.webm", "Images/Castle/Lucy/Fuck/Prone/2.webm", "Images/Castle/Lucy/Fuck/Prone/3.webm"]>> <<set $LucySeduce to [ "Images/Castle/Lucy/Fuck/Seduce/1.webm", "Images/Castle/Lucy/Fuck/Seduce/2.webm", "Images/Castle/Lucy/Fuck/Seduce/3.webm"]>> <<set $NameChange to false>> </div> <</if>> <</nobr>>
<<nobr>> <<include "AliceInteractions">> <<if $ChamberInteraction is false>> <div class="text-box"> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Alice's Chambers</p><br> You are in Alice's chamber<br><br> <div class="Random-image"> <<set _imagePath to $AliceImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' $AliceImg>>Hello $AliceName<</say>><br> <<if !$AlicePower>><<set $AlicePower to 0>><</if>> Alice's Power:<br> <progress @value="$AlicePower" max="30"></progress><br><br> Alice's Hunger:<br> <progress @value="$AliceHunger" max="5"></progress><br><br> <<if $AliceHunger is 0>> <i>Alice is too week, she needs to consume a soul before she can be given a task</i><</if>> <<if $AliceHunger gt 0>> <<button "Give her a task">> <<goto "AliceTask">> <</button>><br><br> <<button "Fuck her">> <<goto "AliceFuck">> <</button>><br><br> <<if $LucyCorrupt is true>> <<button "Summon Lucy for a threeway">> <<goto "Succubus3Sum">> <</button>><br><br> <</if>> <<button "Play as Alice">> <<set $CurrentPlayer to "Alice">> <<goto "AliceBase">> <</button>><br><br> <</if>> <<button "Change Alice's Outfit">> <<set $Position to "null">> <<set $ImagePath to $AliceImg>> <<goto "AliceOutfit">> <</button>><br><br> Change what Alice <<link "calls you">><<set $Servant to "Alice">><<run Engine.play('ChangeName')>><</link>><br><br> <<button "Leave">> <<goto "Castle Chambers">> <</button>><br><br> <<set $LucyCum to 0>> <<set $AliceCum to 0>> <<set $PlayerCum to 0>> <<set $Position to "Seduce">> <<set $AliceNakedImages to [ "Images/Castle/Dungon/Woman/5/12.png", "Images/Castle/Dungon/Woman/5/13.png", "Images/Castle/Dungon/Woman/5/14.png"]>> <<set $AliceSeduceManImages to [ "Images/Castle/Alice/Combat/MF/seduce/1.png", "Images/Castle/Alice/Combat/MF/seduce/2.png", "Images/Castle/Alice/Combat/MF/seduce/3.png", "Images/Castle/Alice/Combat/MF/seduce/4.webp", "Images/Castle/Alice/Combat/MF/seduce/5.webp"]>> <<set $AliceBJImages to [ "Images/Castle/Alice/Combat/MF/bj/1.webp", "Images/Castle/Alice/Combat/MF/bj/2.webp", "Images/Castle/Alice/Combat/MF/bj/3.webp", "Images/Castle/Alice/Combat/MF/bj/4.webp", "Images/Castle/AliceAlice/Combat/MF/bj/5.webp"]>> <<set $AliceSEXManImages to [ "Images/Castle/Alice/Combat/MF/sex/1.webp", "Images/Castle/Alice/Combat/MF/sex/2.webp", "Images/Castle/Alice/Combat/MF/sex/3.webp"]>> <<set $AliceCumManImages to [ "Images/Castle/Alice/Combat/MF/cum/1.webp", "Images/Castle/Alice/Combat/MF/cum/2.webp"]>> <<set $NameChange to false>> </div> <</if>> <</nobr>>
<<set $Time to $Time + 1>> <div class="text-box"> <<nobr>> <<set $Int to random(0, 2)>> Alice's orgasm: <progress @value=" $AliceCum" max="100"></progress><br> Lucy's orgasm <progress @value=" $LucyCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> Which girl are you focusing on: <<listbox "$Girl" autoselect>> `<<option "Alice">>` `<<option "Lucy">> <</listbox>> <br><br> <<if $AliceCum >= 100>> Alice cum's <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Finish/AliceCum.webm" type="video/webm"> <<set $AliceCum to 0>> </video> <</if>> <<if $LucyCum >= 100>> Lucy cum's <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Finish/LucyCum.webm" type="video/webm"> </video> <<set $LucyCum to 0>> <</if>> <<if ($PlayerCum >= 100) and ($Position != "Face") and ($Position != "Outside") and ($Position != "Inside")>> Your about to cum<br> <<link "Face">><<set $Position to "Face">><<run Engine.play('Succubus3Sum')>><</link>><br> <<link "Outside">><<set $Position to "Outside">><<run Engine.play('Succubus3Sum')>><</link>><br> <<link "Inside">><<set $Position to "Inside">><<run Engine.play('Succubus3Sum')>><</link>><br> <</if>> <<if $Position is "Face">> <br>Alice and Lucy kneel infront of you, and you cover them both in cum <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Finish/face.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Outside">><br> <<if $Girl == "Alice">>You pull out and cum on Alice's pussy<<else>>You pulls out and cum on Lucys pussy before Alice sucks the remaining cum out of you<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Finish/outside.webm" type="video/webm"> </video> <br>[[Leave|Inside Castle]] <</if>> <<if $Position is "Inside">><br> <<if $Girl == "Alice">>You cum inside Alice<<else>>You cum inside Lucy<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Finish/inside.webm" type="video/webm"> </video> <br> [[Leave|Inside Castle]] <</if>> <<if ($PlayerCum lt 100) and ($AliceCum lt 100) and ($LucyCum lt 100)>> <<if $Position == "Seduce">> <<if $Int == 0>> <br>Alice stairs at Lucy lustfully as she works her fingers deeper into Lucys pussy <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Seduce/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <br>Alice and Lucy sit on the bed moaning as they play with eachother <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Seduce/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> Lucy sucks her own juces off Alices fingers <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3Sum/Seduce/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "BJ">> <<if $Int == 0>> <<if $Girl == "Alice">>You fuck Alice's face while lucy plays with your balls<<else>>You fuck Lucy's face while Alice plays with your balls<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Bj/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> Lucy and Alice focus on the head of your cock, kissing and licking it together <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Bj/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <<if $Girl == "Alice">>Lucy kisses you while Alice sucks on your cock<<else>>Alice pulls you in for a kiss while Lucy sucks your cock<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Bj/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Behind">> <<if $Int == 0>> <<if $Girl == "Alice">>Alice gets on all fours and you push your cock inside her wet pussy, Lucy watches and plays with your balls<<else>>You fuck Lucy from behind while Alice watches<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Behind/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <<if $Girl == "Alice">>You fuck Alice while she eats Lucy's pussy<<else>>You fuck Lucy while she eats Alice's pussy<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Behind/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> You take turns fucking each girl from behind <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Behind/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "CG">> <<if $Int == 0>> <<if $Girl == "Alice">>Alice climbs untop of you and slides onto your cock, unsatisfied with watching, Lucy also joins in by sitting on your face<<else>>Lucy climbs untop of you and slides onto your cock, unsatisfied with watching, Alice also joins in by sitting on your face<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cg/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <<if $Girl == "Alice">>Alice climbs untop of you and slides onto your cock, unsatisfied with watching, Lucy also joins in by sitting on your face<<else>>Lucy climbs untop of you and slides onto your cock, unsatisfied with watching, Alice also joins in by sitting on your face<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cg/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <<if $Girl == "Alice">>You enjoy Lucy grinding on your face while Alice jumps on your cock<<else>>Lucy and Alice ride your cock and face<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cg/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Cul">> <<if $Int == 0>> <<if $Girl == "Alice">>You focus your attention of Alice, enjoying her pussy, Lucy joins in and burrys her face in Alice's ass<<else>>Lucy gets on top of you, pushing her pussy into your face while sucking your cock<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cul/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <<if $Girl == "Alice">>Alice rides your face while Lucy sucks your cock<<else>>You pull Lucy onto your face and push your toung into her, while Alice gets between your legs and sucks you<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cul/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <<if $Girl == "Alice">>Alice pushs you onto your back and sits on your face, she then sucks your cock while Lucy focuses on your balls<<else>>Lucy and Alice suck your cock while you focus on Lucys pussy<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Cul/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Miss">> <<if $Int == 0>> <<if $Girl == "Alice">>Alice lays back while you push youself into her<<else>>You push Lucy back and fuck her, while Alice pins her down by sitting on her face<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Miss/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <<if $Girl == "Alice">>You fuck Alice on her back while Lucy watches<<else>>You fuck Lucy hard while Alice plays with her<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Miss/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <<if $Girl == "Alice">>You take turns fucking Alice's pussy then Lucys mouth<<else>>Alice eats Lucys pussy while you fuck her slowly<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Miss/3.webm" type="video/webm"> </video><</if>><</if>> <<if $Position == "Anal">> <<if $Int == 0>> <<if $Girl == "Alice">>You fuck Alice's tight ass while Lucy watches<<else>>You fuck Lucy's tight ass while Alice watches<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Anal/1.webm" type="video/webm"> </video><</if>> <<if $Int == 1>> <<if $Girl == "Alice">>You fuck Alice's tight ass while Lucy eats her pussy<<else>>You fuck Lucy's tight ass while Alice eats her pussy<</if>> <video autoplay loop> <source src="Images/Castle/Chambers/Sex/3sum/Anal/2.webm" type="video/webm"> </video><</if>> <<if $Int == 2>> <<if $Girl == "Alice">>Lucy lubes your cock with her mout before you fuck Alice's ass<<else>>Alice lubes your cock with her mout before you fuck Lucy's ass<</if>> <video autoplay loop> <source src= "Images/Castle/Chambers/Sex/3sum/Anal/3.webm" type="video/webm"> </video><</if>><</if>><</if>> <<if $PlayerCum lt 100>> <<link "Blowjob">><<set $Position to "BJ">><<set $PlayerCum to $PlayerCum + 5>> <<run Engine.play('Succubus3Sum')>> <</link>><br> <<link "Cunnilingus">> <<if $Girl == "Alice">><<set $AliceCum to $AliceCum + 10>><</if>> <<if $Girl == "Lucy">><<set $LucyCum to $LucyCum + 10>><</if>> <<set $Position to "Cul">> <<run Engine.play('Succubus3Sum')>> <</link>><br> <<link "Doggy Style">> <<if $Girl == "Alice">><<set $AliceCum to $AliceCum + 15>><</if>> <<if $Girl == "Lucy">><<set $LucyCum to $LucyCum + 15>><</if>> <<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Behind">> <<run Engine.play('Succubus3Sum')>> <</link>><br> <<link "Missionary">> <<if $Girl == "Alice">><<set $AliceCum to $AliceCum + 15>><</if>> <<if $Girl == "Lucy">><<set $LucyCum to $LucyCum + 15>><</if>> <<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "Miss">> <<run Engine.play('Succubus3Sum')>> <</link>><br> <<link "Cowgirl">> <<if $Girl == "Alice">><<set $AliceCum to $AliceCum + 15>><</if>> <<if $Girl == "Lucy">><<set $LucyCum to $LucyCum + 15>><</if>> <<set $PlayerCum to $PlayerCum + 10>> <<set $Position to "CG">> <<run Engine.play('Succubus3Sum')>> <</link>><br> <<link "Anal">> <<if $Girl == "Alice">><<set $AliceCum to $AliceCum + 15>><</if>> <<if $Girl == "Lucy">><<set $LucyCum to $LucyCum + 15>><</if>> <<set $PlayerCum to $PlayerCum + 20>> <<set $Position to "Anal">> <<run Engine.play('Succubus3Sum')>> <</link>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set _charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + ".png">> Succubus Health: <progress @value=" $EnemyHealth" max="100"></progress><br> Your corruption: <progress @value=" $PlayerHealth" max="100"></progress><br> <<if $PlayerHealth == 100>> <<say 'Greater Succubus' _charImg>>Do you want to fuck me?<</say>> The succubus bends over and reveals her ass<br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Strip/3.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 90>> The succubus attempts to corrupt you to her will. She casts a spell which casues to fall backwards and stare at her <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Strip/1.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 80>> <<say 'Greater Succubus' _charImg>>Please let me play with you<</say>> Corrupting you further, the succubus teases you through your clothes <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/1.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 70>> <<say 'Greater Succubus' _charImg>>I just want a taste<</say>> Corrupting you further, the succubus teases you through your clothes <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/1.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 60>> <<say 'Greater Succubus' _charImg>>Ummmm Im going to have so much fun with you<</say>> She pulls your cock out <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/3.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 50>> <<say 'Greater Succubus' _charImg>>Relax<</say>> Unable to resist you reach out and touch her as she strokes your cock <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/6.webm" type="video/webm"> </video> [[Continue|BossCrypt]] <</if>> <<if $PlayerHealth == 40>> <<say 'Greater Succubus' _charImg>>Do you like me sucking you?<</say>> Falling deeper into obedience and corruption, you begin to relax and allow her to suck you <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/7.webm" type="video/webm"> </video> <<link "Give in to her">><<set $Int to 5>><<run Engine.play('SuccubusBlow')>><</link>><br> [[Resist|BossCrypt]] <</if>> <<if $PlayerHealth == 30>> <<say 'Greater Succubus' _charImg>>Relax, let me do all the work?<</say>> You loose more and more of your will as the succubus gets on top of you and rubs your cock between her thighs <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/5.webm" type="video/webm"> </video> <<link "Fuck her">><<set $Int to 6>><<run Engine.play("FuckSuccubus")>><</link>><br> [[Resist|BossCrypt]] <</if>> <<if $PlayerHealth == 20>> <<say 'Greater Succubus' _charImg>>Yessss<</say>> You surrender to the succubus, giving in to pleasure and enjoy the feeling of her fucking you <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/5.webm" type="video/webm"> </video> <<Succubus>>I can feel you getting close, you can cum anywhere you like<</Succubus>><br> <<link "Face">><<set $Int to 30>><<run Engine.play("SuccubusBlow")>><</link>><br> <<link "Mouth">><<set $Int to 31>><<run Engine.play("SuccubusBlow")>><</link>><br> <<link "Breasts">><<set $Int to 32>><<run Engine.play("SuccubusBlow")>><</link>><br> <<link "Pussy">><<set $Int to 33>><<run Engine.play("SuccubusBlow")>><</link>><br> <</if>> <<set $PlayerHealth to $PlayerHealth - 10>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Int == 5>> The feeling of her lips is almost too much and you feel yourself getting closer<br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/1.webm" type="video/webm"><br> </video> You know you must [[fight back|BossCrypt]] before its too late.<br> But the feeling of her sucking your cock is to good. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/2.webm" type="video/webm"><br> </video> Pull your cock from her mouth <<link "fuck her">><<set $Int to 6>><<run Engine.play("FuckSuccubus")>><</link>><br> You could relax giving into your lust and <<link "cum in her mouth">><<set $Int to 6>><<run Engine.play('SuccubusBlow')>><</link>><br> Or maybe you take charge and <<link "fuck her face">><<set $Int to 8>><<run Engine.play('SuccubusBlow')>><</link>><br> Or maybe if you beg, she will let you <<link "taste her pussy">><<set $Int to 11>><<run Engine.play('SuccubusBlow')>><</link>><br> while she sucks you. <</if>> <<if $Int == 6>> You surrender to her and release your cum into her waiting mouth. Giving into the pleasure as you feel one of your souls drain out of your body. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/1.webm" type="video/webm"> </video><br> <<Succubus>>Yessss<</Succubus>><br> She says as she swallows your cum. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/2.webm" type="video/webm"> </video> You black out as you feel a soul leave your body [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 8>> Despite your legs feeling numb, you try to stand up. The succubus continues to suck your cock. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/4.webm" type="video/webm"> </video> <<link "fuck her face">><<set $Int to 9>><<run Engine.play('SuccubusBlow')>><</link>><br> Pull out and try to [[fight|BossCrypt]] <</if>> <<if $Int == 9>> You grab her head and push your cock deep into her throat. The succubus moans in excitment and sucks you even harder. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/5.webm" type="video/webm"> </video> <<Succubus>>Cum for me!<</Succubus>><br> The succubus splutters as you fuck her throat like a pussy and she plays with her clit. <<link "CUM">><<set $Int to 10>><<run Engine.play('SuccubusBlow')>><</link>><br> <<link "CUM">><<set $Int to 10>><<run Engine.play('SuccubusBlow')>><</link>><br> [[Pull Back|BossCrypt]] <</if>> <<if $Int == 10>> Unable to hold back you cum in her mouth <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/4.webm" type="video/webm"> </video> <<Succubus>>Yessss<</Succubus>><br> She says as she swallows your cum. You black out as you feel a soul leave your body [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 11>> <<Lucy>>Oh you want to taste me, well I'm all yours<</Lucy>><br> She says as she lowers her pussy onto your hungry tounge. <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cul/6.webm" type="video/webm"> </video> <<Succubus>>Yes! Like that<</Succubus>><br> After a few moments she lowers her mouth to your cock and returns the favor <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/3.webm" type="video/webm"> </video> You feel your cock slide into her throat and let her continue <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/6.webm" type="video/webm"> </video> <<Succubus>>Cum for me!<</Succubus>><br> The succubus splutters as she sucks your cock and pushes her pussy into your face <<link "CUM">><<set $Int to 12>><<run Engine.play('SuccubusBlow')>><</link>><br> <<link "CUM">><<set $Int to 12>><<run Engine.play('SuccubusBlow')>><</link>><br> [[Pull Back|BossCrypt]] <</if>> <<if $Int == 12>> Its too much, you give in and cum in her warm, wet mouth <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/3.webm" type="video/webm"> </video> <<Succubus>>Good pet!<</Succubus>><br> You black out as the succubus continues to pleasure herself with your face. [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 30>> You grab her and cum on her face <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/7.webm" type="video/webm"> </video> <<Succubus>>Yesss<</Succubus>><br> Your knees give way and you pass out while the succubus scoops the cum off her face and eats it [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 31>> You cum into her hungry, waiting mouth <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/5.webm" type="video/webm"> </video> <<Succubus>>Delicious!<</Succubus>><br> Your knees give way and you pass out... [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 32>> You stand over her and spray your cum over her tits and face <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/6.webm" type="video/webm"> </video> <<Succubus>>Good pet!<</Succubus>><br> Your knees give way and you pass out... [[sleep|SuccubusFightWin]] <</if>> <<if $Int == 33>> You push yourself deep inside her and flood her with your cum <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cum/8.webm" type="video/webm"> </video> <<Succubus>>Good pet!<</Succubus>><br> You black out as the succubus rubs her pussy with her fingers and licks them [[sleep|SuccubusFightWin]] <</if>> <</nobr>> </div>
<<nobr>> <div class="text-box"> <<set _charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + "/1.png">> <div class="Random-image"> <<set _imagePath to _charImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Greater Succubus' _charImg>>Did you enjoy that as much as I did? Well done... You earned this<</say>> She throws you a corruption rune which you take for the castle<br><br> <<set $CorruptionRune to 1>> <<if $Quests.includes("Find the black flower with white tips for Lucy (Maybe by the river near the forest entrance)")>> You have no time to indulge her, she lets you leave, enjoying the soul you forfit while you search for the flower<br><br> <<button "Search">> <<goto "Flower">> <</button>> <<else>> <<if $Souls gt 0>> <<say 'Greater Succubus' _charImg>>I can see more souls trapped inside you... Give me another and you can have one of these<</say>> She holds out a tarot card<br><br> <<if $TarotCardInvet.length >= 3>> You cannot carry any more cards... <<else>> <<button "Accept her deal">> <<fadeToPassage "SuccubusDeal3">> <</button>><br> <</if>> <<button "Reject her and leave">> <<fadeToPassage "Base Intro">> <</button>> <<else>> <<say 'Greater Succubus' _charImg>>Your all drained, theres only your soul left... Shame I was only getting started... So unless you want to sacrifice yourself to me... Get out of my dungeon<</say>> <<button "Leave">> <<goto "Base Intro">> <</button>> <</if>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<include "SuccubusDealLines">> <<set _act = either(_succubusRide_Start)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/2.webm" type="video/webm"> </video><br><br> <<set _act = either(_succubusRide_Mid)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/3.webm" type="video/webm"> </video><br><br> <<set _act = either(_succubusRide_Climax)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Cg/4.webm" type="video/webm"> </video><br><br> Once agin...<br> <<button "You snap back to reality">> <<set $Souls to $Souls -1>> <<goto "SuccubusDeal4">>> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + "/2.png">> <div class="Random-image"> <<set _imagePath to _charImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Greater Succubus' _charImg>>Good boy... Theres a card on the table you earned it<</say>> And with that she walks back into the shadows<br><br> <<button "Study the card">> <<goto "Tarot Turn">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _soulBJ_Awaken to [ "Your mind stirs as warmth wraps around your cock—wet, slow, and impossibly soft. You blink, the room hazy, your legs slightly trembling. You’re standing, and there’s a woman kneeling before you… her mouth full of you.", "You come to with a gasp, a soft, wet suction pulling you from the fog. The air is thick, sweet, almost drugged. You look down—her eyes are closed, her lips sealed tight around your shaft.", "Reality slips back in pieces: you're standing in a dim, red-lit chamber, hips twitching as a woman’s mouth works your cock. You don’t remember undressing. You don't remember agreeing to *this*.", "Pleasure pulses up your spine as your senses return. Your cock is buried in the mouth of something *not quite human*, her skin too smooth, her touch too precise. She’s been at it for a while.", "Your hands hang limp at your sides, and only now do you realize why your knees feel weak—because something’s sucking the soul right out of you, one slow, maddening stroke at a time." ]>> <<set _soulBJ_Midway to [ "Her lips move with perfect rhythm—inhumanly smooth, every stroke coaxing more of your essence free. You can't tell where the pleasure ends and your strength begins to fade.", "Your head tips back as she bobs slow and deep, her tongue swirling, teasing, milking. You can feel her drinking more than just your arousal—something deeper is slipping away.", "You try to say something, but all that comes out is a groan. Her hand cradles your balls gently, while her mouth works you with wet, sinful precision. You’re not in control anymore.", "Each suck draws more heat from you, your body light, breath shallow. The sensation is divine... addictive. You’d give her another soul just to let her keep going.", "Her throat flexes around you with perfect timing. Your vision blurs at the edges, and you swear you see faint wisps of light pulling from your chest every time she takes you deep." ]>> <<set _soulBJ_Climax to [ "You cum hard, hips jerking, the orgasm pulled from you with a pleasure that borders on pain. As you shoot down her throat, something inside you shifts You feel... Lighter... Emptier", "Release crashes through you, your cock twitching as she drinks every drop. As you spasm, you feel something else leaving with it", "You cry out, vision going white, knees nearly buckling as you spill into her mouth. Her throat swallows eagerly, and in that moment, you feel a soul tear free from within", "She moans around your cock as you unload, and you feel the *cost*. A piece of you rips loose—drawn out with the seed she gulps down greedily", "Cum drains from you into her perfect, welcoming mouth and with it, your soul slips through the cracks. The pleasure numbs the loss, but you know it’s gone" ]>> <<set _succubusRide_Start to [ "She straddles your lap with slow, predatory grace, her skin hot and impossibly smooth as her thighs tighten around your hips.", "With a wicked smile, she lowers herself onto your cock, her heat swallowing you inch by inch, her hands planted on your chest.", "Her nails graze your skin as she sinks down, her body shuddering slightly when you fill her. She lets out a pleased hum, already grinding.", "You feel her slick warmth wrap around your cock as she sits down on you fully, hips rolling in a slow, deliberate rhythm.", ]>> <<set _succubusRide_Mid to [ "Her hips move in tight circles, her cunt gripping your cock like it’s milking you for everything you’re worth.", "She rides you with slow, relentless rhythm, her eyes glowing faintly as the air around you thickens with heat and power.", "Every bounce sends shockwaves of pleasure through your spine her body tight, wet, and hungry, draining more than just your seed.", "Her pace shifts, bouncing harder, faster your cock buried deep in her soaked heat, your body helpless under her control.", "Her movements are hypnotic, draining, divine. You can feel something else slipping as her pussy tightens around you again and again." ]>> <<set _succubusRide_Climax to [ "Your orgasm hits like lightning, your body spasming beneath her as you cum hard inside her. She moans deeply and you feel a sharp pull, like something tearing free.", "You buck up into her as your climax crashes over you. Her walls clamp down, drinking in your release… and something else along with it.", "As you cum, your vision blurs. Her body milks every pulse from you while something colder coils around your chest and slips away.", "Your cock throbs deep in her and you finish with a cry your soul shudders as the last drop spills into her and out of you" ]>> <</nobr>>
<<nobr>> <div class="text-box"> <<include "SuccubusDealLines">> <<set _act = either(_soulBJ_Awaken)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/4.webm" type="video/webm"> </video><br><br> <<set _act = either(_soulBJ_Midway)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/5.webm" type="video/webm"> </video><br><br> <<set _act = either(_soulBJ_Climax)>> _act <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Bj/7.webm" type="video/webm"> </video><br><br> <<button "You snap back to reality">> <<set $Souls to $Souls -1>> <<goto "SuccubusDeal2">>> <</button>> </div> <</nobr>>
<div class="text-box blur"> <<nobr>> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Defeat/1.webm" type="video/webm"> </video><br><br> <<Succubus>>That's it...<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Defeat/2.webm" type="video/webm"> </video><br><br> <<Succubus>>I'm going to take everything you have<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Defeat/3.webm" type="video/webm"> </video><br><br> <<Succubus>>You were sooo easy<</Succubus>><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Defeat/4.webm" type="video/webm"> </video><br><br> Eventually... you walk up, you feel empty and powerless... But alive, for some reason<br><br> <<set $Souls to 0>> [[Get up|GetUpCrypt]] <</nobr>> </div>
<<nobr>> <<set _Line to random(0, 2)>> <<set _Vid to random(1, 2)>> <<if $Position is "Finger">> <<set $NPCCum to $NPCCum + 5>> <<set $PlayerLust to $PlayerLust + 10>> <<set $Line to $FingerlinesEnjoy[_Line]>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Start/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Finger/1.webm">> <</if>> <<if $Position is "Lick">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerLust to $PlayerLust + 15>> <<set $Line to $LicklinesEnjoy[_Line]>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Start/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Lick/" + _Vid + ".webm">> <</if>> <<if $Position is "Miss">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <<set $PlayerLust to $PlayerLust + 10>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Miss/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Miss/" + _Vid + ".webm">> <</if>> <<if $Position is "Behind">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <<set $PlayerLust to $PlayerLust + 10>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Behind/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Behind/" + _Vid + ".webm">> <</if>> <<if $Position is "Cg">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 15>> <<set $PlayerLust to $PlayerLust + 10>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Cg/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Cg/" + _Vid + ".webm">> <</if>> <<if $Position is "Bj">> <<set $PlayerCum to $PlayerCum + 10>> <<set $PlayerLust to $PlayerLust + 10>> <<set $ImagePath to "Images/Crypt/SuccubusGame/Bj/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Bj/" + _Vid + ".webm">> <</if>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video> <br> <<if $NPCCum >= 100>> [[She starts to moan louder|SuccubusGameWin]] <<elseif $PlayerCum >= 100>> [[You start to moan louder|SuccubusGameLoose]] <<else>> <<if $Turn lt 2>> <<link "Keep going">><<run Engine.play('SuccubusGameFuck')>><</link>><br> <<link "Change position">><<run Engine.play('SuccubusGameStart')>><</link>> <<else>> <span style="color: red">Succubus: Ok, its my turn</span><br><br> She pushes you back<br><br> <<set $Position to "Board">> [[Continue|SuccubusGameHerTurn]] <</if>><</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> Your lust: <progress @value=" $PlayerLust" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <<set _Line to random(0, 2)>> <<set $Turn to 0>> <<set _Vid to random(1, 2)>> <<if $NPCCum <= 50>><<set $Postion to "Bj">> <<set $ImagePath to "Images/Crypt/SuccubusGame/Bj/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Bj/" + _Vid + ".webm">> <<set $PlayerCum to $PlayerCum + 10>> <<set $PlayerLust to $PlayerLust + 10>> <<set $Act to "She starts sucking your cock">> <</if>> <<if $NPCCum >= 70>> <<set $Postion to "Cg">> <<set $ImagePath to "Images/Crypt/SuccubusGame/Cg/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/Cg/" + _Vid + ".webm">> <<set $NPCCum to $NPCCum + 10>> <<set $PlayerCum to $PlayerCum + 10>> <<set $PlayerLust to $PlayerLust + 10>> <<set $Act to "She starts to ride you">> <</if>> <<if ($NPCCum gt 50) and ($NPCCum lt 70)>><<set $Postion to "Fsit">> <<set $ImagePath to "Images/Crypt/SuccubusGame/FSit/" + $Int + ".png">> <<set $VidPath to "Images/Crypt/SuccubusGame/FSit/1.webm">> <<set $NPCCum to $NPCCum + 15>> <<set $PlayerLust to $PlayerLust + 10>> <<set $Act to "She sits on your face">> <</if>> <div class="text-box"> <<if $Position is "AskHer">> <span style="color: red">Succubus: $AskHerLines[_Line]</span><br><br> <</if>> <<if $Position is "Lower">> <span style="color: red">Succubus: $LowerLines[_Line]</span><br><br> <<set $PlayerLust to $PlayerLust - 25>> <<set $NPCCum to $NPCCum + 5>> <</if>> <<if $Position is "Board">> <span style="color: red">Succubus: $BoardLines[_Line]</span><br><br> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br> $Act <<if $NPCCum >= 100>> [[She starts to moan louder|SuccubusGameWin]] <<elseif $PlayerCum >= 100>> [[You start to moan louder|SuccubusGameLoose]] <<else>> [[Continue|SuccubusGameStart]] <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> Your lust: <progress @value=" $PlayerLust" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $Turn to $Turn + 1>>
<<nobr>> <div class="text-box"> <<set $Souls to $Souls - 1>> You feel your body tighten as you start to orgasm<br><br> <<if $Position is "Bj">> You feel as the demon litterally sucks your soul out. You can't help but enjoy it as you grab her head and cum down her throat<br><br> <<else>> You lock eyes with the demon as you fill her with your seed<br><br> All you can do is watch as her eyes glow brighter and she takes your soul<br><br> <</if>> <<set _VidPath to $VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br> <<if $Souls is 0>> <<set $PlayerHealth to 0>> You feel your life come to an end as you pass out<br><br> <<link "Continue">> <<run Engine.play("Resporn")>> <</link>><br><br> <<else>> <<link "You Pass Out">><<fadeToPassage "Resporn">><</link>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Turn is 0>> She leans in and kisses you, probing your mouth with her long tounge<br><br> <span style="color: red">Succubus: I'll let you do what you wish... for now</span> <br><br> <<set $ImagePath to "Images/Crypt/SuccubusGame/Start/" + $Int + ".png">> <</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<if $Turn lt 3>> <hr> <<if $PlayerLust lt 50>> Pleasure her<br> <<link "Finger her">><<set $Position to "Finger">><<run Engine.play('SuccubusGameFuck')>><</link>><br> <<link "Lick her">><<set $Position to "Lick">><<run Engine.play('SuccubusGameFuck')>><</link>> <hr> <</if>> <<if ($PlayerLust gt 30) and ($PlayerLust lt 80)>> Fuck her<br> <<link "Get on top">><<set $Position to "Miss">><<run Engine.play('SuccubusGameFuck')>><</link>><br> <<link "Fuck her from behind">><<set $Position to "Behind">><<run Engine.play('SuccubusGameFuck')>><</link>><br> <<link "Let her ride you">><<set $Position to "Cg">><<run Engine.play('SuccubusGameFuck')>><</link>> <hr> <</if>> <<if $PlayerLust gt 40>> Pleasure Yourself<br> <<link "Let her blow you">><<set $Position to "Bj">><<run Engine.play('SuccubusGameFuck')>><</link>> <hr> <</if>> <<if $PlayerLust gt 40>> <<link "Ask her to choose">><<set $Position to "AskHer">><<run Engine.play('SuccubusGameHerTurn')>><</link>> <hr> <<if $PlayerLust gt 40>> <<link "Try to lower your lust">><<set $Position to "Lower">><<run Engine.play('SuccubusGameHerTurn')>><</link>> <</if>> <</if>> <<else>> <span style="color: red">Succubus: Ok, its my turn</span><br><br> She pushes you back<br><br> <<set $Position to "Board">> [[Continue|SuccubusGameHerTurn]] <</if>> </div> <div class="text-box"> Her orgasm: <progress @value=" $NPCCum" max="100"></progress><br> Your orgasm: <progress @value=" $PlayerCum" max="100"></progress><br> Your lust: <progress @value=" $PlayerLust" max="100"></progress><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You feel the demon grip you tightly, her limbs tence and her sharp nails dig into your flesh<br><br> The demon falls back and lays down trying to catch her breath<br><br> <span style="color: red">Succubus: I wasn't expecting that mortal, I'm impressed... You've earned this little reward... But which do you prefer?</span><br><br> The demon places a corruption rune on the table and a tarrot card... <span style="color: red">Succubus: Although... You look so pent up, you must have been so close to cumming, you could stay here and I'll satisfy you?</span><br><br> <<button "Take the rune">> <<set $CorruptionRune to 1>> <<goto "Base Intro">> <<script>> UI.alert("You take the rune back to your castle, increasing the speed of corruption in your dungeon"); <</script>> <</button>><br> <<if $TarotCardInvet.length >= 3>> You can't carry any more tarot cards <<else>> <<button "Take the tarot card">> <<goto "Tarot Turn">> <</button>><br> <</if>> <<button "Stay">> <<goto "SuccusbusGameWinFuck">> <</button>> <br><br> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> You slowly come around, when you wake you see that you're not alone<br><br> <<set $ImagePath to "Images/Crypt/SuccubusGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Succubus: Hummm, look at you</span><br><br> You quickly reach for your weapon but you find it missing<br><br> <span style="color: red">Succubus: Relax, your still alive aren't you? Soo many men have come here looking for gold, power or just a good fuck</span><br><br> You go to move but you realise you feet a bound<br><br> <span style="color: red">Succubus: We live down here, luring men like you in to help grow our power. Maybe you have met some of my sisters already, if so you must be stronger than most</span><br><br> <span style="color: red">Succubus: I have an offer for you, us demons thrive off of sexual preasure but no men can handle our beauty or our... skills</span><br><br> <span style="color: red">Succubus: I'm going to untie you now and when I do, you're going to pleasure me until I cum, if you do I'll give you this key</span><br><br> She holds out a key before making it vanish before you<br><br> <span style="color: red">Succubus: I'm not going to make this easy for you... If you cum before I do... well I'll enjoy devouring your soul while one of my sisters pleasures me instead... But, don't worry about that yet, do you want to be a good boy and start?</span><br><br> She cuts the bindings around your ankles with the tip of her nail and leans in for a [[kiss|SuccubusGameStart]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $CryptSuccubusStyle to random (1, 5)>> <<set _charImg to "Images/Crypt/Enemy/Succubus/" + $CryptSuccubusStyle + ".png">> <<set $CurrentEnemy to _charImg>> <div class="Random-image"> <<set _imagePath to _charImg>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Greater Succubus' _charImg>>A new mortal, come to make a deal?<</say>> <<if ($CryptSuccubusStyle is 1) or ($CryptSuccubusStyle is 2) or ($CryptSuccubusStyle is 4)>> <<say 'Greater Succubus' _charImg>>Whats wrong? Not used to seeing us like this? We need souls to create a glamour, making us look like humans<</say>> <</if>> <<if $Souls gt 0>> <<say 'Greater Succubus' _charImg>>I can see those souls trapped inside you... Can you spare one for me? Promis to only take the one... And I'll even let you leave with a gift...<</say>> <<button "Accept her deal">> <<fadeToPassage "SuccubusDeal">> <</button>><br> <<button "Draw your sword">> <<goto "BossCrypt">> <</button>> <<else>> <<say 'Greater Succubus' _charImg>>I can see your soul the last one you have... And I hunger for it did you come here to offer yourself to me? Or do you really think you can defeat me?<</say>> <<button "Draw your sword">> <<goto "BossCrypt">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $PlayerCum to 0>> <<set $PlayerLust to 0>> <<set $NPCCum to 0>> <<set $Turn to 0>> <<set $HerTurn to 0>> <<set $Int to random(1, 3)>> You enter a dark room for a moment you think its a normal empty chamber, but then you hear it... a faint giggle coming from the shadows, for a few moment you smell a sweet smell of perfume, before... <br><br> <<link "You Pass Out">><<fadeToPassage "SuccubusMiniBoss2">><</link>> </div> <audio autoplay> <source src="Audio/CryptDoor.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<script>> $(function() { toggleDarkEdges(true); }); <</script>> <<set $ApprovalLines to [ "You're doing such a good job for a mortal", "God's, maybe I'll keep you as a pet", "Fuck, keep going"]>> <<set $FingerlinesEnjoy to [ "Ummm, thats it", "Work your fingers into me", "Ah, yes tease my clit"]>> <<set $LicklinesEnjoy to [ "Yes, bury your tounge in me", "Do you like the taste?", "Keep this up and I might just drag you back to the void to meet my sisters"]>> <<set $AskHerLines to [ "Oh, you want me to pick do you?", "Such a good boy, asking me what I want to do with you", "Giving in so soon?"]>> <<set $BoardLines to [ "I was getting board of that...", "Ummm, what to do with you", "You've had your fun"]>> <<set $LowerLines to [ "Look at you, trying so hard not to cum", "You really want this key dont you?", "Arn't you enjoying this?"]>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $Position to $NextPosition>> <div class="text-box"> <<if $RaiderResponce lt 4>><<set $RaiderResponce to $RaiderResponce + 1>><</if>> <<if $Defences[$Room].name is "Lucy">> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $LucyPower + 20>> <<else>> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $AlicePower + 20>> <</if>> <<include "SuccubusRaidLines">> <<include "RaidFemaleSexSceens">> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<if $CurrentRaider.corruption >= 100>> Unable to resist the succubus's charm any more, the $CurrentRaider.type gives and and loses control to her<br><br> <<button "Continue">> <<goto "SuccubusRaidWinFem">> <</button>> <<else>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<if $Defences[$Room].name is "Lucy">> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Lucy's Corruption">> <<else>> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Alice's Corruption">> <</if>> Success chance: _monsterChance<br> <<button _BtnTxt>> <<set _roll to random(1, 100)>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> $Defences[$Room].name partly corrupted the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<if $CurrentRaider.corruption lt 75>> <<goto "SuccubusRaidAttackFem">> <<else>> <<goto "SuccubusRaidWinFem">> <</if>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type was not corrupted! (scored: _roll%)<br><br> <<button "They Attack">> <<goto "SuccubusRaidDefend">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</if>> </div> <</nobr>>
<<nobr>> <<set $Position to $NextPosition>> <div class="text-box"> <<if $RaiderResponce lt 4>><<set $RaiderResponce to $RaiderResponce + 1>><</if>> <<if $Defences[$Room].name is "Lucy">> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $LucyPower + 20>> <<else>> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $AlicePower + 20>> <</if>> <<if $Position is "Strip">> Unable to resist, the $CurrentRaider.type reaches out to play with $Defences[$Room].name's ass<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/2.webm" type="video/webm"> </video><br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>Yess play with my ass... You can do whatever you like... What do you want to do to me?<</say>><br><br> <<set _rnd to random(0, 1)>> <<if _rnd == 0>> <<say '$CurrentRaider.type' $CurrentRaider.img>>This...<</say>><br><br> He pushes a finger into $Defences[$Room].name... And then another<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/4.webm" type="video/webm"> </video><br><br> $Defences[$Room].name see's the man is conflicted... Trying to resist her<br><br> <<set $NextPosition to "Cul">> <<else>> With corruption setting in, the $CurrentRaider.type removes some of his clothes<br><br> $Defences[$Room].name takes the advantage and turns to help him <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Tease/3.webm" type="video/webm"> </video><br><br> She gets his cock out and starts to toy with it while he plays with her body<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Strip/2.webm" type="video/webm"> </video><br><br> $Defences[$Room].name stares into his eyes, watching him try to resist this... She attempts to corrupt him further<br><br> <<set $NextPosition to "BJ">> <</if>> <</if>> <<include "SuccubusRaidLines">> <<include "RaidMaleSexSceens">> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> $Defences[$Room].name's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> <<if $CurrentRaider.corruption >= 100>> Unable to resist the succubus's charm any more, the $CurrentRaider.type gives and and loses control to her<br><br> <<button "Continue">> <<goto "SuccubusRaidWin">> <</button>> <<else>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<if $Defences[$Room].name is "Lucy">> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Lucy's Corruption">> <<else>> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Alice's Corruption">> <</if>> Success chance: _monsterChance<br> <<button _BtnTxt>> <<set _roll to random(1, 100)>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> $Defences[$Room].name partly corrupted the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<if $CurrentRaider.corruption lt 75>> <<if $CurrentRaider.gender is "Male">> <<goto "SuccubusRaidAttack">> <<else>> <<goto "SuccubusRaidAttackFem">><</if>> <<else>> <<goto "SuccubusRaidWin">> <</if>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type was not corrupted! (scored: _roll%)<br><br> <<button "They Attack">> <<goto "SuccubusRaidDefend">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "SuccubusRaidLines">> <<set _RLine = _RaiderResistLines[$RaiderResponce]>> <<set _SuccLine = either(_LucyDefendLine)>> The $CurrentRaider.type resists further corruption and swings their $CurrentRaider.weapon at $Defences[$Room].name<br><br> <<set $EnemyDamage = random($EnemyMin, $EnemyMax)>> <<set $EnemyDamage to $EnemyDamage + 10>> <<set $Defences[$Room].health to $Defences[$Room].health - $EnemyDamage>> They do $EnemyDamage damage to her<br><br> <<say '$CurrentRaider.type' $CurrentRaider.img>>_RLine<</say>><br><br> <<if $Defences[$Room].name is "Lucy">> <<if $RaiderResponce gt 0>> <<set $ImagePath to "Images/Castle/Lucy/2.png">><<else>> <<set $ImagePath to $LucyImg>><</if>> <<else>> <<if $RaiderResponce gt 0>> <<set $ImagePath to "Images/Castle/Alice/12.png">><<else>> <<set $ImagePath to $AliceImg>><</if>><</if>> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<if $Defences[$Room].health <= 0>> The $CurrentRaider.type defeats $Defences[$Room].name and pushes her away. Being a demon, Lucy is not fully able to die, but she is unable to continue fighting tonight<br><br> <<if $Room < $DefenceCount>> <<button "Continue to Next Room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> <<button "Continue to Vault">> <<goto "VaultFight">> <</button>> <</if>> <<else>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<if $Defences[$Room].name is "Lucy">> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Lucy's Corruption">> <<else>> <<set _monsterChance to 40>> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Alice's Corruption">> <</if>> Raiders Corruption: <progress @value=" $CurrentRaider.corruption" max="100"></progress><br> Lucy's Health: <progress @value=" $Defences[$Room].health" max="100"></progress><br> Success chance: _monsterChance<br> <<button _BtnTxt>> <<set _roll to random(1, 100)>> <<set _monsterChance to 40>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> $Defences[$Room].name partly corrupted the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<if $CurrentRaider.gender is "Male">> <<goto "SuccubusRaidAttack">> <<else>> <<goto "SuccubusRaidAttackFem">><</if>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type was not corrupted! (scored: _roll%)<br><br> <<button "They Attack">> <<goto "SuccubusRaidDefend">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> <</if>> </div> <</nobr>>
<<nobr>> <<set _LucyOpenLines to [ "It's late out. Why don't you stay here with me?", "You look soo worked up... I can fix that", "A pritty little thing like you trying to sneak past me?", "Come to play?"]>> <<set _RaiderOpenLines to [ "Get out of my way!", "Be gone demon", "Your tricks won't work on me"]>> <<set _LucyStripLinesMan to [ "Don't you like what you see?", "Come on, I'll let you use any hole you like", "If you do a good job, I'll let you go"]>> <<set _LucyStripLinesWoman to [ "Come to me and I will make you feel better than any man can", "It's just us girls... Relax", "I can't wait to see what you have, hiding under all that armor"]>> <<set _RaiderResistLines to [ "Get back demon!", "Stop, get away!", "I-I must resist you"]>> <<set _LucyDefendLine to [ "Come on, put that down", "Don't you like me?", "You're going to give into me one way or another mortal"]>> <<set _LucyBJLine to [ "Gh, fuck I could suck your cock all night", "Ummm, you taste so fucking good", "This is so much better than fighting isn't it"]>> <<set _RaiderResistLines2 to [ "I-I can't... Stop", "God's... It's so g... I can't stop!", "No... Stop... I-I can't"]>> <<set _LucyLickLinesMale to [ "Oh, good pet", "Ah fuck lick my pussy", "Ummm maybe I'll keep you"]>> <<set _LucyAnalLines to [ "Oh fuck my ass!", "F... uck", "That's it fill my ass"]>> <<set _LucyBehindLines to [ "Umm, fuck me harder", "That's it keep going", "Oh fuuu... Yes!"]>> <<set _AfterAnalLines to [ "Oh you did a great job", "I hope you enjoyed that as much as I did", "Wow, you really took it out on me didn't you?"]>> <<set _MaleFinishLines to [ "Such a good boy", "Yess, your mine now", "Thank you, that was fun"]>> <</nobr>>
<<nobr>> <<set $NextPosition to "Strip">> <<set $RaiderResponce to 0>> <div class="text-box"> Before the $CurrentRaider.type can react. $Defences[$Room].name starts to remove her clothes trying to corrupt the raider<br><br> <video autoplay loop> <source src="Images/Crypt/Enemy/Succubus/Combat/Strip/3.webm" type="video/webm"> </video><br><br> <<include "SuccubusRaidLines">> <<if $CurrentRaider.gender is "Male">> <<set _SuccLine = either(_LucyStripLinesMan)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <<else>> <<set _SuccLine = either(_LucyStripLinesWoman)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> <</if>> <div id="monster-animation" style="text-align: center; margin: 20px;"> <<if $Defences[$Room].name is "Lucy">> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Lucy's Corruption">> <<else>> <<set _monsterChance to $AlicePower + 25>> <<set _BtnTxt to "Check Alice's Corruption">> <</if>> Success chance: _monsterChance<br> <<button _BtnTxt>> <<set _roll to random(1, 100)>> <<replace "#monster-animation">> <div class="roll-container"> <div class="roll-text">🎲 Rolling...</div> <div class="progress-container"> <div class="progress-bar"> <div id="progress-fill" class="progress"></div> </div> <div class="scale-markers"> <span>0</span> <span>25</span> <span>50</span> <span>75</span> <span>100</span> </div> </div> </div> <<run setTimeout(() => { document.getElementById('progress-fill').style.width = `${_roll}%`; }, 100)>> <</replace>> <<replace "#monster-result">> <<if _roll <= _monsterChance>> <div class="success-message"> $Defences[$Room].name partly corrupted the raider! (Scored: _roll%)<br><br> <<button "Continue">> <<if $CurrentRaider.gender is "Male">> <<goto "SuccubusRaidAttack">><<else>> <<goto "SuccubusRaidAttackFem">><</if>> <</button>> </div> <<else>> <div class="fail-message"> The $CurrentRaider.type was not corrupted! (scored: _roll%)<br><br> <<button "They Attack">> <<goto "SuccubusRaidDefend">> <</button>> </div> <</if>> <</replace>> <</button>> </div> <div id="monster-result"></div> <style> .roll-container { width: 300px; margin: 20px auto; } .roll-text { font-size: 1.2em; margin-bottom: 10px; } .progress-container { height: 30px; background: #2c3e50; border-radius: 15px; position: relative; overflow: hidden; } .progress-bar { width: 100%; height: 100%; } .progress { height: 100%; width: 0; background: #2ecc71; transition: width 2s ease; } .scale-markers { display: flex; justify-content: space-between; padding: 5px 10px; color: #95a5a6; font-size: 0.8em; } .success-message { color: #2ecc71; font-weight: bold; margin-top: 10px; } .fail-message { color: #e74c3c; font-weight: bold; margin-top: 10px; } </style> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Defences[$Room].name is "Lucy">> With the corruption taking hold, the woman gives into Lucy and grows more lustful<br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Lucy/5.webm">> <<else>> With the corruption taking hold, the woman gives into Alice and grows more lustful<br><br> <<set _VidPath to "Images/Castle/Chambers/Sex/Lesbian/Raid/Alice/6.webm">> <</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> $Defences[$Room].name plays with her new toy a little longer, before locking them away to be dealt with later<br><br> <<run State.variables.TrapdoorCaptives.push($Raiders[0])>> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue">> <<goto "Raid">> <</button>> </div> <</nobr>>
<<nobr>> <<set _MaleFinishLines to [ "Such a good boy", "Yess, your mine now", "Thank you, that was fun"]>> <div class="text-box"> <<if ($Position is "Behind") or ($Position is "Anal") or ($Position is "Cul")>> The $CurrentRaider.type pushes themselves deep into $Defences[$Room].name and finishes inside her.<br><br> With that, the corruption has fully taken hold and the raider has, for now, lost his mind. <<if $Defences[$Room].name is "Lucy">> <<set _VidPath to "Images/Castle/Lucy/Fuck/Finish/inside.webm">><<else>> <<set _VidPath to "Images/Castle/Alice/Fuck/Finish/inside.webm">><</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_MaleFinishLines)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> $Defences[$Room].name plays with her new toy a little longer, before locking them away to be dealt with later<br><br> <</if>> <<if ($Position is "BJ") or ($Position is "Throat")>> <<if $Defences[$Room].name is "Lucy">> Unable to resist further, the raider finishes on Lucys face<br><br> <<set _int to random(1, 2)>> <<set _VidPath to "Images/MiniGame/BJ/Finish/" + _int + ".webm">> <<else>> <<set _int to random(1, 2)>> <<if _int is 1>> The $CurrentRaider.type foces his cock down Alices throat and cums<br><br> <<set _VidPath to "Images/Castle/Lucy/Fuck/Finish/throat.webm">> <<else>> Unable to hold back, the $CurrentRaider.type pulls out and sprays Alices face with cum<br><br> <<set _VidPath to "Images/Castle/Lucy/Fuck/Finish/face.webm">> <</if>> <</if>> <video autoplay loop> <source @src="_VidPath" type="video/webm"> </video><br><br> <<set _SuccLine = either(_MaleFinishLines)>> <<say '$Defences[$Room].name' $Defences[$Room].ImagePath>>_SuccLine<</say>><br><br> $Defences[$Room].name plays with her new toy a little longer, before locking them away to be dealt with later<br><br> <</if>> <<run State.variables.TrapdoorCaptives.push($Raiders[0])>> <<run State.variables.RaidCaptives.push($Raiders[0])>> <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue">> <<goto "Raid">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Souls to $Souls - 1>> Unable to resist, you relax and allow her to take care of you<br><br> <video autoplay loop> <source src="Images/Crypt/SuccubusGame/End/Win/1.webm" type="video/webm"> </video><br><br> <span style="color: red">Succubus: Ummm that's it... Let me serve you</span><br><br> <video autoplay loop> <source src="Images/Crypt/SuccubusGame/End/Win/2.webm" type="video/webm"> </video><br><br> <span style="color: red">Succubus: You're a winner and you deserve this</span><br><br> <video autoplay loop> <source src="Images/Crypt/SuccubusGame/End/Win/3.webm" type="video/webm"> </video><br><br> You get closer<br><br> <video autoplay loop> <source src="Images/Crypt/SuccubusGame/End/Win/4.webm" type="video/webm"> </video><br><br> You start to cum and flood the succubus's mouth with your cum, she continue's sucking you, taking every drop she can<br><br> Feeling your strength leave your body, you realise this was a trick and the demon is taking your soul<br><br> <<if $Souls is 0>> <<set $PlayerHealth to 0>> You feel your life come to an end as you pass out<br><br> <<link "Continue">> <<run Engine.play("Resporn")>> <</link>><br><br> <<else>> <<link "You Pass Out">><<fadeToPassage "Resporn">><</link>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<h2>Sun Card</h2> The Sun... it shines upon all, casting its warm light without judgment. With this card, fortune may favor you, and you’ll find a few more golden rays gracing your path. But be warned friend... beneath that dazzling glow, not all that glitters is truly gold.<br><br> Effects of carrying this card:<br> -Loot is doubled (except tarot cards)<br> -Loot randomly vanishes when you find it<br><br> Effects of buring the card:<br> A chance of gaining or loosing 200 gold<br><br>
Name WRWEI John WolfyWhite Sean CelestisVergil Outspoken_Chris 100 Isaiah Jiménez de Léon Brent Michael RedMass Vitus Alvan Noname Thunder UrgentCare Haot Celians Ricky Tony Jeriel Colin don't subscribe Mitchel Maximux P branden funbaggins Bernd Oberlerchner Sosa55 Lars Alexander James Rodney EighthLeaf Rufer owen Slayer 13170 Mathys Barruyer Jumpy Insert last name Caleb leser Jason Izen Commissar Clutchfrog Heliodos Yuukihirai Cade Marco Mohamed dead lock Hefner Dr.JosephProstata tregart Alpha WSSL Shylo LIN nbjhj Veskurbino T S Adrian MC devastator34v Futs Sidney De backer Joseph ZombieKiller43 Thomas Leighton Slimmy69Jim Silvor thomas Gildor Vikki ì˜ë¯¼ ì¡° Baciu Yobagoya JokerSkull101 Skuuurt MATTHEW Feave Samuel David Spehirax Jeb d'shay Dale Snuggles Windle Michael Attila pepa582 Tinman18 LoneWolfWrestling Felix zlboyle90 potato Nile Valentine danasel Gil Stephen Tyler Derek kamakase Matt Goryn Anon James Kay Jonny TheFallenKing25 Ashrain ornge0102 jutovo Дмитрий MasterWilly AlternativeInSight Patrick PsychoK9Unit Derek Lorraine Chris Jack xthestickmanx Gray -iwnl- BWA Mychal Zopolis Aoife Hiro sylvio Duke AIF Sergey dennis Timurlenk jedikn2 Matthew Dalamazon JamylSarum Виталий ЗакуÑило Alexander Kevin Logan FairyScreech Nathan Kevin bunrath Nash1977 Vincent lywko Darrin Rodolfo E1b3zu Dillon George Gwt34 Fallen19t Mg Gundam Oliver Kay595 Caleb Hunter Michael Boobz Chad Jonny Ricardo #HEFO Caerulius Obener arounor Sir DArtagnant Adam oliver someone irrelevant Christopher Booka Markell TBVixen Juan Justin Chris kdjdj12 Bryce ReaperXXX Lorem DeeJee01 007zamm . Robert MTG NOOB UNBOXES Casey Graham ThePuu Christopher Harry Roemer Andrew Catalin Katal1n xioo Supreme Warlord Nukit Claw Shane Stephen uglibug Robert Hairy funnypickles101 A_Xtra_Omen Timothy Mister robert Cody James Tim The Johnydong Saltpowered Alexis Jonah Ty Raymond Atereta certifiedbruhmomment Eric Kris Stitches Enjeru liloxi liloxi Sithriel Oscar Mackwan Tom Stéphane Ginge Nickious TheSloth MorganThe SwigSwag Dugelle Joseph Ahsan tim ShadowDragon Carl MoreTh4nAFeelin Jac Haniko Seinsonai Drumhead chum K3ntsmok3 Aribathus Ryan ombia joseph Boingboingbaggie VerikoN charlie Rory Neptunes Bogdan dsync frankenstone WytchDr RXNine Mohamed michael arthur Gabriel Tebachi Potatodsn Ben Adam Callum jamie SilverKnight Vince Zezy00 John Steven Andre MarvinTP SomeOne Jonathon Rami Raul Ryan Labyrinth jeffrey john a.purvis0706 Jimmie Jose John Arumai ShadowRider Ludwig HammerLegends kreuzler Alexandru
<nobr> <div class="text-box"> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/1.png">> Down the path you see the enterance to the largest village in the forest, Scarldale<br><br> <<You>>I don't neet to explore any further for now... I should try to find a companion first, to handle things while I am far from the castle<</You>> <<button "Leave">> <<goto "ForestExplore">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> </nobr>
<<nobr>> <div class="character-card"> <div class="character-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image" style="width: 300px; height: 300px; object-fit: cover;"> </div> <div class="character-info"> <p><span class="info-label">Attitude:</span> <<print $currentNPC.attitude>></p> <p><span class="info-label">Interest: <progress @value="$currentNPC.interested" max="100"></progress></span></p> <p><span class="info-label">Attracted to you?:</span> <<print $currentNPC.attracted>></p> <p><span class="info-label">Job:</span> <<print $currentNPC.job>></p> Being a succubus, you can sense some of the personality of this person<br><br> </div> </div> /* Get the current location */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> /* Get the NPC's building */ <<set _buildingId = $currentNPC.building>> /* Get all NPCs living in that building with safety checks */ <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<set _housemates = _location.populatedBuildings[_buildingId]>> <<set _totalResidents = _housemates.length>> <<else>> <</if>> <<if $currentNPC.armor is "Light Armor">> <<set _NPCType to "Guard">> <<elseif $currentNPC.sex is "Male">> <<set _NPCType to "Man">> <<else>> <<set _NPCType to "Woman">> <</if>> <<include "ScoutVillageNPCLines">> <<if $Position is "null">> <<if $currentNPC.met is false>> <<Lucy>>Hello!<</Lucy>><br><br> <<if _NPCType is "Guard">> <<say '_NPCType' _imagePath>>I haven't seen you when doing the rounds before<</say>> <<else>> <<say '_NPCType' _imagePath>>_NPCLine<</say>> <</if>> <<else>> <<if $currentNPC.attitude is "Defensive">> <<say '_NPCType' _imagePath>>Oh Lucy, you're still here<</say>> <<elseif $currentNPC.attitude is "Nutral">> <<say '_NPCType' _imagePath>>Hello again Lucy<</say>> <<else>> <<say '_NPCType' _imagePath>>Ah, Lucy! Hello!<</say>> <</if>> <</if>> <</if>> <<if $Position is "Introduce">> <<Lucy>>My name is Lucy, I'm visitng from Scarldale<</Lucy>> <</if>> <<if $Position is "WhichHome">> <<Lucy>>Which one of these homes is yours?<</Lucy>> <<if $currentNPC.interested lt 60>> <<set _NPCLine = either(_WontShareHome)>> <<say '_NPCType' _imagePath>>_NPCLine<</say>> <<set $currentNPC.interested to $currentNPC.interested - 20>> <<else>> <<set _NPCLine = "I live in that house over there">> <<say '_NPCType' _imagePath>>_NPCLine<</say>> He gestures to $currentNPC.building <<set $currentNPC.buildingKnown to true>> <</if>><</if>> <<if $Position is "LiveAlone">> <<Lucy>>Do you live alone?<</Lucy>> <<if $currentNPC.interested lt 60>> <<say '_NPCType' _imagePath>>Sorry, I don't want to share that with a stranger...<</say>> <<Lucy>>Oh, ok<</Lucy>> <<else>> /* Mark all residents in the building as found */ <<set _buildingId = $currentNPC.building>> <<if _location && _location.populatedBuildings && _location.populatedBuildings[_buildingId]>> <<for _resident range _location.populatedBuildings[_buildingId]>> <<set _resident.found = true>> <</for>> <</if>> <<if _totalResidents is 0>> <<say '_NPCType' _imagePath>>I live alone<</say>> <<elseif _totalResidents is 1>> <<say '_NPCType' _imagePath>>I live alone<</say>> <<else>> <<say '_NPCType' _imagePath>>I live with _totalResidents other people<</say>> <</if>> <</if>> <</if>> <<if $Position is "ComeIn">> <<Lucy>>Do you mind if I come in? I've walked far<</Lucy>> <<if ($currentNPC.attitude is "Neutral") and ($currentNPC.interested >= 60)>> <<say '_NPCType' _imagePath>>Sure, you can rest in the hall for a while<</say>> <<set $Position to "LetComeIn1">> <<elseif ($currentNPC.attitude is "Friendly") and ($currentNPC.interested >= 40)>> <<say '_NPCType' _imagePath>>Sure, you can rest in the hall for a while<</say>> <<set $Position to "LetComeIn1">> <<else>> <<say '_NPCType' _imagePath>>Sorry, I don't let strangers into my home<</say>> <</if>> <</if>> <<if $Position is "SeeHome">> <</if>> <<if $Position is "BuyDrink">> <<Lucy>>Can I buy you a drink?<</Lucy>><br><br> <<if $currentNPC.hiddenJob is "Innkeeper">> <<say '_NPCType' _imagePath>>Sorry, but I am the Innkeeper here. I don't dirnk while working<</say>><br><br> <<updateNPC "job" $currentNPC.hiddenJob>> <<else>> <<say '_NPCType' _imagePath>>That's a kind offer thank you<</say>><br><br> <<set $Gold to $Gold - 10>> <div class="text-box"> You fetch drinks for eachother and enjoy them while chatting<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/4.png" width="700" height="700"> </div><br><br> <<if ($currentNPC.interested >= 70) and ($currentNPC.attracted is "Yes")>> Clearly getting drunk and brave, the stranger looks at you<br><br> <<say '_NPCType' _imagePath>>You know... I have a room booked upstairs, what do you say we go together?<</say>><br><br> <<set $Position to "Indoor">> <</if>> </div> <</if>> <</if>> <<if $Position is "WhatJob">> <<Lucy>>What do you do for work?<</Lucy>> <<if $currentNPC.armor is "Light Armor">> <<say '_NPCType' _imagePath>>Is it not clear from my armor? I am a guard for this village<</say>> <<else>> <<say '_NPCType' _imagePath>>I'm a $currentNPC.hiddenJob<</say>> <</if>> <<Lucy>>Oh, that is interesting<</Lucy>><br><br> <</if>> <<if $currentNPC.interested lt 1>> They no longer wish to speak to you<br><br> <<else>> <div class="text-box flex-buttons"> <<if $Position is "LetComeIn1">> <<button "Go with them">> <<set _Int to 1>> <<goto "ScoutHouseDownHall">> <</button>> <<elseif ($Position is "Outdoor") or ($Position is "Indoor")>> <<button "Go with them">> <<set $BackgroundPath to "Images/Forrest/Encounters/House/Bedroom/3.png">> <<goto "MaleNPCSeduce">> <</button>> <<else>> <<if $currentNPC.met is false>> <<set _newInterest to $currentNPC.interested + 10>> <<button "Introduce yourself">> <<updateNPC "interested" _newInterest>> <<updateNPC "met" true>> <<set $Position to "Introduce">> <<set $currentNPC.met to true>> <<goto "TalkToNPC">> <</button>><br> <</if>> <<if $SettlementLocation is "Tav">> <<if $Gold >= 10>> <<button "Buy them a drink - 10 gold">> <<set _newInterest to $currentNPC.interested + 10>> <<updateNPC "interested" _newInterest>> <<if $currentNPC.attitude is "Neutral">> <<updateNPC "attitude" "Friendly">> <<elseif $currentNPC.attitude is "Defensive">> <<updateNPC "attitude" "Neutral">> <</if>> <<set $Position to "BuyDrink">> <<goto "TalkToNPC">> <</button>> <<else>> <i>You can't afford to buy this person a drink</i> <</if>> <</if>> <<if $currentNPC.job is "Unknown">> <<button "Ask what they do">> <<set _newInterest to $currentNPC.interested + 10>> <<updateNPC "interested" _newInterest>> <<updateNPC "job" $currentNPC.hiddenJob>> <<set $Position to "WhatJob">> <<goto "TalkToNPC">> <</button>><br> <</if>> <<if $currentNPC.interested lt 100>> <<button "Attempt to charm them">> <<goto "NPCCharm">> <</button>> <</if>> <<if ($SettlementLocation is "Outside") or ($SettlementLocation is "Tav")>> <<button "Ask where they live">> <<set $Position to "WhichHome">> <<goto "TalkToNPC">> <</button>><br> <</if>> <<if ($SettlementLocation is "Door") and (_NPCType isnot "Guard")>> <<button "Ask if you can come in">> <<set $Position to "ComeIn">> <<goto "TalkToNPC">> <</button>><br> <</if>> <<button "Ask if they live alone">> <<set $Position to "LiveAlone">> <<goto "TalkToNPC">> <</button>><br> <<if ($SettlementLocation is "Outside") or ($SettlementLocation is "Tav")>> <<button "Ask if you can see there home">> <<set $Position to "SeeHome">> <<goto "TalkToNPC">> <</button>><br> <</if>> <<if $currentNPC.attracted is "Yes">> <<button "Attempt to seduce">> <<set $Position to "seduce">> <<goto "NPCSeduction">> <</button>><br> <<else>> <i>You cannot seduce someone who isnt attracted to you</i> <</if>> <</if>> </div> <</if>> <div style="text-align: center"> <<button "Leave">> <<set $Position to "null">> <<goto $ReturnPassage>> <</button>> </div> <<widget "updateNPC">> /* Parameters: property, value */ <<set $currentNPC[$args[0]] = $args[1]>> /* Update in outdoor NPCs array */ <<set _location = $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<run _location.outdoorNPCs.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> /* Update in populated buildings */ <<for _buildingId, _residents range _location.populatedBuildings>> <<run _residents.forEach(npc => { if(npc.NPCID === $currentNPC.NPCID) { npc[$args[0]] = $args[1]; } })>> <</for>> <</widget>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _Card = $GivenCard.toLowerCase()>> <<set _img to "Images/Cards/Tarot/" + _Card + ".png">> <style> .image-container { width: 30%; height: 30%; overflow: hidden; text-align: center; margin: 0 auto; /* This centers the container itself */ } .image-container img { width: 100%; height: 100%; object-fit: contain; } </style> <div class="image-container"> <img @src=_img alt="Guest Image"> </div> <div class="text-box"> <<if $GivenCard is "Death">> <<run $TarotCardInvet.push("Death")>> Ahh, the Death Card... a grim companion indeed. Should you choose to carry it, the Reaper shall shadow your every step, unseen but ever-present. Those foolish enough to stand against you will feel their very life force wither, their strength fading before the first blow is even struck. Death, it seems, favors your side. But, be warned... Death is a cold companion, and given time it will take you too...<br><br> Effects of carrying this card:<br> -Enemy start each fight with 10 less health<br> -Random chance of starting the day with less health, which increases over time<br><br> Effects of buring the card:<br> -If burned during combat, the enemy will die instantly<br><br> <<elseif $GivenCard is "Devil">> <<run $TarotCardInvet.push("Devil")>> The Devil... the Fallen Angel who commands the damned. To carry this card is to wield power over those souls that defy death’s embrace. But heed my warning nothing comes without a price. The Devil always collects what is owed...<br><br> Effects of carrying this card:<br> -Enemy from the void, such as ghouls, zombies and skeletons deal less damage and give you a soul upon their defeat<br> - Random chance of a soul being lost when you kill someone<br><br> Effects of buring the card:<br> - Gives 5 souls<br><br> <<elseif $GivenCard is "Hermit">> <<run $TarotCardInvet.push("Hermit")>> The Hermit are you truly sure you want this... A soul bound to solitude and deep reflection. With this card, you gain the power to look inward, to seek wisdom in the quiet recesses of your mind. Yet be wary... The path to growth is narrow, and in the silence, it’s all too easy to lose yourself.<br><br> Effects of carrying this card: -Unlocks meditation in your castle, boosting your power by 5 and magic by 10 for the day<br> -Meditating can have side effects<br><br> Effects of buring the card:<br> Unknown<br><br> <<elseif $GivenCard is "Magician">> <<run $TarotCardInvet.push("Magician")>> Magician, sourcoer, worlock, call it what you will... a creature of great power beyond that of flesh and steel. If the magician accompaies you, you will find magic is easier to cunjure. But be warned, the magician loves his tricks and may choose to play them on you<br><br> Effects of carrying this card:<br> -Each combat spell will have a more powerful outcome<br> -Random chance to starting combat with no magic<br><br> Effects of buring the card:<br> -Adds 10 to max magic for 5 days<br><br> <<set $skillBoost to true>> <<elseif $GivenCard is "Strength">> <<run $TarotCardInvet.push("Strength")>> Strength... the raw, unyielding power to crush those who stand in your way. With this card, you could move mountains, shatter stone with a single blow. But remember this well: the mightier you become, the greater the fall when fate decides to strike you down<br><br> Effects of carrying this card:<br> -Your strikes have a random chance to deal double damage<br> -Upon death, you loose 2 souls<br><br> Effects of buring the card:<br> -Add 5 power to the player for 5 days<br><br> <<elseif $GivenCard is "Sun">> <<run $TarotCardInvet.push("Sun")>> The Sun... it shines upon all, casting its warm light without judgment. With this card, fortune may favor you, and you’ll find a few more golden rays gracing your path. But be warned friend... beneath that dazzling glow, not all that glitters is truly gold.<br><br> Effects of carrying this card:<br> -Loot is doubled (except tarot cards)<br> -Loot randomly vanishes when you find it<br><br> Effects of buring the card:<br> A chance of gaining or loosing 200 gold<br><br> <<elseif $GivenCard is "Tower">> <<run $TarotCardInvet.push("Tower")>> The Tower... a fortress of defense, unyielding and impenetrable. With this card, you can lock away your most guarded secrets and treasures, safe from prying eyes. But remember, the deeper you bury something, the more it yearns to be discovered. Walls, no matter how high, can crumble...<br><br> Effects of carrying this card:<br> -Raiders start with 20% corruption and 80% health<br> -1 more raider will come at night<br><br> Effects of buring the card:<br> End a raid instantly, capturing all remaining raiders<br><br> <</if>> <br><br> <<button "Go home">> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<div class="card-section"> <<button "Turn over the card">> <<run turnOverCard()>> <</button>> <div class="card-container"> <div class="card"> <div class="card-face front"> [img[Images/Cards/Tarot/back.png]] </div> <div class="card-face back"> <!-- Set by JS --> </div> </div> </div> <div id="cardDescription" class="hidden"> You turn over the tarot card: <span id="cardName"></span> <br><br> <<button "Study the card">> <<goto "TarotCardEffects">> <</button>> </div> </div>
<div class="text-box"> <<nobr>> You wake up and feel her playing with your cock<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/5.webm" type="video/webm"> </video><br><br> After coming around... You push her over and fuck her<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/6.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/7.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/8.webm" type="video/webm"> </video> <br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/9.webm" type="video/webm"> </video><br><br> You're getting close to cumming <<link "Finish">> <<script>> UI.alert("You cum together, after you are done you leave her"); <</script>> <<set $Time to 1>> <<run Engine.play('ForestExplore')>> <</link>><br><br> <</nobr>> </div>
<div class="text-box"> <<nobr>> After a few drinks and a chat, you take the girl home<br><br> It wasn't hard to get between the sluts legs and soon you're pusing her onto the bed and sliding into her cunt<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/1.webm" type="video/webm"> </video><br><br> <span style="color: #FF1493;">By the gods you're big</span><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/3.webm" type="video/webm"> </video><br><br> After enjoying her for some time, you pull out and spray her with cum<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Blonde/4.webm" type="video/webm"> </video> [[Sleep with her|TavBlonde2]] <</nobr>> </div>
<div class="text-box blur"> You fade in and out of conciseness, not knowing or really caring what you are doing <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/1.webm" type="video/webm"> </video> You can hear moans, you're not sure whats going on, prehapse there was a postion on the drink you had... <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/2.webm" type="video/webm"> </video> Even though you are not fully aware of what is going on, you feel pleasure and give in to the powers of whatever drug got you into this position <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Men/Action/3.webm" type="video/webm"> </video> [[Wake up|Drug2]] </div> <<set $Position to "Start">>
<div class="text-box"> <<nobr>> <<if ($CurrentPlayer is "Overlord") and ($Cloaked is true)>> <<if $EncounterHappen <= 2>> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Women/1.png" width="700" height="700"> </div><br><br> <span style="color: #FF1493;">Hello sir</span><br><br> [[Buy her a drink|TavRedhead]]<br><br> <<elseif $EncounterHappen lt 5>> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Women/2.png" width="700" height="700"> </div><br><br> <span style="color: #FF1493;">Hi, whats your name?</span><br><br> [[Buy her a drink|TavBlonde]]<br><br> <</if>> <</if>> <<if $CurrentPlayer is "LucyCloaked">> <<if $EncounterHappen <= 2>> <<set $NPC to "Tavern Patreon">> A man walks over to you<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Men/1.png" width="700" height="700"> </div><br><br> <span style="color: #8CC5F3;">Man: Hi, whats your name</span><br><br> <<Lucy>>Hi I'm Lucy<</Lucy>><br><br> <<elseif $EncounterHappen gt 2>> A man walks over to you<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Men/2.png" width="700" height="700"> </div><br><br> <<set $Int to 0>> <<if $Int == 0>> <span style="color: #8CC5F3;">Man: Can I buy you a drink?</span><br><br> <<Lucy>>Sure!<</Lucy>><br><br> The man goes away and comes back shortly after with a drink, you both chat for a while, but after some time you look down at your drink and see your vision starts to blur...<br><br> <div class="text-box blur"> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/4.png" width="700" height="700"> </div><br> <<link "Everything turns black">><<fadeToPassage "TavernDrug">><</link>> </div> <</if>> <<if $Int ==1>> <span style="color: #8CC5F3;"> Man: Can I buy you a drink?<br><br></span><br><br> <<Lucy>>Sure!<</Lucy>><br><br> The man goes away and comes back shortly after with a drink, you both chat for a while, after some time he looks at you more seriously<br><br> <span class="blue-text">Man: I've not made it to Harbour's End for a while, I miss the whores there. How about you come back to my house and show me a good time? I'll pay you 50 gold?</span><br><br> You're discusted for a moment, but then you think about how this could benefit you<br><br> <<link "Tell him to fuck off, and leave">><<run Engine.play('Scarldale')>><</link>><br> or<br> <<link "Go home with him">><<run Engine.play('BJLines2')>><</link>> <</if>> <</if>> <</if>> <</nobr>> </div>
<div class="text-box"> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $Time >= 10>>Its too late, I need to go back to the [[castle|Base Intro]] <<else>> <<button "Speak to the bar keep">><<goto "bar keep">><</button>><br> <<button "Leave">><<goto "Town">><</button>> <</if>> </div>
<div class="text-box"> <<nobr>> <<if !$Quests>> <<set $Quests = []>> <</if>> <<if !$TavQuest>> <<set $TavQuest = 0>> <</if>> <<if typeof $TavQuestName === "undefined">> <<set $TavQuestName = "Wolves">> <</if>> <<if !$ReplayQuestActive>> <<set $ReplayQuestActive = false>> <</if>> <<if $ScarldaleTavQuestCompleted and !$ReplayQuestActive>> You have finished all the current quests in this tavern... You can replay one if you like<br><br> <<listbox "$ChooseTavQuest" autoselect>> <<option "Wolves">> <<option "Caravan">> <<option "Ghoul">> <</listbox>><br><br> <<link "Choose quest">> <<set $ReplayQuestActive = true>> <<switch $ChooseTavQuest>> <<case "Wolves">> <<set $TavQuestName to "Wolves">> <<if !$Quests.includes("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run $Quests.push("Find and kill the wolves attacking the local live stock near the abandoned church")>> <</if>> <<case "Caravan">> <<set $TavQuestName to "Caravan">> <<if !$Quests.includes("deal with the bandits attacking caravans near the creek")>> <<run $Quests.push("deal with the bandits attacking caravans near the creek")>> <</if>> <<case "Ghoul">> <<set $TavQuestName to "Ghoul">> <<if !$Quests.includes("Search for the thing near the cemetery in the swamp")>> <<run $Quests.push("Search for the thing near the cemetery in the swamp")>> <</if>> <</switch>> <<goto "ForestExplore">> <</link>> <</if>> <<You>>Has there been any trouble in the area recently?<</You>><br><br> <<if $TavQuestName is "Wolves">> <<Alexander>>You wanted to look for the wolves that attack our livestock near the abandoned church...<</Alexander>><br><br> <<button "Leave">><<goto "ForestExplore">><</button>> <<elseif $TavQuestName is "Caravan">> <<Alexander>>You wanted to deal with the bandit group that raids caravans near the creek in the south.<</Alexander>><br><br> <<button "Leave">><<goto "ForestExplore">><</button>> <<elseif $TavQuestName is "Ghoul">> <<Alexander>>You wanted to investigate the cemetry in the swamp.<</Alexander>><br><br> <<button "Leave">><<goto "ForestExplore">><</button>> <<elseif $TavQuestTime gt 0>> <<Alexander>>No news yet, come back in a few days<</Alexander>><br><br> <<else>> <<switch $TavQuest>> <<case 0>> <<Alexander>>Actually we've been having some issues with wolves attacking our livestock...<</Alexander>><br><br> <<You>>Maybe I can help<</You>><br><br> <<Alexander>>If you're going after them, I recommend getting a bow from the blacksmith<</Alexander>><br><br> <<set $TavQuestName to "Wolves">> <<if !$Quests.includes("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run $Quests.push("Find and kill the wolves attacking the local live stock near the abandoned church")>> <</if>> <<link "Leave">> <<script>> UI.alert("New Quest <br>Find out what is attacking the livestock near the old church"); <</script>> <<goto "ForestExplore">> <</link>> <<case 1>> <<Alexander>>I've heard there’s a group of bandits ambushing caravans near the creek.<</Alexander>><br><br> <<You>>Maybe I can help<</You>><br><br> <<Alexander>>If you're going after them, I recommend getting a bow from the blacksmith<</Alexander>><br><br> <<set $TavQuestName to "Caravan">> <<if !$Quests.includes("deal with the bandits attacking caravans near the creek")>> <<run $Quests.push("deal with the bandits attacking caravans near the creek")>> <</if>> <<link "Leave">> <<script>> UI.alert("New Quest <br>Deal with the bandits attacking caravans"); <</script>> <<goto "ForestExplore">> <</link>> <<case 2>> <<Alexander>>Folk say something stalks near the cemetery in the swamp.<</Alexander>><br><br> <<You>>Maybe I can help<</You>><br><br> <<Alexander>>If you're going after it, get a bow from Henry the blacksmith<</Alexander>><br><br> <<set $TavQuestName to "Ghoul">> <<if !$Quests.includes("Search for the thing near the cemetery in the swamp")>> <<run $Quests.push("Search for the thing near the cemetery in the swamp")>> <</if>> <<link "Leave">> <<script>> UI.alert("New Quest <br>Kill whatever is stalking the cemetery"); <</script>> <<goto "ForestExplore">> <</link>> <</switch>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You flip her onto her back and aim your cock at her cunt<br><br> <span style="color: #FF1493;">Wait, I'm saving myself for marriage, fuck my ass instead</span><br><br> Not about to turn down that offer, you push into her ass<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/6.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/7.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/8.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/9.webm" type="video/webm"> </video> <<button "Finish">> <<script>> UI.alert("You cum together, after you are done you leave her"); <</script>> <<set $Time to 1>> <<run Engine.play('ForestExplore')>> <</button>><br><br> <</nobr>> </div>
<div class="text-box"> <<nobr>> After a few drinks and a chat, you take the girl home<br><br> This gril was clearly a slut, working her way through the village, but you didn't care. As long as she was on her knees sucking your cock<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/1.webm" type="video/webm"> </video><br><br> <span style="color: #FF1493;">Do you like that daddy, wine makes me sooo horny</span><br><br> You lay on the bed and watch her struggle to get her tiny mouth around you<br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/2.webm" type="video/webm"> </video><br><br> <span style="color: #FF1493;">I can't wait to have this thing fill me up</span><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/3.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Forrest/Scarldale/Tavern/Women/Sex/Redhead/4.webm" type="video/webm"> </video> [[Fuck her|TavRedhead2]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You politely decline the stranger and go back to work, the rest of the shift is normal<br><br> When you're finished, Alexander pays you $Pay gold<br><br> <<set $Time to $Time + 6>> <<button "Leave">> <<goto "LucyBase">> <</button>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $TavWork != true>> You approach the bar keep<br><br> <<Lucy>>Hi, I was wondering if you need some help around her?<</Lucy>> <<Alexander>>Sure, I could do with someone helping around here. You can start by collecting and washing glasses<</Alexander>><br><br> <<set $TavWork to true>> <</if>> <<if $TavWork != false>> <<set $Int to random(0, 8)>> You start by collecting the empty glasses around the tavern and then go to giving out mead and wine to customers who stop you and ask<br><br> <<if $Int lt 5>> You hand out drinks for the rest of the night,<br><br> Nothing eventful happens<br><br> <div align="center"> <img src="Images/Forrest/Scarldale/Tavern/Work/1.png" width="700" height="700"> </div><br><br> <</if>> <<if $Int == 5>> You hand a drink to a man sitting alone, before you can leave he takes your hand<br><br> <img src="Images/Forrest/Scarldale/Tavern/Men/3.png" width="700" height="700"> <br><br> <span style="color: #8CC5F3;">Man: Hello there, we've not had a pritty tavern girl like yourself in a long time... Say, how about you get under this table and help me unwind while I drink this</span><br><br> [[Tell him no|TavWorkNo]]<br><br> [[Agree|TavWorkYes]] <</if>> <<if $Int == 6>> You walk over to a man trying to get your attention<br><br> <img src="Images/Forrest/Scarldale/Tavern/Men/3.png" width="700" height="700"> <br><br> <span style="color: #8CC5F3;">Man: How would you like to make a little extra gold? Give me a little, under the table service and I'll leave you a big tip</span><br><br> [[Tell him no|TavWorkNo]]<br><br> [[Agree|TavWorkYes]] <</if>> <<if $Int == 7>> You walk over to a young man who is sat alone, he smiles at you<br><br> <span style="color: #8CC5F3;">Man: Hey, Lucy yes? How about you give me a but of company? Ill buy you a drink?</span><br><br> <img src="Images/Forrest/Scarldale/Tavern/Men/2.png" width="700" height="700"> <br><br> <<Lucy>>I have have customers to serve<</Lucy>><br><br> <span style="color: #8CC5F3;"> Man: It will only be a quick drink, I could use some company<br><br> </span><br><br> [[Tell him no|TavWorkNo]]<br><br> [[Agree|TavWorkYes]] <</if>> <<if $Int == 8>> While serving drinks, you look over and see a lady watching you<br><br> <img src="Images/Forrest/Scarldale/Tavern/Women/2.png" width="700" height="700"> <br><br> You continue working, but she follows you with her eyes<br><br> You walk over to her<br><br> <<Lucy>>Hi, I'm Lucy, can I get you anything?<</Lucy>><br><br> <span style="color: #FF1493;">Woman Hey Lucy, actually you can do something for me, I bet none of these guys know how to please a woman, but you... Well you look like you know what a woman really needs, how about you duck under this table and help another girl out?</span><br><br> [[Tell her no|TavWorkNo]]<br><br> [[Agree|TavWorkYes]] <</if>> <<if $Int lt 5>> <<set $Pay to random(20, 50)>> <<set $Gold to $Gold + $Pay>> You get to work assisting Alexander around the tavern after a few hours you finish and he pays you $Pay gold<br><br> <<set $Time to $Time + 6>> <<button "Leave">> <<goto "LucyBase">> <</button>> <</if>> <</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<if $Int == 5>> <<Lucy>>Anything for a loyal customer<</Lucy>><br><br> You give him a sexy grin and lean forward so you can whisper into his ear<br><br> <<Lucy>>You can unwind right down my throat<</Lucy>><br><br> You duck under the table and pull out the mans cock, you get to work quickly being careful not to get too excited and messy<br><br> <video loop> <source src="Images/Forrest/Scarldale/Tavern/Work/Sex/1.webm" type="video/webm"></video><br><br> After a few moment, you hear a few quiet moans from the man and he starts to breath harder...<br><br> After a few more moment he grabs the back of your head and pulls you in, pushing his cock into your throat. His legs tighten around you and you feel his cock throb as his seed flows down your throat<br><br> After a few second he lefts you go, you pull back gasping and trying not to cough. You think about how fun that was, and find it funny how far you have come from the old innocent Lucy<br><br> You get up from under the table, hoping no one saw... The man smiles at you<br><br> <</if>> <<if $Int == 6>> <<Lucy>>Of course, you relax and I'll get to work<</Lucy>><br><br> You look around quickly to check no one is watching and you duck under the table<br><br> The man has already pulled his cock out so you get to work, using your hand to get him close while your toung works on the head<br><br> You can hear him grunting, he isn't being as subtle as you would have liked...<br><br> <video loop> <source src="Images/Forrest/Scarldale/Tavern/Work/Sex/2.webm" type="video/webm"></video><br><br> You look up at him from under the table and give him a cheeky grin while sucking on the head of his cock<br><br> This pushes him over the edge and he starts to cum, but before you can taste his seed. He grabs your hair and pulls you off his cock, spraying your face<br><br> After a few tense seconds, he slumps back into his chair and goes back to his drink, as if you were't even there<br><br> You sit between his legs for a moment, and smile about how much pleasure you now have after $LucyName corrupted you<br><br> You snap back to reality and lick him clean, before collecting the cum on your face and eating it<br><br> <</if>> <<if $Int == 7>> You smile at him<br><br> <<Lucy>>Sure, give me a moment<</Lucy>><br><br> You return to the bar and pour yourself a drink before returning to the man and sitting next to him, you both enjoy your drinks and chat for a few minuets before you feel him slide his hand onto your leg<br><br> You give him a sexy smile as he runs his hands down your leg and under your dress before moving back up, running his fingers over your thigh as he makes his way to your cunt<br><br> You look around to make sure no one is watching, and have a quick sip of your drink before reaching over and rubbing his crotch with your hand<br><br> The boy looks at you and runs a finger over your clit before sliding down and pushing into you. With your new powers, and sensation feels devine even with his unexperianced fingers<br><br> Aware you don't have much time, you pull his cock from his trousers and stroke him under the table<br><br> <video loop> <source src="Images/Forrest/Scarldale/Tavern/Work/Sex/3.webm" type="video/webm"></video><br><br> After a few minuets like this, you feel him tense up, his hips buck and he almost knocks his drink over. You see him cum and you catch as much as you can<br><br> He removes his hand from you, clearly having no interest in your pleasure now his was over, you smile at him and go to clean your hands<br><br> <</if>> <<if $Int == 8>> <<Lucy>>We're always happy to help our customers<</Lucy>><br><br> You quickly duck under the table and see the woman has spread her legs wide opening her dress and showing off her wet snatch, before you can admire the meal infront of you, she grabs your head and pulls you in<br><br> <div align="centre">[img["Images/Forrest/Scarldale/Tavern/Work/Sex/4.webp"]]</div><br><br> You waste no time and run your tounge over her clit getting her wetter<br><br> Within a few minuets, she soaked and her jucies are flowing down your chin. You take your attention away from her clit and push your tounge as deep as you can go into her pussy, you can hear her take in a sharp breath<br><br> You enjoy the taste of tounge fucking a random woman for a few moments before her legs clamp around your head and she starts to shake, You lick her cunt for as long as you can, until she taps you on the sholder and beacons you to leave<br><br> <</if>> You finish the rest of your shift and not much happens, after the stranger you "services" leaves you notice they left you a tip of 15 gold<br><br> <<set $Pay to random(20, 50)>> <<set $Gold to $Gold + $Pay>> When you're finished, Alexander pays you $Pay gold<br><br> <<set $Time to $Time + 6>> <<button "Leave">> <<goto "LucyBase">> <</button>> <</nobr>> </div>
<<nobr>> <div class="text-box"> You lost the fight against the statue, it may be best to try again, but for now you dust yourself off and leave<br><br> <<button "Leave">> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You defeated the Guardian!<br><br> <<Gnarlak>>Well done Lord, remember not everyone will be so easy to defeat<</Gnarlak>> <<button "Leave">> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<<nobr>> <div class="title-container"> <div class="title-header"> <h1 class="game-title">OVERLORD</h1> </div> <div class="content-warning"> <h2 class="warning-header">⚠️ Content Advisory ⚠️</h2> <div class="warning-content"> <p class="warning-details"> <strong>Overlord</strong> is an adult interactive fiction experience inspired by <em>"Dungeon Overlord"</em> and <em>"Adam & Gaia"</em>. This tale of dark conquest contains mature themes including: </p> <ul class="content-list"> <li>Corruption and moral degradation</li> <li>Domination and mind control</li> <li>Fantasy violence (non-sexual)</li> <li>🔞 Adult situations and themes</li> </ul> <p class="age-disclaimer"> <strong>All characters depicted are fictional adults over the age of 18.</strong><br> All intimate encounters depicted are consensual within the narrative context. </p> </div> <div class="age-verification"> <p class="age-question">By entering this realm, you confirm you are 18 years or older.</p> <div style="text-align: center"> <<button "Enter the Dark Realm">> <<goto "Intro">> <</button>> <<button "Skip Prologue">> <<set $VisitedVault to true>> <<set $VisitedDungeon to true>> <<set $VisitedChambers to true>> <<set $VisitedDefences to true>> <<run Engine.play('PlayerCreation2')>> <</button>> </div> </div> </div> <div class="developer-note"> <h3 class="note-header">📜 Note from the Developer</h3> <div class="note-content"> <p>Hi, thanks so much for trying my game. This is definitely a work in progress, so there will be bugs, typos, and unfinished content. Please feel free to report any to me.</p> <p>If you enjoy the game, please feel free to join my Patreon as a free or premium member, which is where I post regular updates. You are also welcome to DM me anytime!</p> <p class="signature">Thanks,<br> <span class="dev-name">-North</span></p> </div> </div> <div class="audio-settings"> <h3 class="settings-header">🔊 Audio Configuration</h3> <div class="settings-content"> <p>This immersive experience includes atmospheric audio and video content. By default, videos are muted. Customize your audio preferences below (these can be adjusted anytime in the settings menu).</p> <<widget "toggleVideoSound">> <<set $videosMuted to !$videosMuted>> <<run updateVideoMute()>> <<replace "#videoStatus">> <<if $videosMuted>> Videos are now muted. <<else>> Videos are now unmuted. <</if>> <</replace>> <</widget>> <<widget "toggleAudioSound">> <<set $audioMuted to !$audioMuted>> <<replace "#audioStatus">> <<if $audioMuted>> Audio is now muted. <<else>> Audio is now unmuted. <</if>> <</replace>> <</widget>> <div class="audio-controls"> <div class="audio-option"> <h4>🎬 Video Sound</h4> <<button "Toggle Video Audio">> <<toggleVideoSound>> <</button>> <span id="videoStatus" class="status-text"> <<if $videosMuted>> Videos: <span class="muted">MUTED</span> <<else>> Videos: <span class="unmuted">ENABLED</span> <</if>> </span> </div> <div class="audio-option"> <h4>🔔 Sound Effects</h4> <<button "Toggle Sound Effects">> <<toggleAudioSound>> <</button>> <span id="audioStatus" class="status-text"> <<if $audioMuted>> Effects: <span class="muted">MUTED</span> <<else>> Effects: <span class="unmuted">ENABLED</span> <</if>> </span> </div> </div> </div> </div> </div> <style> .title-container { max-width: 900px; margin: 0 auto; padding: 20px; background: linear-gradient(180deg, rgba(0,0,0,0.98) 0%, rgba(139,0,0,0.3) 100%); min-height: 100vh; } .title-header { text-align: center; margin-bottom: 40px; padding: 30px 0; border-bottom: 3px solid #8B0000; } .game-title { font-size: 72px; font-family: 'Georgia', serif; color: #8B0000; text-shadow: 0 0 30px #8B0000, 3px 3px 6px #000; letter-spacing: 8px; margin-bottom: 10px; animation: titlePulse 3s infinite; } @keyframes titlePulse { 0%, 100% { text-shadow: 0 0 30px #8B0000, 3px 3px 6px #000; } 50% { text-shadow: 0 0 50px #DC143C, 5px 5px 10px #000; } } .title-subtitle { font-size: 20px; color: #CD853F; font-style: italic; text-shadow: 2px 2px 4px #000; } .content-warning { background: rgba(139,0,0,0.1); border: 2px solid #8B0000; border-radius: 10px; padding: 25px; margin-bottom: 30px; box-shadow: inset 0 0 20px rgba(0,0,0,0.5); } .warning-header { color: #FFD700; text-align: center; font-size: 28px; margin-bottom: 20px; text-shadow: 2px 2px 4px #000; } .warning-intro { text-align: center; color: #CD853F; font-style: italic; font-size: 18px; margin-bottom: 20px; } .warning-details { color: #E0E0E0; line-height: 1.6; margin-bottom: 15px; } .content-list { list-style: none; padding: 15px; background: rgba(0,0,0,0.5); border-radius: 5px; margin: 20px 0; } .content-list li { padding: 8px 0; color: #E0E0E0; font-size: 16px; } .age-disclaimer { text-align: center; padding: 15px; background: rgba(139,0,0,0.2); border-radius: 5px; margin-top: 20px; color: #FFD700; } .age-verification { text-align: center; margin-top: 25px; padding-top: 20px; border-top: 1px solid #8B0000; } .age-question { color: #FFD700; font-size: 20px; margin-bottom: 20px; font-weight: bold; } .button-container { display: flex; justify-content: center; gap: 20px; } .button-container button { padding: 15px 30px; background: linear-gradient(90deg, #8B0000 0%, #DC143C 100%); color: #FFD700; border: 2px solid #8B0000; border-radius: 5px; font-size: 18px; font-weight: bold; cursor: pointer; transition: all 0.3s; text-shadow: 1px 1px 2px #000; } .button-container button:hover { background: linear-gradient(90deg, #DC143C 0%, #FFD700 100%); color: #000; box-shadow: 0 0 20px rgba(255,215,0,0.6); transform: scale(1.05); } .developer-note { background: rgba(0,0,0,0.7); border: 1px solid #666; border-radius: 10px; padding: 25px; margin: 30px 0; } .note-header { color: #CD853F; font-size: 24px; margin-bottom: 15px; text-align: center; } .note-content { color: #E0E0E0; line-height: 1.8; } .note-content p { margin-bottom: 15px; } .signature { text-align: right; margin-top: 20px; color: #CD853F; font-style: italic; } .dev-name { font-size: 20px; color: #FFD700; font-weight: bold; } .audio-settings { background: rgba(139,0,0,0.1); border: 2px solid #8B0000; border-radius: 10px; padding: 25px; margin-top: 30px; } .settings-header { color: #FFD700; font-size: 24px; margin-bottom: 15px; text-align: center; } .settings-content { color: #E0E0E0; margin-bottom: 20px; } .audio-controls { display: flex; justify-content: space-around; gap: 30px; } .audio-option { flex: 1; text-align: center; padding: 15px; background: rgba(0,0,0,0.5); border-radius: 5px; } .audio-option h4 { color: #CD853F; margin-bottom: 10px; } .audio-option button { padding: 8px 20px; background: #8B0000; color: #FFD700; border: 1px solid #DC143C; border-radius: 3px; cursor: pointer; margin-bottom: 10px; } .audio-option button:hover { background: #DC143C; } .status-text { display: block; color: #E0E0E0; font-size: 14px; } .muted { color: #FF6B6B; } .unmuted { color: #51CF66; } </style> <</nobr>> <<addclass "#right-ui-bar" "stowed">>
<div style="margin-bottom: 10px;"> Image Path: <<textbox "$ImagePath" $ImagePath style="width:600px">> <<button "Reload Image">> <<goto ToolTipCreatorDungeon>> <</button>> </div> <div class="image-container" id="coordFinder"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <div id="coordinates"></div> </div> <div id="clickLog" style="margin-top: 20px; font-family: monospace;"> Click locations will appear here </div> <div id="generatedCode" style="margin-top: 20px; background: #2d2d2d; color: #ffffff; padding: 20px; white-space: pre-wrap; font-family: monospace; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.2);"> Generated code will appear here </div> <<script>> $(document).ready(function() { let clicks = []; $('#coordFinder').on('mousemove', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#coordinates').text(`x: ${x}, y: ${y}`); }).on('click', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#clickLog').prepend(`Clicked at: x: ${x}, y: ${y}<br>`); clicks.push({x: x, y: y}); let codeTemplate = `<<run setup.buildingData.set("${State.variables.ImagePath}", { hotspots: [`; clicks.forEach((click, index) => { codeTemplate += ` { x: ${click.x}, y: ${click.y}, tooltip: "locationname", passage: "CryptExploreRelay", position: "position" }${index < clicks.length - 1 ? ',' : ''}`; }); codeTemplate += ` ] })>>`; $('#generatedCode').text(codeTemplate); }); }); <</script>> <style> #coordinates { position: fixed; top: 10px; left: 10px; background: rgba(0,0,0,0.7); color: white; padding: 5px; border-radius: 3px; } </style> [[Back|Title]]
<<set $ImagePath to "Images/Town/Maps/Social/1.jpeg">> <div style="margin-bottom: 10px;"> Image Path: <<textbox "$ImagePath" $ImagePath style="width:600px">> <<button "Reload Image">> <<goto ToolTipCreatorDungeon>> <</button>> </div> <div class="image-container" id="coordFinder"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <div id="coordinates"></div> </div> <div id="clickLog" style="margin-top: 20px; font-family: monospace;"> Click locations will appear here </div> <div id="generatedCode" style="margin-top: 20px; background: #2d2d2d; color: #ffffff; padding: 20px; white-space: pre-wrap; font-family: monospace; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.2);"> Generated code will appear here </div> <<script>> $(document).ready(function() { let clicks = []; $('#coordFinder').on('mousemove', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#coordinates').text(`x: ${x}, y: ${y}`); }).on('click', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#clickLog').prepend(`Clicked at: x: ${x}, y: ${y}<br>`); clicks.push({x: x, y: y}); let codeTemplate = `<<run setup.buildingData.set("${State.variables.ImagePath}", { hotspots: [`; clicks.forEach((click, index) => { codeTemplate += ` { x: ${click.x}, y: ${click.y}, tooltip: "locationname", passage: "TownExploreRelay", position: "position" }${index < clicks.length - 1 ? ',' : ''}`; }); codeTemplate += ` ] })>>`; $('#generatedCode').text(codeTemplate); }); }); <</script>> <style> #coordinates { position: fixed; top: 10px; left: 10px; background: rgba(0,0,0,0.7); color: white; padding: 5px; border-radius: 3px; } </style> [[Back|Title]]
<div style="margin-bottom: 10px;"> Image Path: <<textbox "$ImagePath" $ImagePath style="width:600px">> <<button "Reload Image">> <<goto ToolTipCreatorDungeon>> <</button>> </div> <div class="image-container" id="coordFinder"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="500" height="500"> <div id="coordinates"></div> </div> <div id="clickLog" style="margin-top: 20px; font-family: monospace;">Click locations will appear here</div> <div id="generatedCode" style="margin-top: 20px; background: #2d2d2d; color: #ffffff; padding: 20px; white-space: pre-wrap; font-family: monospace; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.2);">Generated code will appear here</div> <<script>> $(document).ready(function() { let clicks = []; // Ensure image dimensions on load and reload $('#coordFinder img').on('load', function() { $(this).css({ 'width': '500px', 'height': '500px' }); $(this).parent().css({ 'width': '500px', 'height': '500px' }); }); $('#coordFinder').on('mousemove', function(e) { var rect = this.querySelector('img').getBoundingClientRect(); var x = Math.min(500, Math.max(0, Math.round(e.clientX - rect.left))); var y = Math.min(500, Math.max(0, Math.round(e.clientY - rect.top))); $('#coordinates').text(`x: ${x}, y: ${y}`); }).on('click', function(e) { var rect = this.querySelector('img').getBoundingClientRect(); var x = Math.min(500, Math.max(0, Math.round(e.clientX - rect.left))); var y = Math.min(500, Math.max(0, Math.round(e.clientY - rect.top))); $('#clickLog').prepend(`Clicked at: x: ${x}, y: ${y}<br>`); clicks.push({x: x, y: y}); let codeTemplate = `<<run setup.buildingData.set("${State.variables.ImagePath}", { hotspots: [`; clicks.forEach((click, index) => { codeTemplate += ` { x: ${click.x}, y: ${click.y}, tooltip: "locationname", passage: "CryptExploreRelay", position: "position" }${index < clicks.length - 1 ? ',' : ''}`; }); codeTemplate += ` ] })>>`; $('#generatedCode').text(codeTemplate); }); }); <</script>> <style> #coordFinder { width: 500px !important; height: 500px !important; position: relative; overflow: hidden; } #coordFinder img { width: 500px !important; height: 500px !important; display: block; } #coordinates { position: fixed; top: 10px; left: 10px; background: rgba(0,0,0,0.7); color: white; padding: 5px; border-radius: 3px; } </style> [[Back|Title]]
<div style="margin-bottom: 10px;"> Image Path: <<textbox "$ImagePath" $ImagePath style="width:400px">> <<button "Reload Image">> <<goto ToolTipCreatorLocatons>> <</button>> </div> <div class="image-container" id="coordFinder"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Settlement Image" width="800" height="800"> <div id="coordinates"></div> </div> <div id="clickLog" style="margin-top: 20px; font-family: monospace;"> Click locations will appear here </div> <div id="generatedCode" style="margin-top: 20px; background: #2d2d2d; color: #ffffff; padding: 20px; white-space: pre-wrap; font-family: monospace; border-radius: 5px; box-shadow: 0 2px 4px rgba(0,0,0,0.2);"> Generated code will appear here </div> <<script>> $(document).ready(function() { let clicks = []; $('#coordFinder').on('mousemove', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#coordinates').text(`x: ${x}, y: ${y}`); }).on('click', function(e) { var rect = e.target.getBoundingClientRect(); var x = Math.round(e.clientX - rect.left); var y = Math.round(e.clientY - rect.top); $('#clickLog').prepend(`Clicked at: x: ${x}, y: ${y}<br>`); clicks.push({x: x, y: y}); let codeTemplate = `<<run setup.buildingData.set("${State.variables.ImagePath}", { hotspots: [`; clicks.forEach((click, index) => { codeTemplate += ` { x: ${click.x}, y: ${click.y}, tooltip: "House", passage: "SettlementHouse" }${index < clicks.length - 1 ? ',' : ''}`; }); codeTemplate += ` ] })>>`; $('#generatedCode').text(codeTemplate); }); }); <</script>> <style> #coordinates { position: fixed; top: 10px; left: 10px; background: rgba(0,0,0,0.7); color: white; padding: 5px; border-radius: 3px; } </style>
<h2>Tower Card</h2> The Tower... a fortress of defense, unyielding and impenetrable. With this card, you can lock away your most guarded secrets and treasures, safe from prying eyes. But remember, the deeper you bury something, the more it yearns to be discovered. Walls, no matter how high, can crumble...<br><br> Effects of carrying this card:<br> -Raiders start with 20% corruption and 80% health<br> -1 more raider will come at night<br><br> Effects of buring the card:<br> End a raid instantly, capturing all remaining raiders<br><br>
<<nobr>> <div class="text-box"> <h1>Patreon Members Content</h1><br><br> This area is only available to Lord teir patreons<br><br> <div class="patreon-grid"> <div class="grid-item"> <img src="Images/Town/Demo/1.png"> </div> <div class="grid-item"> <img src="Images/Town/Demo/2.png"> </div> <div class="grid-item"> <img src="Images/Town/Demo/3.png"> </div> </div> <div class="benefits-list"> <h2>Exclusive Patreon Benefits:</h2> <ul> <li>Cheat codes!</li> <li>Purchase and manage an inn</li> <li>Hire and corrupt staff</li> <li>Work in the inn as Alice</li> </ul> </div> <div class="cta-section"> <a href="https://www.patreon.com/user/posts?u=136709338" target="_blank" class="patreon-button">Join my Patreon</a> </div><br><br> [[Leave|Town]] </div> <</nobr>>
<<if $Position is "Residental District">> <<set $BackgroundPath to "Images/Town/3.png">> <<set $ForestLocation to "Images/Town/Maps/Residental/6.jpeg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Social District">> <<set $BackgroundPath to "Images/Town/4.png">> <<set $ForestLocation to "Images/Town/Maps/Social/6.jpeg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Entrance">> <<set $BackgroundPath to "Images/Town/5.png">> <<set $ForestLocation to "Images/Town/Maps/Enterance/6.jpeg">> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Harbour">> <<set $BackgroundPath to "Images/Town/Harbor/1.png">> <<set $ForestLocation to "Images/Town/Maps/Harbour/6.jpeg">> <<set $OldPosition to $Position>> <</if>> $Position $ForestLocation <<goto "TownNight">>
<<set _rand to random(1, 5)>> <<set $BackgroundPath to "Images/Town/3.png">> <<if $Position is "Residental District">> <<set _path to "Images/Town/Maps/Residental/" + _rand + ".jpeg">> <<set $ForestLocation to _path>> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Social District">> <<set $BackgroundPath to "Images/Town/4.png">> <<set _path to "Images/Town/Maps/Social/" + _rand + ".jpeg">> <<set $ForestLocation to _path>> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Entrance">> <<set $BackgroundPath to "Images/Town/5.png">> <<set _path to "Images/Town/Maps/Enterance/" + _rand + ".jpeg">> <<set $ForestLocation to _path>> <<set $OldPosition to $Position>> <</if>> <<if $Position is "Harbour">> <<set $BackgroundPath to "Images/Town/Harbor/1.png">> <<set _path to "Images/Town/Maps/Harbour/" + _rand + ".jpeg">> <<set $ForestLocation to _path>> <<set $OldPosition to $Position>> <</if>> $Position $ForestLocation <<goto "Town">>
<<nobr>> <div class="text-box"> The girl crawls onto the bed and lays back, opening her legs wide and letting you thrust into her<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/5.webm" type="video/webm"> </video><br><br> Woman: M-my my husband will be home s-soon<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/6.webm" type="video/webm"> </video><br><br> <<You>>Let him eat your cunt when he gets here<</You>> Woman: Y-yes<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/7.webm" type="video/webm"> </video><br><br> Woman: Please cum inside me... breed meee<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/8.webm" type="video/webm"> </video><br><br> You give her what she wants and flood her cunt with your seed<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/9.webm" type="video/webm"> </video><br><br> Leaving her passed out on the bed, cum leaking out of her... you [[leave|TownHouses]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You push the girl back and kneel infront of her, tasting her pussy<br><br> Woman: oh gods your so much better than my husband! <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/6.webm" type="video/webm"> </video><br><br> You continue licking her slit, getting her jucies everwhere<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/7.webm" type="video/webm"> </video><br><br> Woman: P-please fuck me, make me yours<br><br> You stand over her and aim your cack at her<br><br> Woman: Yes, takes my pussy<br><br> But you have no interest in giving her what she wanted, do instead you press the head of your cock against her ass<br><br> Woman: Wait I've ner...<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/8.webm" type="video/webm"> </video><br><br> Pushing your spit coverd cock into her ass, the woman screams with a mix of pain and pleasure<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/9.webm" type="video/webm"> </video><br><br> Woman: Oh oh Gods! Yes<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/10.webm" type="video/webm"> </video><br><br> Woman: Fuck my virgin ass, oh<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/11.webm" type="video/webm"> </video><br><br> After enjoying her tight ass gripping your cock, you push deep and fill her with cum<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/12.webm" type="video/webm"> </video><br><br> [[Leave|TownHouses]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You lean over the sleeping woman and whisper into her ear...<br><br> Sleeping and defenceless it takes little effort to dominate her mind<br><br> <<if $Int is 1>> You disrobe and stand infront of the woman as she kneels infront of you<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/1.webm" type="video/webm"> </video><br><br> You watch as she obediently sucks on you<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/3.webm" type="video/webm"> </video><br><br> [[Fuck her|TownhouseEbony]] <</if>> <<if $Int is 3>> You disrobe and lay next to the woman, she slowly opens her eyes and in her trance, she looks at you lustfully<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/1.webm" type="video/webm"> </video><br><br> You let her play with you for a while, enjoying her sucking on your cock<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/3.webm" type="video/webm"> </video><br><br> After some time, you stand and becon her to the end of the bed, she crawls to you stairing at your cock and opens wide as you push yourself into her throat<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/4.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Brunette/5.webm" type="video/webm"> </video><br><br> [[Fuck her|TownhouseBrunette]] <</if>> <<if $Int is 5>> You disrobe and stand infront of the woman as she kneels infront of you<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/1.webm" type="video/webm"> </video><br><br> She takes hold of your cock and slowly sucks it, enjoying herself<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/2.webm" type="video/webm"> </video><br><br> After enjoying her serving you for a while, you take hold of her head and fuck her throat<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/3.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Blond/4.webm" type="video/webm"> </video><br><br> [[Fuck her|TownhouseBlond]] <</if>> <<if $Int is 7>> Removing your clothes, you lay next to the redheadded woman, she slowly comes around and look at you witha lustful gaze<br><br> Getting up, she crawls over the bed and takes your cock in her mouth<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/1.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/2.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/3.webm" type="video/webm"> </video><br><br> After enjoying her self a little too much, the girl removes her clothes and goes back to servicing your cock<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/4.webm" type="video/webm"> </video><br><br> Taking hold of her head, you guide her slowly<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/5.webm" type="video/webm"> </video><br><br> And then force her head down on you, feeling your cock slide down her tight, wet throat<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/6.webm" type="video/webm"> </video><br><br> [[Fuck her|TownhouseRed]] <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You reach down and and grab the her, pulling her over to a table and sitting her on top of it, she follows your commands and opens her legs, looking into your eyes as you spear her with your cock<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/4.webm" type="video/webm"> </video><br><br> Woman: Oh, fuck... I don't even k-know who you are but I want your cock so so bad!<br><br> You flip her around and fuck her againt the mirror, so she can watch herself give in to your control<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/5.webm" type="video/webm"> </video><br><br> Woman: Oh gods, take me<br><br> Enjoying taking her from behind, you push her back over to the bed and continue enjoying her cunt<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/6.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/7.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/8.webm" type="video/webm"> </video><br><br> After having your fill of her pussy, you pull out and grab her hair, pulling her face over to your cock, she follows and inhale you, sucking on you till you fill her mouth with cum<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Ebony/9.webm" type="video/webm"> </video><br><br> She carrys on sucking until you tell her to stop<br><br> [[Leave|TownHouses]] </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to random(1, 8)>> <<set $Room to random(0, 4)>> <<set $Location to random(0, 3)>> <<set $TownHouseRooms to ["BedroomOne", "LivingRoom1", "LivingRoom2", "KitchenOne", "KitchenTwo"]>> <<set $SilverLocation to ["Livingroom", "Bedroom", "Kitchen", "Empty"]>> The lock clicks and you open the door<br><br> Creeping through the front door, you enter a small hallway<br><br> <<link "Try a door">><<run Engine.play($TownHouseRooms[$Room])>><</link>> <div align="center"> <img src="Images/Town/Houses/3.png" width="700" height="700"> </div> </div> <</nobr>> <audio autoplay> <source src="Audio/UnlockDoor.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <<set $SleepingNPC to false>> <<set $Searching to false>> <<set $GoldFound to false>>
<<nobr>> <div class="text-box"> You lay back and enjoy watching the cute redhead straddle you and struggle to fit your cock in her tight cunt<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/7.webm" type="video/webm"> </video><br><br> You relax and enjoy the slow ride letting her fuck you<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/8.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/9.webm" type="video/webm"> </video><br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/11.webm" type="video/webm"> </video><br><br> After letting her ride you for some time, she climbs off you and milks your cock with her hand, finishing you on her chest<br><br> <video autoplay loop> <source src="Images/Town/Houses/Sex/Redhead/12.webm" type="video/webm"> </video><br><br> [[Leave|TownHouses]] </div> <</nobr>>
<<nobr>> <div class="text-box"> You lean over the sleeping woman and kiss her softly, in her sleeping state she is defenceless and offers no resistance as you consume her soul...<br><br> It's probably best to get out of here...<br><br> <<link "Go home">><<run Engine.play('Base Intro')>><</link>> <<set $Souls to $Souls + 1>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set $Bedroom to false>> <<set $Livingroom1 to false>> <<set $Livingroom2 to false>> <<set $Kitchen1 to false>> <<set $Kitchen2 to false>> <<set $silverfound to false>> Its quiet in the town, everyone is either a sleep or at the local taverns. Its a perfect night for sneeking into houses<br><br> You stick to the narrow passages and shaddows as you move through the town houses, eventually finding the perfect house<br> [[Pick the lock]] <br><br> [[Leave|Base Intro]] <</nobr>> </div>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/1.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/2.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/3.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/4.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/5.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/1.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/2.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/3.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/4.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/5.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/1.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/2.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/3.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/4.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/5.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/1.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/2.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/3.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/4.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/5.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/6.jpeg", { hotspots: [ { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/6.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "AliceBar", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/6.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/6.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/6.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/6.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/6.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/6.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <</nobr>>
<<nobr>> <<set setup.buildingData = new Map()>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/1.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/2.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/3.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/4.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Enterance/5.jpeg", { hotspots: [ { x: 14, y: 115, tooltip: "Outskirts", passage: "outskirts", position: "null" }, { x: 402, y: 297, tooltip: "Return to the castle", passage: "Base Intro", position: "null" }, { x: 544, y: 504, tooltip: "Residental District", passage: "TownExploreRelay", position: "Residental District" }, { x: 60, y: 758, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/1.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/2.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/3.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/4.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Harbour/5.jpeg", { hotspots: [ { x: 687, y: 152, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" }, { x: 353, y: 409, tooltip: "Tavern", passage: "Tavern", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/1.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/2.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/3.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/4.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Residental/5.jpeg", { hotspots: [ { x: 119, y: 12, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 8, y: 340, tooltip: "Social District", passage: "TownExploreRelay", position: "Social District" } ] })>> <<if $AliceCorrupt is true and $Cathedral isnot true>> <<run setup.buildingData.set("Images/Town/Maps/Social/1.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/2.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 279, y: 658, tooltip: "Investigate the Cathedral", passage: "TownCathedralVisit", position: "position" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/3.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 279, y: 658, tooltip: "Investigate the Cathedral", passage: "TownCathedralVisit", position: "position" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/4.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 279, y: 658, tooltip: "Investigate the Cathedral", passage: "TownCathedralVisit", position: "position" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/5.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 279, y: 658, tooltip: "Investigate the Cathedral", passage: "TownCathedralVisit", position: "position" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<else>> <<run setup.buildingData.set("Images/Town/Maps/Social/1.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/2.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/3.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/4.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <<run setup.buildingData.set("Images/Town/Maps/Social/5.jpeg", { hotspots: [ { x: 769, y: 368, tooltip: "Entrance", passage: "TownExploreRelay", position: "Entrance" }, { x: 318, y: 357, tooltip: "Bath House", passage: "Bath House", position: "null" }, { x: 140, y: 462, tooltip: "Store", passage: "Store" }, { x: 14, y: 666, tooltip: "Harbour", passage: "TownExploreRelay", position: "Harbour" }, { x: 554, y: 189, tooltip: "Ally Way", passage: "TownAllyWay", position: "null" } ] })>> <</if>> <</nobr>>
Night $Position <<nobr>> <<set $HouseVisit to false>> <<set $Position to "null">> <<set $Animal to false>> <div class="text-box"> <<if $CurrentPlayer is "Overlord">> <<include "TownLocationDataNight">> <<else>> <<include "TownLocationDataNightAlice">> <</if>> <div class="image-container repair-mode"> <<set _imagePath to $ForestLocation>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ForestLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<if $Time >= 9>> <<if $LockPicksUnlocked is true>> <div class="menu-item" data-image="Images/Town/Houses/1.png"> [[Search the town houses|TownHouses]] </div> <</if>> <</if>> <<button "Return to the castle">> <<goto "Base Intro">> <</button>> <<if $NavigationButtons isnot true>> <<button "Show nav buttons (better for phones)">> <<goto "ForestExplore">> <<set $NavigationButtons to true>> <</button>> <</if>> <<if $NavigationButtons is true>> <<button "Hide nav buttons">> <<goto "ForestExplore">> <<set $NavigationButtons to false>> <</button>> <</if>> </div> <<if $NavigationButtons is true>> <div class="text-box"> <!-- Dynamic Hotspot Buttons --> <<set _currentData = setup.buildingData.get($ForestLocation)>> <<if _currentData and _currentData.hotspots.length > 0>> <div class="hotspot-button-list"> <<for _hotspot range _currentData.hotspots>> <<capture _hotspot>> <<button _hotspot.tooltip>> <<set $Position to _hotspot.position>> <<goto _hotspot.passage>> <</button>> <</capture>> <</for>> </div> <</if>> </div> <</if>> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ForestLocation;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: rgba(255, 255, 255, 0.2) !important; border-radius: 50% !important; border: 2px solid white !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .hotspot:hover { border-color: white !important; } .repair-mode .hotspot:hover .tooltip { color: white !important; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <div class="town-menu"> <h1>Harbor’s End Gates</h1> <<if $Time lt 9>> <div class="town-image"> <img src="Images/Town/1.png" alt="Town Image"> </div> <<else>> <<if setup.getCurrentMonth() == 10>> <div class="town-image"> <img src="Images/Town/Seasons/Oct.png" alt="Town Image"> </div> <<elseif setup.getCurrentMonth() == 12>> <div class="town-image"> <img src="Images/Town/Seasons/Dec.png" alt="Town Image"> </div> <<else>> <div class="town-image"> <img src="Images/Town/2.png" alt="Town Image"> </div> <</if>> <</if>> <<if ($Time lt 9) and ($Quests.includes("Obtain a silver weapon"))>> <<You>>I should wait till dark to sneak into people's homes<</You>> <</if>> <<if $Time >= 9>> <div class="menu-item" data-image="Images/Town/Tavern/6.png"> [[Residental District]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[It's too late, I need to go back to the castle|Base Intro]] </div> <<else>> <div class="menu-item" data-image="Images/Town/4.png"> [[Residental District]] </div> <div class="menu-item" data-image="Images/Town/Harbor/1.png"> [[Harbor]] </div> <div class="menu-item" data-image="Images/Town/3.png"> [[Social District]] </div> <div class="menu-item" data-image="Images/Town/7.png"> [[Outskirts|outskirts]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Return to the castle|Base Intro]] </div> <</if>> </div> <<set $CloakDisabled to true>> <style> .town-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .town-menu h1 { font-size: 28px; text-align: center; margin-bottom: 20px; } .town-menu .description { text-align: center; font-size: 18px; margin-bottom: 20px; } .menu-item { display: flex; align-items: center; margin-bottom: 10px; padding: 10px; background-color: rgba(255, 255, 255, 0.1); border-radius: 5px; transition: background-color 0.3s; } .menu-item:hover { background-color: rgba(255, 255, 255, 0.2); } .menu-item img { width: 160px; height: 90px; object-fit: cover; margin-right: 15px; border-radius: 3px; } .menu-item a { color: #FFFFFF; text-decoration: none; font-size: 18px; } .menu-item.disabled { opacity: 0.5; cursor: not-allowed; } .menu-item.disabled:hover { background-color: rgba(255, 255, 255, 0.1); } .town-image { text-align: center; margin-top: 20px; } .town-image img { max-width: 100%; height: auto; border-radius: 5px; } </style> <script> $(document).ready(function() { $('.menu-item').each(function() { var imageSrc = $(this).data('image'); if (imageSrc) { $(this).prepend('<img src="' + imageSrc + '" alt="Menu item image">'); } }); }); </script> <</nobr>> <<addclass "#right-ui-bar" "stowed">>
<<nobr>> <<set $HouseVisit to false>> <<set $Position to "null">> <<set $Animal to false>> <<if $Time gt 6>> <<set $Position to $OldPosition>> <<goto "TownExploreRelayNight">> <</if>> <div class="text-box"> <<if $CurrentPlayer is "Overlord">> <<include "TownLocationData">> <<else>> <<include "TownLocationDataAlice">> <</if>> <div class="image-container repair-mode"> <<set _imagePath to $ForestLocation>> <img @src=_imagePath alt="Settlement Image"> <<widget "createHotspots">> <<set _currentData to setup.buildingData.get($ForestLocation)>> <<if _currentData>> <<for _hotspot range _currentData.hotspots>> <div @class="'hotspot'" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'" data-passage="_hotspot.passage" data-position="_hotspot.position"> <div class="tooltip"><<print _hotspot.tooltip>></div> <div class="circle hidden"></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<if ($Time lt 9) and ($Quests.includes("Obtain a silver weapon")) and ($CurrentPlayer is "Overlord")>> <<You>>I should wait till dark to sneak into people's homes<</You>> <</if>> <<button "Return to the castle">> <<goto "Base Intro">> <</button>> <<if $NavigationButtons isnot true>> <<button "Show nav buttons (better for phones)">> <<goto "ForestExplore">> <<set $NavigationButtons to true>> <</button>> <</if>> <<if $NavigationButtons is true>> <<button "Hide nav buttons">> <<goto "ForestExplore">> <<set $NavigationButtons to false>> <</button>> <</if>> </div> <<if $NavigationButtons is true>> <div class="text-box"> <!-- Dynamic Hotspot Buttons --> <<set _currentData = setup.buildingData.get($ForestLocation)>> <<if _currentData and _currentData.hotspots.length > 0>> <div class="hotspot-button-list"> <<for _hotspot range _currentData.hotspots>> <<capture _hotspot>> <<button _hotspot.tooltip>> <<set $Position to _hotspot.position>> <<goto _hotspot.passage>> <</button>> <</capture>> <</for>> </div> <</if>> </div> <</if>> <<script>>$(document).ready(function(){function updateHotspotPositions(){const container=$('.image-container');const img=container.find('img');if(img.length&&img[0].complete){const originalWidth=800;const originalHeight=800;const currentWidth=img.width();const currentHeight=img.height();const scaleX=currentWidth/originalWidth;const scaleY=currentHeight/originalHeight;$('.hotspot').each(function(){const hotspot=$(this);const originalX=parseInt(hotspot.attr('data-original-x')||hotspot.css('left'));const originalY=parseInt(hotspot.attr('data-original-y')||hotspot.css('top'));if(!hotspot.attr('data-original-x')){hotspot.attr('data-original-x',originalX);hotspot.attr('data-original-y',originalY);}const newX=originalX*scaleX;const newY=originalY*scaleY;hotspot.css({'left':newX+'px','top':newY+'px'});});}}$('.image-container img').on('load',updateHotspotPositions);$(window).on('resize',updateHotspotPositions);setTimeout(updateHotspotPositions,100);$('.hotspot').on('click',function(e){e.preventDefault();e.stopPropagation();let currentPath=State.variables.ForestLocation;let hotspotData=setup.buildingData.get(currentPath);if(hotspotData&&hotspotData.hotspots){const originalX=parseInt($(this).attr('data-original-x'));const originalY=parseInt($(this).attr('data-original-y'));let hotspot=hotspotData.hotspots.find(h=>Math.abs(h.x-originalX)<5&&Math.abs(h.y-originalY)<5);if(hotspot&&hotspot.position){State.variables.Position=String(hotspot.position);}}let nextPassage=$(this).data('passage');Engine.play(nextPassage);return false;});});<</script>> <style> .image-container { position: relative !important; display: inline-block !important; overflow: hidden !important; max-width: 800px !important; max-height: 800px !important; width: auto !important; height: auto !important; border: 2px solid white !important; } .image-container img { width: 100% !important; height: auto !important; max-width: 800px !important; max-height: 800px !important; display: block !important; } .repair-mode .hotspot { position: absolute !important; width: 30px !important; height: 30px !important; cursor: pointer !important; background-color: rgba(255, 255, 255, 0.2) !important; border-radius: 50% !important; border: 2px solid white !important; } .repair-mode .tooltip { position: absolute !important; color: white !important; text-shadow: 2px 2px 2px #000000 !important; width: 120px !important; text-align: center !important; background: none !important; transition: none !important; transform: none !important; left: -45px !important; top: -45px !important; } .repair-mode .hotspot:hover { border-color: white !important; } .repair-mode .hotspot:hover .tooltip { color: white !important; } /* Mobile responsive adjustments */ @media (max-width: 900px) { .image-container { max-width: 95vw !important; max-height: 95vh !important; } .repair-mode .hotspot { width: 25px !important; height: 25px !important; } .repair-mode .tooltip { width: 100px !important; font-size: 12px !important; left: -37px !important; top: -37px !important; } } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<if $FirstVisitSkillTree isnot true>> <<set $FirstVisitSkillTree to true>> <<set $powerSkills = { strength1: {unlocked: false, cost: 5}, strength2: {unlocked: false, cost: 5, requires: 'strength1'}, strength3: {unlocked: false, cost: 5, requires: 'strength2'}, OneHandedSkill: {unlocked: false, cost: 5, requires: 'strength1'}, TwoHandedSkill: {unlocked: false, cost: 5, requires: 'strength2'} }>> <<set $magicSkills = { Magic1: {unlocked: false, cost: 5}, Inferno: {unlocked: false, cost: 5, requires: 'Magic1'}, Magic2: {unlocked: false, cost: 5, requires: 'Magic1'}, DrainPlus: {unlocked: false, cost: 5, requires: 'Magic2'}, Magic3: {unlocked: false, cost: 5, requires: 'Magic2'}, }>> <</if>> <div class="text-box"> <h1>Skill Tree</h1> <p>Available Souls: $Souls</p> <div style="display: flex; justify-content: space-around;"> <!-- Power Tree --> <div style="text-align: center; width: 45%;"> <h2>Power Path</h2> <!-- Strength 1 --> <div class="skill-box"> <h3>Weapon Skill 1</h3> <p>Cost: 5 Souls</p> <p>Place 3 cards during combat</p> <<if !$powerSkills.strength1.unlocked && $Souls >= 5>> <<button "Learn Weapon Skill 1">> <<set $powerSkills.strength1.unlocked = true>> <<set $combatCardsMax to 3>> <<set $Souls -= 5>> <<run Engine.show()>> <</button>> <<elseif $powerSkills.strength1.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Insufficient Souls</button> <</if>> </div> <!-- Strength 2 --> <div class="skill-box"> <h3>Weapon Skill 2</h3> <p>Cost: 5 Souls</p> <p>Place 4 cards during combat</p> <<if !$powerSkills.strength2.unlocked && $powerSkills.strength1.unlocked && $Souls >= 5>> <<button "Learn Weapon Skill 2">> <<set $powerSkills.strength2.unlocked = true>> <<set $combatCardsMax to 4>> <<set $Souls -= 5>> <<run Engine.show()>> <</button>> <<elseif $powerSkills.strength2.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Requirements Not Met</button> <</if>> </div> </div> <!-- CLOSES Power Path column --> <!-- Magic Tree --> <div style="text-align: center; width: 45%;"> <h2>Magic Path</h2> <!-- Magic 1 --> <div class="skill-box"> <h3>Magic 1</h3> <p>Cost: 5 Souls</p> <p>Increase max magic by 10</p> <<if !$magicSkills.Magic1.unlocked && $Souls >= 5>> <<button "Learn Magic 1">> <<set $magicSkills.Magic1.unlocked = true>> <<set $PlayerMaxMagic to 30>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $Souls -= 5>> <<run Engine.show()>> <</button>> <<elseif $magicSkills.Magic1.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Insufficient Souls</button> <</if>> </div> <!-- Inferno --> <div class="skill-box"> <h3>Inferno</h3> <p>Cost: 5 Souls</p> <p>Fireball deals 30 damage</p> <<if !$magicSkills.Inferno.unlocked && $magicSkills.Magic1.unlocked && $Souls >= 5>> <<button "Learn Inferno">> <<set $magicSkills.Inferno.unlocked = true>> <<set $Souls -= 5>> <<run $PlayerSpells.delete("Fire")>> <<run $PlayerSpells.push("Inferno")>> <<run Engine.show()>> <</button>> <<elseif $magicSkills.Inferno.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Requirements Not Met</button> <</if>> </div> <!-- Magic 2 --> <div class="skill-box"> <h3>Magic 2</h3> <p>Cost: 5 Souls</p> <p>Increase max magic by 10</p> <<if !$magicSkills.Magic2.unlocked && $magicSkills.Magic1.unlocked && $Souls >= 5>> <<button "Learn Magic 2">> <<set $magicSkills.Magic2.unlocked = true>> <<set $Souls -= 5>> <<set $PlayerMaxMagic to 40>> <<set $PlayerMagic to $PlayerMaxMagic>> <<run Engine.show()>> <</button>> <<elseif $magicSkills.Magic2.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Requirements Not Met</button> <</if>> </div> <!-- Magic 3 --> <div class="skill-box"> <h3>Magic 3</h3> <p>Cost: 5 Souls</p> <p>Increase max magic by 10</p> <<if (!$magicSkills.Magic3 or !$magicSkills.Magic3.unlocked) and $magicSkills.Magic2 and $magicSkills.Magic2.unlocked and $Souls >= 5>> <<button "Learn Magic 3">> <<set $magicSkills.Magic3.unlocked = true>> <<set $Souls -= 5>> <<set $PlayerMaxMagic to 50>> <<set $PlayerMagic to $PlayerMaxMagic>> <<run Engine.show()>> <</button>> <<elseif $magicSkills.Magic3.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Requirements Not Met</button> <</if>> </div> <!-- Drain --> <div class="skill-box"> <h3>Drain +</h3> <p>Cost: 5 Souls</p> <p>Drain will remove 10 more health from your enemy</p> <<if !$magicSkills.DrainPlus.unlocked && $magicSkills.Magic2.unlocked && $Souls >= 5>> <<button "Learn Drain +">> <<set $magicSkills.DrainPlus.unlocked = true>> <<set $Souls -= 5>> <<run $PlayerSpells.delete("Drain")>> <<run $PlayerSpells.push("Drain+")>> <<run Engine.show()>> <</button>> <<elseif $magicSkills.DrainPlus.unlocked>> <span class="learned">Learned!</span> <<else>> <button disabled>Requirements Not Met</button> <</if>> </div> </div> </div> </div> <<button "Back">> <<goto "Eisheth">><<set $ForestLocation to "Images/Forrest/Maps/Cave.jpg">> <</button>><br> <</nobr>>
<div class="text-box"> Trap Door - A hidden trap with a 20% chance of triggering. Can capture up to two raiders. Spider Lair- Summon a giant spider to defend your castle has a 20% chance of ensnaring its pray, this will increase as it captures more pray and levels up Thief's Lure- A valuable looking necklace, if touched the thief will instantly become corrupted. 50% chance of attracting thieves and 20% chance of attracting other raiders. Guardian- A stone guardian who will attack anyone who tries to pass it Black Pool- Benith the calm water waits a writhing mass of black tentecals ready to drag its pray into the depths [[Return|Defences]] </div>
<<nobr>> <div class="text-box"> <h1>You find treasure</h1> <<if $TarotCardInvet.includes("Sun")>> <<set _int to random(0, 4)>> Having the sun card booses the treasure you find<br><br> <<set $Treasure = random(40, 160)>> <<else>> <<set _int to 0>> <<set $Treasure = random(20, 60)>> <</if>> You open find $Treasure gold <<if _int is 4>> The sun card tricks you, and the gold turns to dust in your hands<br><br> <<else>> <<set $Gold to $Gold + $Treasure>> <</if>><br><br> <div align="center"> <img src="Images/Forrest/Found Items/1.webp" width="700" height="700"> </div> <<if $SearchingVillagers is true>> [[return|Forrest Explore]] <<else>> <<return "Return">><</if>> </div> <</nobr>> <<set $SearchingVillagers to false>>
<<nobr>> <div class="text-box"> <h1>Select Settlement</h1> <h2>Choose where to deploy the unit</h2> <hr> <div id="settlements-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CapturedLocations.length; _i++>> <<capture _settlement>> <<set _settlement to $CapturedLocations[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_settlement.imagePath" alt="<<_settlement.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _settlement.name>></h3> <p>Garrison Size: <<print _settlement.garrison.length>></p> <<if _settlement.hasCult>> <p style="color: red;">Investigate this location before sending anyone</p> <<else>> <<button "Deploy Here">> <<set _newUnit = { NPCID: $currentUnitForTransfer.prisonerId, name: $currentUnitForTransfer.name, sex: $currentUnitForTransfer.sex, specialization: $currentUnitForTransfer.specialization, skill: $currentUnitForTransfer.skill, hairColor: $currentUnitForTransfer.hairColor, ImagePath: $currentUnitForTransfer.ImagePath, armor: $currentUnitForTransfer.armor, weapon: $currentUnitForTransfer.weapon, health: $currentUnitForTransfer.health }>> <<if !_settlement.garrison>> <<set _settlement.garrison to []>> <</if>> <<run _settlement.garrison.push(_newUnit)>> <<run $BarraksOccupance = $BarraksOccupance.filter(u => u.prisonerId !== $currentUnitForTransfer.prisonerId)>> <<run UI.alert(`Unit deployed to ${_settlement.name}'s garrison.`)>> <<goto "Barracks">> <</button>> <</if>> </div> <</capture>> <</for>> </div> </div> <div style="text-align: center"> <<button "Return">><<goto "Barracks">><</button>> </div> <</nobr>>
<<nobr>> <!-- Caravan departure system --> <<if $RaidLocationList && $RaidLocationList.length > 0>> <<set _caravansToRemove = []>> <<for _i to 0; _i < $RaidLocationList.length; _i++>> <<if $RaidLocationList[_i].type === "Caravan">> <<set $RaidLocationList[_i].daysRemaining -= 1>> <<if $RaidLocationList[_i].daysRemaining <= 0>> <<run _caravansToRemove.push(_i)>> <</if>> <</if>> <</for>> <!-- Remove caravans that have departed (in reverse order to avoid index issues) --> <<if _caravansToRemove.length > 0>> <<run _caravansToRemove.sort((a, b) => b - a)>> <<for _i to 0; _i < _caravansToRemove.length; _i++>> <<set _removedCaravan = $RaidLocationList[_caravansToRemove[_i]]>> <<run $RaidLocationList.deleteAt(_caravansToRemove[_i])>> <<run UI.alert(_removedCaravan.name + " has departed and is no longer available for raiding.")>> <</for>> <</if>> <</if>> <<if $CourtyardOccupance>> <<for _i to 0; _i < $CourtyardOccupance.length; _i++>> <<if $CourtyardOccupance[_i].skill < 100>> <<set $CourtyardOccupance[_i].skill += 20>> <<if $CourtyardOccupance[_i].skill > 100>> <<set $CourtyardOccupance[_i].skill = 100>> <</if>> <</if>> <</for>> <</if>> <<if $InfrimaryOccupance>> <<for _i to 0; _i < $InfrimaryOccupance.length; _i++>> <<if $InfrimaryOccupance[_i].health < 100>> <<set $InfrimaryOccupance[_i].health += 25>> <<if $InfrimaryOccupance[_i].health > 100>> <<set $InfrimaryOccupance[_i].health = 100>> <</if>> <</if>> <</for>> <</if>> <<if $LibraryOccupance>> <<for _i to 0; _i < $LibraryOccupance.length; _i++>> <<set _villager = $LibraryOccupance[_i]>> <<if _villager.skill < 100>> <<set _villager.skill += 20>> <<if _villager.skill > 100>> <<set _villager.skill = 100>> <</if>> <</if>> <</for>> <</if>> <<if !$CorruptionRune>> <<set $CorruptionRune to 0>> <</if>> <<set _corruptionBoot to $CorruptionRune * 5>> <<set _corruptionBoot to _corruptionBoot + 15>> <<if $DungonOccupance>> <<for _i to 0; _i < $DungonOccupance.length; _i++>> <<if $DungonOccupance[_i].corruption < 100>> <<set $DungonOccupance[_i].corruption += _corruptionBoot>> <<if $DungonOccupance[_i].corruption > 100>> <<set $DungonOccupance[_i].corruption = 100>> <</if>> <</if>> <</for>> <</if>> <<if $LucyHunger gt 0>> <<set $LucyHunger to $LucyHunger - 1>> <</if>> <<if $AliceHunger gt 0>> <<set $AliceHunger to $AliceHunger - 1>> <</if>> <<set $VistedForestLocations = []>> <<if $FarmPlandedGrain and $FramGrainPlanted is true>> <<set $FarmGrainGroth to $FarmGrainGroth + 1>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> You wake the next morning, the clerk as already left, so you get up and head out to the town squre. To the north is a bridge leading to the main hall, you cross it and aproach the hall only to be stopped by a guard <<Guard>>Halt, the hall is closed today, clear off<</Guard>> <<say 'Alice' _CharProfileIMG>>I, have a meeting<</say>> <<Guard>>No Lords are in to listen to your sob story... clear off<</Guard>> <<say 'Alice' _CharProfileIMG>>Look... I need to get in there to speak to a clerk, what do we need to do to get me in their?<</say>> <<Guard>>How badly do you want in?<</Guard>> You step closer <<say 'Alice' _CharProfileIMG>>Really badly...<</say>> He smiles <<Guard>>Come<</Guard>> He leads you to a small quiet cornor and wastes no time pinning you to the wall and rutting you like a cheap whore. The guards have something of a reputation for being rough but you don't mind as he thusts into you over and over<br><br> <<set _rand to random(7, 9)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> He's clearly in a rush to get back to his duties and after a few moment he stifies a moan and you feel his hard cock throb inside you<br><br> <<Guard>>Fuck... That will do, now who did you wish to speak with?<</Guard>> Explaining that you have a planned audiance with $AliceBarMeetName he escorts you to a side door and gives you some basic directions before letting you inside and returning to his watch<br><br> You continue into the wall<br><br> <<button "Continue">> <<goto "AliceTavClerk1">> <</button>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set $ImagePath to "Images/Forrest/Cult/1.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<if $Position is "null">> <<You>>I wanted to ask you a question<</You>><br><br> <<Vaelora>>You deserve some answers<</Vaelora>><br><br> <<link "What is this place?">> <<set $Position to "Place">> <<run Engine.show()>> <</link>><br><br> <<link "Who are you?">> <<set $Position to "Vaelora">> <<run Engine.show()>> <</link>><br><br> <<link "What do you want with me?">> <<set $Position to "Me">> <<run Engine.show()>> <</link>><br><br> <<if $CultOccupance.length gt 1>> <<set $Position to "Custist">> <<run Engine.show()>> <</link>><br><br> <</if>> <</if>> <<if $Position is "Place">> <<You>>So... what is this place?<</You>><br><br> <<Vaelora>>It is... It was a coven a safe place for women with power<</Vaelora>><br><br> <<You>>You're a witch?<</You>><br><br> <<Vaelora>>Sorcerous is a preferable term, but yes. There were a lot fo us and now there is just me the villagers don't tolerate anything they don't understand... I'm sure you know what that as well as I do.<</Vaelora>><br><br> <<Vaelora>>We are trying to rebuild, Elizabeth shows little ability for magic, but she is enthusiastic and always looking to help<</Vaelora>><br><br> <</if>> <<if $Position is "Vaelora">> <<You>>So, what exectly are you?<</You>><br><br> <<Vaelora>>I am like you, many folk have some sort of power... But you and I can control others souls, corrupt them to our will. I want what you want... Power, control and to rebuild what was taken from me. Your abition is just a little greater than mine. I am content with my coven, while you... I'm not even sure what you will be content with<</Vaelora>><br><br> <</if>> <<if $Position is "Me">> <<You>>And what do you want from me?<</You>><br><br> <<Vaelora>>I have heard of your castle, raiders going in. Woman taken from their homes... You have must have a few souls locked in there somewhere... I simply want you to send me some. I need women, uncorrupted by you or those demons you keep by your side. I will take them off your hands and pursuade them to join me<</Vaelora>><br><br> <<You>>You seem to know a lot about me?<</You>><br><br> <<Vaelora>>Yes, I also know you have a unque power to control some of the demons. I think we can share this power, if we make the right sacrifises... Pehapse we can summon these demons to help you<</Vaelora>> <<Vaelora>>Bring me a woman, and we can talk further... And I don't mean a broken toy you are board with... Someone innocent and uncorrupted<</Vaelora>> <<set _Ask to true>> <</if>> <<if $Position is "Custist">> <<You>>So, you have your girl... What now?<</You>><br><br> <<Vaelora>> <</Vaelora>> <</if>> <<if $Position is not "null">> <<link "Ask another question">> <<set $Position to "null">> <<run Engine.show()>> <</link>><br><br> <</if>> <<link "Leave">> <<if (_Ask is true) and ($Quests.includes("Find out what Vaelora wants"))>> <<script>> UI.alert("New Complete! <br>You now know what Vaelora want's from you, it is your choice to help her or not"); <</script>> <<run $Quests.delete("Find out what Vaelora wants")>> <<script>> UI.alert("New Quest! <br>Send an uncorrupted girl to Vaelora's coven"); <</script>> <<run $Quests.push("Send an uncorrupted girl to Vaelora's coven")>> <</if>> <<run Engine.play('Cult')>> <</link>> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<<nobr>> <div class="text-box"> Ignoring the creatures word's you draw your blade<br><br> <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Vampire: Don't be a fool, put down your blade or die here and now</span><br><br> Prepare for [[Combat]]<br><br> [[Lower your weapon and hear her out|VampireGamtSit]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $CurrentEnemy to "Vampire">> <<set $EnemyHealth to 100>> <<set $EnemyWeapon to "claws">> <<set $EnemyMin to 20>> <<set $EnemyMax to 25>>
<<nobr>> <div class="text-box"> <<set $Int to 1>> <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Girl: You have been working so hard of this</span><br><br> She holds out the key you have been searching for<br><br> <span style="color: red">Girl: You must be sick of fighting and solving silly little puzzles... So how about a simple game? I get so board here and we cannot leave in the day</span><br><br> <span style="color: red">Girl: It's simple really I will lay out two cards, one face up the other face down... You simply need to guess if the one face down will be higher or lower than the last</span><br><br> <span style="color: red">Girl: If you get 5 right, you win! And you can have the key... If you get 3 wrong, you loose</span><br><br> <<You>>And if I loose?<</You>><br><br> Her smile fades<br><br> <span style="color: red">Girl: Do you know what I am mortal?</span><br><br> <<You>>A demon<</You>><br><br> She chuckles<br><br> <span style="color: red">Girl: Close, I'm a vampire... I survive off the life blood flowing through your vains</span><br><br> <span style="color: red">Girl: So if you loose, Im going to drain every last drop from your throat... But, like I said if you win you can have this key and as a reward... I'll drain your ball's instead of your neck. Does that sound like fun to you?</span><br><br> [[Begin|HLGame]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set $VampireHunt to false>> <div class="text-box"> <<set _charPath to "Images/Forrest/Encounters/Abandond tower/Vampire/1.png">> Something trips you and you fall <<say 'Woman' _charPath>>There you are fly...<</say>> She jumps onto you and pins you down with more strength than her from should have<br> <<say 'Woman' _charPath>>That got the blood pumping... Though maybe I should play with you more<</say>> With one arm across your throat she removes your cock and sits on it <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/Vampire/6.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Woman' _charPath>>Fuck, that should really get your heatrate up<</say>> She rides you till you cant take any more, cumming inside her cunt<br><br> <<say 'Woman' _charPath>>Ummm good boy<</say>> And with that continues riding you for her own pleasure as she comes down to your neck and bites your throat <<set _imgPath to "Images/Forrest/Encounters/Abandond tower/Vampire/7.png">> <div class="Random-image"> <<set _imagePath to _imgPath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Woman' _charPath>>Ummm<</say>> You feel her climax on you as she sucks on your throat...<br><br> Eventualy your vision grays and then blures before everything turns black <<button "You die">> <<goto "Resporn">> <</button>> </div> <</nobr>>
<<nobr>> <<set $VampireHunt to false>> <<script>> if (window.vampireHuntTimer) { window.vampireHuntTimer.stop(); } <</script>> <div class="text-box"> You escape the forest and stop to catch your breath... You give yourself a moment before running home<br><br> <<button "Home">> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Int to 1>> You look around the room and see a young girl <<set $ImagePath to "Images/Crypt/VampireGame/" + $Int + ".png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <span style="color: red">Girl: Come closer</span><br><br> [[Obay|VampireGamtSit]]<br><br> [[Draw your sword|VampireGameAttack]] </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> <<set $PlayerScore to 0>> <<set $NPCScore to 0>> <<set $RightLines to [ "Awww, the little mortal wants to live", "Getting closer to that key", "Humm..."]>> <<set $WrongLines to [ "So unfortunate...", "Poor choise", "Oh I can't wait to open your throat"]>>
<div class="text-box"> You slip out of consciouseness as you watch the $CurrentEnemy walk over to your vault door. <<if $Wood >= 500>><<set $Wood to $Wood - 250>> <<elseif $Wood >= 200>><<set $Wood to $Wood - 50>><</if>> <<if $Stone >= 500>><<set $Stone to $Stone - 250>><<else>> <<elseif $Stone >= 200>><<set $Stone to $Stone - 50>><</if>> <<if $Gold >= 500>><<set $Gold to $Gold - 250>><<else>> <<elseif $Gold >= 200>><<set $Gold to $Gold - 50>><</if>> [[Continue|Resporn]] </div>
<<nobr>> <div class="text-box"> You stand between the $CurrentRaider.type and your vault<br><br> <<set $ImagePath to $CurrentRaider.img>> <<set $EnemyCorruption to $CurrentRaider.corruption>> <<set $EnemyHealth to $CurrentRaider.health>> <<set $EnemyWeapon to $CurrentRaider.weapon>> <<set $CurrentEnemy to $CurrentRaider.type>> <<if $CurrentEnemy is "Bandit">> <<goto "Encounter_Raider">> <<elseif $CurrentEnemy is "Heavy Bandit">> <<goto "Encounter_Heavy_Raider">> <<else>> <<goto "Encounter_Thief">> <</if>> </div> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <</nobr>>
<div class="text-box"> <<nobr>> <<if $VisitedVault is false>> <<include "DialogueStorage">> <<startdialogue "_TutorialVault">> <</if>> <div class="vault-container"> <div class="vault-image"> <<set $ImagePath to "Images/Castle/Vault/2.jpg">> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Vault Image"> </div> <div class="vault-resources"> <h2>Resources</h2> <div class="resource-item"> <img src="Images/Icons/Gold.png" alt="Gold" class="resource-icon"> <strong>Gold:</strong> <<print $Gold || 0>> </div> <div class="resource-item"> <img src="Images/Icons/Wood.png" alt="Wood" class="resource-icon"> <strong>Wood:</strong> <<print $Wood || 0>> </div> <div class="resource-item"> <img src="Images/Icons/Stone.png" alt="Stone" class="resource-icon"> <strong>Stone:</strong> <<print $Stone || 0>> </div> <<if $Grain>> <div class="resource-item"> <strong>Grain:</strong> <<print $Grain>> </div> <</if>> </div> <<if $Valuables>> <div class="vault-valuables"> <h2>Valuables</h2> <div class="valuables-grid"> <<for _valuable, _amount range $Valuables>> <<if _amount > 0>> <<set _displayName = _valuable === "Fine_Cloth" ? "Fine Cloth" : _valuable>> <div class="valuable-item"> <img src="Images/Icons/<<print _valuable>>.png" alt="<<print _displayName>>" title="<<print _displayName>>"> <span><<print _displayName>>: <<print _amount>></span> </div> <</if>> <</for>> </div> </div> <</if>> </div> <div class="vault-actions"> <<button "Leave">> <<goto "Inside Castle">> <</button>> </div> <</nobr>> <<set $VisitedVault to true>> <<Styles>> /* Vault styles */ .vault-container { display: grid; grid-template-columns: 1fr; gap: 20px; margin-bottom: 20px; } .vault-image img { width: 100%; max-height: 300px; object-fit: cover; border-radius: 8px; box-shadow: 0 3px 6px rgba(0,0,0,0.16); } .vault-resources, .vault-valuables { background-color: rgba(0,0,0,0.05); border-radius: 8px; padding: 15px; } .vault-resources h2, .vault-valuables h2 { margin-top: 0; border-bottom: 1px solid rgba(0,0,0,0.1); padding-bottom: 8px; margin-bottom: 12px; } .resource-item { margin-bottom: 8px; font-size: 1.1em; display: flex; align-items: center; } .resource-icon { width: 28px; height: 28px; margin-right: 8px; vertical-align: middle; } .valuables-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; } .valuable-item { display: flex; align-items: center; background-color: rgba(0,0,0,0.05); border-radius: 5px; padding: 8px; transition: transform 0.2s ease; } .valuable-item:hover { transform: translateY(-2px); box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .valuable-item img { width: 32px; height: 32px; margin-right: 10px; } .vault-actions { text-align: center; } /* For larger screens, make it two columns */ @media (min-width: 768px) { .vault-container { grid-template-columns: 1fr 1fr; } .vault-image { grid-column: 1; grid-row: span 2; } .vault-image img { height: 100%; } .vault-resources { grid-column: 2; } .vault-valuables { grid-column: 2; } } <</Styles>>
<div class="text-box"> <<nobr>> <div align="center"> <img src="Images/Town/AliceHouse/2.png" width="700" height="700"> </div><br><br> <<if $AliceQuest is true>> <<Alice>>Did you find my father?<</Alice>><br><br> <<if $AliceQuestStatus is "Started">> <<You>>Not yet<</You>><br><br> <<Alice>>Please hurry, the bandits might sell him to slavery or worse soon...<</Alice>><br><br> [[Leave|TownOLD]] <</if>> <<if $AliceQuestStatus is "Ring">> <<You>>I'm sorry, I tried. But the bandits had already killed him<</You>><br><br> <<Alice>>Oh, gods!<</Alice>><br><br> Alice begins to cry<br><br> <<You>>I was able to recover his ring, I brought it back for you<</You>><br><br> You hand her the ring, as she takes it in her hand, you can see her expression change<br><br> Alice stairs at the ring for a long moment, turning it in her hands<br><br> <<Alice>>Thank you...<</Alice>><br><br> She continues stairing at the ring<br><br> <<Alice>>Will you stay?<</Alice>><br><br> She snaps back from her trance and looks at you, realising what she just said<br><br> <<Alice>>I mean... The bandits, they may come back... I shoudl leave the farm... But could you stay tonight... To protect me?<</Alice>><br><br> <<You>>Of course<</You>><br><br> [[Stay the night]] <</if>> <<if $AliceQuestStatus is "Save">> You carry the man into his home and lay him on a chair<br><br> <<Alice>>Farther!<</Alice>><br><br> Alice runs over and kneels next to her farther<br><br> <<Alice>>Are you ok, did they hurt you?<</Alice>><br><br> <<Eduart>>I am find my child, just a little over worked. I need rest, your friend here saved me<</Eduart>><br><br> Alice looks up at you before standing and hugging you tightly<br><br> <<Alice>>You saved him, thank you<</Alice>><br><br> As she hugs you, you feel her change, in her moment of joy you are able to slightly corrupt her...<br><br> <<Alice>>It is late, you should stay<</Alice>><br><br> <<Alice>>We have a spare room, just let me help my farther to his bed and I'll joi... meet you there<</Alice>><br><br> [[Agree to stay|Stay the night 2]] <</if>><</if>> <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $BackgroundPath to "Images/Forrest/Cult/Elizabeth/2.png">> <<set $Position to "null">> <<set $ImagePath to "Images/Forrest/Cult/Elizabeth/1.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<Elizabeth>>Hi!<</Elizabeth>><br><br> [[Ask her about this place|ElizabethQuestions]]<br><br> <<if $ElizabethFuck is true>> [[Fuck Elizabeth]]<br><br> <<set $PlayerCum to 0>> <<set $NPCCum to 0>> <</if>> [[Leave|Cult]] <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<<nobr>> <div class="text-box"> <<set $Position to "Ready">> <h1>The Coven</h1> <<if $CultOccupance.length === 0>> <p>Their are no members of the coven.</p> <<else>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $CultOccupance.length; _i++>> <<capture _prisoner>> <<set _prisoner to $CultOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <h4>Corruption:</h4> <progress @value=" _prisoner.corruption" max="100"></progress> <<button "Speak to her">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<goto "CultMember">> <</button>> </div> <</capture>> <</for>> </div> <</if>> <hr> <br><br> [[Leave|Cult]]<br> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<set $BackgroundPath to "Images/Forrest/Cult/Elizabeth/2.png">> <<set $Position to "null">> <<set $ImagePath to "Images/Forrest/Cult/2.png">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br> <<if $CurrentPlayer is "Overlord">> <<Vaelora>>Hello<</Vaelora>><br><br> [[Ask her about this place|VaeloraQuestions]]<br><br> <</if>> <<if not $Quests.includes("Find out what Vaelora wants")>> <<if $CurrentPlayer is "Overlord">> <<link "Play as Vaelora">> <<set $CurrentPlayer to "Vaelora">> <<run Engine.show()>> <</link>><br><br> <</if>> <<if $CurrentPlayer is "Vaelora">> <<link "Change back to the Overlord (return to the castle)">> <<set $CurrentPlayer to "Overlord">> <<run Engine.play('Base Intro')>> <</link>><br><br> [[Summon Elizabeth|Fuck Elizabeth FF]] <</if>> <</if>> [[Leave|Cult]] <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>> </div>
<<nobr>> <div class="intro-container"> <div class="intro-header"> <h1 class="intro-title">Overlord Walkthrough</h1> <div class="title-divider"></div> <p class="version-info" style="text-align: center; color: #daa520; margin-top: 10px;">Version 0.2.3 - Comprehensive Quest Guide</p> </div> <div class="intro-content"> <div class="intro-section prologue"> <p class="intro-text first-paragraph"> <span class="drop-cap">W</span>elcome to the comprehensive walkthrough for Overlord. This guide will help you navigate the dark paths of your conquest, from the initial awakening in Grimshade Castle to establishing your dominion over the surrounding lands. Each section can be expanded to reveal detailed information about quests, strategies, and hidden secrets. </p> </div> <!-- Table of Contents --> <div class="toc-section" style="background: rgba(139, 69, 19, 0.2); padding: 15px; border-radius: 10px; margin: 20px 0;"> <h2 class="section-title">📜 Table of Contents</h2> <ul style="list-style: none; padding-left: 20px;"> <li>• <a href="#introduction" style="color: #daa520;">Introduction & Tutorial</a></li> <li>• <a href="#facilities" style="color: #daa520;">Base Facilities Guide</a></li> <li>• <a href="#forest" style="color: #daa520;">Exploring the Forest</a></li> <li>• <a href="#lucy" style="color: #daa520;">Lucy's Questline</a></li> <li>• <a href="#alice" style="color: #daa520;">Alice's Questline</a></li> <li>• <a href="#mara" style="color: #daa520;">Mara's Questline</a></li> <li>• <a href="#scarldale" style="color: #daa520;">Scarldale Village</a></li> <li>• <a href="#tavern" style="color: #daa520;">Tavern Quests</a></li> <li>• <a href="#ironpeak" style="color: #daa520;">Ironpeak Mountains</a></li> </ul> </div> <!-- Introduction Section --> <div class="walkthrough-section" id="introduction"> <h2 class="section-title">⚔️ Introduction & Tutorial</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Introduction guide</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <p class="intro-text"> <em>Skip these steps if you chose to skip the intro.</em> </p> <p class="intro-text"> Once you have discussed the basics with the goblin Gnarlak, explore the castle and visit these key locations to understand their functions: </p> <ul style="color: #e8e0d0; margin: 15px 0;"> <li><strong>Your Chambers</strong> - Your personal quarters for rest and planning</li> <li><strong>The Dungeon</strong> - Where captives are corrupted and broken</li> <li><strong>The Vault</strong> - Storage for your accumulated wealth</li> <li><strong>Defence Rooms</strong> - Your first line of protection against raiders</li> </ul> <p class="intro-text"> Once you've familiarized yourself with these facilities, you can leave the castle and begin exploring the Forest. </p> </div> </details> </div> </div> <!-- Base Facilities Section --> <div class="walkthrough-section" id="facilities"> <h2 class="section-title">🏰 Base Facilities Guide</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Base Facilities guide</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <h3 style="color: #daa520; margin-top: 20px;">🛡️ Building Defences</h3> <p class="intro-text"> Your castle will be raided semi-randomly at night, so building defences is crucial. The number of raiders directly correlates to your notoriety (raiders = notoriety ÷ 10). For example, a notoriety of 20 means 2 raiders will attack. </p> <p class="intro-text" style="background: rgba(139, 0, 0, 0.2); padding: 10px; border-radius: 5px;"> <strong>⚠️ Strategy Tip:</strong> Start with a trap door - it instantly captures any bandit who triggers it with a 25% base chance (thieves have resistance). Upgrade to 50% capture rate as soon as possible for maximum efficiency. </p> <h3 style="color: #daa520; margin-top: 20px;">⛓️ The Dungeons</h3> <p class="intro-text"> The dungeons house your captives for corruption. Base corruption rate: 10% per day, increased by Corruption Runes found in crypts. </p> <ul style="color: #e8e0d0;"> <li>Speed up corruption for prisoners above 40% corruption</li> <li>Lucy can instantly corrupt prisoners once unlocked</li> <li>Prisoners can be: sold, given to succubi, recruited, or sent to work</li> <li>Higher corruption = higher value when selling</li> </ul> <h3 style="color: #daa520; margin-top: 20px;">⚔️ The Barracks</h3> <p class="intro-text"> Not recommended early - focus on defences and lumber mill first. Once built, send fully corrupted prisoners here for specialization: </p> <ul style="color: #e8e0d0;"> <li><strong>Combat</strong> - Better at killing during raids/pillages</li> <li><strong>Scouting</strong> - Higher survival rate when scouting</li> <li><strong>Lockpicking</strong> - Essential for pillaging locked buildings</li> <li><strong>Defence</strong> - Holds captured settlements (not for capture process)</li> </ul> <h3 style="color: #daa520; margin-top: 20px;">🗺️ Map Room</h3> <p class="intro-text"> Plan raids, send Lucy to scout, and manage captured locations. Review village dynamics - e.g., jewelry makers need blacksmiths. </p> <h3 style="color: #daa520; margin-top: 20px;">🏥 Armoury/Infirmary</h3> <p class="intro-text"> Build after barracks. Armoury crafts weapons/armor (requires iron from Ironpeak). Infirmary heals forces at 20% per day (requires Mara to staff). </p> <h3 style="color: #daa520; margin-top: 20px;">🌀 Portal Room</h3> <p class="intro-text"> Enables fast travel. Purchase tear spell to unlock teleportation points. Prerequisite for Ironpeak questline. </p> </div> </details> </div> </div> <!-- Forest Exploration Section --> <div class="walkthrough-section" id="forest"> <h2 class="section-title">🌲 Exploring the Forest</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Forest Exploration guide</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <p class="intro-text"> Random encounters await in the forest. Combat is winnable but difficult early - upgrade your power via Lucy's questline first. </p> <h3 style="color: #daa520;">Key Locations & Activities</h3> <ul style="color: #e8e0d0;"> <li><strong>Abandoned Houses</strong> - Best source of resources</li> <li><strong>Merchant</strong> - Trade wood and stone</li> <li><strong>Home Invasions</strong> - Requires lockpicks from Henry (post-Lucy quest)</li> <li><strong>Towers</strong> - Gold sources, but beware tripwires in doorways!</li> </ul> <p class="intro-text" style="background: rgba(139, 0, 0, 0.2); padding: 10px; border-radius: 5px;"> <strong>⚠️ Warning:</strong> Tower tripwires are visible in doorway images - look closely before entering! </p> </div> </details> </div> </div> <!-- Lucy's Questline Section --> <div class="walkthrough-section" id="lucy"> <h2 class="section-title">🌹 Lucy's Questline</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Lucy's questline</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <h3 style="color: #daa520;">Step 1: First Encounter</h3> <p class="intro-text"> Navigate: Forest entrance → South → Southeast (small lake area) </p> <p class="intro-text"> You'll encounter Lucy. Without the cloak spell, you cannot interact - acquire it from the spell merchant. </p> <h3 style="color: #daa520;">Step 2: Acquiring the Cloak</h3> <p class="intro-text"> Navigate: Forest entrance → East (follow path) → Old Shack </p> <p class="intro-text"> Purchase the cloak spell (recommended first purchase). Cast via left UI panel above save button. </p> <h3 style="color: #daa520;">Step 3: The Corrupted Flower</h3> <p class="intro-text"> With cloak active, Lucy tasks you with finding a river flower. New path unlocked: Forest entrance → Southwest → River </p> <p class="intro-text"> Navigate: West → West → South at river → Cave entrance (costs 1 soul) </p> <h3 style="color: #daa520;">Step 4: Meeting Eisheth</h3> <p class="intro-text"> In the cave, meet Eisheth. Trade 5 souls for melee weapon upgrade (highly recommended for combat). </p> <h3 style="color: #daa520;">Step 5: The Crypt</h3> <p class="intro-text"> Exit cave → West over bridge → Enter crypt (costs 1 soul) </p> <ul style="color: #e8e0d0;"> <li>Goal: Find main chamber (always at bottom of map)</li> <li>Search containers for loot (may trigger fights)</li> <li>Defeat greater succubus for 3 souls</li> <li>Obtain Lucy's flower and corrupt it</li> </ul> <h3 style="color: #daa520;">Step 6: Lucy's Corruption</h3> <p class="intro-text"> Return to castle → Sleep → Return to Lucy with cloak → Give corrupted flower → Sleep again → Night visit → Bring Lucy to dungeon </p> <h3 style="color: #daa520;">Step 7: Possession</h3> <p class="intro-text"> Once 100% corrupted, purchase possession spell from shack. Cast to unlock Lucy as playable character. </p> </div> </details> </div> </div> <!-- Alice's Questline Section --> <div class="walkthrough-section" id="alice"> <h2 class="section-title">👑 Alice's Questline</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Alice's questline</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <h3 style="color: #daa520;">Finding Alice</h3> <p class="intro-text"> Navigate: Forest → Northwest to merchant → Purchase horse → Access town → Find Alice in outskirts </p> <p class="intro-text"> Quest: Rescue her father from bandits </p> <h3 style="color: #daa520;">The Bandit Mine</h3> <p class="intro-text"> Location: Bottom-left corner of forest map. Bandits demand item from nearby manor. </p> <h3 style="color: #daa520;">The Manor Game</h3> <p class="intro-text"> East of mine → Manor → Play high/low game with "woman" → Win for item + 150 gold reward (repeatable) </p> <h3 style="color: #daa520;">Completing the Quest</h3> <p class="intro-text"> Trade item for father → Return to Alice → Stay the night → Bring to dungeon → Corrupt and possess like Lucy (Patreon-only playable character) </p> <p class="intro-text" style="background: rgba(139, 0, 0, 0.2); padding: 10px; border-radius: 5px;"> <strong>💡 Tip:</strong> Alice and Lucy can defend empty rooms or work in town brothel for passive income. </p> </div> </details> </div> </div> <!-- Mara's Questline Section --> <div class="walkthrough-section" id="mara"> <h2 class="section-title">💆 Mara's Questline</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Mara's questline</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <p class="intro-text"> Less useful than Alice/Lucy - recommended for last. Expensive (minimum 200 gold needed). </p> <h3 style="color: #daa520;">The Bath House</h3> <p class="intro-text"> Location: Town → Social District → Bath House → Pay for massage </p> <h3 style="color: #daa520;">Three Visits</h3> <ol style="color: #e8e0d0;"> <li>First visit: Massage and tease → Pay tip to advance (not paying delays progress)</li> <li>Second visit: Wait 1+ days → More teasing → Pay tip (recommended)</li> <li>Third visit: Wait 1+ days → Dominate mind → Choose castle or bath house work</li> </ol> <p class="intro-text"> At castle: Provides health/energy massages, staffs infirmary once built. </p> </div> </details> </div> </div> <!-- Scarldale Section --> <div class="walkthrough-section" id="scarldale"> <h2 class="section-title">🏘️ Scarldale Village</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Scarldale guide</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <p class="intro-text"> Unlocked after Lucy's questline. Accessible as Overlord or Lucy. </p> <h3 style="color: #daa520;">Village Locations</h3> <ul style="color: #e8e0d0;"> <li><strong>Main Hall</strong> - Unfinished questline with guard/Jon</li> <li><strong>Tavern</strong> - Quest hub and work opportunities</li> <li><strong>Blacksmith</strong> - Henry's shop for weapons/lockpicks</li> <li><strong>Housing Area</strong> - Night raids for resources</li> <li><strong>Shop</strong> - General goods and supplies</li> </ul> <h3 style="color: #daa520;">Main Hall Access</h3> <p class="intro-text"><strong>As Overlord:</strong></p> <ul style="color: #e8e0d0;"> <li>Fight guard (not recommended - very difficult)</li> <li>Purchase dagger from blacksmith for stealth kill</li> </ul> <p class="intro-text"><strong>As Lucy:</strong></p> <ul style="color: #e8e0d0;"> <li>Seduce guard in forest or at his home</li> <li>Choose to corrupt or kill</li> <li>Grants Overlord access to confront Jon (quest incomplete)</li> </ul> </div> </details> </div> </div> <!-- Tavern Quests Section --> <div class="walkthrough-section" id="tavern"> <h2 class="section-title">🍺 Tavern Quests</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Tavern quests</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <h3 style="color: #daa520;">Quest 1: The Wolf</h3> <ol style="color: #e8e0d0;"> <li>Talk to Alexander about livestock attacks near church</li> <li>Navigate: Forest entrance → Southwest → Church</li> <li>Choose straight path to find wolf (flee or fail without silver weapon)</li> <li>Return to castle → Consult Gnarlak about silver weapons</li> <li>Visit Henry → Collect 6 silver pieces → Purchase lockpicks (75 gold)</li> <li>Town at night → Pick locks → Search houses for silver</li> <li>Return to Henry → Choose arrows (need bow) or dagger</li> <li>Wait 2 days → Collect weapon → Return to church</li> <li>Kill wolf → Search cave → Receive 100 gold</li> </ol> <h3 style="color: #daa520;">Quest 2: The Ambush</h3> <ol style="color: #e8e0d0;"> <li>Navigate: Lucy's meeting spot → Rocky pass → South → East before tower → East to creek</li> <li>Either direction triggers ambush</li> <li>Meet injured woman (trap!) → Choose kill (recommended) or help</li> <li>Fight heavy bandit (bring potions)</li> <li>If woman spared, decide her fate</li> </ol> <h3 style="color: #daa520;">Quest 3: The Cemetery</h3> <ol style="color: #e8e0d0;"> <li>Navigate: Southeast corner of map → Cross lake → Cemetery</li> <li>Hunt ghoul → Attack with sword/bow (miss regardless)</li> <li>Follow to crypt → Pass out</li> <li>Wake in succubus trance → Choose action</li> <li>Fight/resist or give in (costs 1 soul)</li> </ol> </div> </details> </div> </div> <!-- Ironpeak Section --> <div class="walkthrough-section" id="ironpeak"> <h2 class="section-title">🏔️ Ironpeak Mountains</h2> <div class="expandable-content"> <details> <summary style="cursor: pointer; color: #daa520; font-weight: bold; margin: 10px 0;">Click to expand Ironpeak guide</summary> <div style="padding: 15px; background: rgba(0,0,0,0.3); border-left: 3px solid #8b0000; margin-top: 10px;"> <p class="intro-text" style="color: #ffcc00;"> <strong>⚠️ Under Development</strong> </p> <h3 style="color: #daa520;">Accessing Ironpeak</h3> <p class="intro-text"> Prerequisites: Portal room + Armoury built + Horse purchased </p> <ol style="color: #e8e0d0;"> <li>Enter mountains → Encounter blizzard → Enter cave</li> <li>Wake to voices → Choose flee/stay (same outcome)</li> <li>Rescued by Ida → Visit her home → Go to hostel</li> <li>Sleep at hostel (30 gold for visitor)</li> </ol> <h3 style="color: #daa520;">Establishing Portal</h3> <ol style="color: #e8e0d0;"> <li>Buy iron from store (if affordable) → Try to leave</li> <li>Meet Ida → Path blocked → Return to Ironpeak</li> <li>Visit houses → Find woman at end → Convince or break in at night</li> <li>Cast tear spell inside house</li> <li>Shop → Send raven to Gnarlak → Return to house → Sleep</li> <li>Gnarlak arrives → Portal established</li> </ol> <h3 style="color: #daa520;">The Quarry</h3> <p class="intro-text"> Found through exploration. Send workers to mine stone (similar to lumber mill). </p> </div> </details> </div> </div> <!-- Final Notes --> <div class="walkthrough-section" style="margin-top: 40px; padding: 20px; background: rgba(139, 69, 19, 0.2); border-radius: 10px;"> <h2 class="section-title">📖 Final Notes</h2> <p class="intro-text"> This completes the main quests in Overlord V0.2.3. For additional information on raids, combat, and other game mechanics, check the Help section in the game menu. </p> <p class="intro-text" style="text-align: center; margin-top: 20px;"> <em>May darkness guide your path, Overlord.</em> </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<button "Return" $return>><</button>> </div> </div> </div> <style> /* Walkthrough Specific Styles */ .walkthrough-section { margin: 30px 0; padding: 20px; background: rgba(0, 0, 0, 0.4); border-radius: 10px; border: 1px solid #4a0e0e; } .walkthrough-section h2 { margin-bottom: 15px; } .walkthrough-section h3 { margin: 20px 0 10px 0; } details summary { transition: color 0.3s ease; } details summary:hover { color: #ffcc00 !important; text-shadow: 0 0 5px rgba(255, 204, 0, 0.5); } details[open] summary { margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid #daa520; } .expandable-content { animation: fadeIn 0.5s ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } /* Smooth scroll for anchor links */ html { scroll-behavior: smooth; } /* Style anchor links */ a[href^="#"] { text-decoration: none; transition: all 0.3s ease; } a[href^="#"]:hover { color: #ffcc00 !important; text-shadow: 0 0 5px rgba(255, 204, 0, 0.5); } </style> <</nobr>>
<<script>> // Initialize tracking for equipped weapons if it doesn't exist window.currentlyEquipped = window.currentlyEquipped || { dagger: null, medium: null, back: null }; // Check if all slots are empty (null) if (!window.currentlyEquipped.dagger && !window.currentlyEquipped.medium && !window.currentlyEquipped.back) { console.log("All weapon slots are empty, checking for saved data..."); // Load from story variables if they exist if (State.variables.EquippedDaggerSlot) { window.currentlyEquipped.dagger = State.variables.EquippedDaggerSlot; console.log("Loaded dagger from save:", window.currentlyEquipped.dagger); // Add weapon cards to combat system if CombatSystem exists if (window.CombatSystem && window.weaponSets[window.currentlyEquipped.dagger]) { var daggerWeapon = window.weaponSets[window.currentlyEquipped.dagger]; daggerWeapon.cards.forEach(function(card) { var equippedCard = Object.assign({}, card, { slotType: 'dagger', weaponType: window.currentlyEquipped.dagger }); window.CombatSystem.addCard(equippedCard); }); } } if (State.variables.EquippedMediumSlot) { window.currentlyEquipped.medium = State.variables.EquippedMediumSlot; console.log("Loaded medium weapon from save:", window.currentlyEquipped.medium); // Add weapon cards to combat system if CombatSystem exists if (window.CombatSystem && window.weaponSets[window.currentlyEquipped.medium]) { var mediumWeapon = window.weaponSets[window.currentlyEquipped.medium]; mediumWeapon.cards.forEach(function(card) { var equippedCard = Object.assign({}, card, { slotType: 'medium', weaponType: window.currentlyEquipped.medium }); window.CombatSystem.addCard(equippedCard); }); } } if (State.variables.EquippedBackSlot) { window.currentlyEquipped.back = State.variables.EquippedBackSlot; console.log("Loaded back weapon from save:", window.currentlyEquipped.back); // Add weapon cards to combat system if CombatSystem exists if (window.CombatSystem && window.weaponSets[window.currentlyEquipped.back]) { var backWeapon = window.weaponSets[window.currentlyEquipped.back]; backWeapon.cards.forEach(function(card) { var equippedCard = Object.assign({}, card, { slotType: 'back', weaponType: window.currentlyEquipped.back }); window.CombatSystem.addCard(equippedCard); }); } } } // Store equipped weapons in setup for use in story setup.daggerslot = window.currentlyEquipped.dagger; setup.mediumslot = window.currentlyEquipped.medium; setup.backslot = window.currentlyEquipped.back; // Also update SugarCube story variables to maintain persistence State.variables.EquippedDaggerSlot = window.currentlyEquipped.dagger; State.variables.EquippedMediumSlot = window.currentlyEquipped.medium; State.variables.EquippedBackSlot = window.currentlyEquipped.back; <</script>> <<script>> // Weapon prices window.weaponPrices = { 'improved_dagger': 50, 'hatchet': 75, 'buckler': 100, 'corrupting_dagger': 150, 'shortsword': 100, 'axe': 125, 'morningstar_mace': 150, 'flanged_mace': 175, 'claymore': 200, 'shield': 150, 'longsword': 175, 'greataxe': 250, 'longbow': 150 }; // Complete weapon sets database - SINGLE OBJECT WITH ALL WEAPONS window.weaponSets = { basic_dagger: { name: 'Basic Dagger', slot: 'dagger', image: 'Images/Items/Melee Weapons/rusty_dagger.png', description: 'Rusty old dagger, but still sharp', cards: [ { name: 'Slash', type: 'weapon', image: 'Images/Items/Melee Weapons/rusty_dagger.png', energyCost: 0, magicCost: 0, damage: 10, effects: [], description: 'A wild slash' }, { name: 'Stab', type: 'weapon', image: 'Images/Items/Melee Weapons/rusty_dagger.png', energyCost: 10, magicCost: 0, damage: 15, effects: [{name: 'Piercing', value: 1}, {name: 'Bleeding', value: 3}], description: 'Thrust into the enemy' } ] }, improved_dagger: { name: 'Improved Dagger', slot: 'dagger', image: 'Images/Items/Melee Weapons/plain_dagger.png', description: 'A well ballanced dagger, simple and deadly', cards: [ { name: 'Slash', type: 'weapon', image: 'Images/Items/Melee Weapons/plain_dagger.png', energyCost: 0, magicCost: 0, damage: 18, effects: [{name: 'Bleeding', value: 3}], description: 'A focused slash' }, { name: 'Stab', type: 'weapon', image: 'Images/Items/Melee Weapons/plain_dagger.png', energyCost: 5, magicCost: 0, damage: 22, effects: [{name: 'Piercing', value: 1}, {name: 'Bleeding', value: 7}], description: 'Corrupt the enemy with dark magic' } ] }, corrupting_dagger: { name: 'Corrupting Dagger', slot: 'dagger', image: 'Images/Items/Melee Weapons/corrupting_dagger.png', description: 'A cursed blade made of an unknown stone', cards: [ { name: 'Slash', type: 'weapon', image: 'Images/Items/Melee Weapons/corrupting_dagger.png', energyCost: 0, magicCost: 0, damage: 10, effects: [{name: 'Corruption', value: 35}], description: 'A strike that inflicts poison' }, { name: 'Stab', type: 'weapon', image: 'Images/Items/Melee Weapons/corrupting_dagger.png', energyCost: 2, magicCost: 6, damage: 15, effects: [{name: 'Leaching', value: 10}, {name: 'Corruption', value: 35}], description: 'Corrupt the enemy with dark magic' } ] }, hatchet: { name: 'Hatchet', slot: 'dagger', image: 'Images/Items/Melee Weapons/hatchet.png', description: 'A sturdy hatchet, small enough to store on your hip', cards: [ { name: 'Chop', type: 'weapon', image: 'Images/Items/Melee Weapons/hatchet.png', energyCost: 0, magicCost: 0, damage: 10, effects: [{name: 'Guard-break', value: 1}], description: 'A strong swing into the enemy limb' }, { name: 'Bash', type: 'weapon', image: 'Images/Items/Melee Weapons/hatchet.png', energyCost: 10, magicCost: 0, damage: 15, effects: [{name: 'Stun', value: 1}], description: 'A heavy swing, stunning the enemy' } ] }, buckler: { name: 'Buckler', slot: 'dagger', image: 'Images/Items/Melee Weapons/buckler.png', description: 'A small shield ideal for defence and offence', cards: [ { name: 'Block', type: 'defence', image: 'Images/Items/Melee Weapons/buckler.png', energyCost: 10, magicCost: 0, damage: 20, effects: [], description: 'Block incoming attacks' }, { name: 'Bash', type: 'weapon', image: 'Images/Items/Melee Weapons/buckler.png', energyCost: 0, magicCost: 0, damage: 5, effects: [{name: 'Stun', value: 1}], description: 'Bash the enemy with your shield' } ] }, rusty_shortsword: { name: 'Rusty Shortsword', slot: 'medium', image: 'Images/Items/Melee Weapons/rusty_sword.png', description: 'A rusty jagged weapon, but still sharp', cards: [ { name: 'Strike', type: 'weapon', image: 'Images/Items/Melee Weapons/rusty_sword.png', energyCost: 8, magicCost: 0, damage: 15, effects: [{name: 'Bleeding', value: 3}], description: 'A lightning-fast strike with reduced damage' }, { name: 'Parry', type: 'defence', image: 'Images/Items/Melee Weapons/rusty_sword.png', energyCost: 10, magicCost: 0, damage: 15, effects: [], description: 'A defencive stance' }, { name: 'Thrust', type: 'weapon', image: 'Images/Items/Melee Weapons/rusty_sword.png', energyCost: 6, magicCost: 0, damage: 20, effects: [{name: 'Piercing', value: 1}, {name: 'Accuracy', value: 33}], description: 'A precise thrust under enemy armour' } ] }, shortsword: { name: 'Short Sword', slot: 'medium', image: 'Images/Items/Melee Weapons/shortsword.png', description: 'A nimble blade favoring speed and precision', cards: [ { name: 'Quick Strike', type: 'weapon', image: 'Images/Items/Melee Weapons/shortsword.png', energyCost: 8, magicCost: 0, damage: 18, effects: [{name: 'Bleeding', value: 5}], description: 'A lightning-fast strike with reduced damage' }, { name: 'Parry', type: 'defence', image: 'Images/Items/Melee Weapons/shortsword.png', energyCost: 8, magicCost: 0, damage: 15, effects: [], description: 'A defencive stance' }, { name: 'Thrust', type: 'weapon', image: 'Images/Items/Melee Weapons/shortsword.png', energyCost: 6, magicCost: 0, damage: 25, effects: [{name: 'Piercing', value: 1}, {name: 'Accuracy', value: 33}], description: 'A precise thrust under enemy armour' } ] }, morningstar_mace: { name: 'Morningstar Mace', slot: 'medium', image: 'Images/Items/Melee Weapons/morningstar_mace.png', description: 'A heavy and sharp spiked mace', cards: [ { name: 'Quick Swing', type: 'weapon', image: 'Images/Items/Melee Weapons/morningstar_mace.png', energyCost: 10, magicCost: 0, damage: 22, effects: [{name: 'Bleeding', value: 8}, {name: 'Stun', value: 1}], description: 'A quick swing past defences' }, { name: 'Overhead Swing', type: 'weapon', image: 'Images/Items/Melee Weapons/morningstar_mace.png', energyCost: 12, magicCost: 0, damage: 25, effects: [{name: 'Piercing', value: 1}, {name: 'Guard-break', value: 1}], description: 'A heavy overhead swing' } ] }, flanged_mace: { name: 'Flanged Mace', slot: 'medium', image: 'Images/Items/Melee Weapons/flanged_mace.png', description: 'A heavy spiked weight on a chain', cards: [ { name: 'Armour break', type: 'weapon', image: 'Images/Items/Melee Weapons/flanged_mace.png', energyCost: 10, magicCost: 0, damage: 15, effects: [{name: 'Accuracy', value: 25}, {name: 'Armour-Break', value: 2}], description: 'A lightning-fast strike with reduced damage' }, { name: 'Curshing Swing', type: 'weapon', image: 'Images/Items/Melee Weapons/flanged_mace.png', energyCost: 15, magicCost: 0, damage: 20, effects: [{name: 'Overwhelming', value: 100}, {name: 'Piercing', value: 1}], description: 'Multiple quick strikes in succession' } ] }, axe: { name: 'Battle Axe', slot: 'medium', image: 'Images/Items/Melee Weapons/daneaxe.png', description: 'A heavy weapon that cleaves through armor', cards: [ { name: 'Axe Chop', type: 'weapon', image: 'Images/Items/Melee Weapons/daneaxe.png', energyCost: 6, magicCost: 0, damage: 24, effects: [{name: 'cleave', value: 1}], description: 'A powerful chopping attack' }, { name: 'Armor Break', type: 'weapon', image: 'Images/Items/Melee Weapons/daneaxe.png', energyCost: 8, magicCost: 0, damage: 18, effects: [{name: 'Armor-Break', value: 2}], description: 'Destroy enemy armor' } ] }, longsword: { name: 'Long Sword', slot: 'back', image: 'Images/Items/Melee Weapons/longsword.png', description: 'A balanced weapon offering versatility in combat', cards: [ { name: 'Long Sword Slash', type: 'weapon', image: 'Images/Items/Melee Weapons/longsword.png', energyCost: 7, magicCost: 0, damage: 22, effects: [{name: 'balanced', value: 1}], description: 'A well-balanced horizontal slash' }, { name: 'Long Sword Thrust', type: 'weapon', image: 'Images/Items/Melee Weapons/longsword.png', energyCost: 8, magicCost: 0, damage: 26, effects: [{name: 'pierce', value: 1}], description: 'A precise piercing thrust' }, { name: 'Long Sword Guard Break', type: 'weapon', image: 'Images/Items/Melee Weapons/longsword.png', energyCost: 10, magicCost: 0, damage: 18, effects: [{name: 'guard-break', value: 1}, {name: 'stun', value: 1}], description: 'Break through enemy defenses' } ] }, claymore: { name: 'Claymore', slot: 'back', image: 'Images/Items/Melee Weapons/two_handed_sword.png', description: 'A massive two-handed sword dealing devastating damage', cards: [ { name: 'Claymore Heavy Slash', type: 'weapon', image: 'Images/Items/Melee Weapons/two_handed_sword.png', energyCost: 12, magicCost: 0, damage: 35, effects: [{name: 'Two handed', value: 1}, {name: 'Stun', value: 1}], description: 'A devastating overhead strike that hits multiple enemies' }, { name: 'Claymore Thrust', type: 'weapon', image: 'Images/Items/Melee Weapons/two_handed_sword.png', energyCost: 10, magicCost: 0, damage: 30, effects: [{name: 'Two handed', value: 1}, {name: 'Overwhelming', value: 33}], description: 'A powerful thrusting attack with extended reach' } ] }, shield: { name: 'Shield', slot: 'back', image: 'Images/Items/Melee Weapons/round_shield2.png', description: 'A sturdy defense that can also bash enemies', cards: [ { name: 'Shield Block', type: 'defence', image: 'Images/Items/Melee Weapons/round_shield2.png', energyCost: 4, magicCost: 0, damage: 20, effects: [], description: 'Block incoming attacks' }, { name: 'Shield Bash', type: 'weapon', image: 'Images/Items/Melee Weapons/round_shield2.png', energyCost: 6, magicCost: 0, damage: 16, effects: [], description: 'Bash the enemy with your shield' } ] }, greataxe: { name: 'Greataxe', slot: 'back', image: 'Images/Items/Melee Weapons/greataxe.png', description: 'A massive two-handed axe dealing devastating damage', cards: [ { name: 'Greataxe Heavy Chop', type: 'weapon', image: 'Images/Items/Melee Weapons/greataxe.png', energyCost: 12, magicCost: 0, damage: 35, effects: [{name: 'Two handed', value: 1}, {name: 'Dreadful', value: 33}], description: 'A devastating overhead chop that hits multiple enemies' }, { name: 'Greataxe Sweep', type: 'weapon', image: 'Images/Items/Melee Weapons/greataxe.png', energyCost: 10, magicCost: 0, damage: 28, effects: [{name: 'Two handed', value: 1}, {name: 'Guard-break', value: 2}, {name: 'Overwhelming', value: 20}], description: 'A wide sweeping attack that breaks defenses' } ] }, longbow: { name: 'Longbow', slot: 'back', image: 'Images/Items/Melee Weapons/longbow.png', description: 'A powerful bow', cards: [ { name: 'Piercing Arrows', type: 'weapon', image: 'Images/Items/Melee Weapons/Piercing Arrow.png', energyCost: 12, magicCost: 0, damage: 23, effects: [{name: 'Two handed', value: 1}, {name: 'pierce', value: 1}, {name: 'Bleeding', value: 12}], description: 'A devastating overhead chop that hits multiple enemies' }, { name: 'Broadhead Arrows', type: 'weapon', image: 'Images/Items/Melee Weapons/arrows.png', energyCost: 10, magicCost: 0, damage: 20, effects: [{name: 'Two handed', value: 1}, {name: 'Stun', value: 1}, {name: 'Accuracy', value: 50}], description: 'A wide sweeping attack that breaks defenses' } ] } }; // Function to apply persistent upgrades to weapon data window.applyPersistentUpgrades = function() { // Initialize weapon upgrades storage if it doesn't exist if (!State.variables.weaponUpgrades) { State.variables.weaponUpgrades = {}; } // Apply upgrades to all weapons that have them Object.keys(State.variables.weaponUpgrades).forEach(weaponType => { const upgrades = State.variables.weaponUpgrades[weaponType]; const weapon = window.weaponSets[weaponType]; if (weapon && weapon.cards && upgrades && upgrades.corruption > 0) { weapon.cards.forEach(card => { if (!card.effects) card.effects = []; // Remove any existing corruption effects first (to avoid duplicates) card.effects = card.effects.filter(effect => !effect.name || !effect.name.toLowerCase().includes('corruption') ); // Add the current corruption level card.effects.push({ name: 'Corruption', value: upgrades.corruption }); }); } }); }; // Apply upgrades immediately when WeaponData is loaded applyPersistentUpgrades(); // Store utility functions window.getStoreWeaponsForSlot = function(slotType) { return window.storeSlots[slotType] ? window.storeSlots[slotType].weapons : []; }; window.getWeaponPrice = function(weaponType) { return window.weaponPrices[weaponType] || 0; }; window.isWeaponOwned = function(weaponType) { for (let slotType in window.weaponSlots) { if (window.weaponSlots[slotType].weapons.includes(weaponType)) { return true; } } return false; }; window.purchaseWeapon = function(weaponType) { const price = getWeaponPrice(weaponType); const weaponData = window.weaponSets[weaponType]; if (!weaponData) { console.error('Weapon not found:', weaponType); return false; } if (State.variables.Gold < price) { alert('Not enough gold!'); return false; } if (isWeaponOwned(weaponType)) { alert('You already own this weapon!'); return false; } // Deduct gold State.variables.Gold -= price; // Add weapon to appropriate slot const slotType = weaponData.slot; window.weaponSlots[slotType].weapons.push(weaponType); console.log(`Purchased ${weaponData.name} for ${price} gold`); return true; }; // Existing utility functions window.getWeaponData = function(weaponType) { return window.weaponSets[weaponType] || null; }; // Function to corrupt a weapon window.corruptWeapon = function(weaponType, slotType) { console.log(`Corrupting ${weaponType} in ${slotType} slot`); if (State.variables.Souls <= 0) { alert('Not enough souls!'); return; } const currentCorruption = getTotalCorruption(weaponType); console.log(`Current corruption for ${weaponType}:`, currentCorruption); if (currentCorruption >= 30) { alert('This weapon has reached maximum corruption!'); return; } // Initialize weapon upgrades if not exists if (!State.variables.weaponUpgrades[weaponType]) { State.variables.weaponUpgrades[weaponType] = { corruption: 0 }; } // Add 10 corruption, up to max of 30 const newCorruption = Math.min(currentCorruption + 10, 30); State.variables.weaponUpgrades[weaponType].corruption = newCorruption; console.log(`Set corruption for ${weaponType} to:`, newCorruption); console.log('Current weaponUpgrades:', State.variables.weaponUpgrades); // Deduct soul State.variables.Souls -= 1; // Reapply upgrades to weapon data immediately window.applyPersistentUpgrades(); // Verify the upgrade was applied const verifyCorruption = getTotalCorruption(weaponType); console.log(`Verified corruption after upgrade:`, verifyCorruption); // Update combat inventory if it exists if (window.CombatSystem && window.CombatSystem.combatInventory) { window.CombatSystem.combatInventory.forEach(card => { if (card.weaponType === weaponType) { // Find the corresponding upgraded card const weapon = window.weaponSets[weaponType]; const upgradedCard = weapon.cards.find(origCard => origCard.name === card.name); if (upgradedCard) { card.effects = [...(upgradedCard.effects || [])]; console.log(`Updated combat card ${card.name} with effects:`, card.effects); } } }); } console.log(`Successfully corrupted ${weaponType} to corruption level ${newCorruption}`); // Update the souls display document.querySelector('.souls-display').textContent = `Souls: ${State.variables.Souls}`; // Refresh the passage to show updated state setTimeout(() => { displayWeaponUpgrades(); }, 100); }; window.getWeaponsForSlot = function(slotType) { return window.weaponSlots[slotType] ? window.weaponSlots[slotType].weapons : []; }; window.getAllWeaponTypes = function() { return Object.keys(window.weaponSets); }; window.getWeaponsBySlot = function(slotType) { const weaponTypes = getWeaponsForSlot(slotType); return weaponTypes.map(type => window.weaponSets[type]).filter(weapon => weapon); }; // Restore purchased weapons to JS memory from persistent SugarCube data if (Array.isArray(State.variables.PurchasedMeleeWeapons)) { State.variables.PurchasedMeleeWeapons.forEach(weaponType => { if (weaponType && !window.isWeaponOwned(weaponType)) { const slotType = window.weaponSets[weaponType].slot; if (!window.weaponSlots[slotType]) { window.weaponSlots[slotType] = { weapons: [] }; } window.weaponSlots[slotType].weapons.push(weaponType); } }); }; <</script>>
<<nobr>> <style> #weapon-effects-panel { position: fixed; bottom: 20px; left: calc(20em - 10px); z-index: 999; font-family: inherit; } #weapon-effects-toggle { display: none; } #weapon-effects-container { position: relative; transition: transform 0.4s ease-in-out; } #weapon-effects-tab { background: linear-gradient(to bottom, #1a0000 0%, #300000 100%); border: 2px solid #300000; border-radius: 8px 8px 0 0; padding: 12px 20px; cursor: pointer; color: white; font-weight: bold; font-size: 14px; letter-spacing: 1px; transition: all 0.3s ease; user-select: none; text-align: center; box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.4); min-width: 150px; position: relative; z-index: 2; } #weapon-effects-tab:hover { background: linear-gradient(to bottom, #220000 0%, #400000 100%); transform: translateY(-2px); } #weapon-effects-content { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #300000; border-top: none; border-radius: 0 8px 8px 8px; padding: 20px; width: 400px; color: white; font-size: 13px; line-height: 1.5; position: relative; box-shadow: 0 -2px 15px rgba(0, 0, 0, 0.6); max-height: 0; opacity: 0; overflow: hidden; transition: max-height 0.4s ease-in-out, opacity 0.4s ease-in-out, padding 0.4s ease-in-out; padding: 0 20px; } #weapon-effects-toggle:checked + #weapon-effects-container { transform: translateY(-100px); } #weapon-effects-toggle:checked + #weapon-effects-container #weapon-effects-content { max-height: 280px; opacity: 1; padding: 20px; overflow-y: auto; } .weapon-effect { margin-bottom: 12px; padding: 10px; background: rgba(48, 0, 0, 0.3); border-radius: 6px; border-left: 4px solid #300000; transition: background 0.2s ease; } .weapon-effect:hover { background: rgba(48, 0, 0, 0.5); } .weapon-effect strong { color: #ff9999; display: inline-block; min-width: 100px; font-weight: bold; text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5); } .weapon-effect-description { color: #cccccc; margin-left: 8px; } #weapon-effects-content::-webkit-scrollbar { width: 8px; } #weapon-effects-content::-webkit-scrollbar-track { background: #1a0a00; border-radius: 4px; } #weapon-effects-content::-webkit-scrollbar-thumb { background: #300000; border-radius: 4px; } #weapon-effects-content::-webkit-scrollbar-thumb:hover { background: #400000; } @media (max-width: 1200px) { #weapon-effects-panel { left: calc(18em - 10px); } #weapon-effects-content { width: 350px; } #weapon-effects-toggle:checked + #weapon-effects-container { transform: translateY(-90px); } } @media (max-width: 900px) { #weapon-effects-panel { left: calc(16em - 10px); } #weapon-effects-content { width: 300px; font-size: 12px; } #weapon-effects-tab { font-size: 12px; padding: 10px 15px; min-width: 120px; } #weapon-effects-toggle:checked + #weapon-effects-container { transform: translateY(-80px); } } @media (max-width: 768px) { #weapon-effects-panel { left: calc(4em - 10px); } } </style> <div id="weapon-effects-panel"> <input type="checkbox" id="weapon-effects-toggle"> <div id="weapon-effects-container"> <label for="weapon-effects-toggle" id="weapon-effects-tab">WEAPON EFFECTS</label> <div id="weapon-effects-content"> <h3 style="margin: 0 0 18px 0; color: #ff6666; font-size: 16px; text-align: center; border-bottom: 2px solid #300000; padding-bottom: 10px;">Weapon Effects Guide</h3> <div class="weapon-effect"> <strong>Bleeding</strong> <span class="weapon-effect-description">- removes x value from the enemy's health at the start of each round</span> </div> <div class="weapon-effect"> <strong>Stun</strong> <span class="weapon-effect-description">- removes x cards from the enemy in the next round</span> </div> <div class="weapon-effect"> <strong>Corrupting</strong> <span class="weapon-effect-description">- adds x corruption to enemy</span> </div> <div class="weapon-effect"> <strong>Two Handed</strong> <span class="weapon-effect-description">- a second "weapon" cannot be placed on the table with this card</span> </div> <div class="weapon-effect"> <strong>Leaching</strong> <span class="weapon-effect-description">- takes x additional health from enemy and adds to your energy value</span> </div> <div class="weapon-effect"> <strong>Accuracy</strong> <span class="weapon-effect-description">- has x% chance of missing</span> </div> <div class="weapon-effect"> <strong>Dreadful</strong> <span class="weapon-effect-description">- has x% chance of causing the enemy to flee or surrender</span> </div> <div class="weapon-effect"> <strong>Guard-Break</strong> <span class="weapon-effect-description">- nullifies enemy defence card</span> </div> <div class="weapon-effect"> <strong>Piercing</strong> <span class="weapon-effect-description">- bypass enemy armour save</span> </div> <div class="weapon-effect"> <strong>Armour-Break</strong> <span class="weapon-effect-description">- removes enemy armour value</span> </div> </div> </div> </div> <</nobr>>
<<nobr>><<include "WeaponData">> <style> /* Medieval dark red theme with compact layout */ .weapon-selection { max-width: 1400px; margin: 0 auto; padding: 20px 15px; background: linear-gradient(to bottom, #1a0000 0%, #300000 50%, #1a0000 100%); border: 3px solid #2a2a2a; border-radius: 20px; box-shadow: 0 0 20px #000000, 0 20px 40px rgba(0, 0, 0, 0.5); font-family: 'Luminari', 'MedievalSharp', fantasy; } .weapon-selection h3 { text-align: center; color: #ffd700; font-family: 'Cinzel', serif; font-size: 2em; margin-bottom: 20px; text-transform: uppercase; letter-spacing: 0.1em; text-shadow: 0 0 10px #ff8c00, 0 0 20px #ff8c00, 0 0 30px #ff8c00, 2px 2px 2px rgba(0,0,0,0.5); position: relative; padding: 10px 5px; background: linear-gradient(to bottom, rgba(0,0,0,0.7), rgba(0,0,0,0)); border-bottom: 2px solid #ffd700; } .weapon-selection h3::after { content: ""; position: absolute; left: 50%; bottom: -10px; transform: translateX(-50%); width: 50%; height: 1px; background: linear-gradient(to right, transparent, #ffd700, transparent); } /* Weapon slots container for grid layout */ .weapon-slots-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin: 20px 0; } .weapon-slot { padding: 15px; border: 3px solid #8b0000; border-radius: 15px; background: linear-gradient(to bottom, #300000 0%, #1a0000 50%, #300000 100%); box-shadow: 0 0 15px #000000, inset 0 0 20px rgba(139, 0, 0, 0.3); position: relative; overflow: hidden; transition: all 0.3s ease; min-height: 400px; } .weapon-slot::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, #8b0000, #600000, #8b0000, #600000); background-size: 400% 400%; animation: gradientShift 8s ease infinite; opacity: 0.3; z-index: -1; border-radius: 12px; } @keyframes gradientShift { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .weapon-slot:hover { transform: translateY(-3px); box-shadow: 0 0 25px #8b0000, 0 10px 20px rgba(0, 0, 0, 0.6); border-color: #ffd700; } .weapon-slot h4 { color: #ffd700; text-align: center; margin-bottom: 15px; font-size: 1.2em; font-weight: bold; font-family: 'Cinzel', serif; text-transform: uppercase; letter-spacing: 0.05em; text-shadow: 0 0 10px #ff8c00, 0 0 15px #ff8c00, 2px 2px 2px rgba(0,0,0,0.5); position: relative; z-index: 1; } .upgrade-slot { min-height: 80px; display: flex; justify-content: center; align-items: center; position: relative; z-index: 1; } .weapon-upgrade-card { display: flex; flex-direction: column; align-items: center; padding: 15px; border: 2px solid #8b0000; border-radius: 12px; background: linear-gradient(to bottom, rgba(26, 0, 0, 0.8), rgba(48, 0, 0, 0.8)); box-shadow: 0 0 15px #000000; margin: 10px 0; width: 100%; transition: all 0.3s ease; position: relative; overflow: hidden; } .weapon-upgrade-card::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 215, 0, 0.1), transparent); transition: left 0.5s; } .weapon-upgrade-card:hover::before { left: 100%; } .weapon-upgrade-card:hover { transform: scale(1.02); border-color: #ffd700; box-shadow: 0 0 25px #8b0000, 0 5px 15px rgba(0, 0, 0, 0.5); } .weapon-upgrade-image { width: 120px; height: 120px; object-fit: contain; margin-bottom: 10px; border-radius: 10px; border: 2px solid #8b0000; transition: all 0.3s ease; background: radial-gradient(circle, rgba(139, 0, 0, 0.1), transparent); box-shadow: 0 0 10px #000000; } .weapon-upgrade-image:hover { transform: scale(1.05); border-color: #ffd700; box-shadow: 0 0 20px #8b0000; } .weapon-image-corruption { filter: drop-shadow(0 0 10px #ff0000) drop-shadow(0 0 15px #ff0000) drop-shadow(0 0 20px #ff0000); animation: corruptionGlow 2s ease-in-out infinite alternate; border-color: rgba(255, 0, 0, 0.8) !important; } @keyframes corruptionGlow { from { filter: drop-shadow(0 0 10px #ff0000) drop-shadow(0 0 15px #ff0000) drop-shadow(0 0 20px #ff0000); } to { filter: drop-shadow(0 0 15px #ff0000) drop-shadow(0 0 20px #ff0000) drop-shadow(0 0 25px #ff0000); } } .weapon-name { color: #c0c0c0; margin: 8px 0; font-size: 1.1em; font-weight: bold; text-align: center; font-family: 'Cinzel', serif; text-transform: uppercase; letter-spacing: 0.05em; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8); } .corruption-info { color: #ff6b6b; margin: 8px 0; font-weight: bold; text-align: center; font-size: 0.9em; padding: 6px 12px; background: linear-gradient(to bottom, rgba(26, 0, 0, 0.8), rgba(48, 0, 0, 0.8)); border-radius: 15px; border: 2px solid #8b0000; text-shadow: 0 0 10px rgba(255, 107, 107, 0.5); box-shadow: 0 0 10px #000000; } .attack-cards-preview { margin: 10px 0; padding: 12px; border: 2px solid #8b0000; border-radius: 10px; background: linear-gradient(to bottom, rgba(26, 0, 0, 0.6), rgba(48, 0, 0, 0.6)); box-shadow: 0 0 10px #000000; max-width: 100%; width: 100%; } .attack-cards-preview h5 { color: #ffd700; margin: 0 0 10px 0; text-align: center; font-size: 1em; font-family: 'Cinzel', serif; text-transform: uppercase; letter-spacing: 0.05em; text-shadow: 0 0 10px #ff8c00, 0 0 15px #ff8c00, 2px 2px 2px rgba(0,0,0,0.5); } .attack-card-mini { background: linear-gradient(to bottom, rgba(48, 0, 0, 0.8), rgba(26, 0, 0, 0.8)); border: 1px solid #8b0000; border-radius: 6px; padding: 8px; margin: 6px 0; color: #c0c0c0; font-size: 0.85em; transition: all 0.3s ease; position: relative; box-shadow: 0 0 5px #000000; } .attack-card-mini:hover { background: linear-gradient(to bottom, rgba(48, 0, 0, 1), rgba(26, 0, 0, 1)); border-color: #ffd700; transform: translateX(3px); box-shadow: 0 0 10px #8b0000; } .attack-card-name { font-weight: bold; color: #ffd700; margin-bottom: 3px; font-family: 'Cinzel', serif; font-size: 0.9em; } .attack-card-effects { color: #ff6b6b; font-size: 0.8em; margin-top: 3px; font-style: italic; } .souls-display { color: #ffd700; text-align: center; margin-bottom: 20px; font-size: 1.2em; font-weight: bold; font-family: 'Cinzel', serif; padding: 12px 25px; background: linear-gradient(to bottom, rgba(26, 0, 0, 0.8), rgba(48, 0, 0, 0.8)); border: 2px solid #8b0000; border-radius: 20px; box-shadow: 0 0 15px #000000; text-shadow: 0 0 10px #ff8c00, 0 0 15px #ff8c00, 2px 2px 2px rgba(0,0,0,0.5); display: inline-block; margin-left: 50%; transform: translateX(-50%); text-transform: uppercase; letter-spacing: 0.05em; } .no-weapon-text { color: #888; text-align: center; font-style: italic; padding: 30px; font-size: 1em; background: linear-gradient(to bottom, rgba(26, 0, 0, 0.4), rgba(48, 0, 0, 0.4)); border-radius: 10px; border: 2px dashed #8b0000; box-shadow: 0 0 10px #000000; } .return-section { text-align: center; margin: 30px 0 15px 0; padding-top: 20px; border-top: 2px solid #8b0000; position: relative; } .return-section::before { content: ""; position: absolute; top: 0; left: 50%; transform: translateX(-50%); width: 50%; height: 1px; background: linear-gradient(to right, transparent, #8b0000, transparent); } /* Responsive design */ @media (max-width: 1200px) { .weapon-slots-container { grid-template-columns: repeat(2, 1fr); gap: 15px; } .weapon-slot { min-height: 380px; } } @media (max-width: 768px) { .weapon-selection { padding: 15px 10px; } .weapon-selection h3 { font-size: 1.6em; margin-bottom: 15px; } .weapon-slots-container { grid-template-columns: repeat(2, 1fr); gap: 10px; } .weapon-slot { padding: 12px; min-height: 350px; } .weapon-slot h4 { font-size: 1em; margin-bottom: 10px; } .weapon-upgrade-image { width: 80px; height: 80px; } .weapon-upgrade-card { padding: 10px; } .weapon-name { font-size: 0.9em; margin: 5px 0; } .attack-cards-preview { padding: 8px; margin: 8px 0; } .attack-cards-preview h5 { font-size: 0.9em; margin-bottom: 8px; } .attack-card-mini { padding: 6px; margin: 4px 0; font-size: 0.8em; } .attack-card-name { font-size: 0.85em; } .attack-card-effects { font-size: 0.75em; } .souls-display { font-size: 1em; padding: 10px 20px; margin-bottom: 15px; } .corruption-info { font-size: 0.8em; padding: 5px 10px; } } @media (max-width: 480px) { .weapon-slots-container { grid-template-columns: 1fr; gap: 10px; } .weapon-slot { min-height: 320px; } .weapon-upgrade-image { width: 70px; height: 70px; } .weapon-selection h3 { font-size: 1.4em; } } /* Large screens - show more columns */ @media (min-width: 1400px) { .weapon-slots-container { grid-template-columns: repeat(4, 1fr); gap: 20px; } .weapon-slot { min-height: 420px; } } @media (min-width: 1800px) { .weapon-slots-container { grid-template-columns: repeat(5, 1fr); gap: 25px; } } /* Loading animation for images */ .weapon-upgrade-image { opacity: 0; animation: fadeIn 0.5s ease-in-out forwards; } @keyframes fadeIn { to { opacity: 1; } } /* Enhanced pulse effect for corruption info matching the theme */ .corruption-info { animation: corruptionPulse 3s ease-in-out infinite; } @keyframes corruptionPulse { 0%, 100% { box-shadow: 0 0 10px #000000, 0 0 15px rgba(255, 107, 107, 0.3); } 50% { box-shadow: 0 0 15px #000000, 0 0 25px rgba(255, 107, 107, 0.6); } } /* Additional medieval styling elements */ .weapon-slot::after { content: ""; position: absolute; top: 8px; left: 8px; right: 8px; height: 1px; background: linear-gradient(to right, transparent, #ffd700, transparent); opacity: 0.3; z-index: 1; } /* Enhanced scrollbar styling to match theme */ .weapon-selection::-webkit-scrollbar { width: 12px; } .weapon-selection::-webkit-scrollbar-track { background: linear-gradient(to bottom, #1a0000, #300000); border: 1px solid #2a2a2a; } .weapon-selection::-webkit-scrollbar-thumb { background: linear-gradient(to bottom, #600000, #8b0000); border: 1px solid #2a2a2a; border-radius: 6px; } .weapon-selection::-webkit-scrollbar-thumb:hover { background: linear-gradient(to bottom, #8b0000, #600000); } /* Progress bar styling for any progress elements */ progress { width: 100%; height: 15px; background-color: #300000; border: 2px solid #2a2a2a; border-radius: 8px; } progress::-webkit-progress-value { background: linear-gradient(to right, #600000, #8b0000); border-radius: 6px; } progress::-webkit-progress-bar { background: #1a0000; border-radius: 6px; } /* Divider styling to match UI panel */ hr { border: 0; height: 2px; background: linear-gradient(to right, transparent, #8b0000, transparent); margin: 15px 0; } /* Compact grid helper class if you need to force smaller layout */ .weapon-selection.compact .weapon-slots-container { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; } .weapon-selection.compact .weapon-slot { min-height: 300px; padding: 10px; } .weapon-selection.compact .weapon-upgrade-image { width: 100px; height: 100px; } </style> <div class="weapon-selection"> <h3>⚡ Weapon Corruption Altar ⚡</h3> <div class="souls-display">Souls: $Souls</div> <!-- Dagger Slot --> <div class="weapon-slot"> <h4>Dagger Slot</h4> <div id="daggerUpgrade" class="upgrade-slot"> <!-- Dagger upgrade will be displayed here --> </div> </div> <!-- Medium Slot --> <div class="weapon-slot"> <h4> Medium Slot</h4> <div id="mediumUpgrade" class="upgrade-slot"> <!-- Medium weapon upgrade will be displayed here --> </div> </div> <!-- Back Slot --> <div class="weapon-slot"> <h4>Back Slot</h4> <div id="backUpgrade" class="upgrade-slot"> <!-- Back slot upgrade will be displayed here --> </div> </div> </div> <div class="return-section"> <<button "Return">><<goto "Eisheth">><</button>> </div> <</nobr>> <<script>> // Initialize weapon upgrades storage if it doesn't exist if (!State.variables.weaponUpgrades) { State.variables.weaponUpgrades = {}; } // Function to get current corruption level for a weapon window.getWeaponCorruption = function(weaponType) { const upgrades = State.variables.weaponUpgrades[weaponType]; return upgrades ? (upgrades.corruption || 0) : 0; }; // Function to check if weapon has any corruption window.weaponHasCorruption = function(weaponType) { const weapon = window.weaponSets[weaponType]; if (!weapon || !weapon.cards) return false; return weapon.cards.some(card => card.effects && card.effects.some(effect => effect.name && effect.name.toLowerCase().includes('corruption') ) ); }; // Function to get total corruption value window.getTotalCorruption = function(weaponType) { const weapon = window.weaponSets[weaponType]; let maxCorruption = 0; if (weapon && weapon.cards) { weapon.cards.forEach(card => { if (card.effects) { card.effects.forEach(effect => { if (effect.name && effect.name.toLowerCase().includes('corruption')) { maxCorruption = Math.max(maxCorruption, effect.value || 0); } }); } }); } return maxCorruption; }; // Enhanced function to display upgrade option for a specific slot window.displayUpgradeForSlot = function(slotType) { const upgradeDiv = document.getElementById(`${slotType}Upgrade`); if (!upgradeDiv) return; const equippedWeapon = window.currentlyEquipped ? window.currentlyEquipped[slotType] : null; if (!equippedWeapon || !window.weaponSets[equippedWeapon]) { upgradeDiv.innerHTML = ` <div class="no-weapon-text"> <div style="font-size: 3em; margin-bottom: 10px;">⚔️</div> <div>No weapon equipped in this slot</div> <div style="font-size: 0.9em; margin-top: 10px; color: #666;"> Equip a weapon to corrupt it with dark energy </div> </div> `; return; } const weaponData = window.weaponSets[equippedWeapon]; const hasCorruption = weaponHasCorruption(equippedWeapon); const currentCorruption = getTotalCorruption(equippedWeapon); // Create weapon display with upgrade option const weaponDiv = document.createElement('div'); weaponDiv.className = 'weapon-upgrade-card'; const isMaxCorruption = currentCorruption >= 30; const canCorrupt = State.variables.Souls > 0 && !isMaxCorruption; const corruptionCost = 1; // Enhanced attack cards preview with better formatting let attackCardsHtml = ''; if (weaponData.cards && weaponData.cards.length > 0) { attackCardsHtml = ` <div class="attack-cards-preview"> <h5>⚡ Attack Cards Preview</h5> ${weaponData.cards.map(card => { const effectsText = card.effects && card.effects.length > 0 ? card.effects.map(effect => { const value = effect.value > 1 ? ` ${effect.value}` : ''; return `${effect.name}${value}`; }).join(', ') : 'No special effects'; return ` <div class="attack-card-mini"> <div class="attack-card-name">${card.name}</div> <div style="color: #4ecdc4; font-weight: bold;">Damage: ${card.damage || 0}</div> <div class="attack-card-effects">Effects: ${effectsText}</div> </div> `; }).join('')} </div> `; } // Corruption progress bar const corruptionProgress = (currentCorruption / 30) * 100; const progressBarHtml = hasCorruption ? ` <div style="margin: 15px 0; width: 100%;"> <div style="color: #ff6b6b; font-size: 0.9em; margin-bottom: 5px; text-align: center;"> Corruption Progress: ${currentCorruption}/30 </div> <div style="background: rgba(0,0,0,0.3); border-radius: 10px; height: 8px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #ff6b6b, #ff0000); height: 100%; width: ${corruptionProgress}%; transition: width 0.5s ease; border-radius: 10px;"></div> </div> </div> ` : ''; // Enhanced button text based on corruption level let buttonText = 'Corrupt Weapon'; let buttonIcon = '🔥'; if (isMaxCorruption) { buttonText = 'Maximum Corruption'; buttonIcon = '💀'; } else if (hasCorruption) { buttonText = 'Increase Corruption'; buttonIcon = ''; } weaponDiv.innerHTML = ` <img src="${weaponData.image}" alt="${weaponData.name}" class="weapon-upgrade-image ${hasCorruption ? 'weapon-image-corruption' : ''}" onerror="this.style.display='none'"> <div class="weapon-name">⚔️ ${weaponData.name}</div> ${hasCorruption ? ` <div class="corruption-info"> Corruption Level: ${currentCorruption} </div> ${progressBarHtml} ` : ''} ${attackCardsHtml} <div style="margin: 20px 0; text-align: center;"> <div style="color: #888; font-size: 0.9em; margin-bottom: 10px;"> ${isMaxCorruption ? 'This weapon has reached maximum corruption!' : `Cost: ${corruptionCost} Soul${corruptionCost > 1 ? 's' : ''} | +10 Corruption` } </div> <button class="combat-btn ${!canCorrupt ? 'disabled' : ''}" onclick="corruptWeapon('${equippedWeapon}', '${slotType}')" ${!canCorrupt ? 'disabled' : ''} style="${!canCorrupt ? '' : 'background: linear-gradient(145deg, #ff6b6b, #ff4757); border-color: #ff4757;'}"> ${buttonIcon} ${buttonText} </button> </div> `; upgradeDiv.innerHTML = ''; upgradeDiv.appendChild(weaponDiv); // Add entrance animation setTimeout(() => { weaponDiv.style.opacity = '0'; weaponDiv.style.transform = 'translateY(20px)'; weaponDiv.style.transition = 'all 0.5s ease'; requestAnimationFrame(() => { weaponDiv.style.opacity = '1'; weaponDiv.style.transform = 'translateY(0)'; }); }, 50); }; // Enhanced display function with loading states window.displayWeaponUpgrades = function() { console.log('Displaying weapon upgrades...'); // Show loading state ['dagger', 'medium', 'back'].forEach(slotType => { const upgradeDiv = document.getElementById(`${slotType}Upgrade`); if (upgradeDiv) { upgradeDiv.innerHTML = ` <div style="text-align: center; color: #888; padding: 40px;"> <div style="font-size: 2em; animation: spin 1s linear infinite;">⚙️</div> <div style="margin-top: 10px;">Loading weapon data...</div> </div> `; } }); // Add loading animation const style = document.createElement('style'); style.textContent = ` @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } `; document.head.appendChild(style); // First detect what's currently equipped if (typeof detectEquippedWeapons === 'function') { detectEquippedWeapons(); } // Display upgrade options for each slot with slight delays for smooth loading setTimeout(() => displayUpgradeForSlot('dagger'), 100); setTimeout(() => displayUpgradeForSlot('medium'), 200); setTimeout(() => displayUpgradeForSlot('back'), 300); }; // Enhanced corruption function with better feedback window.corruptWeapon = function(weaponType, slotType) { console.log(`Corrupting ${weaponType} in ${slotType} slot`); if (State.variables.Souls <= 0) { // Enhanced error feedback const errorDiv = document.createElement('div'); errorDiv.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: linear-gradient(135deg, #ff4757, #ff3742); color: white; padding: 20px 30px; border-radius: 15px; font-size: 1.2em; font-weight: bold; z-index: 1000; box-shadow: 0 10px 30px rgba(0,0,0,0.5); animation: errorShake 0.5s ease-in-out; `; errorDiv.innerHTML = 'Not enough souls!'; document.body.appendChild(errorDiv); setTimeout(() => errorDiv.remove(), 2000); return; } const currentCorruption = getTotalCorruption(weaponType); if (currentCorruption >= 30) { const maxDiv = document.createElement('div'); maxDiv.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: linear-gradient(135deg, #ffa502, #ff6348); color: white; padding: 20px 30px; border-radius: 15px; font-size: 1.2em; font-weight: bold; z-index: 1000; box-shadow: 0 10px 30px rgba(0,0,0,0.5); `; maxDiv.innerHTML = '⚡ Maximum corruption reached!'; document.body.appendChild(maxDiv); setTimeout(() => maxDiv.remove(), 2000); return; } // Initialize weapon upgrades if not exists if (!State.variables.weaponUpgrades[weaponType]) { State.variables.weaponUpgrades[weaponType] = { corruption: 0 }; } // Add 10 corruption, up to max of 30 const newCorruption = Math.min(currentCorruption + 10, 30); State.variables.weaponUpgrades[weaponType].corruption = newCorruption; // Deduct soul State.variables.Souls -= 1; // Success feedback with animation const successDiv = document.createElement('div'); successDiv.style.cssText = ` position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: linear-gradient(135deg, #2ed573, #1e90ff); color: white; padding: 20px 30px; border-radius: 15px; font-size: 1.2em; font-weight: bold; z-index: 1000; box-shadow: 0 10px 30px rgba(0,0,0,0.5); animation: successPulse 0.6s ease-in-out; `; successDiv.innerHTML = `⚡ Weapon corrupted! (+10 Corruption)`; document.body.appendChild(successDiv); // Add success animation const successStyle = document.createElement('style'); successStyle.textContent = ` @keyframes successPulse { 0% { transform: translate(-50%, -50%) scale(0.8); opacity: 0; } 50% { transform: translate(-50%, -50%) scale(1.1); opacity: 1; } 100% { transform: translate(-50%, -50%) scale(1); opacity: 1; } } @keyframes errorShake { 0%, 100% { transform: translate(-50%, -50%); } 25% { transform: translate(-48%, -50%); } 75% { transform: translate(-52%, -50%); } } `; document.head.appendChild(successStyle); setTimeout(() => { successDiv.remove(); successStyle.remove(); }, 2000); // Reapply upgrades to weapon data immediately window.applyPersistentUpgrades(); // Update combat inventory if it exists if (window.CombatSystem && window.CombatSystem.combatInventory) { window.CombatSystem.combatInventory.forEach(card => { if (card.weaponType === weaponType) { // Find the corresponding upgraded card const weapon = window.weaponSets[weaponType]; const upgradedCard = weapon.cards.find(origCard => origCard.name === card.name); if (upgradedCard) { card.effects = [...(upgradedCard.effects || [])]; } } }); } console.log(`Successfully corrupted ${weaponType} to corruption level ${newCorruption}`); // Update the souls display with animation const soulsDisplay = document.querySelector('.souls-display'); soulsDisplay.style.transform = 'scale(1.1)'; soulsDisplay.style.transition = 'transform 0.3s ease'; soulsDisplay.textContent = `Souls: ${State.variables.Souls}`; setTimeout(() => { soulsDisplay.style.transform = 'scale(1)'; }, 300); // Refresh the passage to show updated state setTimeout(() => { displayWeaponUpgrades(); }, 500); }; // Enhanced go back function window.goBack = function() { // Add exit animation const weaponSelection = document.querySelector('.weapon-selection'); weaponSelection.style.transition = 'all 0.5s ease'; weaponSelection.style.transform = 'translateY(-20px)'; weaponSelection.style.opacity = '0'; setTimeout(() => { if (typeof Engine !== 'undefined' && Engine.backward) { Engine.backward(); } else { // Fallback - go to a specific passage (change this to your desired return passage) Engine.play('Start'); } }, 500); }; // Enhanced initialization with smooth entrance animations $(document).one(':passageend', function() { if (passage() === 'WeaponUpgrade') { // Add entrance animation to the main container const weaponSelection = document.querySelector('.weapon-selection'); if (weaponSelection) { weaponSelection.style.opacity = '0'; weaponSelection.style.transform = 'translateY(30px)'; weaponSelection.style.transition = 'all 0.8s ease'; setTimeout(() => { weaponSelection.style.opacity = '1'; weaponSelection.style.transform = 'translateY(0)'; }, 100); } // Initialize weapon upgrades with staggered loading setTimeout(() => { displayWeaponUpgrades(); }, 300); // Add particle effect for ambiance (optional) createParticleEffect(); } }); // Optional: Add floating particle effect for enhanced atmosphere window.createParticleEffect = function() { const particleContainer = document.createElement('div'); particleContainer.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: -1; overflow: hidden; `; // Create floating particles for (let i = 0; i < 20; i++) { const particle = document.createElement('div'); particle.style.cssText = ` position: absolute; width: 4px; height: 4px; background: radial-gradient(circle, #ffd700, transparent); border-radius: 50%; animation: float ${5 + Math.random() * 10}s linear infinite; left: ${Math.random() * 100}%; top: ${Math.random() * 100}%; opacity: ${0.3 + Math.random() * 0.7}; `; particleContainer.appendChild(particle); } // Add floating animation const particleStyle = document.createElement('style'); particleStyle.textContent = ` @keyframes float { 0% { transform: translateY(100vh) rotate(0deg); opacity: 0; } 10% { opacity: 1; } 90% { opacity: 1; } 100% { transform: translateY(-100vh) rotate(360deg); opacity: 0; } } `; document.head.appendChild(particleStyle); document.body.appendChild(particleContainer); // Clean up particles when leaving the passage $(document).one(':passagestart', function() { if (particleContainer.parentNode) { particleContainer.remove(); } if (particleStyle.parentNode) { particleStyle.remove(); } }); }; // Add keyboard shortcuts for better UX document.addEventListener('keydown', function(e) { if (passage() === 'WeaponUpgrade') { switch(e.key) { case 'Escape': goBack(); break; case '1': // Quick corrupt dagger if possible const daggerWeapon = window.currentlyEquipped?.dagger; if (daggerWeapon && State.variables.Souls > 0) { corruptWeapon(daggerWeapon, 'dagger'); } break; case '2': // Quick corrupt medium weapon if possible const mediumWeapon = window.currentlyEquipped?.medium; if (mediumWeapon && State.variables.Souls > 0) { corruptWeapon(mediumWeapon, 'medium'); } break; case '3': // Quick corrupt back weapon if possible const backWeapon = window.currentlyEquipped?.back; if (backWeapon && State.variables.Souls > 0) { corruptWeapon(backWeapon, 'back'); } break; } } }); // Add tooltip system for better user guidance window.addTooltips = function() { const tooltipStyle = document.createElement('style'); tooltipStyle.textContent = ` .tooltip { position: relative; cursor: help; } .tooltip::before { content: attr(data-tooltip); position: absolute; bottom: 125%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.9); color: white; padding: 8px 12px; border-radius: 6px; font-size: 0.8em; white-space: nowrap; opacity: 0; pointer-events: none; transition: opacity 0.3s ease; z-index: 1000; } .tooltip::after { content: ''; position: absolute; bottom: 115%; left: 50%; transform: translateX(-50%); border: 5px solid transparent; border-top-color: rgba(0, 0, 0, 0.9); opacity: 0; pointer-events: none; transition: opacity 0.3s ease; } .tooltip:hover::before, .tooltip:hover::after { opacity: 1; } `; document.head.appendChild(tooltipStyle); // Add tooltips to various elements setTimeout(() => { const corruptButtons = document.querySelectorAll('.combat-btn:not(.return-section .combat-btn)'); corruptButtons.forEach(button => { if (!button.classList.contains('disabled')) { button.classList.add('tooltip'); button.setAttribute('data-tooltip', 'Costs 1 Soul • Adds +10 Corruption • Hotkeys: 1,2,3'); } }); const soulsDisplay = document.querySelector('.souls-display'); if (soulsDisplay) { soulsDisplay.classList.add('tooltip'); soulsDisplay.setAttribute('data-tooltip', 'Souls are consumed to corrupt weapons'); } }, 1000); }; // Enhanced error handling and user feedback window.addEventListener('error', function(e) { if (passage() === 'WeaponUpgrade') { console.error('Weapon Upgrade System Error:', e.error); const errorNotification = document.createElement('div'); errorNotification.style.cssText = ` position: fixed; top: 20px; right: 20px; background: linear-gradient(135deg, #ff4757, #ff3742); color: white; padding: 15px 20px; border-radius: 10px; font-weight: bold; z-index: 1000; box-shadow: 0 5px 15px rgba(0,0,0,0.3); animation: slideIn 0.5s ease; `; errorNotification.innerHTML = ` <div>⚠️ System Error</div> <div style="font-size: 0.8em; margin-top: 5px;">Please refresh the page</div> `; const slideInStyle = document.createElement('style'); slideInStyle.textContent = ` @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } `; document.head.appendChild(slideInStyle); document.body.appendChild(errorNotification); setTimeout(() => { errorNotification.remove(); slideInStyle.remove(); }, 5000); } }); <</script>>
The Planes... In Development [[Return|Base Intro]]
<div class="text-box"> <<nobr>> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">New to version 2.8</p><br><br> <h2>Convert Militia to Succubis</h2> You can now turn members of your militia into Succubi to unlock different properties to normal humans. This event triggers randomly after you set up the barracks<br><br> <h2>Lucy's Work</h2> Lucy can now visit Scardale and "work" in the housing area<br><br> <h2>Alice's Work</h2> Alice can visit the tavern and speak to people with the goal of securing more grain for the settlements<br><br> <h2>Settlment Visists</h2> You can now visist settlments and interact with villagers. These are semi random visits and depend on who is in the houses<br><br> <h2>Bandit Camps and Caravans</h2> You can now find and raid Bandit Camps and Caravans with different outcomes<br><br> <hr> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">New to version 2.6</p><br><br> <h2>Combat overhaul</h2> Combat has been overhauled to have a better, more steamlined system. Introducing new spells, weapons, stores, potions and consequences<br><br> <h2>Better mobile support</h2><br><br> <h2>Arachness Hunt - Mini game</h2> Getting drunk in the tavern in Scarldale now leads to a new mini game. This adds some "moster girl" content so avoid if thats not for you<br><br> <hr> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">New to version 2.4</p><br><br> <h2>Autosaves!</h2> The game will now autosave each time you sleep, or before you go to a settlement<br><br> <h2>UI Overhall</h2><br><br> <h2>Forest Exploration</h2><br><br> This has been added to hopefully make the game more exciting than the previous system of clicking "Next" over and over like older versions, if its popular then it will be expanded on, for now there isnt too much new content in the forest but do be sure to visit all the campsites and try the towers a few times<br><br> <h2>Crypts</h2><br><br> Exploring crypts has been (hopefully) improved, adding a new randomly generating system and new enemy. There arn't too many types of end final chamber encounters at the moment but more will be added soon<br><br> <h2>Dungeon Corruption</h2> Dungeon Corruption mini game as Lucy or the Overlord, play as either character for different content. Corruption now will apply to prisoners over time rather than old methods<br><br> <h2>Portal Room</h2> Portal room and the matching spell "Tear" have been added. The tear spell will create a location for you to teleport to from the portal room. They are scattered acrsoss the map<br><br> <h2>Build a milita</h2> Corrupt forces and send them to your new barracks to build your army<br><br> <h2>Scout locations</h2> Send your new forces out to look for settlements, once found you can send Lucy to scout them<br><br> <h2>Raid</h2> Send your forces to attack location you've descovered, giving them different objectives depending on what you need<br><br> <h2>Capture Locations</h2> Captured lociation need to be managed and maintained to keep happiness up<br><br> <h2>Bugs</h2> Probably more bugs... sorry <</nobr>> </div>
<div class="text-box"> <<nobr>> <<set $Int to 1>> You draw your dagger as the beast gets closer<br><br> Within moments its on you and begins slashing at you with its claws, your robes are torn and flesh ripped but you managed to pull out your blade<br><br> [[Stab|WolfQuestStab]] <</nobr>> </div> <<set $Int to 0>>
<div class="text-box"> <<nobr>> Feeling over confident with your recent victories, you charge at the beast drawing your sword<br><br> You swing your sword at the beast ready to deliver the killing blow<br><br> But when your blade makes contact it doesn't even scratch the animal, your sword glances off the animal as if you were striking steel<br><br> Not expecting this, you stumble and try to catch yourself, but before you can the creature strikes you with the back of its hand, sending you off your feet and spinning through the forest<br><br> <<link "Flee">> <<set $PlayerHealth to 20>> <<run Engine.play('Base Intro')>> <<script>> UI.alert("You escape with your life, but only just... prehapse Gnarlak can advise on the animal"); <</script>> <</link>> <</nobr>> </div>
<div class="text-box"> <<nobr>> In the distance, you see it... The beast which nearly killed you once before<br><br> The beast snorts and turns towards you<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Wolf/1.png" width="700" height="700"> </div><br><br> It begins to charge toward you<br><br> <<if $WolfWeapon is "Dagger">> Draw your [[Dagger|WolfFightDagger]] <</if>> <<if $WolfWeapon is "Arrows">> <<set _weapon to window.currentlyEquipped && window.currentlyEquipped.back ? window.currentlyEquipped.back : "none">> <<if _weapon is "longbow">> Nock your [[Arrows|Bow]] <<else>> Shit... you didn't bring a [[bow|WolfQuestNoBow]] <</if>><</if>> <</nobr>> </div> <<set $CurrentEnemy to "Werewolf">> <<set $EnemyMin to 33>> <<set $EnemyMax to 50>> <<set $EnemyHealth to 100>> <<set $Tag = tags()[1];>> <<set $BackgroundPath = setup.getBackgroundPath($Tag)>> <audio id="myAudio" src="Audio/Howl.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 1; audio.play(); }); <</script>>
<div class="text-box"> <<nobr>> The wolf bounds towards you and you have no way to defend yourself...<br><br> The beast pins you to a tree and grabs your head, pulling it back and exposing your neck..<br><br> Without a moment on hesitation the werewolf bites down on the neck and tairs out your throat<br><br> The life drains from you and you feel youself pass<br><br> <<set $PlayerHealth to 0>> [[Continue|Resporn]] <</nobr>> </div>
<div class="text-box"> <<nobr>> With the beast down dead, you look around<br><br> After searching for some time you find a shallow cave, it sticks with the sent of rotting flesh, this must have been the beasts den<br><br> You see some torn clothes in the corner, looking closer you can tell these belonged to bandits who were unlucky enough to cross the beasts path...<br><br> You search the clothes and find 100 gold... Time to [[leave|Base Intro]] <<set $Gold to $Gold + 100>> <</nobr>> </div> <<set $WolfDead to true>> <<set $TavQuest to 1>> <<set $TavQuestName to "null">> <<set $ReplayQuestActive to false>>
<div class="text-box"> <<nobr>> Fighting through the pain you land another strike with your dagger<br><br> You force the blade into the beasts chest... It roar's thrashing violently before falling back and dying<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<link "Leave">> <<script>> UI.alert("Quest complete! <br>You killed the beast attacking the local live stock"); <</script>> <<run $Quests.delete("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run Engine.play('WolfQuestOver')>> <</link>> <</nobr>> </div>
<div class="text-box"> <<nobr>> You continue south, pushing deeper into the forest...<br><br> You hear a loud, deep wolf howel<br><br> And then you see it [[...|WolvesQuest3]] <</nobr>> </div> <audio id="myAudio" src="Audio/Howl.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 1; audio.play(); }); <</script>>
<div class="text-box"> <<nobr>> Turning to the left and walking into the clearing, you're met by a lage open space surrounded by forest<br><br> There's nothing here, no live stock or wolves. Infact, there's no sound or sign of life at all...<br><br> [[Search the rocky area|WolvesQuest2Right]]<br><br> [[Search the dense forest|WolvesQuest2Centre]] <</nobr>> </div>
<div class="text-box"> <<nobr>> You walk up a hill, continuing into the forest<br><br> You hear a wolves howel, but its distant and coming from the south<br><br> [[Search the clearing|WolvesQuest2Left]]<br><br> [[Search the dense forest|WolvesQuest2Centre]] <</nobr>> </div> <audio id="myAudio" src="Audio/Howl.mp3"></audio> <<script>> $(document).ready(function() { var audio = document.getElementById("myAudio"); audio.volume = 0.5; audio.play(); }); <</script>>
<div class="text-box"> <<nobr>> <<set $WolfQuestStatus to "FirstEncounter">> <div align="center"> <img src="Images/Forrest/Exploring/Wolf/1.png" width="700" height="700"> </div> Infront of you stands a huge powerful beast unlike anything you have seen before<br><br> Despite there being a good amount of distance between you both, you can tell the creature is enormous <br><br> You have never seen a beast like this before but you know that this unknown threat could rip you in half<br><br> <<link "Run">> <<run Engine.play('Base Intro')>> <<script>> UI.alert("You escape with your life, but only just... prehapse Gnarlak can advise on the animal"); <</script>> <</link>> <br><br> [[Fight|WolfFight]] <</nobr>> </div>
<<nobr>> <div class="text-box"> <<if ($WolfQuestStatus is "FirstEncounter") or ($WolfQuestStatus is "Blacksmith") or ($WolfQuestStatus is "Weapon")>> <<You>>I'm not going back out there until I have a better weapon...<</You>> <<button "Go Back">> <<goto "ForestExplore">> <</button>> <<else>> <<button "Explore the area">> <<goto "WolvesQuest">> <</button>> <</if>> </div> <</nobr>>
<div class="text-box"> <<nobr>> <<if ($WolfQuestStatus is "HaveDagger") or ($WolfQuestStatus is "HaveArrows")>> You wait in the forest till night comes, once its dark and the moon is out, you continue heading south<br><br> Now knowing what you are looking for... It does not take long to find what you are looking [[for...|WolfQuest4]] <<else>> You continue south, searching the pack of wolves which have been attacking the live stock...<br><br> To your left is an opening in the forest, you can see the area is well lit by the moon and lack of tree cover<br><br> To the right is a rocky area covered in thick moss<br><br> Ahead the trees seem to get thicker blocking out more of the moons light<br><br> [[Go left|WolvesQuest2Left][$Position to "Left"]]<br><br> [[Go Right|WolvesQuest2Right][$Position to "Right"]]<br><br> [[Continue Stright|WolvesQuest2Centre][$Position to "Stright"]] <</if>> <</nobr>> </div> <<set $Time to $Time + 9>> <audio autoplay loop> <source src="Audio/WalkingInForest2.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio>
<<nobr>> <div class="text-box"> <<if $CurrentEnemy is "Ghoul">> Your arrow goes wide and strikes the target in the shoulder, its not a perfect hit but would immobilise any regular threat... But the figure doesn't react, instead it turns slowly to face you... <<set $EnemyHealth to $EnemyHealth - 15>> <<link "Continue">><<run Engine.play('GhoulQuest2')>><</link>> <</if>> <<if $CurrentEnemy is "Armored Bandit">> You land a hit on the bandit, but his armor is thick and only does 15 damage<br><br> <<set $EnemyHealth to 85>> [[Combat]] <</if>> <<if $CurrentEnemy is "Werewolf">> Your arrow strikes the beast in the right of its chest, the beast howels but continues <br><br> It slows giving you time to draw another arrow, attempting to kill the beast, but you're not quick enough to nock it, it strikes the bow from your hand and kicks you to the ground<br><br> The beast stands over you, leaning in to making the final kill but you take the arrow still in your hand and force it up into the creatures heart...<br><br> It howels again, and falls back, crashing to the floor and dying<br><br> The people of Scarldale will notice this, and they will know it was you. <br><br> Your influence of Scarldale grows<br><br> <<set $scarldale.influence += 1>> <<set $TavQuestComplete to true>> <<set $ReplayQuestActive to false>> <<link "Leave">> <<script>> UI.alert("Quest complete! <br>You now have a weapon strong enough to kill the werewolf"); <</script>> <<run $Quests.delete("Find and kill the wolves attacking the local live stock near the abandoned church")>> <<run Engine.play('WolfQuestOver')>> <</link>> <</if>> <<if ($OldPosition is "bet") or ($OldPosition is "betDouble")>> Your arrow strikes the center target, scoring you 10 points<br><br> <<set _img to "Images/Forrest/Encounters/Human/Female/Huntress/Camp2/1.png">> <<say 'Huntress' _img>>Not bad...<</say>> <<set $PlayerArcheryScore to $PlayerArcheryScore + 10>> Your score: $PlayerArcheryScore<br> Her score: $NPCArcheryScore <<if $Int lt 3>> <<button "Her turn">> <<goto "NPCArrowShot">> <</button>> <<else>> <<button "The game is over">> <<goto "ArrowGameOver">> <</button>> <</if>> <</if>> </div> <audio autoplay> <source src="Audio/ArrowShot.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <</nobr>>
<div class="text-box"> <<nobr>> <<set $PlayerEquipment = $PlayerEquipment.filter(item => item !== "Lock Picks")>> <<if $PlayerRangedWeapon is "Bow">> <<if !$PlayerEquipment.includes("Bow")>> <<run $PlayerEquipment.push("Bow")>> <</if>> <</if>> <h2>Equipment:</h2> <<for _item range $PlayerEquipment>> <<if _item === "Iron Sword">> <<link "Iron Sword (+5 Damage)">> <<set $PlayerMeleeWeapon = "Iron Sword">> <<set $MeleeWeaponDamage = 5>> <<set $EquippedWeapon = "Iron Sword (+5 Damage)">> <<replace "#weaponDisplay">> Weapon equipped: $EquippedWeapon <</replace>> <</link>><br> <</if>> <<if _item === "Common Short Sword">> <<link "Common Short Sword (+8 Damage)">> <<set $PlayerMeleeWeapon = "Common Short Sword">> <<set $MeleeWeaponDamage = 8>> <<set $EquippedWeapon = "Common Short Sword (+8 Damage)">> <<replace "#weaponDisplay">> Weapon equipped: $EquippedWeapon <</replace>> <</link>><br> <</if>> <<if _item === "Sharpend Short Sword">> <<link "Sharpened Short Sword (+12 Damage)">> <<set $PlayerMeleeWeapon = "Sharpened Short Sword">> <<set $MeleeWeaponDamage = 12>> <<set $EquippedWeapon = "Sharpened Short Sword (+12 Damage)">> <<replace "#weaponDisplay">> Weapon equipped: $EquippedWeapon <</replace>> <</link>><br> <</if>> <<if _item === "Claymore">> <<link "Claymore (+15 Damage)">> <<set $PlayerMeleeWeapon = "Claymore">> <<set $MeleeWeaponDamage = 15>> <<set $EquippedWeapon = "Claymore (+15 Damage)">> <<replace "#weaponDisplay">> Weapon equipped: $EquippedWeapon <</replace>> <</link>><br> <</if>> <</for>> <br> <span id="weaponDisplay"> <<if $EquippedWeapon>><h2>Weapon equipped:</h2> $EquippedWeapon<</if>> </span> <</nobr>> <<if $PlayerEquipment.includes("Bow")>>Bow<</if>> <<if $PlayerEquipment.includes("Dagger")>>Dagger<</if>> <h2>Spells:</h2> <<for _spell range $PlayerSpells>> <<print _spell>> <</for>> [[Return|Chambers]] </div>
<<nobr>> <div class="text-box"> You enter your chamber and feel the temperature rise far greater than any fireplace could reach <<Eisheth>>You've been busy<</Eisheth>><br> <div class="Random-image"> <<set _imagePath to "Images/Forrest/Encounters/Cave/9.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<You>>Eisheth... Your a long way from your cave<</You>><br> <<Eisheth>>Humm, and you've come a long way from that tomb you crawled out of $Day days ago... So much progress in such little time...<</Eisheth>><br> <<Eisheth>>And now... It looks like you're building yourself a little army<</Eisheth>><br> <<You>>A force of men and women to aid me in reclaiming this land. You won't stop me, so I give you this chance to leave peacefully and return to the cave of yours<</You>><br> <<Eisheth>>Stop you! Come now my favorate little mortal... I don't want to stop you. I want to help you<</Eisheth>><br> <<You>>Why?<</You>><br> <<Eisheth>>For a millennium my sisters and I have waited, in the depths for someone like you. I feel like this is an opportunity for us to work together<</Eisheth>><br> <<You>>For sisters? The other demons who linger in the crypts and try to seduce anyone they can? They are evil, demons from the void and I won't join with them or you in this matter<</You>><br> <<Eisheth>>They are lost, starving and tried... You could help them, and they can help you<</Eisheth>><br> <<You>>I have my succubi. I do not need more<</You>><br> <<Eisheth>>Ahhh, yes... Lucy and... Alice what you have there is remarkable you took those woman and exploited the darkess in their heart to create two new greater succubi. But we both know you cannot do that again, you may have found those two but I have searched many a willing host and they are rarer than you think<</Eisheth>><br> <<You>>What are you saying<</You>><br> <<Eisheth>>For now... You me come to me and make a trade, bring me 8 mortal souls and I will give you one in return<</Eisheth>><br> She places a white glowing orb on the table<br><br> <div class="Random-image"> <<set _imagePath to "Images/Items/Stones/White.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<Eisheth>>A soul stone, this will capture their soul when you distory their body, before it can return to the void<</Eisheth>><br> <<You>>And what can I do with this?<</You>><br> <<Eisheth>>Choose a follower, and summon me. I will merge their souls, creating a lesser succubus for your new army<</Eisheth>><br> <<You>>A lesser succubus?<</You>><br> <<Eisheth>>Yes, less powerfull than your girls Alice and Lucy, but still more powerfull than any mortal<</Eisheth>><br> You take the stone and study it <<You>>And they will serve me?<</You>><br> <<Eisheth>>They will have the same devotion to you as any other and they will serve your will<</Eisheth>><br> <<You>>I will consider this<</You>><br> And with that, Eisheth is gone, without a sound as if she was never there<br><br> <<set $EishethVisit to false>> <<set $CaptureSuccubi to true>> <<set $CapturedSuccubiSouls to 1>> <<button "Continue">> <<goto "Chambers">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _prisoner to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <div class="Random-image"> <<set _imagePath to _prisoner.ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<You>>Come, follow me to my chambers<</You>> <<say '_prisoner.name' _prisoner.ImagePath>>Of course, Lord<</say>> _prisoner.name follows you to your personal chambers where Eisheth is waiting<br> <<Eisheth>>Are you ready to merge your soul with one from the void? You must be willing for this to work<</Eisheth>> <<say '_prisoner.name' _prisoner.ImagePath>>I am<</say>> Eisheth steps closer and places the red gem to _prisoner.name chest, within moments, the gem turns back to white and _prisoner.name's eyes turn red, then, slowly a transformation takes over her and her body changes <<set _rand to (1, 20)>> <<set _prisoner.ImagePath to "Images/Castle/Barracks/Mercenaries/Female/Succubus/" + _prisoner.hairColor + "/" + _rand + ".png">> <<set _prisoner.specialization to "Succubus">> <<set _prisoner.skill to 100>> <<set _prisoner.weapon to "Corruption">> <<set $CapturedSuccubiSouls to $CapturedSuccubiSouls - 1>> <div class="Random-image"> <<set _imagePath to _prisoner.ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<You>>How do you feel?<</You>> <<say '_prisoner.name' _prisoner.ImagePath>>Soooo good<</say>> <<You>>Good, you are dismissed<</You>> With a flirtatious wink she leaves<br><br> <<Eisheth>>Remember, she is a lesser succubus, if her body is distroid the soul will return to the void, she will not return like Alice and Lucy. Death is final<</Eisheth>> <<button "Send her back to the barracks">> <<goto "Chambers">> <</button>> </div> <</nobr>>
<!-- SummonToChambers passage --> <<nobr>> <<set _lucyIndex = $BarraksOccupance.findIndex(unit => unit.name === "Lucy")>> <<if _lucyIndex !== -1>> <<run $BarraksOccupance.splice(_lucyIndex, 1)>> <</if>> <<set _aliceIndex = $BarraksOccupance.findIndex(unit => unit.name === "Alice")>> <<if _aliceIndex !== -1>> <<run $BarraksOccupance.splice(_aliceIndex, 1)>> <</if>> <<set $chamberImageState to 1>> <div class="text-box"> <h1>Summon to Chambers</h1> <p>Select a character to summon to your chambers:</p> <!-- Barracks Characters Section --> <div style="margin-bottom: 30px; border: 1px solid #555; padding: 15px; border-radius: 5px;"> <h2 style="text-align: center; margin-top: 0;">Barracks Guards</h2> <<set _femaleBarracksCharacters = $BarraksOccupance.filter(prisoner => prisoner.sex === "Female" && prisoner.specialization !== "Succubus")>> <<if _femaleBarracksCharacters.length === 0>> <p>There are no female guards available in the barracks.</p> <<else>> <div style="display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 20px;"> <<for _i to 0; _i < _femaleBarracksCharacters.length; _i++>> <<capture _prisoner>> <<set _prisoner to _femaleBarracksCharacters[_i]>> <div style="text-align: center; margin: 10px; width: 200px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 180px; height: 180px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <<button "Summon">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<set $selectedCharacterSource = "barracks">> <<goto "CharacterInChambers">> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <!-- Living Quarters Characters Section --> <div style="margin-bottom: 30px; border: 1px solid #555; padding: 15px; border-radius: 5px;"> <h2 style="text-align: center; margin-top: 0;">Living Quarters Subjects</h2> <<if !$QuartersOccupance || $QuartersOccupance.length === 0>> <p>There are no characters available in the living quarters.</p> <<else>> <<set _femaleQuartersResidents = $QuartersOccupance.filter(resident => resident.sex === "Female")>> <<if _femaleQuartersResidents.length === 0>> <p>There are no female residents in the living quarters.</p> <<else>> <div style="display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 20px;"> <<for _i to 0; _i < _femaleQuartersResidents.length; _i++>> <<capture _resident>> <<set _resident to _femaleQuartersResidents[_i]>> <div style="text-align: center; margin: 10px; width: 200px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_resident.ImagePath" alt="<<_resident.name>>" style="width: 180px; height: 180px; object-fit: cover;"> <h3><<print _resident.name>></h3> <<button "Summon">> <<set $currentPrisonerId to _resident.prisonerId>> <<set $selectedCharacterSource = "quarters">> <<goto "CharacterInChambers">> <</button>> </div> <</capture>> <</for>> </div> <</if>> <</if>> </div> </div> <div style="text-align: center"> <<button "Return">> <<goto "Chambers">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $ForestFarmVisited isnot true>> <h1>Abandond Farm</h1> <div class="Random-image"> <<set _imagePath to "Images/Forrest/Exploring/Farm/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You come across a large farm which looks to have been abandoned for some time... <<You>>I should speak to Gnarlak about this, prehpase he can make this place useful<</You>> <<button "Return">> <<run $Quests.push("Speak to Gnarlak about the farm")>> <<script>> UI.alert("Speak to Gnarlak about the farm"); <</script>> <<set $ForestFarmVisited to true>> <<goto "ForestExplore">> <</button>> <<elseif $Quests.includes("Speak to Gnarlak about the farm")>> <h1>Abandond Farm</h1> <div class="Random-image"> <<set _imagePath to "Images/Forrest/Exploring/Farm/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You come across a large farm which looks to have been abandoned for some time... <<You>>I should speak to Gnarlak about this, prehpase he can make this place useful<</You>> <<button "Return">> <<goto "ForestExplore">> <</button>> <<else>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "DialogueStorage">> <<startdialogue "_FarmIntro">> <h1>Abandond Farm</h1> <div class="Random-image"> <<set _imagePath to "Images/Forrest/Exploring/Farm/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set $OakshadeFarmUnlocked to true>> <<set $FarmPlandedGrain to 0>> <<set $FarmGrainCapacity to 20>> <<set $FarmGrainGroth to 0>> <<set $FarmingTeam to []>> <<set $FarmingGuards to []>> <<set $FarmBanditEncounterTriggered to false>> <<set $FarmProtectionDaysRemaining to 0>> <<set $FarmHasMill to false>> <<set $FarmHasGuardTower to false>> <<button "Review the farm">> <<goto "Oakshade Farm">> <</button>> </div> <</nobr>>
<<nobr>> <<run $Quests.delete("Speak to Gnarlak about the farm")>> <div class="text-box"> <<if $FramGrainPlanted is false>> <<include "DialogueStorage">> <<startdialogue "_FarmDefence">> <<set $FramGrainPlanted to true>> <<set $FarmingTeamUnlocked to true>> <<set $FarmPayBandits to true>> <<set $LivingQuarters to true>> <<set $QuartersOccupance to []>> <<script>> UI.alert("You can now send fully corrupted people to the quarters in the courtyard for studying in the library<br><br> You can also send them to work the farm, each farmer can plan 40 grain."); <</script>> <</if>> <h1>Grain Stores</h1> <div style="display: flex; align-items: center; justify-content: center; gap: 10px;"> <img src="Images/Icons/Grain.png" style="width: 40px; height: 40px;"> <span style="font-size: 24px;">$Grain</span> </div> <hr> <h2>Planted Grain / Farm Capacity</h2><br> <h2>$FarmPlandedGrain / $FarmGrainCapacity</h2> <<if $FarmPlandedGrain is 0 and $Grain gt 0>> <<if $Time lt 5>> <<button "Plant grain">> <<if $Grain gt $FarmGrainCapacity>> <<set $FarmPlandedGrain to $FarmGrainCapacity>> <<set $Grain to $Grain - $FarmGrainCapacity>> <<else>> <<set $FarmPlandedGrain to $Grain>> <<set $Grain to 0>> <</if>> <<if $FramGrainPlanted isnot true>> <<set $FramGrainPlanted to false>> <</if>> <<set $FarmGrainGroth to 0>> <<goto "Oakshade Farm">> <<set $Time to 10>> <</button>> <<else>> <h2>Its too late to plant crops</h2> <</if>> <</if>> <<if $FarmPlandedGrain gt 0>> <<if $FarmGrainGroth lt 7>> <<set _grothDaysRemaining to 7 - $FarmGrainGroth >> The crop will take _grothDaysRemaining more days <div class="progress-container"> <progress class="energy-bar" @value="$FarmGrainGroth" max="7"></progress> </div> <<else>> <h2>The crops are grown</h2> <<button "Havest">> <<set $FramGrainPlanted to false>> <<set _minYeald to $FarmPlandedGrain>> <<set _maxYeald to $FarmPlandedGrain * 2>> <<set _yeald to random(_minYeald, _maxYeald)>> <<if $FarmHasMill is true>> <<if $Food>> <<set $Food to $Food + _yeald>> <<else>> <<set $Food to _yeald>> <</if>> <<script>> UI.alert("Harvested " + State.temporary.yeald + " Food from the mill!"); <</script>> <<else>> <<if $Grain>> <<set $Grain to $Grain + _yeald>> <<else>> <<set $Grain to _yeald>> <</if>> <<script>> UI.alert("Harvested " + State.temporary.yeald + " Grain!"); <</script>> <</if>> <<set $FarmPlandedGrain to 0>> <<goto "Oakshade Farm">> <</button>> <</if>> <</if>> </div> <<if $FarmingTeamUnlocked is true>> <div class="text-box"> <h2>Farm Staff</h2> You currently have $FarmingTeam.length farmers working (Maximum: 3)<br><br> <<if $FarmingTeam.length > 0>> <<if !$AutoFarmGrain>> <<set $AutoFarmGrain to false>> <</if>> <div style="text-align: center; margin-bottom: 15px;"> <<if $AutoFarmGrain is true>> <p style="color: green;">✓ Auto-Planting Enabled</p> <p>Farmers will automatically replant grain after harvest</p> <<button "Disable Auto-Planting">> <<set $AutoFarmGrain to false>> <<goto "Oakshade Farm">> <</button>> <<else>> <p style="color: gray;">Auto-Planting Disabled</p> <p>Farmers will harvest but not replant automatically</p> <<button "Enable Auto-Planting">> <<set $AutoFarmGrain to true>> <<goto "Oakshade Farm">> <</button>> <</if>> </div> <hr> <</if>> <<if $FarmingTeam.length === 0>> <p>No farmers are currently working at the farm. Send farmers here to grow crops.</p> <<else>> <div id="staff-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $FarmingTeam.length; _i++>> <<capture _farmer>> <<set _farmer to $FarmingTeam[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_farmer.ImagePath" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _farmer.name>></h3> <p>Specialization: <<print _farmer.specialization>></p> <h4>Skill Level:</h4> <progress @value="_farmer.skill" max="100"></progress> <span><<print _farmer.skill>>%</span> <h4>Health:</h4> <progress @value="_farmer.health" max="100"></progress> <span><<print _farmer.health>>%</span> <<button "Recall to Quarters">> <<run $QuartersOccupance.push(_farmer)>> <<run $FarmingTeam.delete(_farmer)>> <<goto "Oakshade Farm">> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <div class="text-box"> <h2>Farm Guards</h2> <<if !$FarmingGuards>> <<set $FarmingGuards to []>> <</if>> You currently have $FarmingGuards.length guards stationed (Maximum: 3)<br><br> <<if $FarmingGuards.length === 0>> <p>No guards are currently stationed at the farm. Send guards here to protect your workers.</p> <<else>> <div id="guards-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $FarmingGuards.length; _i++>> <<capture _guard>> <<set _guard to $FarmingGuards[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_guard.ImagePath" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _guard.name>></h3> <p>Specialization: <<print _guard.specialization>></p> <h4>Skill Level:</h4> <progress @value="_guard.skill" max="100"></progress> <span><<print _guard.skill>>%</span> <h4>Health:</h4> <progress @value="_guard.health" max="100"></progress> <span><<print _guard.health>>%</span> <<button "Recall to Quarters">> <<run $QuartersOccupance.push(_guard)>> <<run $FarmingGuards.delete(_guard)>> <<goto "Oakshade Farm">> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <div class="text-box"> <h2>Farm Upgrades</h2> <div style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <!-- Farm Expansion --> <div style="text-align: center; margin: 10px; width: 300px; border: 1px solid #ccc; padding: 15px; border-radius: 5px;"> <img src="Images/Icons/Farm.png" style="width: 80px; height: 80px; margin-bottom: 10px;"> <h3>Expand Farmland</h3> <p>Current Capacity: $FarmGrainCapacity</p> <<if $FarmGrainCapacity < 60>> <p>Increase farming capacity by 10</p> <p>Cost: 200 Gold</p> <<if $Gold >= 200>> <<button "Expand Farm (200 Gold)">> <<set $Gold -= 200>> <<set $FarmGrainCapacity += 10>> <<goto "Oakshade Farm">> <</button>> <<else>> <p style="color: red;">Not enough gold</p> <</if>> <<else>> <p style="color: green;">Maximum capacity reached!</p> <</if>> </div> <!-- Mill --> <div style="text-align: center; margin: 10px; width: 300px; border: 1px solid #ccc; padding: 15px; border-radius: 5px;"> <img src="Images/Raids/Maps/Buildings/Mill/2.png" style="width: 80px; height: 80px; margin-bottom: 10px;"> <h3>Build Mill</h3> <<if $FarmHasMill is true>> <p style="color: green;">✓ Mill Constructed</p> <p>Harvests produce <img src="Images/Icons/Bread.png" style="width: 20px; height: 20px; vertical-align: middle;"> Food instead of <img src="Images/Icons/Grain.png" style="width: 20px; height: 20px; vertical-align: middle;"> Grain</p> <<else>> <p>Process grain into food at harvest</p> <p>Cost: 200 Stone</p> <<if $Stone >= 200>> <<button "Build Mill (200 Stone)">> <<set $Stone -= 200>> <<set $FarmHasMill to true>> <<goto "Oakshade Farm">> <</button>> <<else>> <p style="color: red;">Not enough stone</p> <</if>> <</if>> </div> <!-- Guard Tower --> <div style="text-align: center; margin: 10px; width: 300px; border: 1px solid #ccc; padding: 15px; border-radius: 5px;"> <img src="Images/Raids/Maps/Buildings/GuardTower/2.png" style="width: 80px; height: 80px; margin-bottom: 10px;"> <h3>Build Guard Tower</h3> <<if $FarmHasGuardTower is true>> <p style="color: green;">✓ Guard Tower Constructed</p> <p>Provides defensive bonuses against attacks</p> <<else>> <p>Fortify the farm against bandits</p> <p>Cost: 200 Wood</p> <<if $Wood >= 200>> <<button "Build Guard Tower (200 Wood)">> <<set $Wood -= 200>> <<set $FarmHasGuardTower to true>> <<goto "Oakshade Farm">> <</button>> <<else>> <p style="color: red;">Not enough wood</p> <</if>> <</if>> </div> </div> </div> <</if>> <div style="text-align: center"> <<button "Return to the forest">> <<set $ForestLocation to "Images/Forrest/Maps/BanditCamp.jpg">> <<if $FarmBanditEncounterTriggered is not true>> <<set $FarmBanditEncounterTriggered to true>> <<goto "FarmBanditEncounter">> <<else>> <<goto "ForestExplore">> <</if>> <</button>> <<button "Return to the castle">> <<if $FarmBanditEncounterTriggered is not true>> <<set $FarmBanditEncounterTriggered to true>> <<goto "FarmBanditEncounter">> <<else>> <<goto "Base Intro">> <</if>> <</button>><br> <<button "Visit the Bandits Camp">> <<goto "FarmBanditCamp">> <</button>><br> <<if $OakshadeTear isnot true>> <<if ($PlayerSpells.includes("Tear")) and ($PortalVisited is true)>> <<button "Create tear">> <<run setup.addPortalDestination('Oakshade', 'Oakshade Farm', 'Oakshade.png')>> <<set $OakshadeTear to true>> <<run Engine.show()>> <</button>><br><br> <</if>> <</if>> </div> <<if $OakShadeFarmTip isnot false>> <div class="text-box"> <h2>Tip:<br></h2> <i>Havesting crops yourself with give you 1-2x yeald. Farmers yeald can be greater, but it depends on their still level. Their skill will grow over time</i><br> <<link "Do not show this again">> <<set $OakShadeFarmTip to false>> <<goto "ForestExplore">> <</link>> </div> <</if>> <</nobr>>
<<nobr>> <<for _prisoner range $QuartersOccupance>> <<run setup.migratePrisonerData(_prisoner)>> <</for>> <div class="text-box"> <h1>Quarters</h1> You enter the living quarters for your servants <<if $QuartersOccupance.length === 0>> <p>You have no one in your barracks</p> <<else>> <<for _room to 0; _room < Math.ceil($QuartersOccupance.length / 3); _room++>> <h3>Room <<print _room + 1>></h3> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to _room * 3; _i < Math.min((_room + 1) * 3, $QuartersOccupance.length); _i++>> <<capture _prisoner>> <<set _prisoner to $QuartersOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <p style="margin: 2px 0;">Specialization: <<if _prisoner.specialization>><<print _prisoner.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value=" _prisoner.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value=" _prisoner.skill" max="100" style="width: 100%;"></progress> </div> </div> <<button "Manage">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<goto "Servant">> <</button>> </div> <</capture>> <</for>> </div> <<if _room < Math.ceil($QuartersOccupance.length / 3) - 1>> <hr> <</if>> <</for>> <</if>> </div> <div style="text-align: center"> <<button "Leave">> <<run Engine.play('Base Intro')>> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _prisoner to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <!-- Initialize corruption if not set (add this section) --> <<silently>> <<if typeof _prisoner.corruption === 'undefined'>> <<set _prisoner.corruption = random(0, 60)>> <!-- Update the prisoner in the QuartersOccupance array --> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === $currentPrisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = _prisoner.corruption>> <</if>> <</if>> <</silently>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_prisoner.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _prisoner.name>></h2> <div style="margin: 20px 0;"> <h3>Skill</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_prisoner.skill" max="100"></progress> <span><<print _prisoner.skill>>%</span> </div> <h3>Corruption</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_prisoner.corruption" max="100"></progress> <span><<print _prisoner.corruption>>%</span> </div> </div> <div style="margin: 20px 0;"> <h3>Specialization</h3> <<if !_prisoner.specialization>> <p style="color: orange;">Select a skill for this person:</p> <div class="specialization-buttons"> <<button "Farmer">> <<set _prisoner.specialization = "Farmer">> <<set _prisoner.skill = 1>> <<goto "Servant">> <</button>> <<button "Tavern Keep">> <<set _prisoner.specialization = "Tavern Keep">> <<set _prisoner.skill = 1>> <<goto "Servant">> <</button>> <<button "Brewer">> <<set _prisoner.specialization = "Brewer">> <<set _prisoner.skill = 1>> <<goto "Servant">> <</button>> <<button "Blacksmith">> <<set _prisoner.specialization = "Blacksmith">> <<set _prisoner.skill = 1>> <<goto "Servant">> <</button>> </div> <<else>> <p>Specialization: <<print _prisoner.specialization>></p> <<button "Remove Specialization">> <<set _prisoner.specialization = null>> <<set _prisoner.skill = 0>> <<goto "Servant">> <</button>> <</if>> </div> </div> </div> </div> <div class="text-box flex-buttons"> <<if $LibraryUnlocked is true and $LibraryOccupance.length < $LibrarysMax>> <<button "Send to the Library">> <<set $CurrentCaptive = _prisoner>> <<if !$CurrentCaptive.prisonerId>> <<set $CurrentCaptive.prisonerId = $prisonerIdCounter++>> <</if>> <<if !Array.isArray($LibraryOccupance)>> <<set $LibraryOccupance = []>> <</if>> <<run $LibraryOccupance.push($CurrentCaptive)>> <<run $QuartersOccupance = $QuartersOccupance.filter(p => (p.NPCID && p.NPCID !== _prisoner.NPCID) or (p.prisonerId && p.prisonerId !== _prisoner.prisonerId) )>> <<goto "Quarters">> <<script>> UI.alert("You sent the servant to the Library."); <</script>> <</button>> <</if>> <<if ($FarmingTeam) and (_prisoner.specialization is "Farmer")>> <<if $FarmingTeam.length lt 3>> <<button "Send to work at the farm">> <<set $FarmerDetails = { prisonerId: _prisoner.prisonerId, name: _prisoner.name, daysremaining: 3, hairColor: _prisoner.hairColor, ImagePath: _prisoner.ImagePath, sex: _prisoner.sex, specialization: _prisoner.specialization, skill: _prisoner.skill, health: _prisoner.health }>> <<run State.variables.FarmingTeam.push($FarmerDetails)>> <<run $QuartersOccupance.delete(_prisoner)>> <<script>> UI.alert("You your subject to grown and harvest grain at your farm"); <</script>> <<goto "Quarters">> <</button>><br><br> <</if>> <</if>> <<button "Send to Settlement">> <<set $villagerForTransfer to _prisoner>> <<run $QuartersOccupance.delete(_prisoner)>> <<goto "SelectSettlementTransfer2">> <</button>><br> <<button "Release from duty (Delete character)">> <<run $QuartersOccupance.delete(_prisoner)>> <<goto "Quarters">> <</button>> </div> <div style="text-align: center"> <<button "Leave">> <<goto "Quarters">> <</button>> </div> <</nobr>>
<<nobr>> <<for _prisoner range $BarraksOccupance>> <<if !_prisoner.hasOwnProperty("rangedWeapon")>><<set _prisoner.rangedWeapon to "None">><</if>> <<run setup.migratePrisonerData(_prisoner)>> <</for>> <<set _lucyIndex = $BarraksOccupance.findIndex(unit => unit.name === "Lucy")>> <<if _lucyIndex !== -1>> <<run $BarraksOccupance.splice(_lucyIndex, 1)>> <</if>> <<set _aliceIndex = $BarraksOccupance.findIndex(unit => unit.name === "Alice")>> <<if _aliceIndex !== -1>> <<run $BarraksOccupance.splice(_aliceIndex, 1)>> <</if>> <div class="text-box"> <<if $FirstBarracksVisit isnot true>> <<Gnarlak>>Ah, my lord, great work on the barracks. We can grow larger with this!<</Gnarlak>><br><br> <<You>>Yes, I will need some men to help control land<</You>><br><br> <<Gnarlak>>And to defend the castle<</Gnarlak>><br><br> <<You>>What do you mean? We have those defences protecting my vault<</You>><br><br> <<Gnarlak>>Yes lord, and they do a good job protecting your riches from would be theieves sneaking into the castle... But we're drawing a good deal of attention now. If we contiune to grow and fear of us increases, then the local villagers may send mercenarys to break down our gate and kill you. They won't be coming for your vault lord, they will be coming for your head<</Gnarlak>><br><br> <<You>>I see<</You>><br><br> <<Gnarlak>>We need devoted men and women to take new land, but also help hold it, I advise first corrupting some of our prisoners so they are devoted to you, we can then put them to work<</Gnarlak>><br><br> <</if>> <h1>Barracks</h1> You enter the barracks You have space for $BarracksMax militia<br> You currently have $BarraksOccupance.length militia<br><br> <<include "BarracksSceens">> <<if $BarraksOccupance.length === 0>> <p>You have no one in your barracks</p> <<else>> <<for _room to 0; _room < Math.ceil($BarraksOccupance.length / 3); _room++>> <h3>Room <<print _room + 1>></h3> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to _room * 3; _i < Math.min((_room + 1) * 3, $BarraksOccupance.length); _i++>> <<capture _prisoner>> <<set _prisoner to $BarraksOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <p style="margin: 2px 0;">Armor: <<if _prisoner.armor is "None">> <img src="Images/Items/Armour/leather.png" alt="No Armor" style="width: 24px; height: 24px; vertical-align: middle;"> <<elseif _prisoner.armor is "Armored">> <img src="Images/Items/Armour/breastplate.png" alt="Armored" style="width: 24px; height: 24px; vertical-align: middle;"> <<else>> <<print _prisoner.armor>> <</if>> </p> <p style="margin: 2px 0;">Weapon: <<if _prisoner.weapon is "Dagger">> <img src="Images/Items/Melee Weapons/plain_dagger.png" alt="Dagger" style="width: 24px; height: 24px; vertical-align: middle;"> <<elseif _prisoner.weapon is "Sword">> <img src="Images/Items/Melee Weapons/shortsword.png" alt="Sword" style="width: 24px; height: 24px; vertical-align: middle;"> <<else>> <<print _prisoner.weapon>> <</if>> </p> <p style="margin: 2px 0;">Ranged: <<if !_prisoner.hasOwnProperty("rangedWeapon") or _prisoner.rangedWeapon is "None">> None <<elseif _prisoner.rangedWeapon is "Longbow">> <img src="Images/Items/Melee Weapons/longbow.png" alt="Longbow" style="width: 24px; height: 24px; vertical-align: middle;"> <<else>> <<print _prisoner.rangedWeapon>> <</if>> </p> <p style="margin: 2px 0;">Specialization: <<if _prisoner.specialization>><<print _prisoner.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value=" _prisoner.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value=" _prisoner.skill" max="100" style="width: 100%;"></progress> </div> </div> <<button "Manage Unit">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<goto "Mercenary">> <</button>> </div> <</capture>> <</for>> </div> <<if _room < Math.ceil($BarraksOccupance.length / 3) - 1>> <hr> <</if>> <</for>> <</if>> </div> <div style="text-align: center"> <<button "Check list of Explorers">> <<goto "DisplayExploreTeam">> <</button>> <br><br> <<if $FirstBarracksVisit isnot true>> <<button "Leave">> <<script>> UI.alert("New Quest! <br>Possess a prisoner and add them to your militia"); <</script>> <<run $Quests.push("Possess a prisoner and add them to your militia")>> <<set $FirstBarracksVisit to true>> <<run Engine.play('Base Intro')>> <</button>> <<else>> <<button "Leave">> <<run Engine.play('Base Intro')>> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <style> .building-management { margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px; } .staff-card { width: 200px; margin: 10px; padding: 10px; border: 1px solid #444; border-radius: 5px; background: rgba(50, 50, 50, 0.8); display: inline-block; text-align: center; } .staff-card img { width: 150px; height: 150px; object-fit: cover; border-radius: 5px; } .staff-card p { margin: 5px 0; } .staff-section { margin-top: 20px; border-top: 1px solid #444; padding-top: 10px; display: flex; flex-wrap: wrap; } .building-info { margin-bottom: 20px; padding: 10px; background: rgba(50, 50, 50, 0.5); border-radius: 5px; } </style> <!-- Initialize variables --> <<set _settlement = null>> <<if $CapturedLocations && $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set _settlement = $CapturedLocations[$currentSettlementId]>> <</if>> <<set _buildingType = $currentBuilding || "">> <<set _building = null>> <<set _maxStaff = 3>> <!-- Initialize building and staff arrays properly --> <<if _settlement && _settlement.buildings && _buildingType>> <<set _building = _settlement.buildings[_buildingType]>> <<if _building>> <<set _maxStaff = _building.maxStaff || 3>> <!-- Ensure staff array exists --> <<if !_building.staff || !Array.isArray(_building.staff)>> <<set _building.staff = []>> <</if>> <</if>> <</if>> <!-- Ensure settlement arrays exist --> <<if _settlement>> <<if !_settlement.garrison || !Array.isArray(_settlement.garrison)>> <<set _settlement.garrison = []>> <</if>> <<if !_settlement.capturedVillagers || !Array.isArray(_settlement.capturedVillagers)>> <<set _settlement.capturedVillagers = []>> <</if>> <</if>> <!-- Helper functions --> <<set _assignToBuilding = function(npcId, sourceArray) { if (!npcId || !sourceArray || !_building) return false; for (let i = 0; i < sourceArray.length; i++) { if (sourceArray[i] && sourceArray[i].NPCID == npcId) { if (!_building.staff) _building.staff = []; let npcCopy = Object.assign({}, sourceArray[i]); npcCopy.assignedBuilding = _buildingType; _building.staff.push(npcCopy); sourceArray.splice(i, 1); return true; } } return false; }>> <<set _removeFromBuilding = function(npcId) { if (!npcId || !_building || !_building.staff) return false; for (var i = 0; i < _building.staff.length; i++) { if (_building.staff[i] && _building.staff[i].NPCID == npcId) { var removedNPC = _building.staff[i]; _building.staff.splice(i, 1); if (removedNPC.type === "Succubus" || removedNPC.specialization === "Magic" || _buildingType === "guardTower") { if (!_settlement.garrison) _settlement.garrison = []; delete removedNPC.assignedBuilding; _settlement.garrison.push(removedNPC); } else { delete removedNPC.assignedBuilding; var houseName = removedNPC.building || "House 1"; if (!_settlement.populatedBuildings || !_settlement.populatedBuildings[houseName]) { if (!_settlement.populatedBuildings) { _settlement.populatedBuildings = {}; } var foundHouse = false; for (var key in _settlement.populatedBuildings) { if (Array.isArray(_settlement.populatedBuildings[key])) { houseName = key; foundHouse = true; break; } } if (!foundHouse) { houseName = "House 1"; _settlement.populatedBuildings[houseName] = []; } } if (!Array.isArray(_settlement.populatedBuildings[houseName])) { _settlement.populatedBuildings[houseName] = []; } _settlement.populatedBuildings[houseName].push(removedNPC); } return true; } } return false; }>> <<set _isAlreadyAssignedAnywhere = function(npcId) { if (!_settlement || !_settlement.buildings) return false; for (let buildingType in _settlement.buildings) { let building = _settlement.buildings[buildingType]; if (building && building.staff && Array.isArray(building.staff)) { for (let i = 0; i < building.staff.length; i++) { if (building.staff[i] && building.staff[i].NPCID == npcId) { return true; } } } } return false; }>> <div class="building-management"> <h1>Manage <<print _buildingType.charAt(0).toUpperCase() + _buildingType.slice(1)>> Staff</h1> <<if !_settlement || !_building>> <div style="background: #ff0000; color: white; padding: 10px; margin: 10px 0; text-align: center;"> <p><strong>Error:</strong> Invalid settlement or building data</p> </div> <<button "Return to Settlement Overview">> <<goto "SettlementOverview">> <</button>> <<else>> <div class="building-info"> <p>Current Staff: <<print _building.staff.length>>/<<print _maxStaff>></p> <<if _buildingType === "lumberMill">> <p>Effect: Generates wood resources over time.</p> <<elseif _buildingType === "tavern">> <p>Effect: Generates gold and improves happiness.</p> <<elseif _buildingType === "cult">> <p>Effect: Increases corruption in the settlement.</p> <p><em>Requires a Succubus or specialized character to operate.</em></p> <<elseif _buildingType === "guardTower">> <p>Effect: Improves defense against raids and attacks.</p> <<elseif _buildingType === "farm">> <p>Effect: Produces grain over time.</p> <<elseif _buildingType === "forge">> <p>Effect: Produces equipment and weapons.</p> <</if>> </div> <!-- Current Staff --> <h2>Current Staff</h2> <<if !_building.staff || _building.staff.length === 0>> <p>No staff assigned to this building.</p> <<else>> <div class="staff-section"> <<for _i to 0; _i < _building.staff.length; _i++>> <<set _staff = _building.staff[_i]>> <div class="staff-card"> <img @src="_staff.ImagePath" alt="Staff Member"> <p><<print _staff.job || _staff.name || "Worker">></p> <<capture _staff>> <<button "Remove">> <<run _removeFromBuilding(_staff.NPCID)>> <<goto "ManageBuildingStaff">> <</button>> <</capture>> </div> <</for>> </div> <</if>> <!-- Available Units for Guard Tower and Cult --> <<if _buildingType === "guardTower" || _buildingType === "cult">> <h2>Available <<if _buildingType === "cult">>Cultists<<else>>Guards<</if>></h2> <<if _building.staff.length >= _maxStaff>> <p>Maximum staff reached for this building.</p> <<elseif _settlement.garrison.length === 0>> <p>No available units in garrison.</p> <<else>> <div class="staff-section"> <<for _i to 0; _i < _settlement.garrison.length; _i++>> <<set _unit = _settlement.garrison[_i]>> <<set _showUnit = true>> <<if _buildingType === "cult">> <<set _spec = (_unit.specialization || "").toLowerCase()>> <<if _spec !== "succubus">> <<set _showUnit = false>> <</if>> <</if>> <<if _showUnit && !_isAlreadyAssignedAnywhere(_unit.NPCID)>> <div class="staff-card"> <img @src="_unit.ImagePath" alt="Unit"> <p><<print _unit.job || _unit.name || _unit.type || "Guard">></p> <<capture _unit>> <<button "Assign">> <<run _assignToBuilding(_unit.NPCID, _settlement.garrison)>> <<goto "ManageBuildingStaff">> <</button>> <</capture>> </div> <</if>> <</for>> </div> <</if>> <<else>> <!-- Available Villagers for other buildings --> <h2>Available Villagers</h2> <<if _building.staff.length >= _maxStaff>> <p>Maximum staff reached for this building.</p> <<else>> <<silently>> <!-- Collect all NPCs from populatedBuildings --> <<set _availableVillagers to []>> <<if _settlement.populatedBuildings>> <<for _houseName, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<for _resident range _residents>> <<if !_isAlreadyAssignedAnywhere(_resident.NPCID)>> <<run _availableVillagers.push(_resident)>> <</if>> <</for>> <</if>> <</for>> <</if>> <!-- Also add from capturedVillagers if any exist --> <<if _settlement.capturedVillagers && _settlement.capturedVillagers.length > 0>> <<for _villager range _settlement.capturedVillagers>> <<if !_isAlreadyAssignedAnywhere(_villager.NPCID)>> <<run _availableVillagers.push(_villager)>> <</if>> <</for>> <</if>> <</silently>> <<if _availableVillagers.length === 0>> <p>No available villagers in this settlement.</p> <<else>> <div class="staff-section"> <<for _villager range _availableVillagers>> <div class="staff-card"> <img @src="_villager.ImagePath" alt="Villager"> <p><<print _villager.job || _villager.name || "Worker">></p> <p style="font-size: 0.8em; color: #888;">From: <<print _villager.building || "Settlement">></p> <<capture _villager>> <<button "Assign">> <<set _npcId to _villager.NPCID>> <<set _assigned to false>> <!-- Try to remove from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _houseName, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<for _i = 0; _i < _residents.length; _i++>> <<if _residents[_i] && _residents[_i].NPCID === _npcId>> <<set _npcCopy to Object.assign({}, _residents[_i])>> <<set _npcCopy.assignedBuilding to _buildingType>> <<run _building.staff.push(_npcCopy)>> <<run _residents.splice(_i, 1)>> <<set _assigned to true>> <<break>> <</if>> <</for>> <<if _assigned>><<break>><</if>> <</if>> <</for>> <</if>> <!-- If not found in houses, try capturedVillagers --> <<if !_assigned>> <<run _assignToBuilding(_npcId, _settlement.capturedVillagers)>> <</if>> <<goto "ManageBuildingStaff">> <</button>> <</capture>> </div> <</for>> </div> <</if>> <</if>> <</if>> <div style="margin-top: 20px; text-align: center;"> <<button "Return to Settlement Overview">> <<goto "SettlementOverview">> <</button>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<for _guard range _settlement.garrison>> <<if !_guard.hasOwnProperty("rangedWeapon")>><<set _guard.rangedWeapon to "None">><</if>> <<run setup.migratePrisonerData(_guard)>> <</for>> <div class="text-box"> <h1>Garrison</h1> You enter the garrison house<br> You currently have <<print _settlement.garrison.length>> garrison members<br><br> <<if _settlement.garrison.length === 0>> <p>You have no one in your garrison</p> <<else>> <<for _room to 0; _room < Math.ceil(_settlement.garrison.length / 3); _room++>> <h3>Room <<print _room + 1>></h3> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to _room * 3; _i < Math.min((_room + 1) * 3, _settlement.garrison.length); _i++>> <<capture _guard>> <<set _guard to _settlement.garrison[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_guard.ImagePath" alt="<<_guard.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _guard.name>></h3> <p style="margin: 2px 0;">Armor: <<print _guard.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _guard.weapon>></p> <p style="margin: 2px 0;">Specialization: <<if _guard.specialization>><<print _guard.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_guard.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_guard.skill" max="100" style="width: 100%;"></progress> </div> </div> <<button "Manage Unit">> <<set $currentGarrisonId to _guard.NPCID>> <<goto "Settlement_Garrison_Member">> <</button>> </div> <</capture>> <</for>> </div> <<if _room < Math.ceil(_settlement.garrison.length / 3) - 1>> <hr> <</if>> <</for>> <</if>> </div> <div style="text-align: center"> <<button "Leave">> <<goto "SettlementVisit">> <</button>> </div> <</nobr>>
<<nobr>> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set _watchtowerGuards to []>> <!-- Determine who is assigned to the watchtower --> <<if _settlement.buildings && _settlement.buildings.guardTower && _settlement.buildings.guardTower.staff>> <<set _watchtowerGuards to _settlement.buildings.guardTower.staff>> <</if>> <!-- Set current location for event handling --> <<set $SettlementLocation to "WatchTower">> <div class="text-box"> <h1>Settlement Watch Tower</h1> <hr> <<if _watchtowerGuards.length === 0>> <p>The watchtower stands unmanned, offering a commanding view of the surrounding area. Without guards assigned here, this part of the settlement remains vulnerable.</p> <div class="empty-watchtower-image"> <img src="Images/Buildings/WatchTower_Empty.png" alt="Empty Watchtower"> </div> <p>You climb the ladder to the lookout platform and survey the surroundings. From here, you can see for miles in every direction. The strategic importance of keeping this tower staffed is obvious.</p> <<else>> <<set _randomEvent to random(1, 5)>> <<set _guard to _watchtowerGuards[0]>> <<if _randomEvent === 1>> <!-- Guard vigilantly watching --> <p>As you approach the watchtower, you can see <<print _guard.name>> standing at attention, scanning the horizon with a keen eye.</p> <<say '_guard.name' _guard.ImagePath>> My lord! All is quiet today. I've been keeping a close eye on the approaches to the settlement. <</say>> <<elseif _randomEvent === 2>> <!-- Guard sleeping on duty --> <p>You climb the ladder to the watchtower platform to find <<print _guard.name>> entertaining herself... <div class="watchtower-image"> <<if _guard.sex === "Female">> <<if _guard.hairColor is "Red">> <<set _rand to random(7, 9)>> <<set _img2 to 12>> <<elseif _guard.hairColor is "Blonde">> <<set _rand to random(1, 3)>> <<set _img2 to 10>> <<else>> <<set _rand to random(4, 6)>> <<set _img2 to 11>> <</if>> <<set _imagePath to "Images/Raids/Building/WatchTower/F/" + _rand + ".png">> <<else>> <<set _imagePath to "Images/Raids/Building/WatchTower/M/1.png">> <</if>> </div> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <div class="choice-buttons"> <<button "Disapine her">> <<replace "#guard-response">> <p>You clear your throat loudly. <<print _guard.name>> gasps and almost falls out of her chair</p> <<say '_guard.name' _guard.ImagePath>> My lord! I... Was just... There's been no activity, I swear it! <</say>> <p><<print _guard.name>> scrambles to stand at attention, face flushed with embarrassment at being caught off guard</p> <<You>>I could have been a raider... What do you think they would have done, catching you like this?<</You>> She swallows hard <<say '_guard.name' _guard.ImagePath>>I-I'm not sure...<</say>> <<You>>Bend over that table and I'll show you<</You>> You see her fight back a grin as she complys, bending over the table and showing her ass <<set _imagePath to "Images/Raids/Building/WatchTower/F/" + _img2 + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Spank her ass">> <<goto "Settlement_WatchTower_Punishment">> <</button>> <</replace>> <</button>> <<button "Leave her be">> <<replace "#guard-response">> <p>You decide not to disturb <<print _guard.name>> and walk back down the stairs quietly as she moans</p> <</replace>> <</button>> </div> <div id="guard-response"></div> <<elseif _randomEvent === 3 && _settlement.capturedVillagers && _settlement.capturedVillagers.length>> <!-- Guard with villager visitor --> <<set _villagerIndex to random(0, _settlement.capturedVillagers.length - 1)>> <<set _villager to _settlement.capturedVillagers[_villagerIndex]>> <p>As you approach the watchtower, you hear voices. Climbing the ladder, you find <<print _guard.name>> in conversation with one of the villagers.</p> <div class="watchtower-image"> <!-- Determine image based on gender combinations --> <<if _guard.sex === "Female" && _villager.sex === "Female">> <img src="Images/Buildings/WatchTower_Conversation_FF.png" alt="Female guard with female villager"> <<elseif _guard.sex === "Male" && _villager.sex === "Male">> <img src="Images/Buildings/WatchTower_Conversation_MM.png" alt="Male guard with male villager"> <<elseif _guard.sex === "Female" && _villager.sex === "Male">> <img src="Images/Buildings/WatchTower_Conversation_FM.png" alt="Female guard with male villager"> <<else>> <img src="Images/Buildings/WatchTower_Conversation_MF.png" alt="Male guard with female villager"> <</if>> </div> <<say '_guard.name' _guard.ImagePath>> My lord! This villager was just telling me about the local landscape. They've been pointing out landmarks to help me better understand what I'm seeing from up here. <</say>> <p>The villager nods respectfully to you and begins to descend the ladder, leaving you alone with the guard.</p> <<elseif _randomEvent === 4>> <!-- Guard using spyglass --> <p>You find <<print _guard.name>> intently focused on something in the distance, using a spyglass to get a better view.</p> <div class="watchtower-image"> <<if _guard.sex === "Female">> <img src="Images/Buildings/WatchTower_Female_Spyglass.png" alt="Female guard with spyglass"> <<else>> <img src="Images/Buildings/WatchTower_Male_Spyglass.png" alt="Male guard with spyglass"> <</if>> </div> <<say '_guard.name' _guard.ImagePath>> *lowers the spyglass* Ah, <<if $PlayerGender is "Male">>my lord<<else>>my lady<</if>>. I was just tracking the movement of some wildlife in the distance. It's important to distinguish between natural activity and potential threats. <</say>> <<else>> <!-- Guard eating a meal --> <p>You climb up to find <<print _guard.name>> having a small meal while keeping watch over the settlement.</p> <div class="watchtower-image"> <<if _guard.sex === "Female">> <img src="Images/Buildings/WatchTower_Female_Eating.png" alt="Female guard eating"> <<else>> <img src="Images/Buildings/WatchTower_Male_Eating.png" alt="Male guard eating"> <</if>> </div> <<say '_guard.name' _guard.ImagePath>> My lord! Just having a quick bite. The view is particularly clear today, we can see for miles. Would you care to look? <</say>> <</if>> <!-- If multiple guards in watchtower --> <<if _watchtowerGuards.length > 1>> <div class="additional-guards"> <p>Also assigned to the watchtower:</p> <ul> <<for _i to 1; _i < _watchtowerGuards.length; _i++>> <<if _i === 1>> <p>You notice <<print _watchtowerGuards[_i].name>> patrolling the base of the tower.</p> <<else>> <li><<print _watchtowerGuards[_i].name>> - <<print _watchtowerGuards[_i].sex>> guard (currently off-duty)</li> <</if>> <</for>> </ul> </div> <</if>> <</if>> <div class="navigation-options"> <div class="goto-option"> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> </div> </div> <style> .watchtower-image, .empty-watchtower-image { text-align: center; margin: 15px 0; } .watchtower-image img, .empty-watchtower-image img { max-width: 100%; border-radius: 5px; border: 1px solid #555; } .additional-guards { background: rgba(40, 40, 40, 0.7); padding: 10px; border-radius: 5px; margin-top: 15px; } .additional-guards ul { margin: 5px 0; padding-left: 20px; } .view-section { background: rgba(30, 30, 30, 0.8); border-radius: 8px; padding: 15px; margin: 20px 0; } .view-section h2 { color: #d4af37; margin-top: 0; border-bottom: 1px solid #555; padding-bottom: 5px; } .view-details { list-style-type: none; padding-left: 5px; } .view-details li { margin-bottom: 8px; padding-left: 20px; position: relative; } .view-details li:before { content: "→"; position: absolute; left: 0; color: #d4af37; } .navigation-options { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; } .goto-option { display: flex; flex-direction: column; align-items: center; } .hint { font-size: 0.8em; color: #aaa; margin-top: 3px; } .choice-buttons { display: flex; gap: 10px; margin: 15px 0; } </style> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <<run $(document).one(':passagestart', function() { jQuery(document.body).removeAttr('style'); })>> <</nobr>>
<<nobr>> <<set _settlement to $CapturedLocations[$currentLocationid]>> <div class="text-box"> <<set _guard to _settlement.garrison.find(g => g.NPCID === $currentGarrisonId)>> <<if !_guard.hasOwnProperty("rangedWeapon")>><<set _guard.rangedWeapon to "None">><</if>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_guard.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _guard.name>></h2> <div style="margin: 20px 0;"> <p>Sex: <<print _guard.sex>></p> <p>Armor: <<if _guard.armor is "None">> <img src="Images/Items/Armour/leather.png" alt="No Armor" style="width: 32px; height: 32px; vertical-align: middle;"> <<elseif _guard.armor is "Armored">> <img src="Images/Items/Armour/breastplate.png" alt="Armored" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _guard.armor>> <</if>> </p> <p>Melee Weapon: <<if _guard.weapon is "Dagger">> <img src="Images/Items/Melee Weapons/plain_dagger.png" alt="Dagger" style="width: 32px; height: 32px; vertical-align: middle;"> <<elseif _guard.weapon is "Sword">> <img src="Images/Items/Melee Weapons/shortsword.png" alt="Sword" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _guard.weapon>> <</if>> </p> <p>Ranged Weapon: <<if _guard.rangedWeapon is "None">> None <<elseif _guard.rangedWeapon is "Longbow">> <img src="Images/Items/Melee Weapons/longbow.png" alt="Longbow" style="width: 32px; height: 32px; vertical-align: middle;"> <<else>> <<print _guard.rangedWeapon>> <</if>> </p> </div> <div style="margin: 20px 0;"> <h3>Skill</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_guard.skill" max="100"></progress> <span><<print _guard.skill>>%</span> </div> <h3>Health</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_guard.health" max="100"></progress> <span><<print _guard.health>>%</span> </div> </div> <div style="margin: 20px 0;"> <h3>Specialization</h3> <<if !_guard.specialization>> <p style="color: orange;">Select a skill for this person:</p> <div class="specialization-buttons"> <<button "Combat Specialist">> <<set _guard.specialization = "Combat">> <<set _guard.skill = 1>> <<goto "Settlement_Garrison_Member">> <</button>> <<button "Lockpicking Specialist">> <<set _guard.specialization = "Lockpicking">> <<set _guard.skill = 1>> <<goto "Settlement_Garrison_Member">> <</button>> <<button "Defense Specialist">> <<set _guard.specialization = "Defense">> <<set _guard.skill = 1>> <<goto "Settlement_Garrison_Member">> <</button>> <<button "Scouting Specialist">> <<set _guard.specialization = "Scouting">> <<set _guard.skill = 1>> <<goto "Settlement_Garrison_Member">> <</button>> </div> <<else>> <p>Specialization: <<print _guard.specialization>></p> <<button "Remove Specialization">> <<set _guard.specialization = null>> <<set _guard.skill = 0>> <<goto "Settlement_Garrison_Member">> <</button>> <</if>> </div> </div> </div> </div> <div class="text-box flex-buttons"> <<if _guard.specialization isnot "Succubus">> <<if (_guard.weapon is "Dagger") and ($ArmourySwords gt 0) and (_guard.weapon isnot "Corruption")>> <<button "Give Sword">> <<set $ArmourySwords to $ArmourySwords -= 1>> <<set _guard.weapon to "Sword">> <<run Engine.show()>> <</button>><br> <</if>> <<if ($ArmouryLongbows gt 0) and (_guard.weapon isnot "Corruption")>> <<button "Give Longbow">> <<set $ArmouryLongbows to $ArmouryLongbows -= 1>> <<set _guard.rangedWeapon to "Longbow">> <<run Engine.show()>> <</button>><br> <</if>> <<if (_guard.armor is "None") and($ArmouryArmour gt 0) and (_guard.weapon isnot "Corruption")>> <<button "Give Armor">> <<set $ArmouryArmour to $ArmouryArmour -= 1>> <<set _int to random(1, 12)>> <<set _guard.armor to "Armored">> <<set _guard.ImagePath to "Images/Castle/Barracks/Mercenaries/" + _guard.sex + "/Armored/" + _guard.hairColor + "/" + _int + ".png">> <<run Engine.show()>> <</button>><br> <</if>> <<if _guard.health lt 100>> <<if $Infirmary is true>> <<if $MaraWorkInfirmary is true>> <<button "Send to Infirmary">> <<if !$InfrimaryOccupance>><<set $InfrimaryOccupance = []>><</if>> <<run $InfrimaryOccupance.push(_guard)>> <<run _settlement.garrison.delete(_guard)>> <<goto "Settlement_Garrison">> <</button>><br> <<else>> <i>You need someone to work in the infirmary before you can send people to it</i><br><br> <</if>> <<else>> <i>Build an infirmary to heal people</i><br><br> <</if>> <</if>> <</if>> <<button "Transfer to Castle Barracks">> <<if $BarraksOccupance.length < $BarracksMax>> <<run $BarraksOccupance.push(_guard)>> <<run _settlement.garrison.delete(_guard)>> <<script>> UI.alert("Garrison member transferred to castle barracks"); <</script>> <<goto "Settlement_Garrison">> <<else>> <<script>> UI.alert("Castle barracks is full!"); <</script>> <</if>> <</button>><br> <<if $CapturedSuccubiSouls gt 0 and _guard.sex is "Female">> <<button "Transform to Succubus">> <<goto "CreateSuccubus">> <</button>> <</if>> <<button "Release from duty (Delete character)">> <<run _settlement.garrison.delete(_guard)>> <<goto "Settlement_Garrison">> <</button>> </div> <div style="text-align: center"> <<button "Leave">> <<goto "Settlement_Garrison">> <</button>> </div> <</nobr>>
<<nobr>> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set _cultStaff to []>> <!-- Check if there's a demon assigned to the cult --> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff>> <<set _cultStaff to _settlement.buildings.cult.staff>> <</if>> <!-- Set current location for event handling --> <<set $SettlementLocation to "Cult">> <div class="text-box"> <h1>The Cult Shrine</h1> <hr> <<if _cultStaff.length === 0>> <!-- No demon assigned to the cult --> <p>The cult shrine stands empty and silent. Candles flicker weakly on the altar, casting eerie shadows across the dark interior. Without someone to lead the rituals, the cult's influence has waned in the settlement.</p> <div class="empty-cult-image"> <img src="Images/Buildings/Cult_Empty.png" alt="Empty Cult Shrine"> </div> <p>A few offerings lie scattered on the altar - small trinkets, withered flowers, and a few coins. The villagers still remember the old ways, even without a proper guide.</p> <p>Perhaps assigning a succubus to this shrine would breathe new life into this place...</p> <<else>> <!-- Demon is present --> <<set _demon to _cultStaff[0]>> <!-- Ensure hunger property (out of 7) --> <<if typeof _demon.hunger === 'undefined'>> <<set _demon.hunger = 7>> <<set $CapturedLocations[$currentLocationid].buildings.cult.staff[0].hunger = 7>> <</if>> <!-- Build list of all villagers in this settlement --> <<set _allVillagers to []>> <<if _settlement.populatedBuildings>> <<for _houseId, _houseData range _settlement.populatedBuildings>> <<if Array.isArray(_houseData) && _houseData.length > 0>> <!-- Direct array format --> <<for _resident range _houseData>> <<set _allVillagers.push(_resident)>> <</for>> <<elseif _houseData.residents && _houseData.residents.length > 0>> <!-- Nested residents format --> <<for _resident range _houseData.residents>> <<set _allVillagers.push(_resident)>> <</for>> <</if>> <</for>> <</if>> <!-- Get the visitor that was assigned in SettlementVisit --> <<set _visitor to null>> <<if _settlement.buildings.cult.currentVisitor>> <<set _visitor to _settlement.buildings.cult.currentVisitor>> <</if>> <!-- Display scene based on visitor gender or demon alone --> <<if _visitor && _visitor.sex === "Male">> <!-- ========== MALE NPC PRESENT ========== --> <<set _mRand to random(1, 3)>> <<set _imgPath to "Images/Raids/Building/Cult/" + _mRand + ".png">> <div class="Random-image"> <img @src="_imgPath" alt="Guest Image"> </div> <p><<print _visitor.name || _visitor.job || "A male villager">> is here with <<print _demon.name>>.</p> <<say '_demon.name' _demon.ImagePath>> Oh... My Lord, _visitor.name and I were just getting to know eachother... I will be free later <</say>> <<elseif _visitor && _visitor.sex === "Female">> <!-- ========== FEMALE NPC PRESENT ========== --> <<say '_demon.name' _demon.ImagePath>> Ahhh, welcome Lord... I was just getting to know one of the lovely villagers. Shes very... Eager. Prehapse you want to help? <</say>> <<button "Corrupt _visitor.name">> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set $CharImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/" + _rand + ".png">> <<set $Position to "Start">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<else>> <!-- ========== DEMON ALONE ========== --> <p><<print _demon.name>> is alone in the shrine.</p> <<say '_demon.name' _demon.ImagePath>>My Lord, how my I serve?<</say>> <</if>> <!-- Controls: command demon and feed --> <div class="cult-controls" style="margin-top: 15px;"> <h2>Command the Succubus</h2> <p>Hunger: <<print _demon.hunger>> / 7</p> <!-- show current order if set --> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentOrder>> <<set _currentOrder = _settlement.buildings.cult.currentOrder>> <div style="margin:6px 0; padding:8px; border-radius:6px; background:#271227; color:#ffdcdc;"> <strong>Current order:</strong> <<if _currentOrder === "corruption">>Increase Corruption<</if>> <<if _currentOrder === "devotion">>Increase Devotion<</if>> </div> <<else>> <div style="margin:6px 0; padding:8px; border-radius:6px; background:#171717; color:#ddd;"> <em>No active order.</em> </div> <</if>> <!-- Hunger progress bar (uses your global progress styles) --> <div class="progress-bar hunger-bar" aria-hidden="true" style="margin:6px 0;"> <div class="progress-fill" style="width: <<print Math.round((_demon.hunger / 7) * 100)>>%;"></div> </div> <!-- Set persistent Cult Orders (applied during daily processing) --> <<button "Order: Increase Corruption">> <<if !_settlement.buildings>> <<set _settlement.buildings = {}>><</if>> <<if !_settlement.buildings.cult>> <<set _settlement.buildings.cult = {}>><</if>> <<set _settlement.buildings.cult.currentOrder = "corruption">> <<set $CapturedLocations[$currentLocationid] = _settlement>> <!-- persist choice --> <<run State.active.playlist = State.active.playlist>> <<goto "Settlement_Cult">> <</button>> <<button "Order: Increase Devotion">> <<if !_settlement.buildings>> <<set _settlement.buildings = {}>><</if>> <<if !_settlement.buildings.cult>> <<set _settlement.buildings.cult = {}>><</if>> <<set _settlement.buildings.cult.currentOrder = "devotion">> <<set $CapturedLocations[$currentLocationid] = _settlement>> <!-- persist choice --> <<run State.active.playlist = State.active.playlist>> <<goto "Settlement_Cult">> <</button>> <<button "Cancel Order">> <<if !_settlement.buildings>> <<set _settlement.buildings = {}>><</if>> <<if !_settlement.buildings.cult>> <<set _settlement.buildings.cult = {}>><</if>> <<set _settlement.buildings.cult.currentOrder = null>> <<set $CapturedLocations[$currentLocationid] = _settlement>> <<run State.active.playlist = State.active.playlist>> <<goto "Settlement_Cult">> <</button>> <hr> <!-- Offer-list toggle button (shows the villager list only when clicked) --> <<button "Offer a villager's soul">> <<set $CultShowOfferList = true>> <<set $CultFeedSettlementId = $currentLocationid>> <<goto "Settlement_Cult">> <</button>> <!-- Prepare feed candidates (kept silently regardless) --> <<set $CultFeedSettlementId = $currentLocationid>> <<set $CultFeedSuccubusIndex = 0>> <!-- default index of the succubus in staff array --> <<set $CultFeedCandidates = []>> <<silently>> <<for _i = 0; _i < _allVillagers.length; _i++>> <<set $CultFeedCandidates.push(_allVillagers[_i])>> <</for>> <</silently>> <!-- Offer list: only visible after player clicks the toggle above --> <<if $CultShowOfferList>> <div style="margin-top:12px;"> <h3>Offer a villager's soul</h3> <<if _allVillagers.length === 0>> <p>No villagers are currently available to offer.</p> <<else>> <div class="offer-grid"> <<for _i = 0; _i < _allVillagers.length; _i++>> <<set _v = _allVillagers[_i]>> <div class="offer-card"> <<if _v.ImagePath>> <img @src="_v.ImagePath" alt="<<print _v.name || _v.job || 'Villager'>>" class="offer-img"> <<else>> <div class="offer-img placeholder">No Image</div> <</if>> <<silently>> <<set _label = (_v.name && String(_v.name).trim()) ? _v.name : (_v.job && String(_v.job).trim()) ? _v.job : "Villager">> <</silently>> <h4 class="offer-name"><<print _label>></h4> <p class="offer-meta">Corruption: <<print (_v.corruption || 0)>>%</p> <<capture _v>> <<button "Offer this villager">> <<set $CultFeedTargetNPCID = _v.NPCID>> <<set $CultFeedSettlementId = $currentLocationid>> <<set $CultShowOfferList = false>> <<goto "SettlmentGiveNPC">> <</button>> <</capture>> </div> <</for>> </div> <</if>> <<if $Souls && $Souls > 0>> <hr> <<button "Give one of your souls">> <<set $Souls = $Souls - 1>> <<set $CultFeedSettlementId = $currentLocationid>> <<set $CultShowOfferList = false>> <<goto "SettlmentGiveSoul">> <</button>> <</if>> <div style="margin-top:8px;"> <<button "Cancel">> <<set $CultShowOfferList = false>> <<goto "Settlement_Cult">> <</button>> </div> </div> <</if>> </div> <</if>> <div class="navigation-options"> <div class="goto-option"> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> </div> </div> </div> <style> .cult-scene, .empty-cult-image { text-align: center; margin: 20px 0; } .cult-scene img, .empty-cult-image img { max-width: 100%; border-radius: 5px; border: 1px solid #555; box-shadow: 0 0 15px rgba(136, 0, 136, 0.5); } /* NOTE: hunger progress bar uses your global styles - local styles removed. */ .navigation-options { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; } .goto-option { display: flex; flex-direction: column; align-items: center; } .hint { font-size: 0.8em; color: #aaa; margin-top: 3px; } .offer-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; margin-top: 8px; } .offer-card { background: rgba(20,20,20,0.7); border: 1px solid #444; border-radius: 8px; padding: 10px; text-align: center; color: #eee; } .offer-img { width: 120px; height: 120px; object-fit: cover; border-radius: 6px; display: block; margin: 0 auto 8px auto; border: 1px solid #555; } .offer-img.placeholder { display:flex; align-items:center; justify-content:center; background:#222; color:#888; } .offer-name { margin: 6px 0 4px 0; font-size: 1rem; } .offer-meta { margin: 0 0 8px 0; font-size: 0.85rem; color: #bbb; } </style> <</nobr>>
<<nobr>> <<if !$Loot>><<set $Loot = []>><</if>> <<include "RaidReportCSS">> /* Location Card */ <div class="location-card"> <div class="location-image"> <img @src="$currentRaidLocation.imagePath" alt="Location Image"> </div> <div class="location-info"> <h1><<print $currentRaidLocation.name>></h1> <p><span class="info-label">Location Type:</span> <<print $currentRaidLocation.type>></p> <p><span class="info-label">Carts:</span> <<print $currentRaidLocation.caravanCarts>></p> <<if $currentRaidLocation.explorerKnowledge.guardsVisible>> <p><span class="info-label">Guards:</span> <<print $currentRaidLocation.caravanGuards>></p> <<else>> <p><span class="info-label">Guards:</span> Unknown</p> <</if>> </div> </div> /* Initialize combat variables */ <<set _combatLog = []>> <<set _guardsDefeated = 0>> <<set _guardsTotal = $currentRaidLocation.caravanGuards>> <<set _raidSuccessful = false>> <<set _cartsLooted = 0>> <<set _prisonersCaptured = 0>> /* Get best lockpicker from raid party if any */ <<set _bestLockpicker to $currentRaidParty.find(raider => raider.specialization === "Lockpicking")>> <<set _baseLockpickChance to 50>> <<if _bestLockpicker>> <<if _bestLockpicker.skill >= 80>> <<set _baseLockpickChance to 95>> <<elseif _bestLockpicker.skill >= 50>> <<set _baseLockpickChance to 85>> <<elseif _bestLockpicker.skill >= 20>> <<set _baseLockpickChance to 70>> <<else>> <<set _baseLockpickChance to 60>> <</if>> <</if>> /* Combat with guards */ <<run _combatLog.push("Your raiders approach the caravan quietly...")>> <<for _i to 0; _i < _guardsTotal; _i++>> <<set _guardHealth = random(40, 80)>> /* Further reduced guard health to 40-80 */ <<set _guardWeapon = either(["Sword", "Spear", "Club", "Bow"])>> <<set _guardArmor = either(["Light", "Medium", "None"])>> <<set _guardName = "Guard " + (_i+1)>> <<set _availableRaiders = $currentRaidParty.filter(r => r.health > 0)>> <<if _availableRaiders.length === 0>> <<run _combatLog.push("All your raiders have fallen! The remaining guards defend the caravan.")>> <<break>> <</if>> <<set _raider = _availableRaiders[random(0, _availableRaiders.length - 1)]>> <<run _combatLog.push(`${_guardName} (${_guardWeapon}, ${_guardArmor}) spots ${_raider.name}!`)>> /* Combat Loop */ <<for _round = 1; _guardHealth > 0 && _raider.health > 0; _round++>> /* Determine who attacks first (50/50 chance instead of guard always first) */ <<set _raiderGoesFirst = random(1, 100) <= 50>> /* Raider attacks first half the time now */ <<if _raiderGoesFirst>> <<set _raiderDamage = 0>> <<switch _raider.weapon>> <<case "Dagger">> <<set _raiderDamage = random(15, 25)>> /* Increased from 10-20 */ <<case "Sword">> <<set _raiderDamage = random(30, 40)>> /* Significantly increased from 20-30 */ <<case "Axe">> <<set _raiderDamage = random(25, 40)>> /* Increased from 25-35 */ <<case "Mace">> <<set _raiderDamage = random(20, 45)>> /* Increased from 15-40 */ <<case "Corruption">> <<set _raiderDamage = random(30, 45)>> /* Strong corruption weapon */ <<default>> <<set _raiderDamage = random(20, 30)>> /* Increased from 15-25 */ <</switch>> /* Apply guard armor reduction */ <<if _guardArmor === "Light">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.8)>> <<elseif _guardArmor === "Medium">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.7)>> /* Reduced from 0.6 */ <</if>> <<set _guardHealth -= _raiderDamage>> <<run _combatLog.push(`${_raider.name} strikes first for ${_raiderDamage} damage!`)>> /* Guard counterattack if still alive */ <<if _guardHealth > 0>> <<set _guardDamage = 0>> <<switch _guardWeapon>> <<case "Sword">> <<set _guardDamage = random(8, 16)>> /* Further reduced */ <<case "Spear">> <<set _guardDamage = random(6, 20)>> /* Further reduced */ <<case "Club">> <<set _guardDamage = random(10, 16)>> /* Further reduced */ <<case "Bow">> <<set _guardDamage = random(8, 24)>> /* Further reduced */ <</switch>> /* Apply enhanced armor reduction */ <<if _raider.armor === "Light">> <<set _guardDamage = Math.floor(_guardDamage * 0.7)>> /* Improved from 0.8 */ <<elseif _raider.armor === "Medium">> <<set _guardDamage = Math.floor(_guardDamage * 0.5)>> /* Improved from 0.6 */ <<elseif _raider.armor === "Heavy">> <<set _guardDamage = Math.floor(_guardDamage * 0.3)>> /* Improved from 0.4 */ <</if>> <<set _raider.health -= _guardDamage>> <<run _combatLog.push(`${_guardName} strikes back for ${_guardDamage} damage!`)>> <</if>> <<else>> /* Guard attacks first */ <<set _guardDamage = 0>> <<switch _guardWeapon>> <<case "Sword">> <<set _guardDamage = random(8, 16)>> /* Further reduced */ <<case "Spear">> <<set _guardDamage = random(6, 20)>> /* Further reduced */ <<case "Club">> <<set _guardDamage = random(10, 16)>> /* Further reduced */ <<case "Bow">> <<set _guardDamage = random(8, 24)>> /* Further reduced */ <</switch>> /* Apply enhanced armor reduction */ <<if _raider.armor === "Light">> <<set _guardDamage = Math.floor(_guardDamage * 0.7)>> /* Improved from 0.8 */ <<elseif _raider.armor === "Medium">> <<set _guardDamage = Math.floor(_guardDamage * 0.5)>> /* Improved from 0.6 */ <<elseif _raider.armor === "Heavy">> <<set _guardDamage = Math.floor(_guardDamage * 0.3)>> /* Improved from 0.4 */ <</if>> <<set _raider.health -= _guardDamage>> <<run _combatLog.push(`${_guardName} strikes ${_raider.name} for ${_guardDamage} damage!`)>> /* Raider counterattack if still alive */ <<if _raider.health > 0>> <<set _raiderDamage = 0>> <<switch _raider.weapon>> <<case "Dagger">> <<set _raiderDamage = random(15, 25)>> /* Increased from 10-20 */ <<case "Sword">> <<set _raiderDamage = random(30, 40)>> /* Significantly increased from 20-30 */ <<case "Axe">> <<set _raiderDamage = random(25, 40)>> /* Increased from 25-35 */ <<case "Mace">> <<set _raiderDamage = random(20, 45)>> /* Increased from 15-40 */ <<case "Corruption">> <<set _raiderDamage = random(30, 45)>> /* Strong corruption weapon */ <<default>> <<set _raiderDamage = random(20, 30)>> /* Increased from 15-25 */ <</switch>> /* Apply guard armor reduction */ <<if _guardArmor === "Light">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.8)>> <<elseif _guardArmor === "Medium">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.7)>> /* Reduced from 0.6 */ <</if>> <<set _guardHealth -= _raiderDamage>> <<run _combatLog.push(`${_raider.name} strikes back for ${_raiderDamage} damage!`)>> <</if>> <</if>> <</for>> /* Combat Resolution */ <<if _guardHealth <= 0>> <<run _combatLog.push(`${_guardName} has been defeated by ${_raider.name}!`)>> <<set _guardsDefeated++>> /* Handle Corruption weapon capture mechanics */ <<if _raider.weapon === "Corruption">> <<if $CellsCount > $DungonOccupance.length>> /* Add prisoner to dungeon */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter to 0>><</if>> <<set _int to random(1, 10)>> <<set $CurrentCaptive = { prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<set _prisonersCaptured++>> <<run _combatLog.push(`${_raider.name}'s corruption weapon has captured ${_guardName}! They've been sent to your dungeon.`)>> <<else>> <<run _combatLog.push(`${_raider.name}'s corruption weapon would have captured ${_guardName}, but your dungeon is full. The guard was killed instead.`)>> <</if>> <</if>> <<else>> <<run _combatLog.push(`${_raider.name} has fallen to ${_guardName}!`)>> <</if>> <</for>> /* Raid is now partially successful if at least 40% of guards are defeated */ <<if _guardsDefeated === _guardsTotal>> <<set _raidSuccessful = true>> <<run _combatLog.push("All guards have been defeated! The caravan is yours for the taking.")>> <<elseif _guardsDefeated >= Math.ceil(_guardsTotal * 0.4)>> /* Lowered from 50% to 40% */ <<set _raidSuccessful = true>> <<run _combatLog.push(`You defeated ${_guardsDefeated} out of ${_guardsTotal} guards - enough to claim most of the caravan's goods!`)>> <<else>> <<run _combatLog.push("You failed to defeat enough guards. The caravan escapes!")>> <</if>> /* Process loot if raid successful */ <<if _raidSuccessful>> <<set _totalGold = 0>> <<set _totalWood = 0>> <<set _totalStone = 0>> <<set _totalFood = 0>> <<set _totalGrain = 0>> <<set _lockedContainers = 0>> <<set _unlockedContainers = 0>> <<for _i to 0; _i < $currentRaidLocation.caravanCarts; _i++>> <<set _cartResource = "">> /* If resource info is known, use it, otherwise randomize */ <<if $currentRaidLocation.explorerKnowledge.resourcesVisible>> <<set _cartResource = $currentRaidLocation.caravanResources[_i]>> <<else>> <<set _cartResource = either(["gold", "wood", "stone", "food", "grain"])>> <</if>> /* Determine if cart is locked */ <<set _isLocked = random(1, 100) <= 25>> /* Reduced from 40% to 25% */ <<set _wasLooted = false>> <<if _isLocked>> <<set _lockedContainers++>> <<set _lockpickRoll = random(1, 100)>> <<if _lockpickRoll <= _baseLockpickChance>> <<set _wasLooted = true>> <<set _unlockedContainers++>> <<run _combatLog.push(`Cart ${_i+1} was locked, but your raiders successfully picked the lock!`)>> <<else>> <<run _combatLog.push(`Cart ${_i+1} was locked, and your raiders couldn't pick the lock.`)>> <<if _bestLockpicker>> <<run _combatLog.push(`${_bestLockpicker.name} attempted but failed to pick the lock.`)>> <<else>> <<run _combatLog.push("You have no skilled lockpickers in your raiding party.")>> <</if>> <</if>> <<else>> <<set _wasLooted = true>> <<run _combatLog.push(`Cart ${_i+1} was unlocked and easily accessible.`)>> <</if>> <<if _wasLooted>> <<set _cartsLooted++>> <<switch _cartResource>> <<case "gold">> <<set _amount = random(80, 250)>> /* Increased loot */ <<set _totalGold += _amount>> <<run _combatLog.push(`Found ${_amount} gold in cart ${_i+1}!`)>> <<case "wood">> <<set _amount = random(30, 70)>> /* Increased loot */ <<set _totalWood += _amount>> <<run _combatLog.push(`Found ${_amount} wood in cart ${_i+1}!`)>> <<case "stone">> <<set _amount = random(25, 60)>> /* Increased loot */ <<set _totalStone += _amount>> <<run _combatLog.push(`Found ${_amount} stone in cart ${_i+1}!`)>> <<case "food">> <<set _amount = random(50, 100)>> /* Increased loot */ <<set _totalFood += _amount>> <<run _combatLog.push(`Found ${_amount} food in cart ${_i+1}!`)>> <<case "grain">> <<set _amount = random(60, 120)>> /* Increased loot */ <<set _totalGrain += _amount>> <<run _combatLog.push(`Found ${_amount} grain in cart ${_i+1}!`)>> <</switch>> /* Add random valuable items to loot */ <<if random(1, 100) <= 70>> /* Increased from 60% to 70% */ <<set _valuables = [ "Silver Chain", "Gold Ring", "Copper Bracelet", "Silk Fabric", "Spice Box", "Wine Bottle", "Carved Statue", "Exotic Feathers", "Jeweled Dagger", "Trade Permit", "Map Fragment", "Glass Beads" ]>> <<set _item = _valuables[random(0, _valuables.length - 1)]>> <<run $Loot.push(_item)>> <<run _combatLog.push(`Also found ${_item} hidden in cart ${_i+1}!`)>> <</if>> <</if>> <</for>> /* Add resources to player's inventory */ <<if _totalGold > 0>><<set $Gold += _totalGold>><</if>> <<if _totalWood > 0>><<set $Wood += _totalWood>><</if>> <<if _totalStone > 0>><<set $Stone += _totalStone>><</if>> <<if _totalFood > 0>><<set $Food += _totalFood>><</if>> <<if _totalGrain > 0>><<set $Grain += _totalGrain>><</if>> <</if>> /* Display Status Banner */ <div class="raid-status <<if _raidSuccessful>>success<<else>>failed<</if>>"> <<if _raidSuccessful>> Caravan Raid Successful <<else>> Caravan Raid Failed <</if>> </div> /* Raid Results Summary */ <div class="combat-results"> <h2>Raid Results</h2> <div class="response-stats"> <p><span class="info-label">Guards Defeated:</span> <<print _guardsDefeated>> / <<print _guardsTotal>></p> <<if _prisonersCaptured > 0>> <p><span class="info-label">Prisoners Captured:</span> <<print _prisonersCaptured>></p> <</if>> <<if _raidSuccessful>> <p><span class="info-label">Carts Looted:</span> <<print _cartsLooted>> / <<print $currentRaidLocation.caravanCarts>></p> <<if _lockedContainers > 0>> <p><span class="info-label">Locked Containers:</span> <<print _lockedContainers>></p> <p><span class="info-label">Successfully Unlocked:</span> <<print _unlockedContainers>> (<<print Math.round((_unlockedContainers/_lockedContainers)*100)>>%)</p> <</if>> <h3>Resources Acquired</h3> <<if _totalGold > 0>><p><span class="info-label">Gold:</span> <<print _totalGold>></p><</if>> <<if _totalWood > 0>><p><span class="info-label">Wood:</span> <<print _totalWood>></p><</if>> <<if _totalStone > 0>><p><span class="info-label">Stone:</span> <<print _totalStone>></p><</if>> <<if _totalFood > 0>><p><span class="info-label">Food:</span> <<print _totalFood>></p><</if>> <<if _totalGrain > 0>><p><span class="info-label">Grain:</span> <<print _totalGrain>></p><</if>> <<if $Loot.length > $previousLootCount>> <h3>Valuables Found</h3> <ul> <<for _i to $previousLootCount; _i < $Loot.length; _i++>> <li><<print $Loot[_i]>></li> <</for>> </ul> <</if>> <</if>> </div> </div> /* Raid Team Status Display */ <<set _survivors = $currentRaidParty.filter(r => r.health > 0)>> <<set _casualties = $currentRaidParty.filter(r => r.health <= 0)>> <div class="raid-section"> <h2>Raiding Party Status</h2> <div class="raider-container"> <<if _survivors.length > 0>> <<for _raider range _survivors>> <div class="raider-card"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Health: <<print _raider.health>></p> </div> <</for>> <</if>> /* Casualties */ <<if _casualties.length > 0>> <<for _raider range _casualties>> <div class="raider-card deceased"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> </div> <</for>> <</if>> </div> </div> <div class="combat-results"> <h2>Combat Breakdown</h2> <div class="combat-log"> <<for _log range _combatLog>> <p class="combat-entry"><<print _log>></p> <</for>> </div> </div> /* Return surviving raiders to barracks */ <<set _survivors = $currentRaidParty.filter(r => r.health > 0 && r.name !== "Lucy" && r.name !== "Alice")>> <<for _survivor range _survivors>> <<run $BarraksOccupance.push(_survivor)>> <</for>> <div style="text-align: center"> <<button "Continue">> <<set $previousLootCount = $Loot.length>> <<set $pendingRaid to false>> <<set _location = $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<run $RaidLocationList.deleteAt($RaidLocationList.findIndex(p => p.locationId === $currentLocationid))>> <<goto "End Day">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Castle Upgrades</h1> <div id="upgrade-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <!-- Dungeon Cell Upgrade --> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/dungeon_cell.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dungeon Cell</h3> <p>Current Cells: $CellsCount</p> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Add Cell">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $CellsCount to $CellsCount + 1>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <!-- Defense Room Upgrade --> <<if $DefenceCount lt 5>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/defense_room.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Defense Room</h3> <p>Current Defense Rooms: $DefenceCount</p> <p>Cost: 300 Gold & 300 Stone</p> <<if ($Gold >= 300) and ($Stone >= 300)>> <<button "Add Room">> <<set $Gold to $Gold - 300>> <<set $Stone to $Stone - 300>> <<set $DefenceCount to $DefenceCount + 1>> <<set $MaxNotoriety to $MaxNotoriety + 10>> <<run Engine.show()>> <<script>> UI.alert("You have increased your castle's defenses.\nAs the castle becomes larger and more heavily defended, local villages start to notice.\nYour maximum notoriety has increased!"); <</script>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $PortalRoomUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/ClosedPortal.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Ancient Portal</h3> <p>Cost: 200 Gold & 200 Stone</p> <<if ($Gold >= 200) and ($Stone >= 200)>> <<button "Build Portal">> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 200>> <<set $PortalRoomUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $Infirmary is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Upgrades/Infirmary.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Infirmary</h3> <p>Cost: 200 Gold & 200 Stone</p> <<if ($Gold >= 200) and ($Stone >= 200)>> <<button "Build Infirmary">> <<set $Gold to $Gold - 200>> <<set $Stone to $Stone - 200>> <<set $Infirmary to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if not $BarracksUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Barracks/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Barracks</h3> <p>Cost: 500 Wood & 500 Stone</p> <<if ($Wood >= 500) and ($Stone >= 500)>> <<button "Build Barracks">> <<set $Wood to $Wood - 500>> <<set $Stone to $Stone - 500>> <<set $BarracksUnlocked to true>> <<set $BarraksOccupance = []>> <<set $RaidingParty = []>> <<set $ExploreTeam = []>> <<set $BarracksMax to 3>> <<set $Exporing to false>> <<set $RaidLocationList to []>> <<set $SmallSettlementRaid to 1>> <<set $MediumSettlementRaid to 1>> <<set $SmallBanditCampRaid to 1>> <<set $MediumBanditCampRaid to 1>> <<set _dutyList = [ "None", "Guard the castle", "Raiding party" ]>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if $BarracksUnlocked is true>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Barracks/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Barracks upgrade</h3> <p>Current Beds: $BarracksMax</p> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Upgrade">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $BarracksMax to $BarracksMax + 3>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($BarracksUnlocked is true) and ($LibraryUnlocked isnot true)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Library/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Library</h3> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Library">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $LibraryUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> <<if ($BarracksUnlocked is true) and ($ArmoryUnlocked isnot true)>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Castle/Forge/2.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Forge</h3> <p>Cost: 200 Wood & 200 Stone</p> <<if ($Wood >= 200) and ($Stone >= 200)>> <<button "Build Forge">> <<set $Wood to $Wood - 200>> <<set $Stone to $Stone - 200>> <<set $ArmoryUnlocked to true>> <<run Engine.show()>> <</button>> <<else>> <button disabled>Insufficient Resources</button> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Return to chambers">> <<goto "Chambers">> <</button>> </div> <</nobr>>
<<nobr>> <<set $BanditSeigeDay to false>> <<if $DefenceForces>><<else>><<set $DefenceForces to 0>><</if>> <<if $BeingSeiged isnot true>> <<set $SeigingFaction to "Bandits">> <<set $SeigeVanguardForce to []>> <<set $SeigeArcherForce to []>> <<set $SeigeDistance to 100>> <<set _rand to random(1, 9)>> <<set _notorietyBonus = Math.floor($Notoriety / 10)>> <!-- +1 per 10 notoriety (max 50 notoriety = +5) --> <<set $SiegeCombatants to ($BarraksOccupance.length * 2) + _notorietyBonus + 3>> <!-- Check defender equipment quality to scale difficulty --> <<set _strongDefenders = 0>> <<set _totalDefendersCheck = $BarraksOccupance.length>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].weapon === "Sword" && $BarraksOccupance[_i].armor === "Armoured">> <<set _strongDefenders += 1>> <<elseif $BarraksOccupance[_i].weapon === "Sword" || $BarraksOccupance[_i].armor === "Armoured">> <<set _strongDefenders += 0.5>> <</if>> <</for>> <!-- Scale enemy count based on defender equipment quality --> <<set _equipmentQuality = _totalDefendersCheck > 0 ? (_strongDefenders / _totalDefendersCheck) : 0>> <<set _difficultyMultiplier = 1.0>> <<if _equipmentQuality < 0.3>> <<set _difficultyMultiplier = 0.6>> <!-- Very poorly equipped: 40% fewer enemies --> <<elseif _equipmentQuality < 0.5>> <<set _difficultyMultiplier = 0.75>> <!-- Poorly equipped: 25% fewer enemies --> <<elseif _equipmentQuality < 0.7>> <<set _difficultyMultiplier = 0.85>> <!-- Average equipment: 15% fewer enemies --> <</if>> <<set $SiegeCombatants = Math.max(5, Math.floor($SiegeCombatants * _difficultyMultiplier))>> <!-- Add extra enemies to compensate for traps --> <<if $ForestSpiderDefence is true>> <<set $SiegeCombatants += 1>> <!-- +1 enemy for spider web trap --> <</if>> <<if $CourtyardTentaclesDefence is true>> <<set $SiegeCombatants += 1>> <!-- +1 enemy for tentacle trap --> <</if>> <<set $BeingSeiged to true>> <<if $LucyUnlocked>> <<set $SeigeLucyTask to "null">> <</if>> <<if $AliceUnlocked is true>> <<set $SeigeAliceTask to "null">> <</if>> <<set _lucyUnit = $BarraksOccupance.find(unit => unit.name === "Lucy")>> <<if _lucyUnit>><<else>> <<if $LucyCorrupt is true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", ImagePath: $LucyImg, armor: "None", weapon: "Corruption", health: 100, skill: $LucySkill, duty: "none" }>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <<set _aliceUnit = $BarraksOccupance.find(unit => unit.name === "Alice")>> <<if _lucyUnit>><<else>> <<if $AliceCorrupt is true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", ImagePath: $AliceImg, armor: "None", weapon: "Corruption", health: 100, skill: $AliceSkill, duty: "none" }>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <</if>> <<if $SeigeDistance <= 0>> <<goto "SiegeWallReached">> <</if>> <<if $SiegeArchersVolley is true>> <<include "SiegeArcherResults">> <</if>> <div class="text-box"> <<set $SiegeFaction to "bandits">> <h1>The Castle is Under Siege</h1> <h2>Bandits have been spotted gathering near the castle</h2> A lookouts horn sounds across the castle, echoing throughout the dark halls and chambers<br><br> You climb the stairs to the outer walls and look down the narrow, single path leading into the forest below<br><br> In the distance you see $SiegeCombatants $SiegeFaction charging your walls<br><br> You can see they are carring <b>rope</b> and <b>ladders</b> for climbing your walls<br><br> <h2>Enemy Distance from your walls</h2> <div class="progress-container"> <progress class="magic-bar" @value="$SeigeDistance" @max="100"></progress> </div> <h2>You have $DefenceForces people guarding your wall</h2><br> <h2>You have people in your barracks ready for melee combat </h2> <<set _archerCount = $BarraksOccupance.filter(unit => unit.rangedWeapon === "Longbow").length>> <<if _archerCount gt 0>> <h2>_archerCount have ranged weapons</h2> <</if>> <br><br> </div> <<include "SiegeTacticalMap">> <div class="text-box flex-buttons"> <<if ($SeigeVanguardForce.length is 0) and ($BarraksOccupance.length gt 0)>> <<button "Select a vanguard">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "VanguardSelection">> <</button>> <</if>> <<set _archerCount = $BarraksOccupance.filter(unit => unit.rangedWeapon === "Longbow").length>> <<if _archerCount > 0 and $SeigeArcherForce.length is 0>> <<button "Order Archers to the turret">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "SeigeArchersToWall">> <</button>> <</if>> <<if $BarraksOccupance.length gt 0>> <<button "Bring your force atop the wall">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "SiegeForceToWall">> <</button>> <</if>> <<button "Wait for the enemy to reach the wall">> <<goto "SiegeWallReached">> <</button>> </div> <</nobr>><<nobr>> <<if $SeigeDistance <= 0>> <<goto "SiegeWallReached">> <</if>> <<if $DefenceForces>><<else>><<set $DefenceForces to 0>><</if>> <<if $BeingSeiged isnot true>> <<set $SeigingFaction to "Bandits">> <<set $SeigeVanguardForce to []>> <<set $SeigeArcherForce to []>> <<set $SeigeDistance to 100>> <<set _rand to random(1, 9)>> <<set _notorietyBonus = Math.floor($Notoriety / 10)>> <!-- +1 per 10 notoriety (max 50 notoriety = +5) --> <<set $SiegeCombatants to ($BarraksOccupance.length * 2) + _notorietyBonus + 3>> <!-- Check defender equipment quality to scale difficulty --> <<set _strongDefenders = 0>> <<set _totalDefendersCheck = $BarraksOccupance.length>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].weapon === "Sword" && $BarraksOccupance[_i].armor === "Armoured">> <<set _strongDefenders += 1>> <<elseif $BarraksOccupance[_i].weapon === "Sword" || $BarraksOccupance[_i].armor === "Armoured">> <<set _strongDefenders += 0.5>> <</if>> <</for>> <!-- Scale enemy count based on defender equipment quality --> <<set _equipmentQuality = _totalDefendersCheck > 0 ? (_strongDefenders / _totalDefendersCheck) : 0>> <<set _difficultyMultiplier = 1.0>> <<if _equipmentQuality < 0.3>> <<set _difficultyMultiplier = 0.6>> <!-- Very poorly equipped: 40% fewer enemies --> <<elseif _equipmentQuality < 0.5>> <<set _difficultyMultiplier = 0.75>> <!-- Poorly equipped: 25% fewer enemies --> <<elseif _equipmentQuality < 0.7>> <<set _difficultyMultiplier = 0.85>> <!-- Average equipment: 15% fewer enemies --> <</if>> <<set $SiegeCombatants = Math.max(5, Math.floor($SiegeCombatants * _difficultyMultiplier))>> <!-- Add extra enemies to compensate for traps --> <<if $ForestSpiderDefence is true>> <<set $SiegeCombatants += 1>> <!-- +1 enemy for spider web trap --> <</if>> <<if $CourtyardTentaclesDefence is true>> <<set $SiegeCombatants += 1>> <!-- +1 enemy for tentacle trap --> <</if>> <<set $BeingSeiged to true>> <<if $LucyUnlocked>> <<set $SeigeLucyTask to "null">> <</if>> <<if $AliceUnlocked is true>> <<set $SeigeAliceTask to "null">> <</if>> <<set _lucyUnit = $BarraksOccupance.find(unit => unit.name === "Lucy")>> <<if _lucyUnit>><<else>> <<if $LucyCorrupt is true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Lucy", sex: "Female", ImagePath: $LucyImg, armor: "None", weapon: "Corruption", health: 100, skill: $LucySkill, duty: "none" }>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <<set _aliceUnit = $BarraksOccupance.find(unit => unit.name === "Alice")>> <<if _lucyUnit>><<else>> <<if $AliceCorrupt is true>> <<set $Unit= { prisonerId: $prisonerIdCounter++, name: "Alice", sex: "Female", ImagePath: $AliceImg, armor: "None", weapon: "Corruption", health: 100, skill: $AliceSkill, duty: "none" }>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <</if>> <<if $SiegeArchersVolley is true>> <<include "SiegeArcherResults">> <</if>> <div class="text-box"> <<set $SiegeFaction to "bandits">> <h1>Siege</h1> <h2>The Bandits are sieging the castle</h2> A lookouts horn sounds across the castle, echoing throughout the dark halls and chambers<br><br> You climb the stairs to the outer walls and look down the narrow, single path leading into the forest below<br><br> In the distance you see $SiegeCombatants $SiegeFaction charging your walls<br><br> You can see they are carring <b>rope</b> and <b>ladders</b> for climbing your walls<br><br> <h2>Enemy Distance from your walls</h2> <div class="progress-container"> <progress class="magic-bar" @value="$SeigeDistance" @max="100"></progress> </div> <h2>You have $DefenceForces people guarding your wall</h2><br> <h2>You have people in your barracks ready for melee combat </h2> <<set _archerCount = $BarraksOccupance.filter(unit => unit.rangedWeapon === "Longbow").length>> <<if _archerCount gt 0>> <h2>_archerCount have ranged weapons</h2> <</if>> <br><br> </div> <<include "SiegeTacticalMap">> <div class="text-box flex-buttons"> <<if ($SeigeVanguardForce.length is 0) and ($BarraksOccupance.length gt 0)>> <<button "Select a vanguard">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "VanguardSelection">> <</button>> <</if>> <<set _archerCount = $BarraksOccupance.filter(unit => unit.rangedWeapon === "Longbow").length>> <<if _archerCount > 0 and $SeigeArcherForce.length is 0>> <<button "Order Archers to the turret">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "SeigeArchersToWall">> <</button>> <</if>> <<if $BarraksOccupance.length gt 0>> <<button "Bring your force atop the wall">> <<set $SeigeDistance to $SeigeDistance - 10>> <<goto "SiegeForceToWall">> <</button>> <</if>> <<button "Wait for the enemy to reach the wall">> <<goto "SiegeWallReached">> <</button>> </div> <</nobr>>
<<nobr>> <style> .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; } .raider-card:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .raider-card.selected { background: rgba(139, 0, 0, 0.7); } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } </style> <div class="text-box"> <h1>Select a vanguard</h1> These forces will rush the enemy once they reach the castle walls. They will be exposed, but will catch the enemy off guard, doing more damage.<br><br> <<if !$selectedRaiders>><<set $selectedRaiders = []>><</if>> <<if $BarraksOccupance.length === 0>> <p>You have no one in your barracks</p> <<else>> <<set _eligibleUnits = $BarraksOccupance.filter(unit => unit.weapon !== "Longbow")>> <<if _eligibleUnits.length === 0>> <p>None of your guards are suitable for vanguard duty. You need units without longbows.</p> <<else>> <div class="raider-container"> <<for _i to 0; _i < _eligibleUnits.length; _i++>> <<capture _raider>> <<set _raider to _eligibleUnits[_i]>> <div class="raider-card" data-raiderid="<<print _raider.prisonerId>>" style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_raider.ImagePath" alt="<<_raider.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _raider.name>></h3> <p style="margin: 2px 0;">Armor: <<print _raider.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _raider.weapon>></p> <<if _raider.rangedWeapon === "Longbow">> <p style="margin: 2px 0; color: #ff4444;">Ranged Weapon: Longbow</p> <</if>> <p style="margin: 2px 0;">Specialization: <<if _raider.specialization>><<print _raider.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_raider.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_raider.skill" max="100" style="width: 100%;"></progress> </div> </div> </div> <</capture>> <</for>> </div> <<button "Create Vanguard">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<set $SeigeVanguardForce to []>> <<set _newBarracks to []>> <<run console.log("Starting unit transfer process..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = $BarraksOccupance.find(unit => unit.name === name); if (selectedUnit) { let newVanguardUnit = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, duty: selectedUnit.duty, health: selectedUnit.health }; $SeigeVanguardForce.push(newVanguardUnit); console.log(`Added to vanguard: ${newVanguardUnit.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !$SeigeVanguardForce.some(vanguardUnit => vanguardUnit.prisonerId === unit.prisonerId) ); console.log("New Vanguard Force:", $SeigeVanguardForce); console.log("Updated Barracks:", $BarraksOccupance); >> <<goto "BanditSiegeStart">> <</button>> <</if>> <</if>> </div> <<script>> $(document).ready(function() { $('.raider-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <</nobr>>
<<nobr>> <style> .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; } .raider-card:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .raider-card.selected { background: rgba(139, 0, 0, 0.7); } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } </style> <div class="text-box"> <h1>Select Archers for the Turret</h1> <<You>>Who should man the turret?<</You>> Select archers to position on the turret. They will be able to fire at the charging enemy, but will be exposed to incoming fire.<br><br> <<if !$selectedRaiders>><<set $selectedRaiders = []>><</if>> <<set _barracksArchers = $BarraksOccupance.filter(unit => unit.rangedWeapon === "Longbow")>> <<if !$SeigeWallForce>><<set $SeigeWallForce = []>><</if>> <<set _wallArchers = $SeigeWallForce.filter(unit => unit.rangedWeapon === "Longbow")>> <<set _archers = _barracksArchers.concat(_wallArchers)>> <<set _archerCount = _archers.length>> <h2>Arrows: $ArmouryArrows</h2> <h2>Corrupted Arrows: $ArmouryCorruptedArrows</h2> <<if !$SeigeDistance>><<set $SeigeDistance to 100>><</if>> <h3>Enemy Distance: $SeigeDistance</h3> <<if $ArmouryArrows <= 0 && $ArmouryCorruptedArrows <= 0>> <p style="color: red;">You have no arrows available for your archers!</p> <</if>> <<if _archerCount === 0>> <p>You have no archers available. Equip some troops with Longbows first.</p> <<else>> <<if !$ArcherArrowType>> <!-- STEP 1: Select Arrow Type --> <h2>Step 1: Select Arrow Type</h2> <div class="text-box flex-buttons"> <<button "Use Regular Arrows">> <<if $ArmouryArrows > 0>> <<set $ArcherArrowType = "regular">> <<goto "SeigeArchersToWall">> <<else>> <<script>> UI.alert("You don't have any regular arrows available!"); <</script>> <</if>> <</button>> <<button "Use Corrupted Arrows">> <<if $ArmouryCorruptedArrows > 0>> <<set $ArcherArrowType = "corrupted">> <<goto "SeigeArchersToWall">> <<else>> <<script>> UI.alert("You don't have any corrupted arrows available!"); <</script>> <</if>> <</button>> </div> <<else>> <div style="margin-top: 20px;"> <h3>Selected Arrow Type: <<print $ArcherArrowType === "regular" ? "Regular Arrows" : "Corrupted Arrows">></h3> </div> <h2>Step 2: Select Archers</h2> <div class="raider-container"> <<for _i to 0; _i < _archers.length; _i++>> <<capture _archer>> <<set _archer to _archers[_i]>> <div class="raider-card" data-raiderid="<<print _archer.prisonerId>>" style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_archer.ImagePath" alt="<<_archer.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _archer.name>></h3> <p style="margin: 2px 0;">Armor: <<print _archer.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _archer.weapon>></p> <p style="margin: 2px 0; color: #ff4444;">Ranged Weapon: <<print _archer.rangedWeapon>></p> <p style="margin: 2px 0;">Specialization: <<if _archer.specialization>><<print _archer.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_archer.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_archer.skill" max="100" style="width: 100%;"></progress> </div> </div> </div> <</capture>> <</for>> </div> <</if>> <!-- Initialize unlock variables and check for commanders --> <<if typeof $LucyUnlocked === "undefined">><<set $LucyUnlocked = true>><</if>> <<if typeof $AliceUnlocked === "undefined">><<set $AliceUnlocked = true>><</if>> <<set _foundLucy = false>> <<set _foundAlice = false>> <!-- Check barracks for commanders --> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<capture _unit>> <<set _unit = $BarraksOccupance[_i]>> <<if _unit.name === "Lucy">> <<set _foundLucy = true>> <</if>> <<if _unit.name === "Alice">> <<set _foundAlice = true>> <</if>> <</capture>> <</for>> <!-- Check wall forces for commanders --> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _unit>> <<set _unit = $SeigeWallForce[_i]>> <<if _unit.name === "Lucy">> <<set _foundLucy = true>> <</if>> <<if _unit.name === "Alice">> <<set _foundAlice = true>> <</if>> <</capture>> <</for>> <!-- Debug info is hidden in HTML comments Commander debug info: Lucy found: <<_foundLucy ? "Yes" : "No">> Alice found: <<_foundAlice ? "Yes" : "No">> Lucy unlocked: <<$LucyUnlocked ? "Yes" : "No">> Alice unlocked: <<$AliceUnlocked ? "Yes" : "No">> --> <!-- STEP 3: Choose Commander (only if arrow type is selected and archers available) --> <<if $ArcherArrowType && _archerCount > 0>> <h2>Step 3: Choose Commander and Deploy</h2> <p>Select which archers to deploy, then choose a commander to improve their accuracy.</p> <div class="text-box flex-buttons"> <<button "Deploy Selected - Fire at Will (No Commander)">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<if _selectedCards.length === 0>> <<script>> UI.alert("You must select at least one archer before deploying!"); <</script>> <<else>> <<set $ArcherCommander = "none">> <<if !$SeigeArcherForce>><<set $SeigeArcherForce = []>><</if>> <<set _selectedArchers to []>> <<run console.log("Starting archer deployment..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = $BarraksOccupance.find(unit => unit.name === name); if (!selectedUnit) { selectedUnit = $SeigeWallForce.find(unit => unit.name === name); } if (selectedUnit) { let newArcherUnit = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, rangedWeapon: selectedUnit.rangedWeapon, duty: selectedUnit.duty, health: selectedUnit.health }; _selectedArchers.push(newArcherUnit); $SeigeArcherForce.push(newArcherUnit); console.log(`Added to archer force: ${newArcherUnit.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); $SeigeWallForce = $SeigeWallForce.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); console.log("Archer Force:", $SeigeArcherForce); console.log("Remaining Barracks:", $BarraksOccupance); console.log("Remaining Wall Force:", $SeigeWallForce); >> <<goto "BanditSiegeStart">> <</if>> <</button>> <<if _foundLucy>> <<button "Deploy Selected - Lucy Commander (+25% Accuracy)">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<if _selectedCards.length === 0>> <<script>> UI.alert("You must select at least one archer before deploying!"); <</script>> <<else>> <<set $ArcherCommander = "Lucy">> <<if !$SeigeArcherForce>><<set $SeigeArcherForce = []>><</if>> <<set _selectedArchers to []>> <<run console.log("Starting archer deployment with Lucy..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = $BarraksOccupance.find(unit => unit.name === name); if (!selectedUnit) { selectedUnit = $SeigeWallForce.find(unit => unit.name === name); } if (selectedUnit) { let newArcherUnit = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, rangedWeapon: selectedUnit.rangedWeapon, duty: selectedUnit.duty, health: selectedUnit.health }; _selectedArchers.push(newArcherUnit); $SeigeArcherForce.push(newArcherUnit); console.log(`Added to archer force: ${newArcherUnit.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); $SeigeWallForce = $SeigeWallForce.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); console.log("Archer Force:", $SeigeArcherForce); >> <<set _lucyIndex = $BarraksOccupance.findIndex(unit => unit.name === "Lucy")>> <<if _lucyIndex !== -1>> <<set _commanderLucy = $BarraksOccupance[_lucyIndex]>> <<run $BarraksOccupance.splice(_lucyIndex, 1)>> <<else>> <<set _lucyIndex = $SeigeWallForce.findIndex(unit => unit.name === "Lucy")>> <<if _lucyIndex !== -1>> <<set _commanderLucy = $SeigeWallForce[_lucyIndex]>> <<run $SeigeWallForce.splice(_lucyIndex, 1)>> <</if>> <</if>> <<goto "BanditSiegeStart">> <</if>> <</button>> <</if>> <<if _foundAlice>> <<button "Deploy Selected - Alice Commander (+30% Accuracy)">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<if _selectedCards.length === 0>> <<script>> UI.alert("You must select at least one archer before deploying!"); <</script>> <<else>> <<set $ArcherCommander = "Alice">> <<if !$SeigeArcherForce>><<set $SeigeArcherForce = []>><</if>> <<set _selectedArchers to []>> <<run console.log("Starting archer deployment with Alice..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = $BarraksOccupance.find(unit => unit.name === name); if (!selectedUnit) { selectedUnit = $SeigeWallForce.find(unit => unit.name === name); } if (selectedUnit) { let newArcherUnit = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, rangedWeapon: selectedUnit.rangedWeapon, duty: selectedUnit.duty, health: selectedUnit.health }; _selectedArchers.push(newArcherUnit); $SeigeArcherForce.push(newArcherUnit); console.log(`Added to archer force: ${newArcherUnit.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); $SeigeWallForce = $SeigeWallForce.filter(unit => !_selectedArchers.some(archer => archer.prisonerId === unit.prisonerId) ); console.log("Archer Force:", $SeigeArcherForce); >> <<set _aliceIndex = $BarraksOccupance.findIndex(unit => unit.name === "Alice")>> <<if _aliceIndex !== -1>> <<set _commanderAlice = $BarraksOccupance[_aliceIndex]>> <<run $BarraksOccupance.splice(_aliceIndex, 1)>> <<else>> <<set _aliceIndex = $SeigeWallForce.findIndex(unit => unit.name === "Alice")>> <<if _aliceIndex !== -1>> <<set _commanderAlice = $SeigeWallForce[_aliceIndex]>> <<run $SeigeWallForce.splice(_aliceIndex, 1)>> <</if>> <</if>> <<goto "BanditSiegeStart">> <</if>> <</button>> <</if>> </div> <</if>> <</if>> </div> <<script>> $(document).ready(function() { $('.raider-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <div class="text-box flex-buttons"> <<button "Cancel orders">> <<goto "BanditSiegeStart">> <</button>> </div> <</nobr>>
<<nobr>> <style> .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: background 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; font-family: Arial, sans-serif; text-align: center; } .raider-card:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .raider-card.selected { background: rgba(139, 0, 0, 0.7); } .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } </style> <div class="text-box"> <h1>Select Forces for the Wall</h1> <<You>>Who should defend the wall?<</You>> Select troops to rush to the top of your wall. They will be ready to defend against the approaching enemy, but will be exposed to incoming fire.<br><br> <<if !$selectedRaiders>><<set $selectedRaiders = []>><</if>> <<if !$SeigeDistance>><<set $SeigeDistance to 100>><</if>> <h3>Enemy Distance: $SeigeDistance</h3> <<if $BarraksOccupance.length === 0>> <p>You have no one in your barracks</p> <<else>> <div class="raider-container"> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<capture _unit>> <<set _unit to $BarraksOccupance[_i]>> <div class="raider-card" data-raiderid="<<print _unit.prisonerId>>" style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_unit.ImagePath" alt="<<_unit.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _unit.name>></h3> <p style="margin: 2px 0;">Armor: <<print _unit.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _unit.weapon>></p> <<if _unit.rangedWeapon === "Longbow">> <p style="margin: 2px 0; color: #ff4444;">Ranged Weapon: Longbow</p> <</if>> <p style="margin: 2px 0;">Specialization: <<if _unit.specialization>><<print _unit.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_unit.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_unit.skill" max="100" style="width: 100%;"></progress> </div> </div> </div> <</capture>> <</for>> </div> <<button "Deploy Selected to Wall">> <<set _selectedCards to jQuery('.raider-card.selected')>> <<if !$SeigeWallForce>><<set $SeigeWallForce = []>><</if>> <<set _selectedUnits to []>> <<run console.log("Starting wall deployment..."); _selectedCards.each(function() { let cardElement = jQuery(this); let name = cardElement.find('h3').text(); let selectedUnit = $BarraksOccupance.find(unit => unit.name === name); if (selectedUnit) { let newWallUnit = { prisonerId: selectedUnit.prisonerId, name: selectedUnit.name, sex: selectedUnit.sex, specialization: selectedUnit.specialization, skill: selectedUnit.skill, hairColor: selectedUnit.hairColor, ImagePath: selectedUnit.ImagePath, armor: selectedUnit.armor, weapon: selectedUnit.weapon, rangedWeapon: selectedUnit.rangedWeapon, duty: selectedUnit.duty, health: selectedUnit.health }; _selectedUnits.push(newWallUnit); $SeigeWallForce.push(newWallUnit); console.log(`Added to wall: ${newWallUnit.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !_selectedUnits.some(wallUnit => wallUnit.prisonerId === unit.prisonerId) ); console.log("Wall Force:", $SeigeWallForce); console.log("Remaining Barracks:", $BarraksOccupance); >> <<set _foundLucy = false>> <<set _foundAlice = false>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<if $SeigeWallForce[_i].name === "Lucy">> <<set _foundLucy = true>> <</if>> <<if $SeigeWallForce[_i].name === "Alice">> <<set _foundAlice = true>> <</if>> <</for>> <<if _foundAlice>> <<set $WallDefenseCommander = "Alice">> <<elseif _foundLucy>> <<set $WallDefenseCommander = "Lucy">> <<else>> <<set $WallDefenseCommander = "none">> <</if>> <<set $WallDefenseActive = true>> <<goto "BanditSiegeStart">> <</button>> <</if>> </div> <<script>> $(document).ready(function() { $('.raider-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <div class="text-box flex-buttons"> <<button "Deploy All Forces to Wall">> <<if !$SeigeWallForce>><<set $SeigeWallForce = []>><</if>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<run $SeigeWallForce.push($BarraksOccupance[_i])>> <</for>> <<set $BarraksOccupance = []>> <<set _foundLucy = false>> <<set _foundAlice = false>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<if $SeigeWallForce[_i].name === "Lucy">> <<set _foundLucy = true>> <</if>> <<if $SeigeWallForce[_i].name === "Alice">> <<set _foundAlice = true>> <</if>> <</for>> <<if _foundAlice>> <<set $WallDefenseCommander = "Alice">> <<elseif _foundLucy>> <<set $WallDefenseCommander = "Lucy">> <<else>> <<set $WallDefenseCommander = "none">> <</if>> <<set $WallDefenseActive = true>> <<goto "BanditSiegeStart">> <</button>> <<button "Cancel orders">> <<goto "BanditSiegeStart">> <</button>> </div> <</nobr>>
<<nobr>> <<if $SiegeArchersVolley>> <!-- Initialize archer force if undefined --> <<if typeof $SeigeArcherForce === "undefined">> <<set $SeigeArcherForce = []>> <</if>> <!-- Initialize captives array if undefined --> <<if typeof $SiegeCaptives === "undefined">> <<set $SiegeCaptives = []>> <</if>> <<set _archerCount = $SeigeArcherForce.length>> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _archersHit = []>> <<set _hitArcherNames = []>> <<set _killedArcherNames = []>> <div class="text-box"> <h3>Archer Volley Results</h3> <!-- Debug info --> <p style="color: #999; font-size: 0.8em;">Debug: Archer count: <<print _archerCount>></p> <<if _archerCount === 0>> <p>There are no archers left on the wall.</p> <<set $SiegeArchersVolley to false>> <<else>> <<set $SeigeDistance -= 10>> <!-- Commander bonus calculations --> <<set _commanderBonus = 0>> <<if $ArcherCommander === "Lucy">> <<set _commanderBonus = 25>> <p>Lucy's tactical expertise improves your archers' accuracy by 25%!</p> <<elseif $ArcherCommander === "Alice">> <<set _commanderBonus = 30>> <p>Alice's keen eye and commanding presence boosts your archers' accuracy by 30%!</p> <</if>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i]>> <<set _baseHitChance = _archer.specialization === "Archery" ? (_archer.skill || 0) : 25>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 95>><<set _hitChance = 95>><</if>> <!-- Cap at 95% --> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <!-- Add corrupted enemy to the array --> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Shortsword" : "Dagger" })>> <</if>> <<else>> <<set $SiegeArchersVolley to false>> <!-- Out of arrows, stop volley --> <</if>> <!-- Enemy counter-fire --> <<set _counterFireChance = 15>> <<if $ArcherCommander !== "none">> <<set _counterFireChance = 10>> <!-- Commanders reduce risk of being hit --> <</if>> <<if random(1, 100) <= _counterFireChance>> <<set _archersHit.push(_archer)>> <</if>> <</capture>> <</for>> <<if typeof $SiegeCombatants === "undefined">> <<set $SiegeCombatants = 50>> <!-- Default value if not set --> <</if>> <!-- Reduce enemy count by killed + corrupted --> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <!-- Show results based on arrow type --> <<if $ArcherArrowType === "regular">> <p>Your archers fired a volley of regular arrows, killing <<print _enemiesKilled>> enemies.</p> <<else>> <p>Your archers fired a volley of corrupted arrows, subduing <<print _enemiesCorrupted>> enemies with dark magic.</p> <!-- Display appropriate corruption image based on count --> <<if _enemiesCorrupted === 1>> <div style="text-align: center; margin: 10px 0;"> <img src="Images/Seige/Corrupted/1.png" alt="Corrupted Enemy" style="max-width: 300px;"> <p style="color: purple; font-style: italic;">An enemy writhes as corruption takes hold...</p> </div> <<elseif _enemiesCorrupted === 2>> <div style="text-align: center; margin: 10px 0;"> <img src="Images/Seige/Corrupted/2.png" alt="Two Corrupted Enemies" style="max-width: 300px;"> <p style="color: purple; font-style: italic;">Two enemies succumb to the corruption's influence...</p> </div> <<elseif _enemiesCorrupted > 2>> <p style="color: purple; font-style: italic; text-align: center; margin: 10px 0;">Multiple enemies fall under the influence of corruption, their wills broken and bound to your service.</p> <</if>> <</if>> <p>There are <<print $SiegeCombatants>> bandits still charging at a distance of <<print $SeigeDistance>>.</p> <p>You have captured <<print $SiegeCaptives.length>> enemies in total.</p> <<if _archersHit.length > 0>> <p>The bandits return fire!</p> <<for _i to 0; _i < _archersHit.length; _i++>> <<capture _hitArcher>> <<set _hitArcher = _archersHit[_i]>> <<set _hitArcherIndex = $SeigeArcherForce.findIndex(a => a.prisonerId === _hitArcher.prisonerId || a.name === _hitArcher.name)>> <<if _hitArcher.health <= 50>> <<set _killedArcherNames.push(_hitArcher.name)>> <<if _hitArcherIndex !== -1>> <<run $SeigeArcherForce.splice(_hitArcherIndex, 1)>> <</if>> <<else>> <<set _hitArcherNames.push(_hitArcher.name)>> <<if _hitArcherIndex !== -1>> <<set $SeigeArcherForce[_hitArcherIndex].health -= 50>> <</if>> <</if>> <</capture>> <</for>> <<if _hitArcherNames.length > 0>> <p style="color: orange;"><<print _hitArcherNames.join(", ")>> <<if _hitArcherNames.length === 1>>was<<else>>were<</if>> wounded by enemy fire!</p> <</if>> <<if _killedArcherNames.length > 0>> <p style="color: red;"><<print _killedArcherNames.join(", ")>> <<if _killedArcherNames.length === 1>>was<<else>>were<</if>> killed by enemy fire!</p> <</if>> <</if>> <<if ($ArcherArrowType === "regular" && $ArmouryArrows <= 0) || ($ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows <= 0)>> <p style="color: red;">Your archers are out of <<print $ArcherArrowType === "regular" ? "regular" : "corrupted">> arrows!</p> <<set $SiegeArchersVolley to false>> <</if>> <<if $SiegeCombatants <= 0>> <p style="color: green; font-weight: bold;">Victory! Your archers have eliminated all the attacking bandits!</p> <<set $SiegeArchersVolley to false>> <!-- Show message about captives if any --> <<if $SiegeCaptives.length > 0>> <div style="margin: 15px 0; padding: 10px; background-color: #f0e6ff; border: 1px solid purple;"> <p style="color: purple;"><strong><<print $SiegeCaptives.length>> captive bandits</strong> stand motionless, awaiting your command. Their minds now bound to your will, they can be assigned to serve in your castle.</p> </div> <</if>> <!-- Return surviving archers to barracks after victory --> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $BarraksOccupance.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <!-- Return commander to barracks after victory --> <<if $ArcherCommander === "Lucy">> <<set _lucy = {name: "Lucy", health: 100, skill: 80, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_lucy)>> <p>Lucy returns from the walls after the successful defense.</p> <<elseif $ArcherCommander === "Alice">> <<set _alice = {name: "Alice", health: 100, skill: 85, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_alice)>> <p>Alice returns from the walls after the successful defense.</p> <</if>> <<set $ArcherCommander = "none">> <<elseif $SeigeDistance <= 0>> <p style="color: red; font-weight: bold;">The bandits have reached the walls!</p> <<set $SiegeArchersVolley to false>> <!-- Return surviving archers to barracks when walls are reached --> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $BarraksOccupance.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <!-- Risk of commander being injured when walls are reached --> <<if $ArcherCommander === "Lucy">> <<if random(1, 100) <= 30>> <!-- 30% chance of commander being injured --> <p style="color: red;">As the bandits reach the walls, Lucy is struck by an arrow while directing the defense!</p> <<set _lucy = {name: "Lucy", health: 70, skill: 80, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_lucy)>> <p style="color: orange;">Lucy is wounded but survives.</p> <<else>> <<set _lucy = {name: "Lucy", health: 100, skill: 80, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_lucy)>> <p>Lucy narrowly escapes as the bandits reach the walls.</p> <</if>> <<elseif $ArcherCommander === "Alice">> <<if random(1, 100) <= 30>> <!-- 30% chance of commander being injured --> <p style="color: red;">As the bandits reach the walls, Alice is struck by an arrow while directing the defense!</p> <<set _alice = {name: "Alice", health: 70, skill: 85, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_alice)>> <p style="color: orange;">Alice is wounded but survives.</p> <<else>> <<set _alice = {name: "Alice", health: 100, skill: 85, weapon: "Corruption"}>> <<run $BarraksOccupance.push(_alice)>> <p>Alice narrowly escapes as the bandits reach the walls.</p> <</if>> <</if>> <<set $ArcherCommander = "none">> <</if>> <</if>> </div> <</if>> <</nobr>>
<<nobr>> <<if $WallDefenseActive>> <<set _defenders = $BarraksOccupance>> <<set _defenderCount = _defenders.length>> <<set _enemiesKilled = 0>> <<set _defendersHit = []>> <<set _hitDefenderNames = []>> <<set _killedDefenderNames = []>> <!-- Remove commander from count if appointed --> <<if $WallDefenseCommander === "Lucy" || $WallDefenseCommander === "Alice">> <<set _commanderIndex = $BarraksOccupance.findIndex(unit => unit.name === $WallDefenseCommander)>> <<if _commanderIndex !== -1>> <<set _commander = $BarraksOccupance[_commanderIndex]>> <<run $BarraksOccupance.splice(_commanderIndex, 1)>> <</if>> <</if>> <div class="text-box"> <h3>Wall Defense Results</h3> <<if _defenders.length === 0>> <p>There are no defenders left on the wall.</p> <<set $WallDefenseActive = false>> <<else>> <<set $SeigeDistance -= 10>> <!-- Commander bonus calculations --> <<set _commanderBonus = 0>> <<if $WallDefenseCommander === "Lucy">> <<set _commanderBonus = 20>> <p>Lucy's tactical expertise improves your defenders' coordination by 20%!</p> <<elseif $WallDefenseCommander === "Alice">> <<set _commanderBonus = 25>> <p>Alice's commanding presence boosts your defenders' morale and effectiveness by 25%!</p> <</if>> <!-- Process enemy fire at defenders --> <<for _i to 0; _i < _defenders.length; _i++>> <<capture _defender>> <<set _defender = _defenders[_i]>> <!-- Enemy counter-fire --> <<set _hitChance = 15>> <!-- Base chance of being hit --> <!-- Apply armor protection --> <<if _defender.armor === "Heavy Armor">> <<set _hitChance -= 7>> <!-- Heavy armor reduces chance of injury --> <<elseif _defender.armor === "Medium Armor">> <<set _hitChance -= 4>> <!-- Medium armor reduces chance slightly --> <</if>> <!-- Apply commander protection --> <<if $WallDefenseCommander !== "none">> <<set _hitChance -= 5>> <!-- Commanders reduce risk of being hit --> <</if>> <<if _hitChance < 5>><<set _hitChance = 5>><</if>> <!-- Minimum 5% chance --> <<if random(1, 100) <= _hitChance>> <<set _defendersHit.push(_defender)>> <</if>> <</capture>> <</for>> <!-- Process any stone throwing if enemies have reached the wall --> <<if $SeigeDistance <= 0>> <p>The bandits have reached the walls! Your defenders begin dropping stones and other projectiles on them!</p> <<for _i to 0; _i < _defenders.length; _i++>> <<capture _defender>> <<set _defender = _defenders[_i]>> <<set _baseHitChance = _defender.skill || 40>> <!-- Base chance to hit with stones --> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 95>><<set _hitChance = 95>><</if>> <!-- Cap at 95% --> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <!-- Bonus kills for specialized fighters --> <<if _defender.specialization === "Combat" || _defender.weapon === "Longbow">> <<set _enemiesKilled += 1>> <!-- Better aim with projectiles --> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= _enemiesKilled>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <p>Your defenders dropped stones and other projectiles on the bandits, taking down <<print _enemiesKilled>> enemies.</p> <p>There are <<print $SiegeCombatants>> bandits still attempting to breach your walls.</p> <<else>> <p>The bandits are still approaching (<<print $SeigeDistance>> distance). Your defenders prepare stones and other projectiles for when they reach the wall.</p> <</if>> <!-- Process injuries to defenders --> <<if _defendersHit.length > 0>> <p>The bandits fire arrows at your defenders!</p> <<for _i to 0; _i < _defendersHit.length; _i++>> <<capture _hitDefender>> <<set _hitDefender = _defendersHit[_i]>> <<set _hitDefenderIndex = $BarraksOccupance.findIndex(d => d.prisonerId === _hitDefender.prisonerId)>> <<if _hitDefender.health <= 50>> <<set _killedDefenderNames.push(_hitDefender.name)>> <<if _hitDefenderIndex !== -1>> <<run $BarraksOccupance.splice(_hitDefenderIndex, 1)>> <</if>> <<else>> <<set _hitDefenderNames.push(_hitDefender.name)>> <<set $BarraksOccupance[_hitDefenderIndex].health -= 50>> <</if>> <</capture>> <</for>> <<if _hitDefenderNames.length > 0>> <p style="color: orange;"><<print _hitDefenderNames.join(", ")>> <<if _hitDefenderNames.length === 1>>was<<else>>were<</if>> wounded by enemy fire!</p> <</if>> <<if _killedDefenderNames.length > 0>> <p style="color: red;"><<print _killedDefenderNames.join(", ")>> <<if _killedDefenderNames.length === 1>>was<<else>>were<</if>> killed by enemy fire!</p> <</if>> <</if>> <<if $SiegeCombatants <= 0>> <p style="color: green; font-weight: bold;">Victory! Your defenders have eliminated all the attacking bandits!</p> <<set $WallDefenseActive = false>> <!-- Return commander to barracks after victory --> <<if $WallDefenseCommander === "Lucy" || $WallDefenseCommander === "Alice">> <<if _commander>> <<run $BarraksOccupance.push(_commander)>> <p><<print $WallDefenseCommander>> returns from the walls after the successful defense.</p> <</if>> <</if>> <</if>> <</if>> </div> <</if>> <</nobr>>
<<nobr>> <!-- Initialize forces if undefined --> <<if typeof $SeigeArcherForce === "undefined">><<set $SeigeArcherForce = []>><</if>> <<if typeof $SeigeWallForce === "undefined">><<set $SeigeWallForce = []>><</if>> <<if typeof $SeigeVanguardForce === "undefined">><<set $SeigeVanguardForce = []>><</if>> <<if typeof $SiegeCaptives === "undefined">><<set $SiegeCaptives = []>><</if>> <div class="text-box"> <h1>The Wall Battle</h1> <<if $SeigeDistance <= 0>> <div class="battle-phase-alert"> <p>The bandits have reached the wall and are attempting to scale it with ladders and ropes!</p> </div> <!-- Battle Overview Stats --> <div class="battle-stats"> <div class="enemy-stats text-box"> <h2>Enemy Forces</h2> <p>Remaining Bandits: <<print $SiegeCombatants>></p> <p>Bandits at the Wall: <<print Math.min($SiegeCombatants, 20)>></p> </div> <div class="defender-stats text-box"> <h2>Your Defenses</h2> <p>Archers: <<print $SeigeArcherForce.length>></p> <p>Wall Defenders: <<print $SeigeWallForce.length>></p> <p>Vanguard: <<print $SeigeVanguardForce.length>></p> </div> </div> <!-- MOVED: Battle Results section moved before visualization to update cards properly --> <div class="battle-results text-box"> <h2>Battle Progress</h2> <!-- Archer Actions --> <<if $SeigeArcherForce.length > 0 && ($ArmouryArrows > 0 || $ArmouryCorruptedArrows > 0)>> <div class="action-section"> <h3>Archer Volleys</h3> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _arrowsUsed = 0>> <!-- REDUCED: Each archer only fires one arrow per turn --> <<set _maxArrowsPerTurn = Math.min($SeigeArcherForce.length, ($ArcherArrowType === "regular" ? $ArmouryArrows : $ArmouryCorruptedArrows))>> <<for _i to 0; _i < _maxArrowsPerTurn; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <!-- Distribute evenly if more archers than arrows --> <!-- REDUCED: Lower base hit chance and commander bonus --> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <!-- Lower cap to 80% --> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <<if _arrowsUsed > 0>> <<if $ArcherArrowType === "regular">> <p>Your archers fire a volley of <<print _arrowsUsed>> regular arrows, killing <<print _enemiesKilled>> bandits trying to scale the wall.</p> <<if _enemiesKilled > 0>> <<set _arrowImageNum = Math.ceil(random(1, 3))>> <<set _arrowPath = "Images/Seige/Battle/arrows-" + _arrowImageNum + ".png">> <div class="Random-image"> <img @src="_arrowPath" alt="Arrow Volley"> </div> <</if>> <<else>> <p>Your archers fire a volley of <<print _arrowsUsed>> corrupted arrows, corrupting <<print _enemiesCorrupted>> bandits and binding them to your will.</p> <<if _enemiesCorrupted > 0>> <<set _corruptedPath = "Images/Seige/Combat/Corrupted/1.png">> <div class="Random-image"> <img @src="_corruptedPath" alt="Corrupted Enemies"> </div> <</if>> <</if>> <<else>> <p>Your archers are out of <<print $ArcherArrowType === "regular" ? "regular" : "corrupted">> arrows!</p> <</if>> </div> <</if>> <!-- Wall Defender Actions --> <<if $SeigeWallForce.length > 0>> <div class="action-section"> <h3>Wall Defense</h3> <<set _enemiesKnockedDown = 0>> <!-- REDUCED: Lower commander bonus --> <<set _commanderBonus = $WallDefenseCommander === "Lucy" ? 15 : ($WallDefenseCommander === "Alice" ? 18 : 0)>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <!-- REDUCED: Lower base hit chance --> <<set _baseHitChance = Math.min(_defender.skill || 30, 50)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <!-- Lower cap to 80% --> <<if random(1, 100) <= _hitChance>> <<set _enemiesKnockedDown += 1>> <<if _defender.specialization === "Combat" || _defender.weapon === "Sword">> <!-- REDUCED: Combat specialists less effective --> <<if random(1, 3) === 1>> <!-- Only 1/3 chance to get bonus kill --> <<set _enemiesKnockedDown += 1>> <</if>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= _enemiesKnockedDown>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <p>Your defenders drop stones and push ladders away, knocking down <<print _enemiesKnockedDown>> bandits.</p> <<if _enemiesKnockedDown >= 5>> <<set _rocksFallingPath = "Images/Seige/Battle/rocks-falling.png">> <div class="Random-image"> <img @src="_rocksFallingPath" alt="Rocks Falling"> </div> <</if>> </div> <</if>> <!-- Vanguard Combat --> <<if $SeigeVanguardForce.length > 0>> <div class="action-section"> <h3>Vanguard Combat</h3> <<set _totalEnemiesDefeated = 0>> <<set _totalEnemiesCorrupted = 0>> <<set _fallenVanguard = []>> <<set _banishedDemons = []>> <<set _woundedVanguard = []>> <<set _lucyCorrupting = false>> <<set _aliceCorrupting = false>> <<set _slainFighters = []>> <!-- Track slain fighters separately for dramatic effect --> <<set _maxEnemiesPerTurn = Math.max(3, Math.ceil($SiegeCombatants * 0.35))>> <!-- Max 35% of enemies can die per turn, minimum 3 --> <<set _enemiesKilledThisTurn = 0>> <!-- Process combat for each vanguard member --> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<capture _fighter>> <<set _fighter = $SeigeVanguardForce[_i]>> <<set _fighterDefeats = 0>> <<set _fighterCorruptions = 0>> <<set _fighterWounded = false>> <<set _fighterKilled = false>> <<set _isBanished = false>> <!-- Set default image path if missing --> <<if !_fighter.ImagePath>> <<if _fighter.name === "Lucy">> <<set _fighter.ImagePath = "Images/Seige/Lucy/portrait.png">> <<elseif _fighter.name === "Alice">> <<set _fighter.ImagePath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _fighter.ImagePath = "Images/Seige/Icons/fighter.png">> <</if>> <</if>> <<set _fighterData = { name: _fighter.name, originalHealth: _fighter.health, finalHealth: _fighter.health, killed: false, banished: false, wounded: false, ImagePath: _fighter.ImagePath, enemiesDefeated: 0, enemiesCorrupted: 0 }>> <!-- Lucy and Alice use corruption instead of normal combat --> <<if _fighter.name === "Lucy" || _fighter.name === "Alice">> <!-- REDUCED: Much lower corruption power and targets --> <<set _corruptionPower = _fighter.name === "Lucy" ? 8 : 10>> <!-- Alice is slightly more powerful --> <<set _corruptionTargets = random(1, 100) <= 50 ? 1 : 0>> <!-- 50% chance for 1 target --> <<for _j to 0; _j < _corruptionTargets; _j++>> <<if $SiegeCombatants <= 0>> <<break>> <</if>> <!-- REDUCED: Much lower corruption chance --> <<set _corruptionChance = 30 + _corruptionPower>> <<if random(1, 100) <= _corruptionChance && _enemiesKilledThisTurn < _maxEnemiesPerTurn>> <<set _fighterCorruptions += 1>> <<set _fighterData.enemiesCorrupted += 1>> <<set _totalEnemiesCorrupted += 1>> <<set $SiegeCombatants -= 1>> <<set _enemiesKilledThisTurn += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: _fighter.name, gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <<if _fighter.name === "Lucy">><<set _lucyCorrupting = true>><</if>> <<if _fighter.name === "Alice">><<set _aliceCorrupting = true>><</if>> <</if>> <</for>> <!-- ADDED: Counter-attack chance for corruption specialists --> <<if random(1, 100) <= 40>> <!-- 40% chance to get hit --> <<set _damage = random(15, 35)>> <<set _fighter.health -= _damage>> <<set _fighterData.finalHealth = _fighter.health>> <<if _fighter.health <= 0>> <<set _isBanished = true>> <<set _banishedDemons.push(_fighter.name)>> <<set _fighterData.banished = true>> <<else>> <<set _fighterWounded = true>> <<set _woundedVanguard.push(_fighter.name)>> <<set _fighterData.wounded = true>> <</if>> <</if>> <<else>> <!-- Regular combat for normal fighters --> <!-- BALANCED: Each fighter faces 2-3 enemies but with lower kill rate --> <<set _enemiesForFighter = Math.min(Math.ceil(random(2, 3)), $SiegeCombatants)>> <<set _fighterKillsThisRound = 0>> <!-- Track kills per fighter --> <<for _j to 0; _j < _enemiesForFighter; _j++>> <<if $SiegeCombatants <= 0 || _fighterKilled || _fighterKillsThisRound >= 1>> <<break>> <!-- Max 1 kill per fighter per round --> <</if>> <!-- Combat calculations --> <!-- REDUCED: Much lower fighter advantages --> <<set _fighterStrength = (_fighter.skill || 40) + (_fighter.weapon === "Sword" ? 10 : 3)>> <<set _fighterDefense = (_fighter.armor === "Armoured" ? 15 : (_fighter.armor === "Medium Armor" ? 10 : 3))>> <!-- INCREASED: Much higher enemy strength --> <<set _enemyStrength = random(60, 90)>> <<set _enemyHitChance = 60 + Math.floor(_enemyStrength / 10)>> <!-- 66-69% --> <<set _fighterHitChance = 25 + Math.floor(_fighterStrength / 10)>> <!-- ~30-35% --> <!-- Fighter attacks --> <<if random(1, 100) <= _fighterHitChance && _enemiesKilledThisTurn < _maxEnemiesPerTurn>> <<set _fighterDefeats += 1>> <<set _fighterData.enemiesDefeated += 1>> <<set _totalEnemiesDefeated += 1>> <<set $SiegeCombatants -= 1>> <<set _fighterKillsThisRound += 1>> <<set _enemiesKilledThisTurn += 1>> <</if>> <!-- Enemy always counter-attacks --> <<if random(1, 100) <= _enemyHitChance>> <!-- INCREASED: Much higher damage --> <<set _damage = random(30, 55) - Math.floor(_fighterDefense / 3)>> <<if _damage < 20>><<set _damage = 20>><</if>> <!-- Higher minimum damage --> <<set _fighter.health -= _damage>> <<set _fighterData.finalHealth = _fighter.health>> <<if _fighter.health <= 0>> <<set _fighterKilled = true>> <<set _fallenVanguard.push(_fighter.name)>> <<set _slainFighters.push(_fighterData)>> <<set _fighterData.killed = true>> <<else>> <<set _fighterWounded = true>> <<set _woundedVanguard.push(_fighter.name)>> <<set _fighterData.wounded = true>> <</if>> <</if>> <</for>> <</if>> <!-- Update the fighter in the array --> <<if _fighterKilled || _isBanished>> <<set $SeigeVanguardForce[_i].health = 0>> <<else>> <<set $SeigeVanguardForce[_i].health = _fighter.health>> <</if>> <</capture>> <</for>> <!-- Combat results --> <p>Your vanguard engages the bandits in fierce combat.</p> <<if _totalEnemiesDefeated > 0>> <p>They manage to defeat <<print _totalEnemiesDefeated>> enemies.</p> <</if>> <<if _totalEnemiesCorrupted > 0>> <p style="color: purple;"><<print _totalEnemiesCorrupted>> bandits are corrupted and fall under your control.</p> <</if>> <<if _woundedVanguard.length > 0>> <p style="color: orange;"><<print _woundedVanguard.join(", ")>> <<if _woundedVanguard.length === 1>>is<<else>>are<</if>> wounded in the fighting.</p> <</if>> <!-- Dramatic death scenes for fallen fighters - REDESIGNED as Cards --> <<if _fallenVanguard.length > 0>> <div class="fallen-fighters-section"> <h3 style="color: red;">Fallen Warriors</h3> <div class="combat-table"> <<for _i to 0; _i < _slainFighters.length; _i++>> <<capture _slain>> <<set _slain = _slainFighters[_i]>> <div class="character-card card" style="filter: grayscale(100%); opacity: 0.8; position: relative;"> <div class="card-type weapon" style="background: linear-gradient(to right, #8b0000, #a00000);">FALLEN</div> <div class="card-name"><<print _slain.name>></div> <div class="card-image"> <img @src="_slain.ImagePath" alt="<<print _slain.name>>"> </div> <div class="fallen-overlay">SLAIN</div> <div class="card-stats"> <div class="health-bar"> <div class="health-fill" style="width: 0%;"></div> </div> <p class="card-damage">Health: 0/100</p> <p class="card-description" style="color: #900;">Fought bravely against overwhelming odds</p> <p class="card-effects">Defeated <<print _slain.enemiesDefeated>> enemies before falling</p> </div> </div> <</capture>> <</for>> </div> <p style="color: red; margin-top: 15px;"><<print _fallenVanguard.join(", ")>> <<if _fallenVanguard.length === 1>>has<<else>>have<</if>> fallen in battle, sacrificing <<if _fallenVanguard.length === 1>>their life<<else>>their lives<</if>> to defend the castle.</p> </div> <</if>> <!-- Banished demons section - REDESIGNED as Cards --> <<if _banishedDemons.length > 0>> <div class="banished-demons-section"> <h3 style="color: purple;">Banished Demons</h3> <div class="combat-table"> <<for _i to 0; _i < _banishedDemons.length; _i++>> <<capture _demonName>> <<set _demonName = _banishedDemons[_i]>> <<set _demonPath = "">> <<if _demonName === "Lucy">> <<set _demonPath = "Images/Seige/Lucy/portrait.png">> <<elseif _demonName === "Alice">> <<set _demonPath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _demonPath = "Images/Seige/Icons/fighter.png">> <</if>> <div class="character-card card" style="background: linear-gradient(to bottom, #4b0082 0%, #2a0048 100%); border-color: #9400d3; position: relative;"> <div class="card-type spell" style="background: linear-gradient(to right, #9400d3, #8a2be2);">BANISHED</div> <div class="card-name" style="color: #e6e6fa;"><<print _demonName>></div> <div class="card-image"> <img @src="_demonPath" alt="<<print _demonName>>" style="opacity: 0.7;"> </div> <div class="fallen-overlay" style="background-color: rgba(148, 0, 211, 0.7);">BANISHED</div> <div class="card-stats"> <p class="card-description" style="color: #e6e6fa;">This demon has been banished back to their realm by the bandits' attacks.</p> <p class="card-effects" style="color: #d8bfd8;">They will recover their power and return in time.</p> </div> </div> <</capture>> <</for>> </div> <p style="color: purple;"><<print _banishedDemons.join(", ")>> <<if _banishedDemons.length === 1>>has<<else>>have<</if>> been banished back to the demonic realm by the bandits' attacks!</p> </div> <</if>> <!-- Display corruption image for Lucy or Alice if they corrupted enemies --> <<if _lucyCorrupting>> <<set _lucyImageNum = Math.ceil(random(1, 3))>> <<set _lucyCorruptPath = "Images/Seige/Lucy/" + _lucyImageNum + ".png">> <div class="Random-image"> <img @src="_lucyCorruptPath" alt="Lucy Corrupting"> <p style="color: purple; font-style: italic;">Lucy unleashes her corruption magic, binding enemies to her will.</p> </div> <</if>> <<if _aliceCorrupting>> <<set _aliceImageNum = Math.ceil(random(1, 3))>> <<set _aliceCorruptPath = "Images/Seige/Alice/" + _aliceImageNum + ".png">> <div class="Random-image"> <img @src="_aliceCorruptPath" alt="Alice Corrupting"> <p style="color: purple; font-style: italic;">Alice's corruption power flows through the battlefield, ensnaring her foes.</p> </div> <</if>> <!-- Update regular combat image path for normal fighters --> <<if $SeigeVanguardForce.length > 0 && !_lucyCorrupting && !_aliceCorrupting && _totalEnemiesDefeated > 0>> <<set _combatImageNum = Math.ceil(random(1, 3))>> <<set _vanguardCombatPath = "Images/Seige/Combat/" + _combatImageNum + ".png">> <div class="Random-image"> <img @src="_vanguardCombatPath" alt="Vanguard Combat"> </div> <</if>> <!-- Remove fallen fighters --> <<set $SeigeVanguardForce = $SeigeVanguardForce.filter(fighter => fighter.health > 0)>> </div> <</if>> </div> <!-- Battle Visualization - NOW AFTER the battle results so cards show updated state --> <div class="battle-visualization"> <!-- Ground Battle Section --> <div class="ground-battle-section"> <!-- Vanguard Forces as Cards --> <<if $SeigeVanguardForce.length > 0>> <div class="vanguard-forces text-box"> <h3>Vanguard Forces</h3> <!-- Combat Table Style from CombatCSS --> <div class="combat-table"> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<capture _fighter>> <<set _fighter = $SeigeVanguardForce[_i]>> <<set _fighterPath = "">> <!-- Set default image path if missing --> <<if !_fighter.ImagePath>> <<if _fighter.name === "Lucy">> <<set _fighterPath = "Images/Seige/Lucy/portrait.png">> <<elseif _fighter.name === "Alice">> <<set _fighterPath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _fighterPath = "Images/Seige/Icons/fighter.png">> <</if>> <<set _fighter.ImagePath = _fighterPath>> <</if>> <!-- Character Card Styling - Removed card-type section --> <div class="character-card card"> <div class="card-name"><<print _fighter.name>></div> <div class="card-image"> <img @src="_fighter.ImagePath" alt="<<print _fighter.name>>"> </div> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em;">Health:</h4> <progress @value="_fighter.health" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: <<print _fighter.health>>/100</p> <<if _fighter.weapon>> <p class="card-effects">Weapon: <<print _fighter.weapon>></p> <</if>> <<if _fighter.armor>> <p class="card-effects">Armor: <<print _fighter.armor>></p> <</if>> <<if _fighter.specialization>> <p class="card-effects">Specialty: <<print _fighter.specialization>></p> <</if>> <<if _fighter.name === "Lucy" || _fighter.name === "Alice">> <p class="card-description" style="color: purple;">Can corrupt enemies and bend them to your will.</p> <</if>> </div> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Enemy Forces as Cards --> <div class="enemy-forces text-box"> <h3>Attacking Bandits</h3> <!-- Combat Table Style from CombatCSS --> <div class="combat-table <<if $SiegeCombatants === 0>>empty<</if>>"> <<set _displayedEnemies = Math.min($SiegeCombatants, 6)>> <<for _i to 0; _i < _displayedEnemies; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <!-- FIXED: Updated bandit image paths to match the correct structure --> <<if _gender === "Male">> <<set _banditPath = "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg">> <<else>> <<set _banditPath = "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg">> <</if>> <div class="character-card card enemy-card"> <div class="card-type weapon">BANDIT</div> <div class="card-name"><<print _gender>> Bandit</div> <div class="card-image"> <img @src="_banditPath" alt="Bandit"> </div> <!-- Replace the enemy card stats section in the bandits display --> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em;">Health:</h4> <progress value="100" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: 100/100</p> <h4 style="margin: 0; font-size: 0.8em;">Corruption:</h4> <progress value="0" max="100" style="width: 100%;" class="corruption-progress"></progress> <p class="card-effects">Corruption: 0/100</p> <p class="card-description">Armed with <<print random(1, 10) > 5 ? "sword" : "dagger">> and <<print random(1, 10) > 7 ? "medium" : "light">> armor.</p> </div> </div> <</for>> <<if $SiegeCombatants > 6>> <div class="more-enemies stack-indicator" style="position: relative; margin-left: 15px;"> <div class="card enemy-card" style="width: 80px; min-height: 120px; display: flex; align-items: center; justify-content: center;"> <div style="text-align: center;"> <strong>+<<print $SiegeCombatants - 6>></strong><br> <span style="font-size: 0.8em;">more bandits</span> </div> </div> </div> <</if>> </div> </div> </div> </div> <!-- Battle Controls - Only show if enemies remain --> <<if $SiegeCombatants > 0>> <div class="battle-controls text-box"> <h2>Battle Commands</h2> <div class="flex-buttons"> <<button "Continue Defense">> <!-- Initialize DeadVanguard array if needed --> <<if typeof $DeadVanguard === "undefined">><<set $DeadVanguard = []>><</if>> <!-- Check if vanguard was completely wiped out this turn --> <<if _fallenVanguard && _fallenVanguard.length > 0 && $SeigeVanguardForce.length === 0>> <!-- Store fallen fighters for the defeated passage --> <<for _i to 0; _i < _slainFighters.length; _i++>> <<run $DeadVanguard.push(_slainFighters[_i])>> <</for>> <!-- Add banished demons to the dead vanguard list --> <<for _i to 0; _i < _banishedDemons.length; _i%> <<set _demonName = _banishedDemons[_i]>> <<set _demonPath = "">> <<if _demonName === "Lucy">> <<set _demonPath = "Images/Seige/Lucy/portrait.png">> <<elseif _demonName === "Alice">> <<set _demonPath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _demonPath = "Images/Seige/Icons/fighter.png">> <</if>> <<run $DeadVanguard.push({ name: _demonName, ImagePath: _demonPath, health: 0, banished: true })>> <</for>> <<goto "VanguardDefeated">> <<else>> <<goto "SiegeWallBattle">> <</if>> <</button>> <<if $SeigeVanguardForce.length > 0>> <<button "Recall Vanguard">> <!-- Navigate to the retreat passage instead of immediately processing --> <<goto "VanguardRetreat">> <</button>> <</if>> </div> </div> <</if>> <!-- Battle Outcome --> <<if $SiegeCombatants <= 0>> <div class="victory-banner text-box"> <h2>Victory!</h2> <p>Your forces have successfully repelled the bandit attack!</p> <!-- Return all forces to barracks --> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $BarraksOccupance.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<run $BarraksOccupance.push($SeigeWallForce[_i])>> <</for>> <<set $SeigeWallForce = []>> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<run $BarraksOccupance.push($SeigeVanguardForce[_i])>> <</for>> <<set $SeigeVanguardForce = []>> <!-- Return commanders --> <<if $ArcherCommander === "Lucy" || $WallDefenseCommander === "Lucy">> <<set _lucy = {name: "Lucy", health: 100, skill: 80, weapon: "Corruption", ImagePath: "Images/Seige/Lucy/portrait.png"}>> <<run $BarraksOccupance.push(_lucy)>> <</if>> <<if $ArcherCommander === "Alice" || $WallDefenseCommander === "Alice">> <<set _alice = {name: "Alice", health: 100, skill: 85, weapon: "Corruption", ImagePath: "Images/Seige/Alice/portrait.png"}>> <<run $BarraksOccupance.push(_alice)>> <</if>> <<set $ArcherCommander = "none">> <<set $WallDefenseCommander = "none">> <div class="flex-buttons" style="margin-top: 20px;"> <<button "Secure the Castle" class="execute-combat-btn">> <<set $BeingSeiged = false>> <<goto "SiegeVictory">> <</button>> </div> </div> <</if>> <<else>> <p>The bandits are still approaching. They have not yet reached the wall.</p> <div class="flex-buttons"> <<button "Return to Orders">> <<goto "SeigeWallOrders">> <</button>> </div> <</if>> </div> <style> /* Siege Battle Styles */ .siege-battle-container { max-width: 900px; margin: 0 auto; } .battle-phase-alert { background-color: #ffe6e6; border: 2px solid #ff0000; padding: 15px; margin-bottom: 20px; text-align: center; font-weight: bold; font-size: 1.2em; } .battle-stats { display: flex; justify-content: space-between; margin-bottom: 20px; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; } .battle-visualization { margin: 30px 0; } /* NEW CARD STYLES BASED ON COMBAT CSS */ .ground-battle-section { display: flex; justify-content: space-between; margin-bottom: 20px; gap: 20px; } .vanguard-forces, .enemy-forces { width: 48%; } /* Combat Table Style */ .combat-table { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; min-height: 80px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } .combat-table.empty { background: linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%), linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%); background-size: 20px 20px; background-position: 0 0, 10px 10px; opacity: 0.7; } .combat-table.empty::after { content: "No cards deployed"; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #666; font-style: italic; text-transform: uppercase; letter-spacing: 1px; } /* Character Card Styling */ .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .character-card.card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4), 0 0 15px rgba(139, 69, 19, 0.3); } .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%); color: #ff4444; border-color: #8b0000; } .enemy-card .card-name { color: #ff6666; } /* Card Type Styling */ .card-type { text-align: center; font-size: 0.7em; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; padding: 2px 4px; border-radius: 3px; margin-bottom: 5px; } .card-type.weapon { background: linear-gradient(to right, #8b0000, #a00000); color: white; } .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad); color: white; } .card-type.defence { background: linear-gradient(to right, #2f4f4f, #708090); color: white; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .enemy-card .card-name { color: #ff6666; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); } /* Card image improvements */ .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .health-bar, .corruption-bar { width: 100%; height: 10px; background-color: #eee; border-radius: 5px; overflow: hidden; margin: 5px 0; } .health-fill { height: 100%; background-color: #4CAF50; } .corruption-fill { height: 100%; background-color: #9c27b0; } .card-damage, .card-effects, .card-description { font-size: 0.75em; text-align: center; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin: 3px 0; } .card-damage { font-weight: bold; color: #8b0000; } .card-effects { color: #444; } .card-description { color: #666; font-style: italic; margin-top: auto; } /* Combat Action Buttons */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.1em !important; padding: 12px 25px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 20px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) !important; } /* Stack indicator */ .stack-indicator { position: relative; top: 0; right: 0; } /* Fallen overlay */ .fallen-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); background-color: rgba(139, 0, 0, 0.7); color: white; padding: 5px 10px; font-weight: bold; font-size: 1.5em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; } /* ORIGINAL STYLES MAINTAINED */ .battle-results { margin: 30px 0; } .action-section { margin-bottom: 20px; padding: 15px; border-radius: 5px; background-color: rgba(255, 255, 255, 0.1); border: 1px solid #ccc; } .battle-controls { margin: 30px 0; text-align: center; } .victory-banner { border: 2px solid #00cc00; padding: 20px; text-align: center; margin: 30px 0; } .flex-buttons { display: flex; justify-content: center; gap: 15px; margin-top: 15px; } /* Fallen fighter styles */ .fallen-fighters-section { background-color: rgba(0, 0, 0, 0.1); border: 1px solid #900; padding: 15px; margin: 20px 0; border-radius: 5px; } .banished-demons-section { background-color: rgba(128, 0, 128, 0.1); border: 1px solid purple; padding: 15px; margin: 20px 0; border-radius: 5px; } /* Random image styles */ .Random-image { text-align: center; margin: 10px 0; } .Random-image img { max-width: 400px; } /* Add to the style section */ .corruption-progress::-webkit-progress-value { background-color: #9c27b0; } .corruption-progress::-moz-progress-bar { background-color: #9c27b0; } .corruption-progress { color: #9c27b0; /* For IE */ } /* Responsive design */ @media (max-width: 768px) { .ground-battle-section { flex-direction: column; } .vanguard-forces, .enemy-forces { width: 100%; margin-bottom: 20px; } .character-card.card { width: 120px; min-height: 180px; } .card-image { height: 60px; width: 60px; } } </style> <</nobr>>
<<nobr>> <!-- Initialize forces if undefined --> <<if typeof $SeigeArcherForce === "undefined">><<set $SeigeArcherForce = []>><</if>> <<if typeof $SeigeWallForce === "undefined">><<set $SeigeWallForce = []>><</if>> <<if typeof $SeigeVanguardForce === "undefined">><<set $SeigeVanguardForce = []>><</if>> <<if typeof $SiegeCaptives === "undefined">><<set $SiegeCaptives = []>><</if>> <!-- Check for undefended scenario: No vanguard, no wall defenders, no archers --> <<if $SeigeVanguardForce.length === 0 && $SeigeWallForce.length === 0 && $SeigeArcherForce.length === 0>> <!-- Set siege distance to 0 - they've reached the walls --> <<set $SeigeDistance = 0>> <!-- Initialize WallEnemies to show enemies on the wall --> <<if typeof $WallEnemies === "undefined" || $WallEnemies.length === 0>> <<set $WallEnemies = []>> <<set _enemiesOnWall = Math.min($SiegeCombatants, 15)>> <<for _i to 0; _i < _enemiesOnWall; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $WallEnemies.push({ id: "bandit-" + _i, gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <<set $SiegeEnemiesClimbing = Math.max(0, $SiegeCombatants - _enemiesOnWall)>> <<set $SiegeEnemiesAtBase = 0>> <</if>> <div class="text-box"> <h1>Walls Breached!</h1> <div class="battle-phase-alert" style="border-color: #900; background-color: rgba(139, 0, 0, 0.1);"> <p style="color: #c00; font-weight: bold;">The enemy has reached the walls completely unopposed!</p> </div> <div class="battle-narrative"> <p>With no vanguard to meet them, no defenders on the walls, and no archers to slow their advance, the bandits swarm the castle walls uncontested.</p> <div class="battle-image"> <img src="Images/Seige/Battle/breach.png" alt="Wall Breach"> </div> <p>Ladders rise against the battlements, ropes are thrown over the parapets, and within moments the first wave of attackers is climbing over the walls!</p> <p style="color: #900; font-weight: bold;">The enemy has breached your defenses and is pouring into the courtyard!</p> <!-- Move any available forces from barracks to courtyard --> <<if !$CourtyardDefenders>><<set $CourtyardDefenders = []>><</if>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<run $CourtyardDefenders.push($BarraksOccupance[_i])>> <</for>> <<set $BarraksOccupance = []>> <<if $CourtyardDefenders.length > 0>> <p>Your forces scramble from the barracks to form a last line of defense in the courtyard!</p> <p><<print $CourtyardDefenders.length>> defenders rush to meet the invaders in desperate combat.</p> <<else>> <p style="color: #c00;">You have no forces left to defend the courtyard! The battle is lost!</p> <</if>> </div> </div> <<include "SiegeTacticalMap">> <div class="text-box flex-buttons"> <<button "Fight in the Courtyard">> <<goto "CourtyardBattle">> <</button>> </div> <!-- Check for archers only scenario: No vanguard, no wall defenders, but archers present --> <<elseif $SeigeVanguardForce.length === 0 && $SeigeWallForce.length === 0 && $SeigeArcherForce.length > 0>> <!-- Set siege distance to 0 - they've reached the walls --> <<set $SeigeDistance = 0>> <!-- Initialize WallEnemies to show enemies on the wall --> <<if typeof $WallEnemies === "undefined" || $WallEnemies.length === 0>> <<set $WallEnemies = []>> <<set _enemiesOnWall = Math.min($SiegeCombatants, 15)>> <<for _i to 0; _i < _enemiesOnWall; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $WallEnemies.push({ id: "bandit-" + _i, gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <<set $SiegeEnemiesClimbing = Math.max(0, $SiegeCombatants - _enemiesOnWall)>> <<set $SiegeEnemiesAtBase = 0>> <</if>> <div class="text-box"> <h1>Enemy at the Walls</h1> <div class="battle-phase-alert"> <p>The bandits have reached the castle walls unopposed!</p> </div> <div class="battle-narrative"> <p>With no vanguard to meet them and no defenders on the walls, the bandits swarm forward with their ladders and ropes.</p> <div class="battle-image"> <img src="Images/Seige/Battle/ladders.png" alt="Bandits with Ladders"> </div> <p>Your archers are the only force standing between the enemy and a complete breach. They fire desperately at the climbers, but without support they cannot hold the walls!</p> <<if $ArmouryArrows > 0 || $ArmouryCorruptedArrows > 0>> <!-- Archers get one final volley --> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _maxArrows = Math.min($SeigeArcherForce.length, ($ArcherArrowType === "regular" ? $ArmouryArrows : $ArmouryCorruptedArrows))>> <<for _i to 0; _i < _maxArrows; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Shortsword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <<if $ArcherArrowType === "regular" && _enemiesKilled > 0>> <p>Your archers manage to kill <<print _enemiesKilled>> bandits in a desperate final volley!</p> <<elseif $ArcherArrowType === "corrupted" && _enemiesCorrupted > 0>> <p>Your archers corrupt <<print _enemiesCorrupted>> bandits with their final volley!</p> <<elseif (_enemiesKilled === 0 && $ArcherArrowType === "regular") || (_enemiesCorrupted === 0 && $ArcherArrowType === "corrupted")>> <p>Your archers fire desperately but fail to hit any targets in the chaos!</p> <</if>> <<else>> <p>Your archers are out of arrows and can only watch as the enemy climbs the walls!</p> <</if>> <p style="color: #c90; font-weight: bold;">The archers retreat from the walls before they are overrun!</p> <!-- Auto-retreat archers to courtyard (same as player-ordered retreat) --> <!-- Set retreat flag FIRST so tactical map shows correct position --> <<set $ArchersRetreated to true>> <<if !$CourtyardDefenders>><<set $CourtyardDefenders = []>><</if>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $CourtyardDefenders.push($SeigeArcherForce[_i])>> <</for>> <!-- Keep archers in SeigeArcherForce temporarily for tactical map display --> <!-- They'll be cleared after the map is shown --> <!-- Move any barracks forces to courtyard --> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<run $CourtyardDefenders.push($BarraksOccupance[_i])>> <</for>> <<set $BarraksOccupance = []>> <p>The walls are breached! The bandits pour into the courtyard where your defenders make their final stand.</p> <p><<print $CourtyardDefenders.length>> defenders prepare for the last battle.</p> </div> </div> <<include "SiegeTacticalMap">> <!-- Now clear archer force after map display --> <<set $SeigeArcherForce = []>> <div class="text-box flex-buttons"> <<button "Fight in the Courtyard">> <<goto "CourtyardBattle">> <</button>> </div> <!-- Normal scenario: Some defenders present --> <<else>> <div class="text-box"> <h1>Enemy at the Walls</h1> <div class="battle-phase-alert"> <p>The bandits have reached the castle walls and are preparing to climb them with ladders and ropes!</p> </div> <!-- Set siege distance to 0 - they've reached the walls --> <<set $SeigeDistance = 0>> <!-- Handle skip-ahead archer volleys if player chooses to skip ahead --> <<if $SeigeDistance > 0>> <div class="skipped-volleys"> <h2>Archer Volleys</h2> <<set _totalVolleys = Math.ceil($SeigeDistance / 10)>> <<set _totalEnemiesKilled = 0>> <<set _totalEnemiesCorrupted = 0>> <<set _totalArrowsUsed = 0>> <<if $SeigeArcherForce.length > 0 && ($ArmouryArrows > 0 || $ArmouryCorruptedArrows > 0)>> <!-- Process archer volleys for each 10 meters --> <<for _volley to 0; _volley < _totalVolleys; _volley++>> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _arrowsUsed = 0>> <<set _maxArrowsPerVolley = Math.min($SeigeArcherForce.length, ($ArcherArrowType === "regular" ? $ArmouryArrows : $ArmouryCorruptedArrows))>> <<for _i to 0; _i < _maxArrowsPerVolley; _i++>> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<set _arrowsUsed += 1>> <<set _totalArrowsUsed += 1>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <<set _totalEnemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<set _arrowsUsed += 1>> <<set _totalArrowsUsed += 1>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <<set _totalEnemiesCorrupted += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Shortsword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</if>> <</if>> <</for>> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <</for>> <p>Your archers fire <<print _totalVolleys>> volleys of arrows as the enemy approaches the walls!</p> <<if _totalEnemiesKilled > 0>> <p>They manage to kill <<print _totalEnemiesKilled>> bandits.</p> <<set _arrowImageNum = Math.ceil(random(1, 3))>> <<set _arrowPath = "Images/Seige/Battle/arrows-" + _arrowImageNum + ".png">> <div class="battle-image"> <img @src="_arrowPath" alt="Arrow Volleys"> </div> <</if>> <<if _totalEnemiesCorrupted > 0>> <p style="color: purple;">They corrupt <<print _totalEnemiesCorrupted>> bandits, binding them to your will.</p> <<set _corruptedPath = "Images/Seige/Combat/Corrupted/1.png">> <div class="battle-image"> <img @src="_corruptedPath" alt="Corrupted Enemies"> </div> <</if>> <p>Total arrows used: <<print _totalArrowsUsed>></p> <<else>> <p>Your archers were unable to fire as the enemy approached, either because you have no archers positioned or because they ran out of arrows.</p> <</if>> </div> <</if>> </div> <<include "SiegeTacticalMap">> <div class="text-box"> <!-- Vanguard Section --> <<if $SeigeVanguardForce.length > 0>> <div class="vanguard-section"> <h2>Vanguard Sortie</h2> <p>Your vanguard force bursts through the gates to meet the enemy before they can scale the walls!</p> <!-- Display image based on who is in the vanguard --> <<set _lucyInVanguard = false>> <<set _aliceInVanguard = false>> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<if $SeigeVanguardForce[_i].name === "Lucy">> <<set _lucyInVanguard = true>> <</if>> <<if $SeigeVanguardForce[_i].name === "Alice">> <<set _aliceInVanguard = true>> <</if>> <</for>> <<if _lucyInVanguard && _aliceInVanguard>> <div class="vanguard-image"> <img src="Images/Seige/Vanguard/LucyandAlice.png" alt="Alice and Lucy lead the vanguard"> <p>Alice and Lucy lead your forces in a daring assault against the enemy.</p> </div> <<elseif _lucyInVanguard>> <div class="vanguard-image"> <img src="Images/Seige/Vanguard/Lucy.png" alt="Lucy leads the vanguard"> <p>Lucy leads your forces with dark determination, her eyes glowing with power as she prepares to corrupt the enemy.</p> </div> <<elseif _aliceInVanguard>> <div class="vanguard-image"> <img src="Images/Seige/Vanguard/Alice.png" alt="Alice leads the vanguard"> <p>Alice commands your vanguard with calculated precision, her corruption magic ready to ensnare the bandits.</p> </div> <<else>> <!-- Get the first vanguard member's hair color --> <<set _firstVanguard = $SeigeVanguardForce[0]>> <<set _vanguardName = _firstVanguard.name || "A warrior">> <!-- Make sure we define _hairColor before using it --> <<set _hairColor = "Brown">> <!-- Default if no hair color is found --> <!-- Check for direct hairColor property first --> <<if _firstVanguard.hairColor>> <<set _hairColor = _firstVanguard.hairColor>> <<elseif _firstVanguard.character && _firstVanguard.character.hairColor>> <<set _hairColor = _firstVanguard.character.hairColor>> <</if>> <!-- Capitalize first letter for proper file naming --> <<if typeof _hairColor === "string" && _hairColor.length > 0>> <<set _hairColor = _hairColor.charAt(0).toUpperCase() + _hairColor.slice(1)>> <</if>> <!-- Limit to known hair colors --> <<if _hairColor !== "Blonde" && _hairColor !== "Brown" && _hairColor !== "Red">> <<set _hairColor = "Brown">> <</if>> <!-- Set the image path with the @src syntax --> <<set _imagePath = "Images/Seige/Vanguard/" + _hairColor + ".png">> <!-- Alternative path if needed --> <<set _alternateImagePath = "Images/Siege/Vanguard/" + _hairColor + ".png">> <div class="vanguard-image"> <!-- Use @src for dynamic image path --> <img @src="_imagePath" alt="<<print _vanguardName>> leads the charge" onerror="this.onerror=null; this.src='<<print _alternateImagePath>>';"> <p><<print _vanguardName>> leads your forces into battle, weapon raised high.</p> </div> <</if>> <p><<print $SeigeVanguardForce.length>> warriors stream out to intercept the attackers before they can establish a foothold on the walls.</p> <<if $SeigeVanguardForce.length >= 5>> <p>The bandits are caught off guard by the size of your sortie!</p> <</if>> </div> <<else>> <div class="wall-defense-only"> <p>With no vanguard to meet them in the field, the bandits reach the walls unopposed and begin setting up their ladders.</p> <p>The first wave of attackers begins their ascent immediately, scrambling up ropes and ladders!</p> <p>Your wall defenders prepare to repel the climbers as they reach the top.</p> <div class="battle-image"> <img src="Images/Seige/Battle/wall-defenders.png" alt="Wall Defenders"> </div> </div> <</if>> <!-- Battle Stats --> <div class="battle-stats"> <div class="enemy-stats text-box"> <h3>Enemy Forces</h3> <p>Remaining Bandits: <<print $SiegeCombatants>></p> <p>Bandits at the Wall: <<print Math.min($SiegeCombatants, 20)>></p> </div> <div class="defender-stats text-box"> <h3>Your Defenses</h3> <p>Archers: <<print $SeigeArcherForce.length>></p> <p>Wall Defenders: <<print $SeigeWallForce.length>></p> <p>Vanguard: <<print $SeigeVanguardForce.length>></p> </div> </div> <!-- Archer Decision Section (only if no vanguard) --> <<if $SeigeVanguardForce.length === 0 && $SeigeArcherForce.length > 0>> <<if typeof $ArcherDecisionMade === "undefined">><<set $ArcherDecisionMade to false>><</if>> <div class="battle-options"> <h2>Tactical Decision Required</h2> <p>The bandits are climbing the walls. What orders will you give your archers?</p> <div class="option-container"> <<if !$ArcherDecisionMade>> <div class="option-box" id="archer-decision"> <h3>Archers at Risk</h3> <p>Your archers are vulnerable to enemy fire as they stand on the battlements. Order them to retreat or draw melee weapons to join the wall defense.</p> <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 10px;"> <<button "Order Archers to Retreat">> <<set $ArchersRetreated to true>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Ordered to Retreat</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<replace "#battle-button">> <<button "Defend the Walls">> <<set $ArcherDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</button>> <<button "Order Archers to Draw Melee Weapons">> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $SeigeWallForce.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Joined Wall Defense</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<replace "#battle-button">> <<button "Defend the Walls">> <<set $ArcherDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</button>> </div> </div> <<else>> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Orders Given</p> <div class="decision-overlay">ORDERED</div> </div> <</if>> </div> </div> <</if>> <div class="battle-controls"> <div class="flex-buttons" id="battle-button"> <<if $SeigeVanguardForce.length > 0>> <<button "Begin the Battle">> <<goto "SiegeWallBattle">> <</button>> <<elseif $SeigeArcherForce.length > 0 && !$ArcherDecisionMade>> <!-- Button will appear after archer decision --> <<else>> <<button "Defend the Walls">> <<if typeof $ArcherDecisionMade !== "undefined">><<set $ArcherDecisionMade to false>><</if>> <<goto "WallTopBattle">> <</button>> <</if>> </div> </div> </div> <style> .battle-phase-alert { background-color: #ffe6e6; border: 2px solid #ff0000; padding: 15px; margin-bottom: 20px; text-align: center; font-weight: bold; font-size: 1.2em; } .battle-stats { display: flex; justify-content: space-between; margin: 20px 0; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); } .vanguard-section, .wall-defense-only, .skipped-volleys { margin: 20px 0; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; } .vanguard-image, .battle-image { margin: 15px auto; text-align: center; } .vanguard-image img, .battle-image img { max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } .vanguard-image p { margin-top: 10px; font-style: italic; color: #666;6; } .battle-controls { margin: 30px 0; text-align: center; } .flex-buttons { display: flex; justify-content: center; gap: 15px; } .battle-options { margin: 30px 0; padding: 20px; background-color: rgba(255, 255, 200, 0.3); border: 2px solid #ff9900; border-radius: 5px; } .option-container { display: flex; flex-direction: column; gap: 15px; margin-top: 15px; } .option-box { padding: 15px; background-color: rgba(255, 255, 255, 0.8); border: 2px solid #666; border-radius: 5px; } .decision-overlay { position: absolute; top: 10px; right: 10px; background-color: rgba(0, 128, 0, 0.8); color: white; padding: 5px 10px; border-radius: 3px; font-weight: bold; font-size: 0.9em; } </style> <</if>> <</nobr>>
<<nobr>> <!-- Initialize DeadVanguard array if needed --> <<if typeof $DeadVanguard === "undefined">><<set $DeadVanguard = []>><</if>> <div class="text-box"> <h1>Vanguard Defeated</h1> <!-- Set flag for defeated vanguard --> <<set $VanguardDefeated to true>> <div class="battle-narrative"> <p>A hush falls over the battlements as the last of your vanguard falls before the overwhelming enemy forces. Their valiant stand bought precious time, but now the full weight of the enemy assault turns toward your walls.</p> <div class="battle-image"> <img src="Images/Seige/Battle/defeat.png" alt="Vanguard Defeated"> </div> <!-- Display fallen fighters --> <h2>The Fallen Vanguard</h2> <div class="fallen-section"> <p>Your brave warriors who fell in battle before the gates:</p> <<set _regularFallen = []>> <<set _demonicBanished = []>> <!-- Sort the dead into regular and demonic --> <<for _i to 0; _i < $DeadVanguard.length; _i++>> <<capture _fallen>> <<set _fallen = $DeadVanguard[_i]>> <<if _fallen.name === "Lucy" || _fallen.name === "Alice">> <<run _demonicBanished.push(_fallen)>> <<else>> <<run _regularFallen.push(_fallen)>> <</if>> <</capture>> <</for>> <div class="fallen-container"> <!-- Display regular fallen --> <<for _i to 0; _i < _regularFallen.length; _i++>> <<capture _fallen>> <<set _fallen = _regularFallen[_i]>> <div class="character-card card" style="filter: grayscale(100%); opacity: 0.8; position: relative; margin: 10px;"> <div class="card-name"><<print _fallen.name>></div> <div class="card-image"> <img @src="_fallen.ImagePath" alt="<<print _fallen.name>>"> </div> <div class="fallen-overlay">SLAIN</div> <div class="card-stats"> <p class="card-description" style="color: #900;">Fought bravely to the last breath</p> <p class="card-effects">Their sacrifice will not be forgotten</p> </div> </div> <</capture>> <</for>> <!-- Display banished demons --> <<for _i to 0; _i < _demonicBanished.length; _i++>> <<capture _demon>> <<set _demon = _demonicBanished[_i]>> <div class="character-card card" style="background: linear-gradient(to bottom, #4b0082 0%, #2a0048 100%); border-color: #9400d3; position: relative; margin: 10px;"> <div class="card-name" style="color: #e6e6fa;"><<print _demon.name>></div> <div class="card-image"> <img @src="_demon.ImagePath" alt="<<print _demon.name>>" style="opacity: 0.7;"> </div> <div class="fallen-overlay" style="background-color: rgba(148, 0, 211, 0.7);">BANISHED</div> <div class="card-stats"> <p class="card-description" style="color: #e6e6fa;">This demon has been banished back to their realm by the bandits' attacks.</p> <p class="card-effects" style="color: #d8bfd8;">They will recover their power and return in time.</p> </div> </div> <</capture>> <</for>> </div> <<if _regularFallen.length > 0>> <p style="color: red; margin-top: 15px;"><<print _regularFallen.length>> brave warriors gave their lives in defense of your castle.</p> <</if>> <<if _demonicBanished.length > 0>> <p style="color: purple; margin-top: 15px;"><<print _demonicBanished.map(d => d.name).join(" and ")>> <<if _demonicBanished.length === 1>>has<<else>>have<</if>> been banished back to the demonic realm.</p> <</if>> <!-- Clear the vanguard and dead vanguard arrays --> <<set $SeigeVanguardForce = []>> <<set $DeadVanguard = []>> </div> </div> </div> <<include "SiegeTacticalMap">> <div class="text-box"> <!-- Wall escalation section --> <div class="wall-assault"> <h2>The Assault Intensifies</h2> <p>With your vanguard eliminated, the bandits press their advantage and swarm toward the walls. Ladders rise against the battlements, and grappling hooks are thrown upward.</p> <!-- Calculate increased risk to defenders --> <<set _defenderRisk = Math.min(70, 30 + ($SiegeCombatants / 5))>> <!-- Higher risk percentage --> <<set _archerRisk = Math.min(50, 20 + ($SiegeCombatants / 8))>> <!-- Higher risk percentage --> <<set _woundedWallDefenders = []>> <<set _killedWallDefenders = []>> <<set _woundedArchers = []>> <<set _killedArchers = []>> <!-- Process risks for wall defenders --> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <<if random(1, 100) <= _defenderRisk>> <<set _damageAmount = random(25, 45)>> <!-- More damage --> <<set _defender.health -= _damageAmount>> <<if _defender.health <= 0>> <<run _killedWallDefenders.push(_defender)>> <<else>> <<run _woundedWallDefenders.push(_defender)>> <</if>> <</if>> <</capture>> <</for>> <!-- Process risks for archers --> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i]>> <<if random(1, 100) <= _archerRisk>> <<set _damageAmount = random(20, 40)>> <!-- More damage --> <<set _archer.health -= _damageAmount>> <<if _archer.health <= 0>> <<run _killedArchers.push(_archer)>> <<else>> <<run _woundedArchers.push(_archer)>> <</if>> <</if>> <</capture>> <</for>> <!-- Wall Defense Section - Only show if wall defenders exist --> <<if $SeigeWallForce.length > 0>> <div class="action-section"> <h3>Wall Defense</h3> <<set _enemiesKnockedDown = 0>> <<set _commanderBonus = $WallDefenseCommander === "Lucy" ? 15 : ($WallDefenseCommander === "Alice" ? 18 : 0)>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <<if _defender.health > 0>> <!-- Only healthy defenders can fight --> <<set _baseHitChance = Math.min(_defender.skill || 30, 50)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKnockedDown += 1>> <<if _defender.specialization === "Combat" || _defender.weapon === "Sword">> <<if random(1, 3) === 1>> <<set _enemiesKnockedDown += 1>> <</if>> <</if>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= _enemiesKnockedDown>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <p>Your defenders desperately repel the ladders and drop stones on the attackers, knocking down <<print _enemiesKnockedDown>> bandits.</p> <<if _enemiesKnockedDown >= 5>> <<set _rocksFallingPath = "Images/Seige/Battle/rocks-falling.png">> <div class="battle-image"> <img @src="_rocksFallingPath" alt="Rocks Falling"> </div> <</if>> </div> <<else>> <div class="action-section"> <h3>Wall Undefended!</h3> <p style="color: red; font-weight: bold;">There are no defenders stationed on the walls! The bandits are able to climb their ladders unopposed.</p> <div class="battle-image"> <img src="Images/Seige/Battle/ladders.png" alt="Bandits Climbing Ladders"> </div> </div> <</if>> <!-- Archer Volleys Section - Only show if archers exist --> <<if $SeigeArcherForce.length > 0>> <div class="action-section"> <h3>Archer Volleys</h3> <<if ($ArmouryArrows > 0 || $ArmouryCorruptedArrows > 0)>> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _arrowsUsed = 0>> <<set _maxArrowsPerTurn = Math.min($SeigeArcherForce.length, ($ArcherArrowType === "regular" ? $ArmouryArrows : $ArmouryCorruptedArrows))>> <<for _i to 0; _i < _maxArrowsPerTurn; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <<if _archer.health > 0>> <!-- Only healthy archers can shoot --> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</if>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <<if _arrowsUsed > 0>> <<if $ArcherArrowType === "regular">> <p>Your archers frantically fire a volley of <<print _arrowsUsed>> regular arrows, killing <<print _enemiesKilled>> bandits trying to scale the wall.</p> <<if _enemiesKilled > 0>> <<set _arrowImageNum = Math.ceil(random(1, 3))>> <<set _arrowPath = "Images/Seige/Battle/arrows-" + _arrowImageNum + ".png">> <div class="battle-image"> <img @src="_arrowPath" alt="Arrow Volley"> </div> <</if>> <<else>> <p>Your archers fire a volley of <<print _arrowsUsed>> corrupted arrows, corrupting <<print _enemiesCorrupted>> bandits and binding them to your will.</p> <<if _enemiesCorrupted > 0>> <<set _corruptedPath = "Images/Seige/Combat/Corrupted/1.png">> <div class="battle-image"> <img @src="_corruptedPath" alt="Corrupted Enemies"> </div> <</if>> <</if>> <<else>> <p>Your archers are out of <<print $ArcherArrowType === "regular" ? "regular" : "corrupted">> arrows!</p> <</if>> <<else>> <p>Your archers are unable to continue firing - they've run out of arrows!</p> <</if>> </div> <<else>> <div class="action-section"> <h3>No Archers Available</h3> <p>There are no archers stationed on the walls to provide covering fire.</p> </div> <</if>> <!-- Display casualties among defenders --> <<if _woundedWallDefenders.length > 0 || _killedWallDefenders.length > 0 || _woundedArchers.length > 0 || _killedArchers.length > 0>> <div class="casualties-section"> <h3>Defender Casualties</h3> <p>With your vanguard eliminated, the enemy concentrates their full attack on your wall defenders and archers. A hail of arrows and spears fly over the battlements.</p> <<if _woundedWallDefenders.length > 0>> <p><<print _woundedWallDefenders.length>> wall defenders are wounded by enemy missiles.</p> <</if>> <<if _killedWallDefenders.length > 0>> <p style="color: red;"><<print _killedWallDefenders.length>> wall defenders are killed in the assault.</p> <</if>> <<if _woundedArchers.length > 0>> <p><<print _woundedArchers.length>> archers are wounded while returning fire.</p> <</if>> <<if _killedArchers.length > 0>> <p style="color: red;"><<print _killedArchers.length>> archers are killed by enemy fire.</p> <</if>> <!-- Remove the killed defenders --> <<set $SeigeWallForce = $SeigeWallForce.filter(defender => defender.health > 0)>> <<set $SeigeArcherForce = $SeigeArcherForce.filter(archer => archer.health > 0)>> </div> <</if>> </div> <div class="battle-status"> <h2>Battle Status</h2> <div class="battle-stats"> <div class="enemy-stats text-box"> <h3>Enemy Forces</h3> <p>Remaining Bandits: <<print $SiegeCombatants>></p> <p>Bandits at the Wall: <<print Math.min($SiegeCombatants, 20)>></p> </div> <div class="defender-stats text-box"> <h3>Your Defenses</h3> <p>Archers: <<print $SeigeArcherForce.length>></p> <p>Wall Defenders: <<print $SeigeWallForce.length>></p> <p style="color: red;">Vanguard: 0 (Defeated)</p> </div> </div> </div> <div class="battle-options"> <h2>Tactical Options</h2> <p>The bandits are climbing the walls. What orders will you give?</p> <<if typeof $ArcherDecisionMade === "undefined">><<set $ArcherDecisionMade to false>><</if>> <<if typeof $BarracksDecisionMade === "undefined">><<set $BarracksDecisionMade to false>><</if>> <div class="option-container"> <<if $SeigeArcherForce.length > 0 && !$ArcherDecisionMade>> <div class="option-box" id="archer-decision"> <h3>Archers at Risk</h3> <p>Your archers are vulnerable to enemy as they stand on the battlements. Order them to retreat or draw melee weapons.</p> <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 10px;"> <<button "Order Archers to Retreat">> <<set $ArchersRetreated to true>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Ordered to Retreat</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $BarracksDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $BarracksDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> <<button "Order Archers to Draw Melee Weapons">> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $SeigeWallForce.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Joined Wall Defense</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $BarracksDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $BarracksDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> </div> </div> <<elseif $SeigeArcherForce.length === 0>> <<set $ArcherDecisionMade to true>> <<elseif $ArcherDecisionMade>> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Decision Made</p> <div class="decision-overlay">ORDERED</div> </div> <</if>> <<if $BarraksOccupance && $BarraksOccupance.length > 0 && !$BarracksDecisionMade>> <div class="option-box" id="barracks-decision"> <h3>Reinforce the Walls</h3> <p>You could call on soldiers in the barracks to reinforce the battlements.</p> <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 10px;"> <<button "Call Barracks Forces to Walls">> <<if typeof $BarraksOccupance === "undefined">><<set $BarraksOccupance = []>><</if>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<run $SeigeWallForce.push($BarraksOccupance[_i])>> <</for>> <<set $BarraksOccupance = []>> <<set $BarracksDecisionMade to true>> <<replace "#barracks-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Barracks Forces Sent to Walls</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $ArcherDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $BarracksDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> <<button "Leave Barracks Forces in Reserve">> <<set $BarracksDecisionMade to true>> <<replace "#barracks-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Barracks Forces Held in Reserve</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $ArcherDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $BarracksDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> </div> </div> <<else>> <<set $BarracksDecisionMade to true>> <<if $BarracksDecisionMade>> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Decision Made</p> <div class="decision-overlay">ORDERED</div> </div> <</if>> <</if>> </div> <div class="final-option"> <span id="battle-button"> <<if $ArcherDecisionMade && $BarracksDecisionMade>> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $BarracksDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <<else>> <p style="color: orange; font-style: italic;">You must make decisions about your forces before proceeding to battle.</p> <</if>> </span> </div> </div> </div> <style> .fallen-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; margin: 20px 0; } .battle-image { text-align: center; margin: 15px 0; } .battle-image img { max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } .battle-stats { display: flex; justify-content: space-between; margin: 20px 0; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); } .action-section, .casualties-section, .morale-effect { margin-bottom: 20px; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; } .casualties-section { border-color: #900; background-color: rgba(139, 0, 0, 0.05); } .morale-effect { border-color: #ffa500; background-color: rgba(255, 165, 0, 0.05); } .battle-controls { margin: 30px 0; text-align: center; } .flex-buttons { display: flex; justify-content: center; gap: 15px; } .fallen-section { margin: 20px 0; padding: 15px; border: 2px solid #900; background-color: rgba(139, 0, 0, 0.05); border-radius: 5px; } /* Character Card Styling */ .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .card-description, .card-effects { font-size: 0.75em; text-align: center; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin: 3px 0; } .card-effects { color: #444; } .card-description { color: #666; font-style: italic; margin-top: auto; } .fallen-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); background-color: rgba(139, 0, 0, 0.7); color: white; padding: 5px 10px; font-weight: bold; font-size: 1.5em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; } .decision-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-15deg); background-color: rgba(0, 100, 0, 0.8); color: white; padding: 8px 15px; font-weight: bold; font-size: 1.3em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; pointer-events: none; } .battle-options { margin: 30px 0; padding: 20px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; } .option-container { display: flex; flex-wrap: wrap; gap: 20px; margin: 20px 0; } .option-box { flex: 1; min-width: 300px; padding: 15px; background-color: rgba(255, 255, 255, 0.7); border: 1px solid #aaa; border-radius: 5px; } .final-option { margin-top: 30px; text-align: center; } .final-option button { font-size: 1.2em; padding: 10px 20px; background-color: #900; color: white; border: none; border-radius: 5px; cursor: pointer; } .final-option button:hover { background-color: #b00; } /* Responsive design */ @media (max-width: 768px) { .battle-stats { flex-direction: column; } .enemy-stats, .defender-stats { width: 100%; margin-bottom: 20px; } } </style> <</nobr>>
<<nobr>> <div class="text-box"> <h1>Vanguard Retreat</h1> <!-- Set flag for retreated vanguard --> <<set $VanguardRetreated to true>> <div class="battle-narrative"> <p>You signal for your vanguard to fall back to the castle gates. The horn sounds three times - the retreat signal - as your forces begin to disengage from the enemy.</p> <<set _totalRetreating = $SeigeVanguardForce.length>> <<set _casualtyChance = Math.min(30, 10 + ($SiegeCombatants / 10))>> <!-- Chance increases with more enemies --> <<set _randomCasualty = random(1, 100)>> <<set _casualtyOccurred = false>> <<set _casualtyName = "">> <<set _casualtyData = null>> <!-- Check if someone will die covering the retreat --> <<if _randomCasualty <= _casualtyChance && _totalRetreating > 0>> <<set _casualtyIndex = Math.floor(random(0, _totalRetreating - 0.01))>> <<set _casualtyData = $SeigeVanguardForce[_casualtyIndex]>> <<set _casualtyName = _casualtyData.name>> <<set _casualtyOccurred = true>> <div class="casualty-alert"> <h3>Heroic Sacrifice</h3> <p>As your forces pull back, <strong><<print _casualtyName>></strong> stays behind to cover the retreat. <<print _casualtyData.name === "Lucy" || _casualtyData.name === "Alice" ? "She fights" : "They fight">> valiantly against the overwhelming enemy forces, buying precious time for the others to escape.</p> <<if _casualtyData.name === "Lucy" || _casualtyData.name === "Alice">> <p style="color: purple;">The bandits' concentrated attacks are too much even for a demon. <<print _casualtyData.name>> is banished back to her realm in a flash of dark energy.</p> <div class="character-card card" style="background: linear-gradient(to bottom, #4b0082 0%, #2a0048 100%); border-color: #9400d3; position: relative; margin: 20px auto; max-width: 200px;"> <div class="card-name" style="color: #e6e6fa;"><<print _casualtyData.name>></div> <div class="card-image"> <img @src="_casualtyData.ImagePath" alt="<<print _casualtyData.name>>" style="opacity: 0.7;"> </div> <div class="fallen-overlay" style="background-color: rgba(148, 0, 211, 0.7);">BANISHED</div> <div class="card-stats"> <p class="card-description" style="color: #e6e6fa;">Sacrificed herself to ensure the others could retreat safely.</p> </div> </div> <<else>> <p style="color: red;">In a final act of bravery, <<print _casualtyName>> falls to the enemy blades, but their sacrifice ensures the rest of your vanguard makes it back safely.</p> <div class="character-card card" style="filter: grayscale(100%); opacity: 0.8; position: relative; margin: 20px auto; max-width: 200px;"> <div class="card-name"><<print _casualtyData.name>></div> <div class="card-image"> <img @src="_casualtyData.ImagePath" alt="<<print _casualtyData.name>>"> </div> <div class="fallen-overlay">SLAIN</div> <div class="card-stats"> <p class="card-description" style="color: #900;">Died heroically covering the retreat of their comrades.</p> </div> </div> <</if>> </div> <!-- Remove the casualty from the vanguard --> <<run $SeigeVanguardForce.splice(_casualtyIndex, 1)>> <</if>> <!-- Display survivors --> <h2>Surviving Vanguard</h2> <p>The gates open briefly to allow your battered vanguard to return to safety.</p> </div> </div> <<include "SiegeTacticalMap">> <div class="text-box"> <div class="battle-narrative"> <<if $SeigeVanguardForce.length === 0>> <p>None of your vanguard survived the retreat...</p> <<else>> <div class="raider-container"> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<capture _survivor>> <<set _survivor = $SeigeVanguardForce[_i]>> <div class="raider-card" style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_survivor.ImagePath" alt="<<_survivor.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _survivor.name>></h3> <p style="margin: 2px 0;">Armor: <<print _survivor.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _survivor.weapon>></p> <p style="margin: 2px 0;">Specialization: <<if _survivor.specialization>><<print _survivor.specialization>><<else>>None<</if>></p> <div style="display: flex; justify-content: space-around; align-items: center; margin: 5px 0;"> <div style="width: 45%;"> <h4 style="margin: 0;">Health:</h4> <progress @value="_survivor.health" max="100" style="width: 100%;"></progress> </div> <div style="width: 45%;"> <h4 style="margin: 0;">Skill:</h4> <progress @value="_survivor.skill" max="100" style="width: 100%;"></progress> </div> </div> </div> <</capture>> <</for>> </div> <p>Your vanguard has returned to the safety of the castle courtyard, though many bear wounds from the fighting. You must now decide whether to send them back into battle or let them rest.</p> <</if>> </div> <!-- Wall escalation section --> <div class="wall-assault"> <h2>The Assault Intensifies</h2> <p>With your vanguard no longer holding the enemy at bay, the bandits press their advantage and swarm toward the walls. Ladders rise against the battlements, and grappling hooks are thrown upward.</p> <!-- Calculate increased risk to defenders --> <<set _defenderRisk = Math.min(60, 20 + ($SiegeCombatants / 5))>> <!-- Risk percentage --> <<set _archerRisk = Math.min(40, 15 + ($SiegeCombatants / 8))>> <!-- Risk percentage --> <<set _woundedWallDefenders = []>> <<set _killedWallDefenders = []>> <<set _woundedArchers = []>> <<set _killedArchers = []>> <!-- Process risks for wall defenders --> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <<if random(1, 100) <= _defenderRisk>> <<set _damageAmount = random(20, 40)>> <<set _defender.health -= _damageAmount>> <<if _defender.health <= 0>> <<run _killedWallDefenders.push(_defender)>> <<else>> <<run _woundedWallDefenders.push(_defender)>> <</if>> <</if>> <</capture>> <</for>> <!-- Process risks for archers --> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i]>> <<if random(1, 100) <= _archerRisk>> <<set _damageAmount = random(15, 35)>> <<set _archer.health -= _damageAmount>> <<if _archer.health <= 0>> <<run _killedArchers.push(_archer)>> <<else>> <<run _woundedArchers.push(_archer)>> <</if>> <</if>> <</capture>> <</for>> <!-- Wall Defense Section - Only show if wall defenders exist --> <<if $SeigeWallForce.length > 0>> <div class="action-section"> <h3>Wall Defense</h3> <<set _enemiesKnockedDown = 0>> <<set _commanderBonus = $WallDefenseCommander === "Lucy" ? 15 : ($WallDefenseCommander === "Alice" ? 18 : 0)>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <<if _defender.health > 0>> <!-- Only healthy defenders can fight --> <<set _baseHitChance = Math.min(_defender.skill || 30, 50)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKnockedDown += 1>> <<if _defender.specialization === "Combat" || _defender.weapon === "Sword">> <<if random(1, 3) === 1>> <<set _enemiesKnockedDown += 1>> <</if>> <</if>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= _enemiesKnockedDown>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <p>Your defenders valiantly repel the ladders and drop stones on the attackers, knocking down <<print _enemiesKnockedDown>> bandits.</p> <<if _enemiesKnockedDown >= 5>> <<set _rocksFallingPath = "Images/Seige/Battle/rocks-falling.png">> <div class="battle-image"> <img @src="_rocksFallingPath" alt="Rocks Falling"> </div> <</if>> </div> <<else>> <div class="action-section"> <h3>Wall Undefended!</h3> <p style="color: red; font-weight: bold;">There are no defenders stationed on the walls! The bandits are able to climb their ladders unopposed.</p> <div class="battle-image"> <img src="Images/Seige/Battle/ladders.png" alt="Bandits Climbing Ladders"> </div> </div> <</if>> <!-- Archer Volleys Section - Only show if archers exist --> <<if $SeigeArcherForce.length > 0>> <div class="action-section"> <h3>Archer Volleys</h3> <<if ($ArmouryArrows > 0 || $ArmouryCorruptedArrows > 0)>> <<set _enemiesKilled = 0>> <<set _enemiesCorrupted = 0>> <<set _arrowsUsed = 0>> <<set _maxArrowsPerTurn = Math.min($SeigeArcherForce.length, ($ArcherArrowType === "regular" ? $ArmouryArrows : $ArmouryCorruptedArrows))>> <<for _i to 0; _i < _maxArrowsPerTurn; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i % $SeigeArcherForce.length]>> <<if _archer.health > 0>> <!-- Only healthy archers can shoot --> <<set _baseHitChance = _archer.specialization === "Archery" ? Math.min((_archer.skill || 0), 60) : 20>> <<set _commanderBonus = $ArcherCommander === "Lucy" ? 15 : ($ArcherCommander === "Alice" ? 20 : 0)>> <<set _hitChance = _baseHitChance + _commanderBonus>> <<if _hitChance > 80>><<set _hitChance = 80>><</if>> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesKilled += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<set _arrowsUsed += 1>> <<if random(1, 100) <= _hitChance>> <<set _enemiesCorrupted += 1>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: _gender, banditNumber: _banditNumber, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</if>> <</if>> <</if>> <</capture>> <</for>> <<set $SiegeCombatants -= (_enemiesKilled + _enemiesCorrupted)>> <<if $SiegeCombatants < 0>><<set $SiegeCombatants = 0>><</if>> <<if _arrowsUsed > 0>> <<if $ArcherArrowType === "regular">> <p>Your archers fire a volley of <<print _arrowsUsed>> regular arrows, killing <<print _enemiesKilled>> bandits trying to scale the wall.</p> <<if _enemiesKilled > 0>> <<set _arrowImageNum = Math.ceil(random(1, 3))>> <<set _arrowPath = "Images/Seige/Battle/arrows-" + _arrowImageNum + ".png">> <div class="battle-image"> <img @src="_arrowPath" alt="Arrow Volley"> </div> <</if>> <<else>> <p>Your archers fire a volley of <<print _arrowsUsed>> corrupted arrows, corrupting <<print _enemiesCorrupted>> bandits and binding them to your will.</p> <<if _enemiesCorrupted > 0>> <<set _corruptedPath = "Images/Seige/Combat/Corrupted/1.png">> <div class="battle-image"> <img @src="_corruptedPath" alt="Corrupted Enemies"> </div> <</if>> <</if>> <<else>> <p>Your archers are out of <<print $ArcherArrowType === "regular" ? "regular" : "corrupted">> arrows!</p> <</if>> <<else>> <p>Your archers are unable to continue firing - they've run out of arrows!</p> <</if>> </div> <<else>> <div class="action-section"> <h3>No Archers Available</h3> <p>There are no archers stationed on the walls to provide covering fire.</p> </div> <</if>> <!-- Display casualties among defenders --> <<if _woundedWallDefenders.length > 0 || _killedWallDefenders.length > 0 || _woundedArchers.length > 0 || _killedArchers.length > 0>> <div class="casualties-section"> <h3>Defender Casualties</h3> <p>With your vanguard withdrawn, the enemy concentrates their fire on your wall defenders and archers. Arrows and spears fly over the battlements.</p> <<if _woundedWallDefenders.length > 0>> <p><<print _woundedWallDefenders.length>> wall defenders are wounded by enemy missiles.</p> <</if>> <<if _killedWallDefenders.length > 0>> <p style="color: red;"><<print _killedWallDefenders.length>> wall defenders are killed in the assault.</p> <</if>> <<if _woundedArchers.length > 0>> <p><<print _woundedArchers.length>> archers are wounded while returning fire.</p> <</if>> <<if _killedArchers.length > 0>> <p style="color: red;"><<print _killedArchers.length>> archers are killed by enemy fire.</p> <</if>> <!-- Remove the killed defenders --> <<set $SeigeWallForce = $SeigeWallForce.filter(defender => defender.health > 0)>> <<set $SeigeArcherForce = $SeigeArcherForce.filter(archer => archer.health > 0)>> </div> <</if>> </div> <div class="battle-status"> <h2>Battle Status</h2> <div class="battle-stats"> <div class="enemy-stats text-box"> <h3>Enemy Forces</h3> <p>Remaining Bandits: <<print $SiegeCombatants>></p> <p>Bandits at the Wall: <<print Math.min($SiegeCombatants, 20)>></p> </div> <div class="defender-stats text-box"> <h3>Your Defenses</h3> <p>Archers: <<print $SeigeArcherForce.length>></p> <p>Wall Defenders: <<print $SeigeWallForce.length>></p> <p style="color: cyan;">Vanguard: <<print $SeigeVanguardForce.length>> (In Courtyard)</p> </div> </div> </div> <div class="battle-options"> <h2>Tactical Options</h2> <p>The bandits are climbing the walls. What orders will you give?</p> <<if typeof $ArcherDecisionMade === "undefined">><<set $ArcherDecisionMade to false>><</if>> <<if typeof $VanguardDecisionMade === "undefined">><<set $VanguardDecisionMade to false>><</if>> <div class="option-container"> <<if $SeigeArcherForce.length > 0 && !$ArcherDecisionMade>> <div class="option-box" id="archer-decision"> <h3>Archers at Risk</h3> <p>Your archers are vulnerable to enemy as they stand on the battlements. Order them to retreat or draw melee weapons. If they retreat, they will not be able to attack until the enemy are in the courtyard</p> <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 10px;"> <<button "Order Archers to Retreat">> <<set $ArchersRetreated to true>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Ordered to Retreat</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $VanguardDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $VanguardDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> <<button "Order Archers to Draw Melee Weapons">> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $SeigeWallForce.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <<set $ArcherDecisionMade to true>> <<replace "#archer-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Archers Joined Wall Defense</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $VanguardDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $VanguardDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> </div> </div> <<elseif $SeigeArcherForce.length === 0>> <<set $ArcherDecisionMade to true>> <<elseif $ArcherDecisionMade>> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Archers at Risk</h3> <p style="color: green; font-weight: bold;">✓ Decision Made</p> <div class="decision-overlay">ORDERED</div> </div> <</if>> <<if $SeigeVanguardForce.length > 0 && !$VanguardDecisionMade>> <div class="option-box" id="vanguard-decision"> <h3>Reinforce the Walls</h3> <p>You could call the retreated vanguard to help defend the battlements, or leave them to recover in the courtyard (Each survivor will regain 20 health).</p> <div style="display: flex; flex-direction: column; gap: 10px; margin-top: 10px;"> <<button "Call Vanguard to Battlements">> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<run $SeigeWallForce.push($SeigeVanguardForce[_i])>> <</for>> <<set $SeigeVanguardForce = []>> <<set $VanguardRetreated to false>> <<set $VanguardDecisionMade to true>> <<replace "#vanguard-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Vanguard Sent to Battlements</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $ArcherDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $VanguardDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> <<button "Let Vanguard Recover">> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<set $SeigeVanguardForce[_i].health = Math.min($SeigeVanguardForce[_i].health + 20, 100)>> <</for>> <<set $VanguardDecisionMade to true>> <<replace "#vanguard-decision">> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Vanguard Recovering in Courtyard</p> <div class="decision-overlay">ORDERED</div> </div> <</replace>> <<if $ArcherDecisionMade>> <<replace "#battle-button">> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $VanguardDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <</replace>> <</if>> <</button>> </div> </div> <<else>> <<set $VanguardDecisionMade to true>> <<if $VanguardDecisionMade && ($SeigeVanguardForce.length > 0 || $BarraksOccupance.length > 0)>> <div class="option-box" style="position: relative; opacity: 0.7;"> <h3>Reinforce the Walls</h3> <p style="color: green; font-weight: bold;">✓ Decision Made</p> <div class="decision-overlay">ORDERED</div> </div> <</if>> <</if>> </div> <div class="final-option"> <span id="battle-button"> <<if $ArcherDecisionMade && $VanguardDecisionMade>> <<button "Repel the Attackers">> <<set $ArcherDecisionMade to false>> <<set $VanguardDecisionMade to false>> <<goto "WallTopBattle">> <</button>> <<else>> <p style="color: orange; font-style: italic;">You must make decisions about your forces before proceeding to battle.</p> <</if>> </span> </div> </div> </div> <style> .raider-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; } .raider-card { width: 220px; margin: 5px; padding: 8px; border: 2px solid #333; border-radius: 8px; background-color: rgba(0, 0, 0, 0.05); font-family: Arial, sans-serif; text-align: center; transition: all 0.3s; } .raider-card:hover { box-shadow: 0 0 8px rgba(0, 0, 0, 0.3); } .battle-image { text-align: center; margin: 15px 0; } .battle-image img { max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } .battle-stats { display: flex; justify-content: space-between; margin: 20px 0; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); } .action-section, .casualties-section { margin-bottom: 20px; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; } .casualties-section { border-color: #900; background-color: rgba(139, 0, 0, 0.05); } .battle-controls { margin: 30px 0; text-align: center; } .flex-buttons { display: flex; justify-content: center; gap: 15px; } .casualty-alert { margin: 20px 0; padding: 15px; border: 2px solid #900; background-color: rgba(139, 0, 0, 0.1); border-radius: 5px; } /* Character Card Styling */ .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .card-description { font-size: 0.75em; text-align: center; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin: 3px 0; color: #666; font-style: italic; margin-top: auto; } .fallen-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); background-color: rgba(139, 0, 0, 0.7); color: white; padding: 5px 10px; font-weight: bold; font-size: 1.5em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; } .decision-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-15deg); background-color: rgba(0, 100, 0, 0.8); color: white; padding: 8px 15px; font-weight: bold; font-size: 1.3em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; pointer-events: none; } /* Responsive design */ @media (max-width: 768px) { .battle-stats { flex-direction: column; } .enemy-stats, .defender-stats { width: 100%; margin-bottom: 20px; } } .battle-options { margin: 30px 0; padding: 20px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; } .option-container { display: flex; flex-wrap: wrap; gap: 20px; margin: 20px 0; } .option-box { flex: 1; min-width: 300px; padding: 15px; background-color: rgba(255, 255, 255, 0.7); border: 1px solid #aaa; border-radius: 5px; } .final-option { margin-top: 30px; text-align: center; } .final-option button { font-size: 1.2em; padding: 10px 20px; background-color: #900; color: white; border: none; border-radius: 5px; cursor: pointer; } .final-option button:hover { background-color: #b00; } </style> <</nobr>>
<<nobr>> <!-- Initialize forces if undefined --> <<if typeof $SeigeArcherForce === "undefined">><<set $SeigeArcherForce = []>><</if>> <<if typeof $SeigeWallForce === "undefined">><<set $SeigeWallForce = []>><</if>> <<if typeof $SiegeCaptives === "undefined">><<set $SiegeCaptives = []>><</if>> <<if typeof $DeadWallDefenders === "undefined">><<set $DeadWallDefenders = []>><</if>> <<if typeof $DeadArchers === "undefined">><<set $DeadArchers = []>><</if>> <<if typeof $SiegeKilledEnemies === "undefined">><<set $SiegeKilledEnemies = 0>><</if>> <<if typeof $LucyPower === "undefined">><<set $LucyPower = 20>><</if>> <<if typeof $AlicePower === "undefined">><<set $AlicePower = 25>><</if>> <<if typeof $WallEnemies === "undefined">><<set $WallEnemies = []>><</if>> <div class="text-box"> <h1>Battle on the Walls</h1> <div class="battle-phase-alert"> <p>The enemy is attempting to scale the walls! Your defenders must hold the battlements!</p> </div> <!-- Battle setup with improved enemy distribution --> <<if typeof $FirstWallBattleRound === "undefined">> <!-- First round setup - distribute enemies across positions --> <<set $FirstWallBattleRound = true>> <!-- Start with more enemies already on the wall --> <<set _enemiesOnWall = Math.min(Math.ceil($SiegeCombatants * 0.2), 12)>> <!-- 20% initially on wall --> <<set _enemiesClimbing = Math.min(Math.ceil($SiegeCombatants * 0.5), 25)>> <!-- 50% climbing --> <<set _enemiesAtBase = $SiegeCombatants - _enemiesOnWall - _enemiesClimbing>> <!-- Rest at base --> <!-- Initialize wall enemies with health and corruption tracking --> <<set $WallEnemies = []>> <<for _i to 0; _i < _enemiesOnWall; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $WallEnemies.push({ id: "bandit-" + _i, gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, targetedBy: null, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <<else>> <!-- Load existing enemy positions from previous round --> <<set _enemiesOnWall = $WallEnemies.length>> <<set _enemiesClimbing = $SiegeEnemiesClimbing || 0>> <<set _enemiesAtBase = $SiegeEnemiesAtBase || 0>> <!-- Balanced progression of climbing enemies to the top --> <<set _newArrivals = Math.min(Math.ceil(_enemiesClimbing * 0.35), 8)>> <!-- 35% of climbing reach top --> <<set _enemiesClimbing -= _newArrivals>> <!-- Create new enemies for arrivals --> <<for _i to 0; _i < _newArrivals; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $WallEnemies.push({ id: "bandit-" + ($WallEnemies.length + _i), gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, targetedBy: null, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <!-- More enemies start climbing each round --> <<set _newClimbers = Math.min(Math.ceil(_enemiesAtBase * 0.4), 15)>> <!-- 40% of base start climbing --> <<set _enemiesClimbing += _newClimbers>> <<set _enemiesAtBase -= _newClimbers>> <</if>> <<set _initialEnemiesOnWall = _enemiesOnWall>> <<set _totalDefenders = $SeigeWallForce.length + $SeigeArcherForce.length>> <!-- Spider Trap System --> <<if $ForestSpiderDefence is true && _enemiesAtBase > 0>> <<set _spiderTrapTriggered = random(1, 100) <= 50>> <<if _spiderTrapTriggered>> <<set _trappedCount = Math.min(random(1, 3), _enemiesAtBase)>> <<set _trapImage = random(9, 15)>> <div class="trap-event" style="background: linear-gradient(135deg, #1a3d1a 0%, #0d1f0d 100%); border: 3px solid #228b22; border-radius: 10px; padding: 20px; margin: 20px 0; box-shadow: 0 0 20px rgba(34, 139, 34, 0.5);"> <h3 style="color: #32cd32; text-align: center; margin-top: 0;">Spider Web Trap Activated!</h3> <div style="text-align: center; margin: 15px 0;"> <img @src="'Images/Seige/Trap/' + _trapImage + '.png'" alt="Spider Trap" style="max-width: 100%; max-height: 400px; height: auto; border: 2px solid #228b22; border-radius: 8px; box-shadow: 0 0 15px rgba(34, 139, 34, 0.7);"> </div> <p style="color: #90ee90; text-align: center; font-size: 1.1em; margin: 15px 0;"> <b><<print _trappedCount>> bandit<<if _trappedCount > 1>>s<</if>> stumble<<if _trappedCount === 1>>s<</if>> into sticky webs at the wall base!</b><br> Giant spiders emerge from the forest shadows and drag their helpless prey back into the dark woods... </p> </div> <!-- Remove the trapped enemies from combat --> <<set _enemiesAtBase -= _trappedCount>> <<set $SiegeCombatants -= _trappedCount>> <</if>> <</if>> <!-- Combat round calculations --> <<set _defendersCasualties = 0>> <<set _archerCasualties = 0>> <<set _enemiesDefeated = 0>> <<set _enemiesCorrupted = 0>> <<set _roundDescription = "">> <<set _lucyCorrupting = false>> <<set _aliceCorrupting = false>> <<set _banishedDemons = []>> <<set _combatLog = []>> <!-- Detailed combat log --> <!-- Assign targets to defenders --> <<if $SeigeWallForce.length > 0 && $WallEnemies.length > 0>> <<set _lucyCommanding = false>> <<set _aliceCommanding = false>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<if $SeigeWallForce[_i].name === "Lucy">><<set _lucyCommanding = true>><</if>> <<if $SeigeWallForce[_i].name === "Alice">><<set _aliceCommanding = true>><</if>> <</for>> <<set _commanderBonus = _lucyCommanding ? 15 : (_aliceCommanding ? 18 : 0)>> <!-- Reset enemy targeting --> <<for _i to 0; _i < $WallEnemies.length; _i++>> <<set $WallEnemies[_i].targetedBy = []>> <</for>> <!-- Assign targets to each defender - allow multiple defenders per enemy --> <<set _defendersPerEnemy = Math.max(1, Math.floor($SeigeWallForce.length / Math.max(1, $WallEnemies.length)))>> <<set _defendersAssigned = 0>> <!-- First pass - assign defenders evenly --> <<for _i to 0; _i < $WallEnemies.length && _defendersAssigned < $SeigeWallForce.length; _i++>> <<for _j to 0; _j < _defendersPerEnemy && _defendersAssigned < $SeigeWallForce.length; _j++>> <<run $WallEnemies[_i].targetedBy.push($SeigeWallForce[_defendersAssigned].name)>> <<set _defendersAssigned++>> <</for>> <</for>> <!-- Second pass - assign any remaining defenders --> <<for _i to 0; _defendersAssigned < $SeigeWallForce.length; _i = (_i + 1) % $WallEnemies.length>> <<run $WallEnemies[_i].targetedBy.push($SeigeWallForce[_defendersAssigned].name)>> <<set _defendersAssigned++>> <</for>> <!-- Execute combat for each enemy --> <<for _i to 0; _i < $WallEnemies.length; _i++>> <<capture _enemy>> <<set _enemy = $WallEnemies[_i]>> <<set _initialHealth = _enemy.health>> <<set _initialCorruption = _enemy.corruption>> <<set _enemyDefeated = false>> <<set _enemyCorrupted = false>> <<set _targetingDefenders = []>> <!-- Find all defenders targeting this enemy --> <<for _j to 0; _j < _enemy.targetedBy.length; _j++>> <<for _k to 0; _k < $SeigeWallForce.length; _k++>> <<if $SeigeWallForce[_k].name === _enemy.targetedBy[_j]>> <<run _targetingDefenders.push($SeigeWallForce[_k])>> <</if>> <</for>> <</for>> <!-- Process each defender's attack --> <<for _j to 0; _j < _targetingDefenders.length; _j++>> <<set _defender = _targetingDefenders[_j]>> <!-- Skip if enemy already defeated or corrupted --> <<if _enemy.health <= 0 || _enemy.corruption >= 100>><<continue>><</if>> <!-- Defender combat check --> <<set _baseSkill = _defender.skill || 30>> <<set _armorBonus = _defender.armor === "Armoured" ? 10 : 0>> <<set _weaponBonus = _defender.weapon === "Sword" ? 15 : 0>> <<set _defenderPower = _baseSkill + _armorBonus + _weaponBonus + _commanderBonus>> <!-- Enemy combat power includes numerical advantage --> <<set _enemyAdvantage = Math.min(20, Math.floor(($WallEnemies.length - $SeigeWallForce.length) * 2))>> <<if _enemyAdvantage < 0>><<set _enemyAdvantage = 0>><</if>> <<set _enemyPower = 50 + _enemyAdvantage>> <!-- Special handling for Lucy and Alice who corrupt instead of damage --> <<if _defender.name === "Lucy">> <!-- Lucy applies corruption --> <<set _corruptionAmount = $LucyPower + 20>> <<set _enemy.corruption += _corruptionAmount>> <<set _lucyCorrupting = true>> <<run _combatLog.push({type: "corruption", attacker: "Lucy", target: _enemy.gender + " Bandit", amount: _corruptionAmount, completed: _enemy.corruption >= 100})>> <!-- Check if corruption is complete --> <<if _enemy.corruption >= 100 && !_enemyCorrupted>> <<set _enemiesCorrupted += 1>> <<set _enemyCorrupted = true>> <<set _enemy.corruption = 100>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: "Lucy", gender: _enemy.gender, banditNumber: _enemy.banditNumber, ImagePath: _enemy.ImagePath })>> <</if>> <<elseif _defender.name === "Alice">> <!-- Alice applies corruption --> <<set _corruptionAmount = $AlicePower + 20>> <<set _enemy.corruption += _corruptionAmount>> <<set _aliceCorrupting = true>> <<run _combatLog.push({type: "corruption", attacker: "Alice", target: _enemy.gender + " Bandit", amount: _corruptionAmount, completed: _enemy.corruption >= 100})>> <!-- Check if corruption is complete --> <<if _enemy.corruption >= 100 && !_enemyCorrupted>> <<set _enemiesCorrupted += 1>> <<set _enemyCorrupted = true>> <<set _enemy.corruption = 100>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: "Alice", gender: _enemy.gender, banditNumber: _enemy.banditNumber, ImagePath: _enemy.ImagePath })>> <</if>> <<else>> <!-- Regular combat --> <<set _defenderWins = false>> <!-- Combat calculation --> <<if _defenderPower > _enemyPower>> <<if random(1, 100) <= 70>> <!-- 70% chance to win against weaker enemy --> <<set _defenderWins = true>> <</if>> <<elseif _defenderPower < _enemyPower>> <<if random(1, 100) <= 30>> <!-- 30% chance to win against stronger enemy --> <<set _defenderWins = true>> <</if>> <<else>> <<if random(1, 100) <= 50>> <!-- 50% chance in even match --> <<set _defenderWins = true>> <</if>> <</if>> <!-- Apply combat results --> <<if _defenderWins>> <<set _damageAmount = random(30, 50)>> <<set _enemy.health -= _damageAmount>> <<run _combatLog.push({type: "damage", attacker: _defender.name, target: _enemy.gender + " Bandit", amount: _damageAmount, killed: _enemy.health <= 0})>> <<if _enemy.health <= 0 && !_enemyDefeated>> <<set _enemiesDefeated += 1>> <<set _enemyDefeated = true>> <<set _enemy.health = 0>> <</if>> <</if>> <</if>> <</for>> <!-- Enemy gets to attack all defenders targeting it --> <<if !_enemyDefeated && !_enemyCorrupted>> <<for _j to 0; _j < _targetingDefenders.length; _j++>> <<set _defender = _targetingDefenders[_j]>> <!-- Enemy combat power includes numerical advantage --> <<set _enemyAdvantage = Math.min(25, Math.floor(($WallEnemies.length - $SeigeWallForce.length) * 2.5))>> <<if _enemyAdvantage < 0>><<set _enemyAdvantage = 0>><</if>> <<set _enemyPower = 60 + _enemyAdvantage>> <!-- Defender power calculation --> <<set _baseSkill = _defender.skill || 30>> <<set _armorBonus = _defender.armor === "Armoured" ? 10 : 0>> <<set _weaponBonus = _defender.weapon === "Sword" ? 15 : 0>> <<set _defenderPower = _baseSkill + _armorBonus + _weaponBonus + _commanderBonus>> <<set _enemyHits = false>> <<if _enemyPower > _defenderPower>> <<if random(1, 100) <= 65>> <!-- 65% chance to hit stronger defender --> <<set _enemyHits = true>> <</if>> <<elseif _enemyPower < _defenderPower>> <<if random(1, 100) <= 30>> <!-- 30% chance to hit weaker defender --> <<set _enemyHits = true>> <</if>> <<else>> <<if random(1, 100) <= 50>> <!-- 50% chance in even match --> <<set _enemyHits = true>> <</if>> <</if>> <<if _enemyHits>> <<set _damageAmount = random(25, 45)>> <<set _defender.health -= _damageAmount>> <<run _combatLog.push({type: "damage", attacker: _enemy.gender + " Bandit", target: _defender.name, amount: _damageAmount, killed: _defender.health <= 0})>> <<if _defender.health <= 0>> <<set _defendersCasualties += 1>> <<run $DeadWallDefenders.push(_defender)>> <<if _defender.name === "Lucy" || _defender.name === "Alice">> <<run _banishedDemons.push(_defender.name)>> <</if>> <</if>> <</if>> <</for>> <</if>> <</capture>> <</for>> <!-- Store dead defenders before filtering --> <<set _deadThisRound = []>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<if $SeigeWallForce[_i].health <= 0>> <<run _deadThisRound.push($SeigeWallForce[_i])>> <</if>> <</for>> <!-- Remove dead defenders --> <<set $SeigeWallForce = $SeigeWallForce.filter(defender => defender.health > 0)>> <!-- Store defeated/corrupted enemies before filtering --> <<set _defeatedThisRound = []>> <<set _corruptedThisRound = []>> <<for _i to 0; _i < $WallEnemies.length; _i++>> <<if $WallEnemies[_i].health <= 0>> <<run _defeatedThisRound.push($WallEnemies[_i])>> <<elseif $WallEnemies[_i].corruption >= 100>> <<run _corruptedThisRound.push($WallEnemies[_i])>> <</if>> <</for>> <!-- Remove defeated or corrupted enemies --> <<set $WallEnemies = $WallEnemies.filter(enemy => enemy.health > 0 && enemy.corruption < 100)>> <!-- Add description of the battle's intensity based on enemy numbers --> <<if _initialEnemiesOnWall > 10>> <<set _roundDescription += "The walls are swarming with bandits! Your defenders are overwhelmed and fighting desperately. ">> <<elseif _initialEnemiesOnWall > 5>> <<set _roundDescription += "The battle on the walls is fierce with enemies pressing hard. ">> <<else>> <<set _roundDescription += "The battle on the walls rages on. ">> <</if>> <<if _defendersCasualties > 0>> <<set _roundDescription += _defendersCasualties === 1 ? "One defender falls in combat. " : _defendersCasualties + " defenders fall in combat. ">> <</if>> <<if _enemiesDefeated > 0>> <<set _roundDescription += _enemiesDefeated === 1 ? "Your forces manage to defeat one bandit. " : "Your forces defeat " + _enemiesDefeated + " bandits. ">> <<set $SiegeKilledEnemies += _enemiesDefeated>> <</if>> <<if _enemiesCorrupted > 0>> <<set _roundDescription += _enemiesCorrupted === 1 ? "One bandit is corrupted and now serves you. " : _enemiesCorrupted + " bandits are corrupted and now serve you. ">> <</if>> <<elseif $SeigeWallForce.length > 0 && $WallEnemies.length <= 0>> <<set _roundDescription += "Your defenders stand ready on the walls, waiting for enemies to reach the top. ">> <<elseif $SeigeWallForce.length <= 0 && $WallEnemies.length > 0>> <<set _roundDescription += "With no defenders on the walls, the bandits secure a foothold on the battlements. ">> <</if>> <!-- Archer combat - they can attack climbing enemies --> <<if $SeigeArcherForce.length > 0>> <<set _archerHitChance = 50>> <!-- Base archer hit chance --> <<set _archerCommanderBonus = $ArcherCommander === "Lucy" ? 10 : ($ArcherCommander === "Alice" ? 12 : 0)>> <<set _archersKilled = 0>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i]>> <!-- Archers are vulnerable if enemies reach the wall top --> <<if $WallEnemies.length > 0>> <!-- Archer vulnerability increases dramatically with more enemies --> <<set _archerDeathChance = Math.min(90, 45 + (12 * Math.floor($WallEnemies.length / 2)))>> <<if random(1, 100) <= _archerDeathChance>> <<set _archer.health -= random(50, 90)>> <<if _archer.health <= 0>> <<set _archerCasualties += 1>> <<run $DeadArchers.push(_archer)>> <</if>> <</if>> <</if>> <!-- Archers can shoot at climbing enemies, but with reduced effectiveness when many ladders are present --> <<set _ladderPenalty = Math.min(35, Math.floor(_enemiesClimbing / 4) * 5)>> <<if _archer.health > 0 && _enemiesClimbing > 0 && random(1, 100) <= (_archerHitChance + _archerCommanderBonus - _ladderPenalty)>> <<set _archersKilled += 1>> <<set _enemiesClimbing -= 1>> <<set $SiegeKilledEnemies += 1>> <</if>> <</capture>> <</for>> <!-- Remove dead archers --> <<set $SeigeArcherForce = $SeigeArcherForce.filter(archer => archer.health > 0)>> <<if _archerCasualties > 0>> <<set _roundDescription += _archerCasualties === 1 ? "One archer falls in the melee. " : _archerCasualties + " archers fall in the melee. ">> <</if>> <<if _archersKilled > 0>> <<set _roundDescription += _archersKilled === 1 ? "Your archers shoot down one climbing bandit. " : "Your archers shoot down " + _archersKilled + " climbing bandits. ">> <</if>> <<if _enemiesClimbing > 12>> <<set _roundDescription += "There are too many ladders for your archers to effectively target all climbers. ">> <</if>> <</if>> <!-- Random events to add pressure --> <<if random(1, 100) <= 30 && _enemiesAtBase > 0>> <<set _surpriseClimbers = Math.min(5, _enemiesAtBase)>> <<set _enemiesAtBase -= _surpriseClimbers>> <!-- Create new enemies for surprise arrivals --> <<for _i to 0; _i < _surpriseClimbers; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $WallEnemies.push({ id: "bandit-surprise-" + _i, gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, targetedBy: [], ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <<set _roundDescription += "A group of bandits used grappling hooks to bypass your defenses and reach the top of the wall! ">> <</if>> <!-- Save enemy positions for next round --> <<set $SiegeEnemiesOnWall = $WallEnemies.length>> <<set $SiegeEnemiesClimbing = _enemiesClimbing>> <<set $SiegeEnemiesAtBase = _enemiesAtBase>> <!-- Add narration based on enemy movements --> <<if $WallEnemies.length === 0 && _enemiesClimbing > 0>> <<if _enemiesClimbing > 15>> <<set _roundDescription += "The wall is surrounded by ladders with enemies climbing rapidly toward the battlements! ">> <<else>> <<set _roundDescription += "Enemies continue to climb the walls. Your defenders prepare for their arrival. ">> <</if>> <</if>> <<if _enemiesClimbing === 0 && _enemiesAtBase > 0>> <<set _roundDescription += "More enemies are moving ladders into position at the base of the walls. ">> <</if>> <!-- Combat Summary MOVED ABOVE CARDS --> <div class="combat-round"> <h2>Battle Results</h2> <p><<print _roundDescription>></p> <!-- Detailed Combat Summary --> <<if _combatLog.length > 0>> <div style="background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; padding: 10px; margin: 15px 0;"> <h3 style="margin-top: 0;">Combat Details:</h3> <ul style="margin: 5px 0; padding-left: 20px; max-height: 300px; overflow-y: auto;"> <<for _i to 0; _i < _combatLog.length; _i++>> <<set _log = _combatLog[_i]>> <<if _log.type === "damage">> <<if _log.killed>> <li style="color: #8b0000; font-weight: bold;"><<print _log.attacker>> dealt <<print _log.amount>> damage to <<print _log.target>> - <strong>KILLED</strong></li> <<else>> <li style="color: #444;"><<print _log.attacker>> dealt <<print _log.amount>> damage to <<print _log.target>></li> <</if>> <<elseif _log.type === "corruption">> <<if _log.completed>> <li style="color: purple; font-weight: bold;"><<print _log.attacker>> corrupted <<print _log.target>> (+<<print _log.amount>>) - <strong>CAPTURED</strong></li> <<else>> <li style="color: #9c27b0;"><<print _log.attacker>> applied <<print _log.amount>> corruption to <<print _log.target>></li> <</if>> <</if>> <</for>> </ul> </div> <</if>> <!-- Display corruption image for Lucy if she corrupted enemies --> <<if _lucyCorrupting>> <<set _lucyImageNum = Math.ceil(random(1, 3))>> <<set _lucyCorruptPath = "Images/Seige/Lucy/" + _lucyImageNum + ".png">> <div class="battle-image"> <img @src="_lucyCorruptPath" alt="Lucy Corrupting"> <p style="color: purple; font-style: italic;">Lucy unleashes her corruption magic, binding enemies to her will.</p> </div> <</if>> <!-- Display corruption image for Alice if she corrupted enemies --> <<if _aliceCorrupting>> <<set _aliceImageNum = Math.ceil(random(1, 3))>> <<set _aliceCorruptPath = "Images/Seige/Alice/" + _aliceImageNum + ".png">> <div class="battle-image"> <img @src="_aliceCorruptPath" alt="Alice Corrupting"> <p style="color: purple; font-style: italic;">Alice's corruption power flows through the battlefield, ensnaring her foes.</p> </div> <</if>> <!-- Banished demons notification --> <<if _banishedDemons.length > 0>> <div class="battle-image" style="background-color: rgba(128, 0, 128, 0.1); border: 2px solid purple; padding: 15px; margin: 15px 0;"> <h3 style="color: purple;">Banished!</h3> <p style="color: purple;"><<print _banishedDemons.join(", ")>> <<if _banishedDemons.length === 1>>has<<else>>have<</if>> been banished back to the void</p> <p style="color: #9c27b0; font-style: italic;"><<if _banishedDemons.length === 1>>They<<else>>She<</if>> will recover her power and return to her chambers in time.</p> </div> <</if>> <!-- Show combat image based on the battle --> <<if $SeigeWallForce.length > 0 && _initialEnemiesOnWall > 0 && (_enemiesDefeated > 0 || _enemiesCorrupted > 0) && !_lucyCorrupting && !_aliceCorrupting>> <<set _combatImageNum = Math.ceil(random(1, 6))>> <<set _wallCombatPath = "Images/Seige/Combat/" + _combatImageNum + ".png">> <div class="battle-image"> <img @src="_wallCombatPath" alt="Combat on the walls"> </div> <</if>> </div> <!-- Battle Visualization with Side-by-Side Cards --> <div class="battle-visualization"> <h2>Forces on the Battlefield</h2> <div class="ground-battle-section"> <!-- Defender Forces --> <<if $SeigeWallForce.length > 0>> <div class="vanguard-forces text-box"> <h3>Your Defenders (<<print $SeigeWallForce.length>>)</h3> <div class="combat-table"> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<capture _defender>> <<set _defender = $SeigeWallForce[_i]>> <!-- Set default image path if missing --> <<if !_defender.ImagePath>> <<if _defender.name === "Lucy">> <<set _defender.ImagePath = "Images/Seige/Lucy/portrait.png">> <<elseif _defender.name === "Alice">> <<set _defender.ImagePath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _defender.ImagePath = "Images/Seige/Icons/fighter.png">> <</if>> <</if>> <div class="character-card card"> <div class="card-name"><<print _defender.name>></div> <div class="card-image"> <img @src="_defender.ImagePath" alt="<<print _defender.name>>"> </div> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em;">Health:</h4> <progress @value="_defender.health" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: <<print _defender.health || 100>>/100</p> <<if _defender.name === "Lucy">> <p class="card-description" style="color: purple;">Corruption: <<print $LucyPower + 20>> per turn</p> <<elseif _defender.name === "Alice">> <p class="card-description" style="color: purple;">Corruption: <<print $AlicePower + 20>> per turn</p> <</if>> <<if _defender.weapon>> <p class="card-effects">Weapon: <<print _defender.weapon>></p> <</if>> <<if _defender.armor>> <p class="card-effects">Armor: <<print _defender.armor>></p> <</if>> </div> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Enemy Forces --> <div class="enemy-forces text-box"> <h3>Enemies on Wall (<<print $WallEnemies.length>>)</h3> <div class="combat-table <<if $WallEnemies.length === 0>>empty<</if>>"> <<set _displayedEnemies = Math.min($WallEnemies.length, 6)>> <<for _i to 0; _i < _displayedEnemies; _i++>> <<capture _enemy>> <<set _enemy = $WallEnemies[_i]>> <div class="character-card card enemy-card"> <div class="card-name"><<print _enemy.gender>> Bandit</div> <div class="card-image"> <img @src="_enemy.ImagePath" alt="Bandit"> </div> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em; color: #ff6666;">Health:</h4> <progress @value="_enemy.health" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: <<print _enemy.health>>/100</p> <<if _enemy.corruption > 0>> <h4 style="margin: 0; font-size: 0.8em; color: #9c27b0;">Corruption:</h4> <progress @value="_enemy.corruption" max="100" style="width: 100%;" class="corruption-progress"></progress> <p class="card-effects">Corruption: <<print Math.floor(_enemy.corruption)>>/100</p> <</if>> </div> </div> <</capture>> <</for>> <<if $WallEnemies.length > 6>> <div class="more-enemies"> <div class="card enemy-card" style="width: 80px; min-height: 120px; display: flex; align-items: center; justify-content: center;"> <div style="text-align: center;"> <strong style="font-size: 1.5em;">+<<print $WallEnemies.length - 6>></strong><br> <span style="font-size: 0.8em;">more</span> </div> </div> </div> <</if>> </div> </div> </div> </div> <!-- Tactical Map Visualization MOVED HERE --> <div class="wall-battle-visualization"> <h2>Tactical Overview</h2> <<include "SiegeTacticalMap">> <div class="battle-stats"> <div class="enemy-stats text-box"> <h3>Enemy Forces</h3> <p>Bandits on the Walls: <<print $WallEnemies.length>></p> <p>Bandits Below: <<print _enemiesClimbing + _enemiesAtBase>></p> <p>Total Bandits Remaining: <<print $WallEnemies.length + _enemiesClimbing + _enemiesAtBase>></p> </div> <div class="defender-stats text-box"> <h3>Your Defenses</h3> <p>Wall Defenders: <<print $SeigeWallForce.length>></p> <p>Archers: <<print $SeigeArcherForce.length>></p> <p>Captive Bandits: <<print $SiegeCaptives.length>></p> <p>Bandits Killed: <<print $SiegeKilledEnemies>></p> </div> </div> </div> <!-- Detailed Cards Section --> <div class="combat-round"> <!-- Display casualties with cards --> <<if _defendersCasualties > 0 || _archerCasualties > 0 || _enemiesDefeated > 0 || _enemiesCorrupted > 0>> <div class="casualties-section"> <h3>Casualties This Round</h3> <div class="combat-table" style="background-color: rgba(139, 0, 0, 0.05); border-color: #900;"> <!-- Dead Defenders --> <<if $DeadWallDefenders.length > 0>> <<for _i to Math.max(0, $DeadWallDefenders.length - _defendersCasualties); _i < $DeadWallDefenders.length; _i++>> <<capture _dead>> <<set _dead = $DeadWallDefenders[_i]>> <<if !_dead.ImagePath>> <<if _dead.name === "Lucy">> <<set _dead.ImagePath = "Images/Seige/Lucy/portrait.png">> <<elseif _dead.name === "Alice">> <<set _dead.ImagePath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _dead.ImagePath = "Images/Seige/Icons/fighter.png">> <</if>> <</if>> <div class="character-card card card-dead" style="position: relative;"> <div class="card-overlay defeat">SLAIN</div> <div class="card-name"><<print _dead.name>></div> <div class="card-image"> <img @src="_dead.ImagePath" alt="<<print _dead.name>>"> </div> <div class="card-stats"> <p class="card-damage" style="color: #8b0000;">Killed in Action</p> </div> </div> <</capture>> <</for>> <</if>> <!-- Dead Archers --> <<if $DeadArchers.length > 0>> <<for _i to Math.max(0, $DeadArchers.length - _archerCasualties); _i < $DeadArchers.length; _i++>> <<capture _dead>> <<set _dead = $DeadArchers[_i]>> <<if !_dead.ImagePath>> <<set _dead.ImagePath = "Images/Seige/Icons/archer.png">> <</if>> <div class="character-card card card-dead" style="position: relative;"> <div class="card-overlay defeat">SLAIN</div> <div class="card-name"><<print _dead.name || "Archer">></div> <div class="card-image"> <img @src="_dead.ImagePath" alt="Archer"> </div> <div class="card-stats"> <p class="card-damage" style="color: #8b0000;">Killed in Melee</p> </div> </div> <</capture>> <</for>> <</if>> <!-- Defeated/Corrupted Enemies --> <<if _enemiesDefeated > 0>> <<for _i to 0; _i < Math.min(_enemiesDefeated, 6); _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<set _banditPath = _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg">> <div class="character-card card enemy-card card-dead" style="position: relative;"> <div class="card-overlay defeat">SLAIN</div> <div class="card-name"><<print _gender>> Bandit</div> <div class="card-image"> <img @src="_banditPath" alt="Bandit"> </div> <div class="card-stats"> <p class="card-damage" style="color: #ff0000;">Defeated</p> </div> </div> <</for>> <<if _enemiesDefeated > 6>> <div class="more-enemies"> <div class="card enemy-card" style="width: 100px; min-height: 140px; display: flex; align-items: center; justify-content: center;"> <div style="text-align: center; color: #8b0000;"> <strong style="font-size: 1.5em;">+<<print _enemiesDefeated - 6>></strong><br> <span style="font-size: 0.9em;">slain</span> </div> </div> </div> <</if>> <</if>> </div> </div> <</if>> </div> <!-- Battle options --> <div class="battle-options"> <h2>What Will You Do?</h2> <<set _totalEnemiesRemaining = $WallEnemies.length + _enemiesClimbing + _enemiesAtBase>> <<if $SeigeWallForce.length > 0 && _totalEnemiesRemaining > 0>> <div class="option-box"> <h3>Continue Fighting</h3> <p>Your forces can continue to hold the walls against the attackers.</p> <<button "Fight On" class="execute-combat-btn">> <<goto "WallTopBattle">> <</button>> </div> <div class="option-box"> <h3>Regroup in the Courtyard</h3> <p>Pull back from the walls and consolidate your forces in the courtyard for a defensive stand.</p> <<button "Regroup in Courtyard">> <!-- Update total enemies --> <<set $SiegeCombatants = $WallEnemies.length + _enemiesClimbing + _enemiesAtBase>> <<goto "CourtyardBattle">> <</button>> </div> <<elseif $SeigeWallForce.length > 0 && _totalEnemiesRemaining <= 0>> <!-- Victory --> <div class="option-box" style="background-color: rgba(0, 200, 0, 0.1); border-color: #0a0;"> <h3>Victory!</h3> <p>You have successfully defended the walls! The bandits are defeated!</p> <<button "Secure the Castle" class="execute-combat-btn">> <<set $BeingSeiged = false>> <<goto "SiegeVictory">> <</button>> </div> <<else>> <div class="option-box defeated"> <h3>Your forces have been defeated</h3> <p>All your defenders on the walls have fallen. The bandits have secured the battlements.</p> <<button "Continue">> <<set $SiegeCombatants = $WallEnemies.length + _enemiesClimbing + _enemiesAtBase>> <<goto "SiegeDefeated">> <</button>> </div> <</if>> </div> </div> <style> /* Base Styles */ .battle-phase-alert { background-color: #ffe6e6; border: 2px solid #ff0000; padding: 15px; margin-bottom: 20px; text-align: center; font-weight: bold; font-size: 1.2em; } .battle-image { text-align: center; margin: 15px 0; } .battle-image img { max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } .combat-round { margin: 20px 0; padding: 15px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; } .casualties-section { margin: 15px 0; padding: 10px; background-color: rgba(139, 0, 0, 0.05); border: 1px solid #900; border-radius: 5px; } .battle-stats { display: flex; justify-content: space-between; margin: 20px 0; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); } /* Combat Visualization Styles */ .combat-visualization { margin: 20px 0; padding: 15px; background-color: rgba(0, 0, 0, 0.03); border: 1px solid #ddd; border-radius: 5px; } /* Ground Battle Section - Side by Side Layout */ .ground-battle-section { display: flex; gap: 20px; margin: 20px 0; flex-wrap: wrap; } .vanguard-forces, .enemy-forces { flex: 1; min-width: 300px; background-color: rgba(255, 255, 255, 0.8); border: 2px solid #8b4513; border-radius: 8px; padding: 15px; } .enemy-forces { border-color: #8b0000; background-color: rgba(255, 240, 240, 0.8); } .combat-pairings { display: flex; flex-wrap: wrap; gap: 20px; justify-content: center; } .combat-pair { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; padding: 10px; background-color: rgba(0, 0, 0, 0.02); border-radius: 8px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .battle-indicator { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 5px 10px; } .battle-result { font-weight: bold; font-size: 1.2em; text-transform: uppercase; color: #444; } .battle-result.defeat { color: #cc0000; } .battle-result.corrupt { color: #9400d3; } .card-overlay { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotate(-30deg); padding: 5px 10px; font-weight: bold; font-size: 1.5em; border: 2px solid #fff; text-shadow: 1px 1px 3px #000; z-index: 10; color: white; } .card-overlay.defeat { background-color: rgba(139, 0, 0, 0.7); } .card-overlay.corrupt { background-color: rgba(148, 0, 211, 0.7); } .card-dead { filter: grayscale(90%); opacity: 0.8; } .card-corrupted { background: linear-gradient(to bottom, #4b0082 0%, #2a0048 100%); border-color: #9400d3; color: #e6e6fa; } .empty-card { background: linear-gradient(45deg, #ddd 25%, #eee 25%, #eee 50%, #ddd 50%, #ddd 75%, #eee 75%); background-size: 20px 20px; opacity: 0.7; } /* Wall Visualization Styles */ .wall-battle-visualization { margin: 30px 0; padding: 20px; background-color: rgba(0, 0, 0, 0.03); border: 1px solid #ddd; border-radius: 5px; } .castle-wall-container { display: flex; flex-direction: column; gap: 30px; margin: 20px 0; position: relative; } /* Wall Sections */ .wall-section { position: relative; padding: 15px; border-radius: 5px; margin-bottom: 10px; } .wall-top { background-color: rgba(139, 69, 19, 0.15); border: 1px solid #8B4513; } .wall-climbing { background-color: rgba(160, 82, 45, 0.1); border: 1px solid #A0522D; } .wall-base { background-color: rgba(210, 180, 140, 0.15); border: 1px solid #D2B48C; } /* Combat Areas in Wall Top */ .combat-area { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 15px; } .defenders-area, .archers-area, .enemies-area { flex: 1; min-width: 300px; } /* Combat Table Style */ .combat-table { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; min-height: 80px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } .combat-table.empty { background: linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%), linear-gradient(45deg, #1a0a00 25%, transparent 25%, transparent 75%, #1a0a00 75%); background-size: 20px 20px; background-position: 0 0, 10px 10px; opacity: 0.7; } .combat-table.empty::after { content: "No cards deployed"; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; color: #666; font-style: italic; text-transform: uppercase; letter-spacing: 1px; } /* Character Card Styling */ .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .character-card.card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4), 0 0 15px rgba(139, 69, 19, 0.3); } .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%); color: #ff4444; border-color: #8b0000; } .enemy-card .card-name { color: #ff6666; } .climbing-card { transform: rotate(30deg); margin-top: 20px; } .base-card { transform: rotate(-10deg); } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .enemy-card .card-name { color: #ff6666; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); } /* Card image improvements */ .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .card-damage, .card-effects, .card-description { font-size: 0.75em; text-align: center; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin: 3px 0; } .card-damage { font-weight: bold; color: #8b0000; } .card-effects { color: #444; } .card-description { color: #666; font-style: italic; margin-top: auto; } /* Ladder Visualization */ .ladder-section { display: flex; justify-content: space-around; align-items: flex-end; height: 150px; background: linear-gradient(to bottom, #8B4513 0%, #A0522D 100%); border-radius: 5px; margin: 15px 0; position: relative; padding: 10px; } .ladder-container { position: relative; height: 100%; width: 60px; } .ladder { position: absolute; width: 40px; height: 100%; left: 10px; display: flex; flex-direction: column; justify-content: space-between; padding: 5px 0; } .ladder-rung { height: 5px; width: 100%; background-color: #D2B48C; border: 1px solid #8B4513; } .climbing-enemy { position: absolute; width: 30px; height: 30px; left: 15px; display: flex; justify-content: center; align-items: center; } .enemy-token { width: 20px; height: 20px; background-color: #8B0000; border-radius: 50%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); } .climbing-info { margin-top: 20px; } .no-ladders { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: #D2B48C; font-style: italic; } /* Corrupted Section */ .corrupted-section { margin-top: 30px; background-color: rgba(75, 0, 130, 0.1); padding: 15px; border-radius: 5px; border: 1px solid #4B0082; } /* More enemies indicator */ .more-enemies { margin-left: 15px; } /* Battle Options */ .battle-options { margin: 30px 0; } .option-box { padding: 15px; margin: 15px 0; background-color: rgba(255, 255, 255, 0.7); border: 1px solid #aaa; border-radius: 5px; text-align: center; } .option-box button { margin-top: 10px; padding: 10px 20px; font-size: 1.1em; cursor: pointer; } .option-box.defeated { background-color: rgba(139, 0, 0, 0.1); border-color: #900; } /* Execute Combat Button */ .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.1em !important; padding: 12px 25px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 20px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) !important; } /* Responsive design */ @media (max-width: 768px) { .battle-stats { flex-direction: column; } .enemy-stats, .defender-stats { width: 100%; margin-bottom: 20px; } .combat-area { flex-direction: column; } .character-card.card { width: 120px; min-height: 180px; } .card-image { height: 60px; width: 60px; } .ladder-section { height: 120px; } } </style> <</nobr>>
<<nobr>> /* Lucy Random Interaction System */ /* Only show debug in development */ <<set _debugMode = false>> <<set _showInteraction = _debugMode ? true : (random(1, 100) <= 40)>> <<silently>> /* Initialize debug info array */ <<set _debugInfo = []>> <<run _debugInfo.push(`BarraksOccupance exists: ${$BarraksOccupance ? 'Yes' : 'No'}`)>> <<run _debugInfo.push(`BarraksOccupance length: ${$BarraksOccupance ? $BarraksOccupance.length : 'N/A'}`)>> /* If we're showing an interaction, decide which type */ <<if _showInteraction>> /* Initialize possible interaction targets */ <<set _possibleTargets = []>> /* Check for Alice */ <<if $AliceCorrupt is true>> <<run _possibleTargets.push({ type: "alice", name: "Alice", probability: 30 })>> <<run _debugInfo.push(`Alice is available for interaction`)>> <<else>> <<run _debugInfo.push(`Alice is not unlocked`)>> <</if>> /* Check for guards in barracks */ <<if $BarraksOccupance && $BarraksOccupance.length > 0>> <<run _debugInfo.push(`Number of guards in barracks: ${$BarraksOccupance.length}`)>> /* Log all guards for debugging */ <<for _i = 0; _i < $BarraksOccupance.length; _i++>> <<set _guard = $BarraksOccupance[_i]>> <<run _debugInfo.push(`Guard ${_i+1}: ${_guard.name}, Sex: ${_guard.sex || 'Unknown'}, Hair: ${_guard.hairColor || 'Unknown'}`)>> <</for>> /* Check for blonde women - fixed filter */ <<set _blondeWomen = []>> <<for _i = 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].sex === "Female" && $BarraksOccupance[_i].hairColor === "Blonde">> <<run _blondeWomen.push($BarraksOccupance[_i])>> <</if>> <</for>> <<run _debugInfo.push(`Blonde female guards found: ${_blondeWomen.length}`)>> <<if _blondeWomen.length > 0>> <<run _possibleTargets.push({ type: "blonde", name: _blondeWomen[0].name || "the blonde guard", character: _blondeWomen[0], imagePath: _blondeWomen[0].ImagePath, probability: 20 })>> <</if>> /* Check for red-haired women - fixed filter */ <<set _redheadWomen = []>> <<for _i = 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].sex === "Female" && $BarraksOccupance[_i].hairColor === "Red">> <<run _redheadWomen.push($BarraksOccupance[_i])>> <</if>> <</for>> <<run _debugInfo.push(`Red-haired female guards found: ${_redheadWomen.length}`)>> <<if _redheadWomen.length > 0>> <<run _possibleTargets.push({ type: "redhead", name: _redheadWomen[0].name || "the red-haired guard", character: _redheadWomen[0], imagePath: _redheadWomen[0].ImagePath, probability: 20 })>> <</if>> /* Check for brown-haired women - fixed filter */ <<set _brownHairWomen = []>> <<for _i = 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].sex === "Female" && $BarraksOccupance[_i].hairColor === "Brown">> <<run _brownHairWomen.push($BarraksOccupance[_i])>> <</if>> <</for>> <<run _debugInfo.push(`Brown-haired female guards found: ${_brownHairWomen.length}`)>> <<if _brownHairWomen.length > 0>> <<run _possibleTargets.push({ type: "brunette", name: _brownHairWomen[0].name || "the brown-haired guard", character: _brownHairWomen[0], imagePath: _brownHairWomen[0].ImagePath, probability: 20 })>> <</if>> <<else>> <<run _debugInfo.push(`No guards in barracks or BarraksOccupance is undefined`)>> <</if>> /* Add the "alone" option */ <<run _possibleTargets.push({ type: "alone", name: "alone", probability: 10 })>> <<run _debugInfo.push(`Added "alone" option as fallback`)>> /* Calculate total probability weight */ <<set _totalWeight = 0>> <<for _target range _possibleTargets>> <<set _totalWeight += _target.probability>> <</for>> <<run _debugInfo.push(`Total probability weight: ${_totalWeight}`)>> /* Select a random target based on weighted probabilities */ <<set _randomValue = _debugMode ? 1 : random(1, _totalWeight)>> <<run _debugInfo.push(`Random value rolled: ${_randomValue}`)>> <<set _runningTotal = 0>> <<set _selectedTarget = null>> <<for _target range _possibleTargets>> <<set _runningTotal += _target.probability>> <<run _debugInfo.push(`Option: ${_target.type}, Probability: ${_target.probability}, Running total: ${_runningTotal}`)>> <<if _randomValue <= _runningTotal && !_selectedTarget>> <<set _selectedTarget = _target>> <<run _debugInfo.push(`Selected target: ${_target.type}`)>> <</if>> <</for>> /* If somehow we don't have a selected target, default to alone */ <<if !_selectedTarget>> <<set _selectedTarget = { type: "alone", name: "alone" }>> <<run _debugInfo.push(`No target selected, defaulted to "alone"`)>> <</if>> <</if>> <</silently>> /* Debug Info Display (only in debug mode) */ <<if _debugMode>> <div style="background-color: #333; color: #0f0; padding: 10px; font-family: monospace; border: 1px solid #0f0; margin-bottom: 20px;"> <h3>Lucy Interaction System Debug</h3> <<for _info range _debugInfo>> <div><<print _info>></div> <</for>> <h4>Raw BarraksOccupance Data:</h4> <pre><<print JSON.stringify($BarraksOccupance, null, 2)>></pre> <h4>Selected Interaction:</h4> <pre><<print JSON.stringify(_selectedTarget, null, 2)>></pre> </div> <</if>> /* Only show the interaction if _showInteraction is true */ <<if _showInteraction>> <<set $ChamberInteraction to true>> <div class="random-interaction" style="border: 1px solid #666; padding: 15px; margin: 15px 0; background-color: rgba(0,0,0,0.3); border-radius: 5px;"> <h3>Lucys chambers</h3> <<switch _selectedTarget.type>> <<case "alice">> <p>You enter Lucy's chambers to find her with Alice</p> <<set _rand to random(1, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lesbian/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>$LucyName, care to join us?<</say>> <p><<button "Approach them">> <<replace "#interaction-result">> You strip down and climb onto the bed <<set _rand to random(1, 3)>> <<if _rand is 1>> Alice moves to the side as you relax into the bed, taking Lucys hand and guiding her onto you, aiming your manhood at her while she slides down you <<say 'Alice' $AliceImg>>Thats it...<</say>><br> <<elseif _rand is 2>> Alice takes the lead, confidently straddling you and quickly spearing herslef with your cock before gridning on you slowly<br> Enjoying the site before her, Lucy joins in by cimbing onto you and lowering herself onto your face<br> None of you say anything as the chamber is filled with with the sounds of passion and low moans of pleasure <<else>> Lucy continues to kiss Alice while you get behind her and press your cock into her tight inviting hole. Lucys moan is stifled by the kiss she shared with Alice and they continue embracing as you speed up <<say 'Lucy' $LucyImg>>Muph! Umm<</say>> <</if>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> You change position and continue using your two most loyal servants <<set _rand to random(4, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> After what feels like an hour of sharing eachother, you eventally tire and relax on the bed allowing the two succubi to worship your cock until you cum <<set _rand to random(1, 3)>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/Cum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave">> <<goto "Castle Chambers">> <</button>> <</replace>> <</button>> | <<button "Leave them be">> <<goto "Castle Chambers">> <</button>></p> <div id="interaction-result"></div> <<case "blonde">> <p>You enter the chamber to find lucy in bed with <<print _selectedTarget.name>> The guard is moaning as Lucy teases her</p> <<set _rand to random(5, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lucy/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>$LucyName! <<print _selectedTarget.name>> was guarding the halls and she looked soooo board... I hope you don't mind<</say>> <<say ' _selectedTarget.name' _selectedTarget.imagePath>>Lord... I can explain... oooo<</say>> Lucys fingers press deeper and _selectedTarget.name stops trying to explain <p> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Lucy to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus1">> <</button>> </p> <div id="interaction-result"></div> <<case "redhead">> <p>You enter the chamber to find lucy in bed with <<print _selectedTarget.name>> The guard is moaning as Lucy teases her</p> <<set _rand to random(3, 4)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lucy/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>$LucyName! <<print _selectedTarget.name>> bet I couldn't make her loose focus on her guard duty.... I won the bet!<</say>> <<say ' _selectedTarget.name' _selectedTarget.imagePath>>Lord... I... Oh...<</say>> <p> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Lucy to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus1">> <</button>> </p></div> <<case "brunette">> <p>You enter the chamber to find lucy in bed with <<print _selectedTarget.name>> The guard is moaning as Lucy teases her</p> <<set _rand to random(1, 2)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lucy/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>$LucyName! <<print _selectedTarget.name>> and I were just getting to know eachother<</say>> <<say ' _selectedTarget.name' _selectedTarget.imagePath>>Lord... I... Oh...<</say>> <p> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Lucy to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus1">> <</button>> </p> <div id="interaction-result"></div> <<case "alone">> Entering her chamber, you find Lucy teasing herself on her bed <<set _rand to random(7, 8)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lucy/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <p> <<button "Leave her">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Lucy to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus1">> <</button>> </p> <div id="interaction-result"></div> <</switch>> </div> <</if>> <</nobr>>
<<nobr>> /* Alice Random Interaction System */ /* Configure interaction chance */ <<set _debugMode = false>> <<set _showInteraction = _debugMode ? true : (random(1, 100) <= 40)>> <<silently>> /* Initialize debug info array */ <<set _debugInfo = []>> /* If we're showing an interaction, decide which type */ <<if _showInteraction>> /* Initialize possible interaction targets */ <<set _possibleTargets = []>> /* Check for Lucy */ <<if $LucyUnlocked is true>> <<run _possibleTargets.push({ type: "lucy", name: "Lucy", probability: 20 })>> <<run _debugInfo.push(`Lucy is available for interaction`)>> <<else>> <<run _debugInfo.push(`Lucy is not unlocked`)>> <</if>> /* Check for male guards in barracks */ <<if $BarraksOccupance && $BarraksOccupance.length > 0>> <<set _maleGuards = []>> <<for _i = 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].sex === "Male">> <<run _maleGuards.push($BarraksOccupance[_i])>> <</if>> <</for>> <<run _debugInfo.push(`Male guards found: ${_maleGuards.length}`)>> /* Alice with one male guard */ <<if _maleGuards.length > 0>> <<run _possibleTargets.push({ type: "oneMaleGuard", name: _maleGuards[0].name || "the guard", character: _maleGuards[0], imagePath: _maleGuards[0].ImagePath, probability: 25 })>> <</if>> /* Alice with two male guards */ <<if _maleGuards.length > 1>> <<run _possibleTargets.push({ type: "twoMaleGuards", guard1: _maleGuards[0], guard2: _maleGuards[1], imagePath1: _maleGuards[0].ImagePath, imagePath2: _maleGuards[1].ImagePath, probability: 20 })>> <</if>> <<else>> <<run _debugInfo.push(`No male guards in barracks or BarraksOccupance is undefined`)>> <</if>> /* Check for dungeon escapees */ <<if $DungonOccupance && $DungonOccupance.length > 0>> <<set _escapees = []>> <<for _i = 0; _i < $DungonOccupance.length; _i++>> <<if $DungonOccupance[_i].sex === "Male">> <<run _escapees.push($DungonOccupance[_i])>> <</if>> <</for>> <<run _debugInfo.push(`Male dungeon escapees found: ${_escapees.length}`)>> <<if _escapees.length > 0>> <<run _possibleTargets.push({ type: "dungeonEscapee", name: _escapees[0].name || "the prisoner", character: _escapees[0], imagePath: _escapees[0].ImagePath, probability: 35 })>> <</if>> <<else>> <<run _debugInfo.push(`No dungeon escapees or DungonOccupance is undefined`)>> <</if>> /* Calculate total probability weight */ <<set _totalWeight = 0>> <<for _target range _possibleTargets>> <<set _totalWeight += _target.probability>> <</for>> <<if _totalWeight > 0>> /* Select a random target based on weighted probabilities */ <<set _randomValue = _debugMode ? 1 : random(1, _totalWeight)>> <<run _debugInfo.push(`Random value rolled: ${_randomValue}`)>> <<set _runningTotal = 0>> <<set _selectedTarget = null>> <<for _target range _possibleTargets>> <<set _runningTotal += _target.probability>> <<run _debugInfo.push(`Option: ${_target.type}, Probability: ${_target.probability}, Running total: ${_runningTotal}`)>> <<if _randomValue <= _runningTotal && !_selectedTarget>> <<set _selectedTarget = _target>> <<run _debugInfo.push(`Selected target: ${_target.type}`)>> <</if>> <</for>> <<else>> <<set _showInteraction = false>> <<run _debugInfo.push(`No valid interaction targets available`)>> <</if>> <</if>> <</silently>> /* Debug Info Display (only in debug mode) */ <<if _debugMode>> <div style="background-color: #333; color: #0f0; padding: 10px; font-family: monospace; border: 1px solid #0f0; margin-bottom: 20px;"> <h3>Alice Interaction System Debug</h3> <<for _info range _debugInfo>> <div><<print _info>></div> <</for>> <h4>Selected Interaction:</h4> <pre><<print JSON.stringify(_selectedTarget, null, 2)>></pre> </div> <</if>> /* Only show the interaction if _showInteraction is true and we have a selected target */ <<if _showInteraction && _selectedTarget>> <<set $ChamberInteraction to true>> <div class="random-interaction" style="border: 1px solid #666; padding: 15px; margin: 15px 0; background-color: rgba(0,0,0,0.3); border-radius: 5px;"> <h3>Alice's Chambers</h3> <<switch _selectedTarget.type>> <<case "lucy">> <p>You enter Alice's chambers to find her with Lucy</p> <<set _rand to random(1, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Lesbian/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucyImg>>$LucyName, care to join us?<</say>> <p><<button "Approach them">> <<replace "#interaction-result">> You strip down and climb onto the bed <<set _rand to random(1, 3)>> <<if _rand is 1>> Alice moves to the side as you relax into the bed, taking Lucys hand and guiding her onto you, aiming your manhood at her while she slides down you <<say 'Alice' $AliceImg>>Thats it...<</say>><br> <<elseif _rand is 2>> Alice takes the lead, confidently straddling you and quickly spearing herslef with your cock before gridning on you slowly<br> Enjoying the site before her, Lucy joins in by cimbing onto you and lowering herself onto your face<br> None of you say anything as the chamber is filled with with the sounds of passion and low moans of pleasure <<else>> Lucy continues to kiss Alice while you get behind her and press your cock into her tight inviting hole. Lucys moan is stifled by the kiss she shared with Alice and they continue embracing as you speed up <<say 'Lucy' $LucyImg>>Muph! Umm<</say>> <</if>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> You change position and continue using your two most loyal servants <<set _rand to random(4, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> After what feels like an hour of sharing eachother, you eventally tire and relax on the bed allowing the two succubi to worship your cock until you cum <<set _rand to random(1, 3)>> <<set _imagePath to "Images/Castle/Chambers/Sex/3sum/Cum/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave">> <<goto "Castle Chambers">> <</button>> <</replace>> <</button>> | <<button "Leave them be">> <<goto "Castle Chambers">> <</button>></p> <div id="interaction-result"></div> <<case "oneMaleGuard">> Opening the door you find Alice enjoying the company of one of your guards. He see's you and stops dead<br><br> <<if $LucyUnlocked is true>> <<set _guard1 to _possibleTargets[1]>> <<else>> <<set _guard1 to _possibleTargets[0]>> <</if>> <<say 'Alice' $AliceImg>>$AliceName! I was so board and _guard1.name was keeping me company<</say>><br> <<set _rand to random(5, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Alice/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Alice to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus2">> <</button>> <<case "twoMaleGuards">> <<if $LucyUnlocked is true>> <<set _guard1 to _possibleTargets[1]>> <<set _guard2 to _possibleTargets[2]>> <<else>> <<set _guard1 to _possibleTargets[0]>> <<set _guard2 to _possibleTargets[1]>> <</if>> You enter Alice chamber to find her being pleasured by two of your guards _guard1 and _guard2... They are both focused solely on her. But she talks the time to look at you and smile while shes in the throws of pleasure<br><br> <<set _rand to random(1, 4)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Alice/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Alice to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus2">> <</button>> <<case "dungeonEscapee">> Entering Alice's chambers you find her with one of your prisoners <<say 'Alice' $AliceImg>>$AliceName! I found this one trying to escape... But I think I've convinced him to stay haha<</say>><br><br> <<set _rand to random(5, 6)>> <<set _imagePath to "Images/Castle/Chambers/Sex/Alice/" + _rand + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave them">> <<goto "Castle Chambers">> <</button>> <br> <<button "Tell Alice to stop">> <<set $ChamberInteraction to false>> <<goto "Succubus2">> <</button>> <</switch>> </div> <</if>> <</nobr>>
<<nobr>> <<if $selectedCharacterSource === "barracks">> <!-- First try to find the character by ID --> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <!-- Display error if character not found --> <<if !_character>> <div style="color: red; text-align: center; margin: 20px;"> <h3>Error: Character not found!</h3> <button onclick="javascript:history.back()">Go Back</button> </div> <<return>> <</if>> <!-- Only generate a random number if this is the first time or if we're resetting --> <<if !$chamberImageState || $chamberImageState === 1>> <!-- Special folders for characters with "Corruption" weapon --> <<if _character.weapon === "Corruption">> <<if !$chamberFolderNum>><<set $chamberFolderNum = random(8, 11)>><</if>> <<else>> <<if !$chamberFolderNum>><<set $chamberFolderNum = random(1, 3)>><</if>> <</if>> <</if>> <<if !$chamberImageState>><<set $chamberImageState = 1>><</if>> <<set _chamberImagePath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/" + $chamberFolderNum + "/" + $chamberImageState + ".png">> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<if !_character>> <div style="color: red; text-align: center; margin: 20px;"> <h3>Error: Character not found!</h3> <button onclick="javascript:history.back()">Go Back</button> </div> <<return>> <</if>> <!-- Initialize corruption for quarters characters if not set --> <<silently>> <<if typeof _character.corruption === 'undefined'>> <<set _character.corruption = random(0, 60)>> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === $currentPrisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = _character.corruption>> <</if>> <</if>> <</silently>> <!-- Only generate a random number if this is the first time or if we're resetting --> <<if !$chamberImageState || $chamberImageState === 1>> <<if !$chamberFolderNum>><<set $chamberFolderNum = random(6, 8)>><</if>> <</if>> <<if !$chamberImageState>><<set $chamberImageState = 1>><</if>> <<set _chamberImagePath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/" + $chamberFolderNum + "/" + $chamberImageState + ".png">> <</if>> <div class="text-box"> <h1>Chambers - <<print _character.name>></h1> <<include "ChamberCharacterDialogue">> <<if $chamberImageState === 1>> <<set _dialogueInt to random(0, 2)>> <<You>>_greetingPlayer[_dialogueInt]<</You>> _greetingAction[_dialogueInt] <<say _character.name _chamberImagePath>>_greetingNPC[_dialogueInt]<</say>> <<elseif $chamberImageState === 2>> <<set _dialogueInt to random(0, 3)>> <<You>>_undessPlayer1[_dialogueInt]<</You>> _undressAction1[_dialogueInt] <<say _character.name _chamberImagePath>>_undressNPC1[_dialogueInt]<</say>> <<else>> <<set _dialogueInt to random(0, 3)>> <<You>>_undessPlayer2[_dialogueInt]<</You>> _undressAction2[_dialogueInt] <<say _character.name _chamberImagePath>>_undressNPC2[_dialogueInt]<</say>> <</if>> <!-- Simplified layout --> <div style="text-align: center; margin: 20px 0;"> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_chamberImagePath" alt="<<_character.name>> Image"> </div> <h2 style="margin-top: 20px;"><<print _character.name>></h2> <<if $selectedCharacterSource === "barracks">> <p>Armor: <<print _character.armor>> | Weapon: <<print _character.weapon>></p> <<else>> <p>Corruption: <<print _character.corruption>></p> <</if>> <p>Specialization: <<if _character.specialization>><<print _character.specialization>><<else>>None<</if>></p> <!-- Item interaction buttons --> <div style="margin-top: 20px;"> <<if $chamberImageState === 1>> <<button "Ask her to undress">> <<set $chamberImageState = 2>> <<goto "CharacterInChambers">> <</button>> <<elseif $chamberImageState === 2>> <<button "Let her continue">> <<set $chamberImageState = 3>> <<goto "CharacterInChambers">> <</button>> <</if>> </div> </div> </div> <!-- Settlement deployment buttons --> <div style="text-align: center; margin: 20px 0;"> <<if $selectedCharacterSource === "barracks">> <<button "Deploy to Settlement">> <<set $currentUnitForTransfer to _character>> <<goto "UnitSettlementTransfer">> <</button>><br> <<if $chamberImageState === 1>> <<button "Let her suck you">> <<goto "CharacterChambersBJ">> <</button>><br> <<elseif $chamberImageState === 3>> <<button "Fuck her on the chair">> <<set $Position to "Chair">> <<goto "CharacterChambersSex">> <</button>> <<button "Push her onto your desk">> <<set $Position to "Desk">> <<goto "CharacterChambersSex">> <</button>> <<button "Take her on the bed">> <<set $Position to "Bed">> <<goto "CharacterChambersSex">> <</button>> <</if>> <<else>> <<if $chamberImageState === 1 or $chamberImageState === 3>> <<button "Ask her to service you">> <<goto "CharacterChambersBJ">> <</button>><br> <<if $chamberImageState === 3>> <<button "Fuck her on the chair">> <<set $Position to "Chair">> <<goto "CharacterChambersSex">> <</button>> <<button "Push her onto your desk">> <<set $Position to "Desk">> <<goto "CharacterChambersSex">> <</button>> <<button "Take her on the bed">> <<set $Position to "Bed">> <<goto "CharacterChambersSex">> <</button>> <</if>> <</if>> <<button "Send to a Settlement">> <<set _villager = _character>> <<set $villagerForTransfer = _villager>> <<set _npcId = _villager.NPCID>> <<goto "SelectSettlementTransfer2">> <</button>><br> <</if>> </div> <div style="text-align: center"> <<button "Return to Selection">> <<set $chamberImageState = 1>> <<set $chamberFolderNum = null>> <<goto "SummonToChambers">> <</button>> <<button "Dismiss">> <<set $chamberImageState = 1>> <<set $chamberFolderNum = null>> <<goto "Chambers">> <</button>> </div> <</nobr>>
<<nobr>> <<include "RaidReportCSS">> /* Initialize camp variables */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _campInitialStrength = _location.campStrength || 100>> <<set _campSize = _location.size>> <<set _banditsRemaining = _location.banditGuards || 0>> <<set _originalBanditCount = _location.originalBanditCount || _banditsRemaining>> /* If this is the first attack, set the original count */ <<if !_location.originalBanditCount>> <<set _location.originalBanditCount = _banditsRemaining>> <<set _originalBanditCount = _banditsRemaining>> <</if>> /* Combat Setup */ <<set _raiders = []>> <<set _bandits = []>> <<set _combatLog = []>> <<set _casualties = 0>> <<set _initialRaiderCount = 0>> <<set _prisonersCaptured = 0>> /* Initial combat messages */ <<run _combatLog.push(`Your forces approach ${_location.name}, a ${_campSize} bandit camp...`)>> <<run _combatLog.push(`Camp strength: ${_campInitialStrength}%`)>> <<run _combatLog.push(`Your retreat threshold: ${$RazeTolorance}% casualties`)>> /* Setup raiders with armor bonuses */ <<if $RaidingParty>> <<for _raider range $RaidingParty>> <<if _raider.armor !== "None" && !_raider.armorBonusApplied>> <<set _raider.health += 25>> <<set _raider.armorBonusApplied = true>> <</if>> <<run _raiders.push(_raider)>> <</for>> <</if>> <<set _initialRaiderCount = _raiders.length>> <<run _combatLog.push(`Attacking force: ${_initialRaiderCount} raiders`)>> /* Generate bandits based on remaining count */ <<for _i = 0; _i < _banditsRemaining; _i++>> <<set _banditGender = random(1, 100) <= 70 ? "male" : "female">> <<set _banditWeapon = either(["Dagger", "Sword", "Club", "Axe"])>> <<set _banditArmor = either(["None", "Light", "None", "None"])>> /* Most bandits have no armor */ <<set _banditHealth = (_campInitialStrength / 100) * random(80, 100)>> /* Health scaled by camp strength */ <<if _banditGender === "male">> <<set _banditImg = "Images/Forrest/Encounters/Male/Bandit/" + random(1, 7) + ".png">> <<else>> <<set _banditHairColor = either(["Blonde", "Red", "Brown"])>> <<set _banditImg = "Images/Forrest/Encounters/Female/Bandit/" + _banditHairColor + "/" + random(1, 7) + ".png">> <</if>> <<run _bandits.push({ id: _i, gender: _banditGender, weapon: _banditWeapon, armor: _banditArmor, health: _banditHealth, imagePath: _banditImg, defeated: false })>> <</for>> <<run _combatLog.push(`Defending bandits: ${_bandits.length}`)>> <<run _combatLog.push("The attack begins!")>> /* Combat System */ <<set _roundCounter = 0>> <<set _retreating = false>> <<set _raidStatus = "In Progress">> <<set _banditsDefeated = 0>> <<set _totalDamageToCamp = 0>> /* Main Combat Loop - use for loop with up to 100 rounds */ <<for _round = 0; _round < 100; _round++>> /* Check if we should break the loop */ <<if _retreating || _raiders.length === 0 || !_bandits.some(b => !b.defeated)>> <<break>> <</if>> <<set _roundCounter++>> /* Each raider fights an undefeated bandit */ <<for _raiderIndex = 0; _raiderIndex < _raiders.length; _raiderIndex++>> <<if _retreating>> <<break>> <</if>> <<set _raider = _raiders[_raiderIndex]>> /* Find an undefeated bandit */ <<set _banditIndex = _bandits.findIndex(b => !b.defeated)>> <<if _banditIndex >= 0>> <<set _bandit = _bandits[_banditIndex]>> /* Determine if raider or bandit attacks first (raiders have 60% chance to go first) */ <<set _raiderGoesFirst = random(1, 100) <= 60>> <<if _raiderGoesFirst>> /* Raider attack */ <<set _raiderDamage = 0>> <<switch _raider.weapon>> <<case "Dagger">> <<set _raiderDamage = random(15, 25)>> <<case "Sword">> <<set _raiderDamage = random(25, 35)>> <<case "Axe">> <<set _raiderDamage = random(20, 40)>> <<case "Mace">> <<set _raiderDamage = random(18, 38)>> <<case "Corruption">> <<set _raiderDamage = random(25, 40)>> <<default>> <<set _raiderDamage = random(15, 30)>> <</switch>> /* Apply specialization bonus */ <<if _raider.specialization === "Combat">> /* Significant skill-based combat boost */ <<if _raider.skill >= 75>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.4)>> /* 40% damage boost */ <<run _combatLog.push(`${_raider.name}'s expert combat training provides a major damage boost!`)>> <<elseif _raider.skill >= 50>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.25)>> /* 25% damage boost */ <<run _combatLog.push(`${_raider.name}'s advanced combat training increases damage!`)>> <<elseif _raider.skill >= 25>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.15)>> /* 15% damage boost */ <<run _combatLog.push(`${_raider.name}'s combat training improves attack effectiveness.`)>> <<else>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.1)>> /* 10% damage boost */ <<run _combatLog.push(`${_raider.name}'s basic combat training helps a little.`)>> <</if>> <<elseif _raider.specialization === "Defense">> /* Could add other specialization bonuses here in the future */ <</if>> /* Apply bandit armor reduction */ <<if _bandit.armor === "Light">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.8)>> <<elseif _bandit.armor === "Medium">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.7)>> <</if>> <<set _bandit.health -= _raiderDamage>> <<run _combatLog.push(`${_raider.name} attacks a bandit for ${_raiderDamage} damage!`)>> /* Check if bandit is defeated */ <<if _bandit.health <= 0>> <<set _bandit.defeated = true>> <<set _banditsDefeated++>> <<set _totalDamageToCamp += 1>> /* Handle corruption weapon capture */ <<if _raider.weapon === "Corruption" && random(1, 100) <= 60>> <<if $CellsCount > $DungonOccupance.length>> /* Add prisoner to dungeon */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> /* Determine hair color first */ <<set _captiveHairColor = "Brown">> <<if _bandit.gender === "female">> <<if _bandit.imagePath.includes("Blonde")>> <<set _captiveHairColor = "Blonde">> <<elseif _bandit.imagePath.includes("Red")>> <<set _captiveHairColor = "Red">> <</if>> <</if>> /* Determine sex */ <<set _captiveSex = _bandit.gender === "male" ? "male" : "female">> /* Create captive */ <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter, name: "Bandit", sex: _captiveSex, hairColor: _captiveHairColor, ImagePath: _bandit.imagePath, corruption: 0, status: "Clothed" })>> <<set $prisonerIdCounter++>> <<set _prisonersCaptured++>> <<run _combatLog.push(`${_raider.name}'s corruption weapon has captured a bandit! They've been sent to your dungeon.`)>> <<else>> <<run _combatLog.push(`${_raider.name}'s corruption weapon would have captured a bandit, but your dungeon is full. The bandit was killed instead.`)>> <</if>> <<else>> <<run _combatLog.push(`The bandit has been defeated!`)>> <</if>> <<else>> /* Bandit counterattack */ <<set _banditDamage = 0>> <<switch _bandit.weapon>> <<case "Dagger">> <<set _banditDamage = random(10, 20)>> <<case "Sword">> <<set _banditDamage = random(12, 25)>> <<case "Club">> <<set _banditDamage = random(15, 22)>> <<case "Axe">> <<set _banditDamage = random(14, 28)>> <</switch>> /* Apply raider armor reduction */ <<if _raider.armor === "Light">> <<set _banditDamage = Math.floor(_banditDamage * 0.7)>> <<elseif _raider.armor === "Medium">> <<set _banditDamage = Math.floor(_banditDamage * 0.5)>> <<elseif _raider.armor === "Heavy">> <<set _banditDamage = Math.floor(_banditDamage * 0.3)>> <</if>> <<set _raider.health -= _banditDamage>> <<run _combatLog.push(`The bandit counters ${_raider.name} for ${_banditDamage} damage!`)>> /* Check if raider is defeated */ <<if _raider.health <= 0>> <<run _combatLog.push(`${_raider.name} has fallen!`)>> <<run _raiders.splice(_raiderIndex, 1)>> <<set _raiderIndex-->> <<set _casualties++>> /* Check retreat threshold */ <<set _casualtyPercentage = Math.round((_casualties / _initialRaiderCount) * 100)>> <<if _casualtyPercentage >= $RazeTolorance>> <<set _retreating = true>> <<run _combatLog.push(`Casualty threshold reached (${_casualtyPercentage}%)! Your forces are retreating!`)>> <</if>> <</if>> <</if>> <<else>> /* Bandit attacks first */ <<set _banditDamage = 0>> <<switch _bandit.weapon>> <<case "Dagger">> <<set _banditDamage = random(10, 20)>> <<case "Sword">> <<set _banditDamage = random(12, 25)>> <<case "Club">> <<set _banditDamage = random(15, 22)>> <<case "Axe">> <<set _banditDamage = random(14, 28)>> <</switch>> /* Apply raider armor reduction */ <<if _raider.armor === "Light">> <<set _banditDamage = Math.floor(_banditDamage * 0.7)>> <<elseif _raider.armor === "Medium">> <<set _banditDamage = Math.floor(_banditDamage * 0.5)>> <<elseif _raider.armor === "Heavy">> <<set _banditDamage = Math.floor(_banditDamage * 0.3)>> <</if>> <<set _raider.health -= _banditDamage>> <<run _combatLog.push(`A bandit attacks ${_raider.name} for ${_banditDamage} damage!`)>> /* Check if raider is defeated */ <<if _raider.health <= 0>> <<run _combatLog.push(`${_raider.name} has fallen!`)>> <<run _raiders.splice(_raiderIndex, 1)>> <<set _raiderIndex-->> <<set _casualties++>> /* Check retreat threshold */ <<set _casualtyPercentage = Math.round((_casualties / _initialRaiderCount) * 100)>> <<if _casualtyPercentage >= $RazeTolorance>> <<set _retreating = true>> <<run _combatLog.push(`Casualty threshold reached (${_casualtyPercentage}%)! Your forces are retreating!`)>> <</if>> <<else>> /* Raider counterattack */ <<set _raiderDamage = 0>> <<switch _raider.weapon>> <<case "Dagger">> <<set _raiderDamage = random(15, 25)>> <<case "Sword">> <<set _raiderDamage = random(25, 35)>> <<case "Axe">> <<set _raiderDamage = random(20, 40)>> <<case "Mace">> <<set _raiderDamage = random(18, 38)>> <<case "Corruption">> <<set _raiderDamage = random(25, 40)>> <<default>> <<set _raiderDamage = random(15, 30)>> <</switch>> /* Apply specialization bonus */ <<if _raider.specialization === "Combat">> /* Significant skill-based combat boost */ <<if _raider.skill >= 75>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.4)>> /* 40% damage boost */ <<run _combatLog.push(`${_raider.name}'s expert combat training provides a major damage boost!`)>> <<elseif _raider.skill >= 50>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.25)>> /* 25% damage boost */ <<run _combatLog.push(`${_raider.name}'s advanced combat training increases damage!`)>> <<elseif _raider.skill >= 25>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.15)>> /* 15% damage boost */ <<run _combatLog.push(`${_raider.name}'s combat training improves attack effectiveness.`)>> <<else>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.1)>> /* 10% damage boost */ <<run _combatLog.push(`${_raider.name}'s basic combat training helps a little.`)>> <</if>> <<elseif _raider.specialization === "Defense">> /* Could add other specialization bonuses here in the future */ <</if>> /* Apply bandit armor reduction */ <<if _bandit.armor === "Light">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.8)>> <<elseif _bandit.armor === "Medium">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.7)>> <</if>> <<set _bandit.health -= _raiderDamage>> <<run _combatLog.push(`${_raider.name} counters for ${_raiderDamage} damage!`)>> /* Check if bandit is defeated */ <<if _bandit.health <= 0>> <<set _bandit.defeated = true>> <<set _banditsDefeated++>> <<set _totalDamageToCamp += 1>> /* Handle corruption weapon capture */ <<if _raider.weapon === "Corruption" && random(1, 100) <= 60>> <<if $CellsCount > $DungonOccupance.length>> /* Add prisoner to dungeon */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> /* Determine hair color first */ <<set _captiveHairColor = "Brown">> <<if _bandit.gender === "female">> <<if _bandit.imagePath.includes("Blonde")>> <<set _captiveHairColor = "Blonde">> <<elseif _bandit.imagePath.includes("Red")>> <<set _captiveHairColor = "Red">> <</if>> <</if>> /* Determine sex */ <<set _captiveSex = _bandit.gender === "male" ? "male" : "female">> /* Create captive */ <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter, name: "Bandit", sex: _captiveSex, hairColor: _captiveHairColor, ImagePath: _bandit.imagePath, corruption: 0, status: "Clothed" })>> <<set $prisonerIdCounter++>> <<set _prisonersCaptured++>> <<run _combatLog.push(`${_raider.name}'s corruption weapon has captured a bandit! They've been sent to your dungeon.`)>> <<else>> <<run _combatLog.push(`${_raider.name}'s corruption weapon would have captured a bandit, but your dungeon is full. The bandit was killed instead.`)>> <</if>> <<else>> <<run _combatLog.push(`The bandit has been defeated!`)>> <</if>> <</if>> <</if>> <</if>> <</if>> <</for>> <</for>> /* Calculate results and camp status */ <<set _casualtyPercentage = Math.round((_casualties / _initialRaiderCount) * 100)>> <<set _banditsDefeatedPercentage = Math.round((_banditsDefeated / _bandits.length) * 100)>> /* Update camp strength based on damage */ <<if _bandits.length > 0>> <<set _damagePercentage = Math.round((_banditsDefeated / _bandits.length) * 100)>> <<set _newCampStrength = Math.max(0, _campInitialStrength - _damagePercentage)>> <<else>> <<set _newCampStrength = 0>> <</if>> /* Update number of bandits remaining */ <<set _newBanditsRemaining = _banditsRemaining - _banditsDefeated>> <<if _newBanditsRemaining < 0>><<set _newBanditsRemaining = 0>><</if>> /* Update location data */ <<if _location>> <<set _location.campStrength = _newCampStrength>> <<set _location.banditGuards = _newBanditsRemaining>> <<set _location.attacksCount = (_location.attacksCount || 0) + 1>> <</if>> /* Initialize loot variables */ <<set _goldLooted = 0>> <<set _woodLooted = 0>> <<set _foodLooted = 0>> /* Check for prisoners freed */ <<set _prisonersFreed = 0>> <<if _banditsDefeatedPercentage >= 50 && _location.prisoners && _location.prisoners > 0>> <<if _banditsDefeatedPercentage >= 90>> <<set _prisonersFreed = _location.prisoners>> <<else>> <<set _prisonersFreed = Math.floor(_location.prisoners * (_banditsDefeatedPercentage / 100))>> <</if>> <<for _i = 0; _i < _prisonersFreed; _i++>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<set _prisonerGender = random(1, 100) <= 60 ? "male" : "female">> <<set _prisonerHairColor = _prisonerGender === "female" ? either(["Blonde", "Red", "Brown"]) : "Brown">> <<if _prisonerGender === "male">> <<set _prisonerImg = "Images/Castle/Dungon/Men/Bandit/" + random(1, 15) + ".png">> <<else>> <<set _prisonerImg = "Images/Castle/Dungon/Woman/" + _prisonerHairColor + "/Clothed/" + random(1, 15) + ".png">> <</if>> <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter, name: "Freed Prisoner", sex: _prisonerGender, hairColor: _prisonerHairColor, ImagePath: _prisonerImg, corruption: 100, status: "Clothed" })>> <<set $prisonerIdCounter++>> <</for>> <<set _location.prisoners -= _prisonersFreed>> <<if _location.prisoners < 0>><<set _location.prisoners = 0>><</if>> <</if>> /* Determine raid status */ <<if _newCampStrength <= 0>> <<set _raidStatus = "Complete Victory">> <<set _outcomeMessage = `Your forces have completely destroyed the bandit camp! All remaining bandits have fled and the camp is razed to the ground.`>> /* Only calculate loot on complete victory */ <<set _goldLooted = Math.floor(random(100, 300) * (_campSize === "Medium" ? 1.5 : 1))>> <<set _woodLooted = Math.floor(random(20, 50) * (_campSize === "Medium" ? 1.5 : 1))>> <<set _foodLooted = Math.floor(random(30, 80) * (_campSize === "Medium" ? 1.5 : 1))>> /* Add resources to player inventory */ <<set $Gold += _goldLooted>> <<set $Wood += _woodLooted>> <<set $Food += _foodLooted>> /* Remove location since camp is destroyed */ <<set $RaidLocationList = $RaidLocationList.filter(loc => loc.locationId !== _location.locationId)>> <<elseif _retreating>> <<set _raidStatus = "Tactical Retreat">> <<set _outcomeMessage = `Your forces inflicted significant damage but had to retreat after reaching the ${$RazeTolorance}% casualty threshold. The camp strength is now at ${_newCampStrength}%.`>> <<elseif _banditsDefeatedPercentage >= 70>> <<set _raidStatus = "Major Victory">> <<set _outcomeMessage = `Your forces won a major victory, defeating ${_banditsDefeated} bandits and reducing camp strength to ${_newCampStrength}%. Another attack will likely destroy the camp completely.`>> <<elseif _banditsDefeatedPercentage >= 40>> <<set _raidStatus = "Partial Victory">> <<set _outcomeMessage = `Your forces achieved a partial victory, defeating ${_banditsDefeated} bandits and reducing camp strength to ${_newCampStrength}%. The camp is weakened but still operational.`>> <<elseif _banditsDefeatedPercentage > 0>> <<set _raidStatus = "Minor Victory">> <<set _outcomeMessage = `Your forces achieved only minor success, defeating ${_banditsDefeated} bandits and reducing camp strength to ${_newCampStrength}%. The camp remains largely intact.`>> <<else>> <<set _raidStatus = "Defeat">> <<set _outcomeMessage = `Your forces were repelled before they could inflict any significant damage. The bandit camp remains at full strength.`>> <</if>> /* Display Location Card */ <div class="location-card"> <div class="location-image"> <img @src="_location.imagePath" alt="Bandit Camp"> </div> <div class="location-info"> <h1><<print _location.name>></h1> <p><span class="info-label">Location Type:</span> Bandit Camp (<<print _location.size>>)</p> <p><span class="info-label">Number of Attacks:</span> <<print _location.attacksCount>></p> <p><span class="info-label">Camp Strength:</span> <<print _newCampStrength>>% (Was: <<print _campInitialStrength>>%)</p> <p><span class="info-label">Bandits Remaining:</span> <<print _newBanditsRemaining>> (Was: <<print _banditsRemaining>>)</p> </div> </div> /* Display Status Banner - Fixed to handle "In Progress" properly */ <div class="raid-status <<if _raidStatus === "In Progress">>in-progress <<elseif _raidStatus.includes("Victory") || _raidStatus === "Complete Victory">>success <<elseif _raidStatus === "Tactical Retreat">>partial <<else>>failed<</if>>"> <<print _raidStatus>> </div> /* Display Raid Outcome */ <div class="raid-outcome-message"> <p><<print _outcomeMessage>></p> </div> /* Display Combat Results */ <div class="combat-results"> <h2>Raid Results</h2> <div class="response-stats"> <p><span class="info-label">Raiders:</span> <<print _initialRaiderCount>></p> <p><span class="info-label">Casualties:</span> <<print _casualties>> (<<print _casualtyPercentage>>%)</p> <p><span class="info-label">Bandits Defeated:</span> <<print _banditsDefeated>> / <<print _bandits.length>> (<<print _banditsDefeatedPercentage>>%)</p> <p><span class="info-label">Bandits Captured:</span> <<print _prisonersCaptured>></p> <<if _prisonersFreed > 0>> <p><span class="info-label">Prisoners Freed:</span> <<print _prisonersFreed>></p> <</if>> <h3>Resources Looted</h3> <p><span class="info-label">Gold:</span> <<print _goldLooted>></p> <p><span class="info-label">Wood:</span> <<print _woodLooted>></p> <p><span class="info-label">Food:</span> <<print _foodLooted>></p> </div> </div> /* Display Raiding Party Status */ <<set _survivors = $RaidingParty.filter(r => r.health > 0)>> <<set _fallen = $RaidingParty.filter(r => r.health <= 0)>> <div class="raid-section"> <h2>Raiding Party Status</h2> <div class="raider-container"> /* Display Survivors */ <<for _raider range _survivors>> <div class="raider-card"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Health: <<print _raider.health>></p> </div> <</for>> /* Display Casualties */ <<for _raider range _fallen>> <div class="raider-card deceased"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> </div> <</for>> </div> </div> /* Display Combat Log */ <div class="combat-results"> <h2>Combat Breakdown</h2> <div class="combat-log"> <<for _log range _combatLog>> <p class="combat-entry"><<print _log>></p> <</for>> </div> </div> /* Return surviving raiders to barracks */ <<for _survivor range _survivors>> <<if _survivor.name !== "Lucy" && _survivor.name !== "Alice">> <<run $BarraksOccupance.push(_survivor)>> <</if>> <</for>> /* Remove location if camp destroyed */ <<if _newCampStrength <= 0>> <<set $RaidLocationList = $RaidLocationList.filter(loc => loc.locationId !== _location.locationId)>> <</if>> <div style="text-align: center"> <<button "Continue">> <<set $pendingRaid to false>> <<goto "End Day">> <</button>> </div> <</nobr>>
<<nobr>> <<include "RaidReportCSS">> /* Initialize camp variables */ <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <<set _campInitialStrength = _location.campStrength || 100>> <<set _campSize = _location.size>> <<set _banditsRemaining = _location.banditGuards || 0>> <<set _originalBanditCount = _location.originalBanditCount || _banditsRemaining>> /* If this is the first attack, set the original count */ <<if !_location.originalBanditCount>> <<set _location.originalBanditCount = _banditsRemaining>> <<set _originalBanditCount = _banditsRemaining>> <</if>> /* If first attack and no prisoners set, generate some */ <<if !_location.hasOwnProperty("prisoners")>> <<set _location.prisoners = Math.floor(random(1, 5) * (_campSize === "Medium" ? 1.5 : 1))>> <</if>> /* Initialize player resources if they don't exist */ <<if !$Valuables>> <<set $Valuables = { Dyes: 0, Fine_Cloth: 0, Ivory: 0, Venison: 0, Wine: 0, Tobacco: 0, Pottery: 0 }>> <</if>> /* Combat and Pillage Setup */ <<set _raiders = []>> <<set _bandits = []>> <<set _combatLog = []>> <<set _casualties = 0>> <<set _initialRaiderCount = 0>> <<set _prisonersCaptured = 0>> <<set _prisonersRescued = 0>> <<set _goldLooted = 0>> <<set _woodLooted = 0>> <<set _foodLooted = 0>> <<set _stoneLooted = 0>> <<set _retreatTriggered = false>> /* Initialize valuable items loot tracking */ <<set _valuablesLooted = { Dyes: 0, Fine_Cloth: 0, Ivory: 0, Venison: 0, Wine: 0, Tobacco: 0, Pottery: 0 }>> /* Define pillage effectiveness based on objective */ <<set _pillageEffectiveness = {}>> <<if $PillageObjective === "Prisoners">> <<set _pillageEffectiveness.prisoners = 2.5>> /* Increased from 1.5 to 2.5 */ <<set _pillageEffectiveness.resources = 0.5>> <<run _combatLog.push("Your raiders focus on locating and freeing prisoners, with less emphasis on gathering resources.")>> <<elseif $PillageObjective === "Resources">> <<set _pillageEffectiveness.prisoners = 0.5>> <<set _pillageEffectiveness.resources = 1.5>> <<run _combatLog.push("Your raiders focus on finding and collecting valuable resources, with less attention to rescuing prisoners.")>> <<else>> /* Balanced */ <<set _pillageEffectiveness.prisoners = 1.5>> /* Increased from 1.0 to 1.5 */ <<set _pillageEffectiveness.resources = 1.0>> <<run _combatLog.push("Your raiders balance their efforts between finding prisoners and collecting resources.")>> <</if>> /* Initial combat messages */ <<run _combatLog.push(`Your forces approach ${_location.name}, a ${_campSize} bandit camp for a quick pillaging operation...`)>> <<run _combatLog.push(`Camp strength: ${_campInitialStrength}%`)>> <<run _combatLog.push(`Mission objective: ${$PillageObjective || "Standard Pillage"}`)>> /* Setup raiders with armor bonuses */ <<if $RaidingParty>> <<for _raider range $RaidingParty>> <<if _raider.armor !== "None" && !_raider.armorBonusApplied>> <<set _raider.health += 25>> <<set _raider.armorBonusApplied = true>> <</if>> <<run _raiders.push(_raider)>> <</for>> <</if>> <<set _initialRaiderCount = _raiders.length>> <<run _combatLog.push(`Pillaging force: ${_initialRaiderCount} raiders`)>> /* Generate bandits based on remaining count - fewer than in razing as not all are encountered */ <<set _activeDefenders = Math.floor(_banditsRemaining * 0.3)>> /* Only encounter 30% of the camp */ <<run _combatLog.push(`Defending bandits encountered: ${_activeDefenders}`)>> <<for _i = 0; _i < _activeDefenders; _i++>> <<set _banditGender = random(1, 100) <= 70 ? "male" : "female">> <<set _banditWeapon = either(["Dagger", "Sword", "Club", "Axe"])>> <<set _banditArmor = either(["None", "Light", "None", "None"])>> /* Most bandits have no armor */ <<set _banditHealth = (_campInitialStrength / 100) * random(80, 100)>> /* Health scaled by camp strength */ <<if _banditGender === "male">> <<set _banditImg = "Images/Forrest/Encounters/Male/Bandit/" + random(1, 7) + ".png">> <<else>> <<set _banditHairColor = either(["Blonde", "Red", "Brown"])>> <<set _banditImg = "Images/Forrest/Encounters/Female/Bandit/" + _banditHairColor + "/" + random(1, 7) + ".png">> <</if>> <<run _bandits.push({ id: _i, gender: _banditGender, weapon: _banditWeapon, armor: _banditArmor, health: _banditHealth, imagePath: _banditImg, defeated: false, hairColor: _banditGender === "female" ? _banditHairColor : "Brown" })>> <</for>> <<run _combatLog.push("The pillage operation begins!")>> /* Pillaging System - less combat, more resource gathering */ <<set _roundCounter = 0>> <<set _banditsDefeated = 0>> <<set _pillageComplete = false>> <<set _maxPillageRounds = 5>> /* Limit pillage to 5 rounds to represent quick in-and-out */ /* Calculate retreat threshold */ <<set _retreatThreshold = Math.ceil(_initialRaiderCount * 0.25)>> /* 25% casualties */ /* Main Loop */ <<for _round = 0; _round < _maxPillageRounds; _round++>> /* Check if we should break the loop */ <<if _pillageComplete || _raiders.length === 0 || !_bandits.some(b => !b.defeated) || _retreatTriggered>> <<break>> <</if>> <<set _roundCounter++>> <<run _combatLog.push(`=== Pillage Round ${_roundCounter} ===`)>> /* Occasional combat - reduced chance of fighting */ <<if _round === 0 || random(1, 100) <= 30>> /* Only 30% chance of combat after first round */ <<run _combatLog.push("Your raiders encounter guards!")>> /* Select a subset of raiders and bandits for skirmish to reduce overall combat */ <<set _activeBandits = _bandits.filter(b => !b.defeated).slice(0, Math.min(2, _bandits.length))>> <<set _activeRaiders = _raiders.slice(0, Math.min(3, _raiders.length))>> /* Quick skirmish */ <<for _raiderIndex = 0; _raiderIndex < _activeRaiders.length; _raiderIndex++>> <<set _raider = _activeRaiders[_raiderIndex]>> /* Find an undefeated bandit */ <<set _banditIndex = _activeBandits.findIndex(b => !b.defeated)>> <<if _banditIndex >= 0>> <<set _bandit = _activeBandits[_banditIndex]>> <<set _originalBanditIndex = _bandits.findIndex(b => b.id === _bandit.id)>> /* Raider attack */ <<set _raiderDamage = 0>> <<switch _raider.weapon>> <<case "Dagger">> <<set _raiderDamage = random(15, 25)>> <<case "Sword">> <<set _raiderDamage = random(25, 35)>> <<case "Axe">> <<set _raiderDamage = random(20, 40)>> <<case "Mace">> <<set _raiderDamage = random(18, 38)>> <<case "Corruption">> <<set _raiderDamage = random(25, 40)>> <<default>> <<set _raiderDamage = random(15, 30)>> <</switch>> /* Apply specialization bonus */ <<if _raider.specialization === "Combat">> /* Significant skill-based combat boost */ <<if _raider.skill >= 75>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.4)>> /* 40% damage boost */ <<run _combatLog.push(`${_raider.name}'s expert combat training provides a major damage boost!`)>> <<elseif _raider.skill >= 50>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.25)>> /* 25% damage boost */ <<run _combatLog.push(`${_raider.name}'s advanced combat training increases damage!`)>> <<elseif _raider.skill >= 25>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.15)>> /* 15% damage boost */ <<run _combatLog.push(`${_raider.name}'s combat training improves attack effectiveness.`)>> <<else>> <<set _raiderDamage = Math.floor(_raiderDamage * 1.1)>> /* 10% damage boost */ <<run _combatLog.push(`${_raider.name}'s basic combat training helps a little.`)>> <</if>> <</if>> /* Apply bandit armor reduction */ <<if _bandit.armor === "Light">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.8)>> <<elseif _bandit.armor === "Medium">> <<set _raiderDamage = Math.floor(_raiderDamage * 0.7)>> <</if>> <<set _bandit.health -= _raiderDamage>> <<run _combatLog.push(`${_raider.name} attacks a bandit for ${_raiderDamage} damage!`)>> /* Update the main bandits array */ <<if _originalBanditIndex >= 0>> <<set _bandits[_originalBanditIndex].health = _bandit.health>> <</if>> /* Check if bandit is defeated */ <<if _bandit.health <= 0>> <<set _bandit.defeated = true>> <<if _originalBanditIndex >= 0>> <<set _bandits[_originalBanditIndex].defeated = true>> <</if>> <<set _banditsDefeated++>> <<run _combatLog.push(`The bandit has been defeated!`)>> /* Capture chance with corruption weapon */ <<if _raider.weapon === "Corruption" && random(1, 100) <= 60>> <<if $CellsCount > $DungonOccupance.length>> /* Add prisoner to dungeon */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> /* Create captive */ <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter, name: "Bandit", sex: _bandit.gender === "male" ? "male" : "female", hairColor: _bandit.hairColor, ImagePath: _bandit.imagePath, corruption: 0, status: "Clothed" })>> <<set $prisonerIdCounter++>> <<set _prisonersCaptured++>> <<run _combatLog.push(`${_raider.name}'s corruption weapon has captured a bandit! They've been sent to your dungeon.`)>> <<else>> <<run _combatLog.push(`${_raider.name}'s corruption weapon would have captured a bandit, but your dungeon is full.`)>> <</if>> <</if>> <<else>> /* Bandit counterattack - less damaging in pillage scenarios */ <<set _banditDamage = 0>> <<switch _bandit.weapon>> <<case "Dagger">> <<set _banditDamage = random(8, 15)>> <<case "Sword">> <<set _banditDamage = random(10, 20)>> <<case "Club">> <<set _banditDamage = random(12, 18)>> <<case "Axe">> <<set _banditDamage = random(10, 22)>> <</switch>> /* Apply raider armor reduction */ <<if _raider.armor === "Light">> <<set _banditDamage = Math.floor(_banditDamage * 0.7)>> <<elseif _raider.armor === "Medium">> <<set _banditDamage = Math.floor(_banditDamage * 0.5)>> <<elseif _raider.armor === "Heavy">> <<set _banditDamage = Math.floor(_banditDamage * 0.3)>> <</if>> <<set _raider.health -= _banditDamage>> <<run _combatLog.push(`The bandit counters ${_raider.name} for ${_banditDamage} damage!`)>> /* Check if raider is defeated */ <<if _raider.health <= 0>> <<run _combatLog.push(`${_raider.name} has fallen!`)>> <<run _raiders.splice(_raiders.indexOf(_raider), 1)>> <<set _casualties++>> /* Check retreat condition */ <<if _casualties >= _retreatThreshold>> <<set _retreatTriggered = true>> <<run _combatLog.push(`The raiding party has suffered too many casualties! They begin to retreat with what they've gathered so far.`)>> <<break>> <</if>> <</if>> <</if>> <</if>> <</for>> <<else>> <<run _combatLog.push("Your raiders navigate through the camp, avoiding combat where possible...")>> <</if>> /* Resource gathering phase - happens every round */ <<if !_retreatTriggered>> <<if _round === 0>> /* Add prisoner chance in first round */ <<if $PillageObjective === "Prisoners" && random(1, 100) <= 50>> <<if _location.prisoners > 0>> <<set _foundPrisoners = Math.min(_location.prisoners, Math.floor(random(1, 2) * _pillageEffectiveness.prisoners))>> <<set _prisonersRescued += _foundPrisoners>> <<set _location.prisoners -= _foundPrisoners>> <<run _combatLog.push(`Your raiders quickly found ${_foundPrisoners} prisoner${_foundPrisoners > 1 ? 's' : ''} in the camp!`)>> <</if>> <</if>> <<if random(1, 100) <= 80>> <<if $PillageObjective === "Resources" || $PillageObjective === "Balanced">> <<set _foundGold = Math.floor(random(20, 50) * _pillageEffectiveness.resources)>> <<set _goldLooted += _foundGold>> <<run _combatLog.push(`Your raiders found ${_foundGold} gold in the camp!`)>> /* Chance to find valuables */ <<if random(1, 100) <= 40>> <<set _randomValuable = either(["Dyes", "Fine_Cloth", "Pottery"])>> <<set _amount = Math.floor(random(1, 3) * _pillageEffectiveness.resources)>> <<set _valuablesLooted[_randomValuable] += _amount>> <<set _displayName = _randomValuable === "Fine_Cloth" ? "Fine Cloth" : _randomValuable>> <<run _combatLog.push(`Your raiders found ${_amount} ${_displayName}!`)>> <</if>> <</if>> <</if>> <<elseif _round === 1>> <<if random(1, 100) <= 75>> /* Changed from 85 to 75 */ <<if $PillageObjective === "Prisoners" || $PillageObjective === "Balanced">> <<if _location.prisoners > 0>> <<set _foundPrisoners = Math.min(_location.prisoners, Math.floor(random(1, 3) * _pillageEffectiveness.prisoners))>> <<set _prisonersRescued += _foundPrisoners>> <<set _location.prisoners -= _foundPrisoners>> <<run _combatLog.push(`Your raiders found ${_foundPrisoners} prisoner${_foundPrisoners > 1 ? 's' : ''} in the camp!`)>> <</if>> <</if>> <</if>> /* Add chance for valuables */ <<if random(1, 100) <= 65 && ($PillageObjective === "Resources" || $PillageObjective === "Balanced")>> <<set _randomValuable = either(["Wine", "Venison"])>> <<set _amount = Math.floor(random(2, 5) * _pillageEffectiveness.resources)>> <<set _valuablesLooted[_randomValuable] += _amount>> <<run _combatLog.push(`Your raiders discovered ${_amount} ${_randomValuable} in the bandits' supplies!`)>> <</if>> <<elseif _round === 2>> /* Add another prisoner rescue chance */ <<if $PillageObjective === "Prisoners" && random(1, 100) <= 75>> /* Changed from 60 to 75 */ <<if _location.prisoners > 0>> <<set _foundPrisoners = Math.min(_location.prisoners, Math.floor(random(1, 2) * _pillageEffectiveness.prisoners))>> <<set _prisonersRescued += _foundPrisoners>> <<set _location.prisoners -= _foundPrisoners>> <<run _combatLog.push(`Your raiders discovered ${_foundPrisoners} more prisoner${_foundPrisoners > 1 ? 's' : ''} hidden in a back area!`)>> <</if>> <</if>> <<if random(1, 100) <= 75>> <<if $PillageObjective === "Resources" || $PillageObjective === "Balanced">> <<set _foundWood = Math.floor(random(10, 25) * _pillageEffectiveness.resources)>> <<set _woodLooted += _foundWood>> <<run _combatLog.push(`Your raiders found ${_foundWood} wood in the camp!`)>> <<set _foundFood = Math.floor(random(15, 30) * _pillageEffectiveness.resources)>> <<set _foodLooted += _foundFood>> <<run _combatLog.push(`Your raiders found ${_foundFood} food in the camp!`)>> <<set _foundStone = Math.floor(random(5, 15) * _pillageEffectiveness.resources)>> <<set _stoneLooted += _foundStone>> <<run _combatLog.push(`Your raiders found ${_foundStone} stone in the camp!`)>> /* Chance for tobacco and ivory */ <<if random(1, 100) <= 50>> <<set _randomValuable = either(["Tobacco", "Ivory"])>> <<set _amount = Math.floor(random(1, 3) * _pillageEffectiveness.resources)>> <<set _valuablesLooted[_randomValuable] += _amount>> <<run _combatLog.push(`Your raiders found ${_amount} ${_randomValuable} hidden among the bandits' loot!`)>> <</if>> <</if>> <</if>> <<elseif _round === 3>> <<if random(1, 100) <= 65>> <<if $PillageObjective === "Resources" || $PillageObjective === "Balanced">> <<set _foundGold = Math.floor(random(30, 70) * _pillageEffectiveness.resources)>> <<set _goldLooted += _foundGold>> <<run _combatLog.push(`Your raiders found an additional ${_foundGold} gold hidden in the camp!`)>> /* Special find - rare valuables */ <<if random(1, 100) <= 40>> <<set _randomValuable = either(["Fine_Cloth", "Ivory", "Wine"])>> <<set _amount = Math.floor(random(3, 6) * _pillageEffectiveness.resources)>> <<set _valuablesLooted[_randomValuable] += _amount>> <<set _displayName = _randomValuable === "Fine_Cloth" ? "Fine Cloth" : _randomValuable>> <<run _combatLog.push(`Your raiders discovered a stash of ${_amount} high-quality ${_displayName}!`)>> <</if>> <</if>> <</if>> <<elseif _round === 4>> <<if random(1, 100) <= 75>> /* Changed from 90 to 75 */ <<if $PillageObjective === "Prisoners" || $PillageObjective === "Balanced">> <<if _location.prisoners > 0>> <<set _foundPrisoners = Math.min(_location.prisoners, Math.floor(random(2, 4) * _pillageEffectiveness.prisoners))>> /* Increased from 1-3 to 2-4 */ <<set _prisonersRescued += _foundPrisoners>> <<set _location.prisoners -= _foundPrisoners>> <<run _combatLog.push(`Your raiders found ${_foundPrisoners} more prisoner${_foundPrisoners > 1 ? 's' : ''} in a hidden area of the camp!`)>> <</if>> <</if>> /* Final valuable items haul */ <<if $PillageObjective === "Resources" || $PillageObjective === "Balanced">> <<set _randomValuable1 = either(["Dyes", "Pottery"])>> <<set _randomValuable2 = either(["Venison", "Wine"])>> <<set _amount1 = Math.floor(random(2, 4) * _pillageEffectiveness.resources)>> <<set _amount2 = Math.floor(random(2, 5) * _pillageEffectiveness.resources)>> <<set _valuablesLooted[_randomValuable1] += _amount1>> <<set _valuablesLooted[_randomValuable2] += _amount2>> <<run _combatLog.push(`Before leaving, your raiders grab ${_amount1} ${_randomValuable1} and ${_amount2} ${_randomValuable2} from the bandits' storage!`)>> <</if>> <</if>> <</if>> <</if>> <</for>> /* Add resources to player inventory */ <<set $Gold += _goldLooted>> <<set $Wood += _woodLooted>> <<set $Food += _foodLooted>> <<if $Stone !== undefined>> <<set $Stone += _stoneLooted>> <<else>> <<set $Stone = _stoneLooted>> <</if>> /* Add valuable items to player inventory */ <<for _valuable, _amount range _valuablesLooted>> <<if _amount > 0>> <<set $Valuables[_valuable] += _amount>> <</if>> <</for>> /* Calculate new camp stats */ <<set _newBanditsRemaining = _banditsRemaining - _banditsDefeated>> <<set _location.banditGuards = _newBanditsRemaining>> <<set _casualtyPercentage = Math.round((_casualties / _initialRaiderCount) * 100) || 0>> /* Determine camp strength reduction */ <<set _strengthReduction = Math.min(25, Math.floor((_banditsDefeated / _originalBanditCount) * 50))>> <<set _newCampStrength = Math.max(0, _campInitialStrength - _strengthReduction)>> <<set _location.campStrength = _newCampStrength>> /* Increment attack counter */ <<if !_location.attacksCount>><<set _location.attacksCount = 0>><</if>> <<set _location.attacksCount++>> /* Determine raid status */ <<if _casualties === 0 && (_goldLooted > 50 || _prisonersRescued > 0)>> <<set _raidStatus = "Flawless Pillage">> <<set _outcomeMessage = "Your raiders executed a perfect pillage, escaping with valuable loot and suffering no casualties.">> <<elseif _casualties === 0>> <<set _raidStatus = "Clean Getaway">> <<set _outcomeMessage = "Your forces managed to pillage the camp and escape without any casualties.">> <<elseif _retreatTriggered>> <<set _raidStatus = "Desperate Escape">> <<set _outcomeMessage = "Your raiders took heavy losses during the pillage but managed to retreat with what they could gather.">> <<elseif _casualties < (_initialRaiderCount * 0.2) && (_goldLooted > 0 || _prisonersRescued > 0)>> <<set _raidStatus = "Successful Pillage">> <<set _outcomeMessage = "Despite suffering some casualties, your raiders successfully pillaged the camp.">> <<else>> <<set _raidStatus = "Costly Pillage">> <<set _outcomeMessage = "Your pillage operation succeeded but at a significant cost of raiders.">> <</if>> /* Process rescued prisoners */ <<for _i = 0; _i < _prisonersRescued; _i++>> <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> /* Generate random details for prisoner */ <<set _prisonerSex = random(1, 100) <= 50 ? "Female" : "Male">> <<set _prisonerHairColor = _prisonerSex === "Female" ? either(["Blonde", "Red", "Brown"]) : "Brown">> <<set _int = random(1, 15)>> /* Changed to 1-15 to match available images */ /* Get proper name from appropriate list */ <<if _prisonerSex === "Female">> <<set _names = Story.get("FemaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <<else>> <<set _names = Story.get("MaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <</if>> <<set _randomName = _names[random(0, _names.length - 1)]>> /* Create rescued prisoner */ <<if _prisonerSex === "Female">> <<set $CurrentCaptive to { prisonerId: $prisonerIdCounter, name: _randomName, sex: "Female", hairColor: _prisonerHairColor, ImagePath: "Images/Castle/Living Quaters/Female/" + _prisonerHairColor + "/" + _int + ".png", armor: "None", weapon: "None", health: 100, skill: 0, duty: "none" }>> <<set $prisonerIdCounter += 1>> <<else>> <<set $CurrentCaptive to { prisonerId: $prisonerIdCounter, name: _randomName, sex: "Male", hairColor: _prisonerHairColor, ImagePath: "Images/Castle/Living Quaters/Male/" + _int + ".png", armor: "None", weapon: "Dagger", health: 100, skill: 0, duty: "none" }>> <<set $prisonerIdCounter += 1>> <</if>> <<run State.variables.QuartersOccupance.push($CurrentCaptive)>> <<run _combatLog.push(`Rescued prisoner ${_randomName} has been given quarters in your castle.`)>> <</for>> /* Replace the raid outcome container HTML */ <div class="raid-outcome-container"> <div class="raid-status <<if _raidStatus.includes('Flawless') || _raidStatus.includes('Successful')>>success<<elseif _raidStatus.includes('Clean') || _raidStatus.includes('Costly')>>partial<<else>>failed<</if>>"> <<print _raidStatus>> </div> <div class="raid-outcome-message"> <<print _outcomeMessage>> </div> </div> /* Display Location Card */ <div class="location-card"> <div class="location-image"> <img @src="_location.imagePath" alt="Bandit Camp"> </div> <div class="location-info"> <h1><<print _location.name>></h1> <p><span class="info-label">Location Type:</span> Bandit Camp (<<print _location.size>>)</p> <p><span class="info-label">Number of Attacks:</span> <<print _location.attacksCount>></p> <p><span class="info-label">Camp Strength:</span> <<print _newCampStrength>>% (Was: <<print _campInitialStrength>>%)</p> <p><span class="info-label">Bandits Remaining:</span> <<print _newBanditsRemaining>> (Was: <<print _banditsRemaining>>)</p> <<if _location.prisoners !== undefined>> <p><span class="info-label">Prisoners Remaining:</span> <<print _location.prisoners>></p> <</if>> </div> </div> /* Display Combat Results */ <div class="combat-results"> <h2>Pillage Results</h2> <div class="response-stats"> <p><span class="info-label">Raiders:</span> <<print _initialRaiderCount>></p> <p><span class="info-label">Casualties:</span> <<print _casualties>> (<<print _casualtyPercentage>>%)</p> <p><span class="info-label">Bandits Defeated:</span> <<print _banditsDefeated>> / <<print _bandits.length>></p> <p><span class="info-label">Bandits Captured:</span> <<print _prisonersCaptured>></p> <<if _prisonersRescued > 0>> <p><span class="info-label">Prisoners Rescued:</span> <<print _prisonersRescued>></p> <</if>> <h3>Resources Looted</h3> <p><span class="info-label">Gold:</span> <<print _goldLooted>></p> <p><span class="info-label">Wood:</span> <<print _woodLooted>></p> <p><span class="info-label">Food:</span> <<print _foodLooted>></p> <p><span class="info-label">Stone:</span> <<print _stoneLooted>></p> <h3>Valuables Looted</h3> <div class="valuables-grid"> <<for _valuable, _amount range _valuablesLooted>> <<if _amount > 0>> <<set _displayName = _valuable === "Fine_Cloth" ? "Fine Cloth" : _valuable>> <div class="valuable-item"> <img src="Images/Icons/<<print _valuable>>.png" alt="<<print _displayName>>" title="<<print _displayName>>"> <span><<print _displayName>>: <<print _amount>></span> </div> <</if>> <</for>> </div> </div> </div> /* Display Raiding Party Status */ <<set _survivors = $RaidingParty.filter(r => r.health > 0)>> <<set _fallen = $RaidingParty.filter(r => r.health <= 0)>> <div class="raid-section"> <h2>Raiding Party Status</h2> <div class="raider-container"> /* Display Survivors */ <<for _raider range _survivors>> <div class="raider-card"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> <p>Health: <<print _raider.health>></p> </div> <</for>> /* Display Casualties */ <<for _raider range _fallen>> <div class="raider-card deceased"> <img @src="_raider.ImagePath" alt="_raider.name"> <h3><<print _raider.name>></h3> <p>Armor: <<print _raider.armor>></p> <p>Weapon: <<print _raider.weapon>></p> </div> <</for>> </div> </div> /* Display Combat Log */ <div class="combat-results"> <h2>Pillage Operation Log</h2> <div class="combat-log"> <<for _log range _combatLog>> <p class="combat-entry"><<print _log>></p> <</for>> </div> </div> /* Return surviving raiders to barracks */ <<for _survivor range _survivors>> <<if _survivor.name !== "Lucy" && _survivor.name !== "Alice">> <<run $BarraksOccupance.push(_survivor)>> <</if>> <</for>> <div style="text-align: center"> <<button "Continue">> <<set $pendingRaid to false>> <<goto "End Day">> <</button>> </div> <</nobr>>
<<nobr>> <<set _location to $RaidLocationList.find(p => p.locationId === $currentLocationid)>> <style> .objective-card { width: 280px; margin: 10px; padding: 15px; border: 2px solid #333; border-radius: 8px; cursor: pointer; transition: transform 0.3s, box-shadow 0.3s; background-color: rgba(0, 0, 0, 0.7); color: #fff; text-align: center; } .objective-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.4); background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .objective-container { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-top: 20px; } .objective-icon { font-size: 48px; margin-bottom: 15px; } .unknown-info { font-style: italic; color: #aaa; } </style> <div class="text-box"> <h1>Pillage Objective Selection</h1> <h2><<print _location.name>></h2> <p>Before launching your raid on this bandit camp, you need to decide what your primary objective will be. This will affect how your raiders allocate their efforts during the operation.</p> <div class="objective-container"> <!-- Prisoners Objective --> <div class="objective-card" id="prisoners-objective"> <div class="objective-icon">👥</div> <h3>Rescue Prisoners</h3> <p>Focus on locating and freeing captives held by the bandits.</p> <<if _location.explorerKnowledge && _location.explorerKnowledge.prisonersVisible>> <p>Known Prisoners: <<print _location.prisoners>></p> <<else>> <p class="unknown-info">Number of prisoners: Unknown</p> <p>Your scouts couldn't determine how many prisoners are being held.</p> <</if>> <p>Choosing this objective will prioritize prisoner rescue but may result in fewer resources collected.</p> <<button "Select This Objective">> <<set $PillageObjective = "Prisoners">> <<goto "RaidSummary">> <</button>> </div> <!-- Resources Objective --> <div class="objective-card" id="resources-objective"> <div class="objective-icon">💰</div> <h3>Gather Resources</h3> <p>Focus on locating and collecting valuable resources from the camp.</p> <<if _location.explorerKnowledge && _location.explorerKnowledge.resourcesVisible>> <p>Known Resources:</p> <ul style="text-align: left; list-style-type: none; padding-left: 10px;"> <<for _resourceType, _amount range _location.resources>> <li>• <<print _resourceType>>: <<print _amount>></li> <</for>> </ul> <<else>> <p class="unknown-info">Resources: Unknown</p> <p>Your scouts couldn't determine what resources are available.</p> <</if>> <p>Choosing this objective will maximize resource collection but may result in fewer prisoners rescued.</p> <<button "Select This Objective">> <<set $PillageObjective = "Resources">> <<goto "RaidSummary">> <</button>> </div> <!-- Balanced Approach --> <div class="objective-card" id="balanced-objective"> <div class="objective-icon">⚖️</div> <h3>Balanced Approach</h3> <p>Strike a balance between rescuing prisoners and gathering resources.</p> <p>This approach won't maximize either objective but provides a more even outcome.</p> <<button "Select This Objective">> <<set $PillageObjective = "Balanced">> <<goto "RaidSummary">> <</button>> </div> </div> <div style="margin-top: 20px; text-align: center;"> <<button "Back to Team Selection">> <<run $RaidingParty.forEach(raider => $BarraksOccupance.push(raider))>> <<set $RaidingParty = []>> <<goto "RaidTeamSelection">> <</button>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _prisoner to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<set _imagePath to _prisoner.ImagePath>> <<set _pathParts to _imagePath.split("/")>> <<set _filename to _pathParts[_pathParts.length - 1]>> <<set _currentImageNumber to Number(_filename.replace(".png", ""))>> <h2>Edit Character</h2> <div style="display: flex; gap: 30px; margin: 20px 0;"> <!-- Image Preview and Navigation --> <div style="flex: 0 0 300px; text-align: center;"> <img @src="_prisoner.ImagePath" style="width: 100%; height: auto; border-radius: 5px; margin-bottom: 15px;"> <div style="display: flex; justify-content: space-between; align-items: center;"> <<button "◀ Previous">> <<set _newNumber to _currentImageNumber - 1>> <<if _newNumber < 1>><<set _newNumber to 20>><</if>> <<set _newPath to _imagePath.replace(_filename, _newNumber + ".png")>> <<set _prisoner.ImagePath to _newPath>> <<goto "EditMercenary">> <</button>> <span>Image <<print _currentImageNumber>> / 20</span> <<button "Next ▶">> <<set _newNumber to _currentImageNumber + 1>> <<if _newNumber > 20>><<set _newNumber to 1>><</if>> <<set _newPath to _imagePath.replace(_filename, _newNumber + ".png")>> <<set _prisoner.ImagePath to _newPath>> <<goto "EditMercenary">> <</button>> </div> </div> <!-- Character Details Form --> <div style="flex: 1;"> <div style="margin-bottom: 20px;"> <label for="characterName" style="display: block; margin-bottom: 5px; font-weight: bold;">Character Name:</label> <<textbox "_tempName" _prisoner.name>> </div> <<if _prisoner.sex is "Female">> <div style="margin-bottom: 20px;"> <label style="display: block; margin-bottom: 5px; font-weight: bold;">Hair Color:</label> <div style="display: flex; gap: 10px;"> <<set _basePath to _imagePath.substring(0, _imagePath.lastIndexOf("/"))>> <<set _basePath to _basePath.substring(0, _basePath.lastIndexOf("/") + 1)>> <<button "Blonde">> <<set _newPath to _basePath + "Blonde/" + _currentImageNumber + ".png">> <<set _prisoner.ImagePath to _newPath>> <<set _prisoner.hairColor to "Blonde">> <<goto "EditMercenary">> <</button>> <<button "Brown">> <<set _newPath to _basePath + "Brown/" + _currentImageNumber + ".png">> <<set _prisoner.ImagePath to _newPath>> <<set _prisoner.hairColor to "Brown">> <<goto "EditMercenary">> <</button>> <<button "Red">> <<set _newPath to _basePath + "Red/" + _currentImageNumber + ".png">> <<set _prisoner.ImagePath to _newPath>> <<set _prisoner.hairColor to "Red">> <<goto "EditMercenary">> <</button>> </div> </div> <</if>> <div style="margin-top: 30px;"> <h3>Character Information</h3> <p>Sex: <<print _prisoner.sex>></p> <p>Current Hair Color: <<print _prisoner.hairColor || "N/A">></p> <p>Armor: <<print _prisoner.armor>></p> <p>Weapon: <<print _prisoner.weapon>></p> <p>Specialization: <<print _prisoner.specialization || "None">></p> </div> </div> </div> <div style="display: flex; justify-content: center; gap: 20px; margin-top: 30px;"> <<button "Save Changes">> <<set _prisoner.name to _tempName>> <<goto "Mercenary">> <</button>> <<button "Cancel">> <<goto "Mercenary">> <</button>> </div> </div> <</nobr>>
<<nobr>> <<set _greetingPlayer to [ "Welcome, come warm yourslef by my fire", "Hello, thank you come coming", "Welcome, please help yourself to wine"]>> <<set _greetingAction to [ "She steps into your chamber and closer to the harth", "She enters the chambers and stands before you", "She enters the chambers and poors a chalice of wine"]>> <<set _greetingNPC to [ "Thank you, my lord", "Of course my lord", "Thank you, lord"]>> <<set _undessPlayer1 to [ "Remove your garments", "Would you like to disrobe for me?", "I want you to undress for me", "Show me whats hiding under those clothes"]>> <<set _undressAction1 to [ "She grins and begins to unfastern her clothes, letting each part fall to the floor", "Wordlessly, she begins to undress, you watch as she slowly removes the outer layer of her clothes. You cannot tell if she is being slow intentionally or due to nerves ", "You see a flash of excitement pass over her face and she prepares to remove her clothing", "Teasingly slowly, she removes each time of her clothing until she is stood before you wearing only under undergarments"]>> <<set _undressNPC1 to [ "Do you like what you see?", "Shall I continue?", "Would you like to see more?", "Shall I remove the rest?"]>> <<set _undessPlayer2 to [ "Continue", "I want to see all of you", "Everything...", "Keep going"]>> <<set _undressAction2 to [ "Having gained confidence she continues to tease you, undressing slowly", "With her excitement growing, she continues, making a show out of removing her clothes", "Her exictiment is hard to hard to contain as she removes what remains of her clothes and tosses them across the room", "Submissively, she removes the rest of her clothes making sure to show off each part of her body"]>> <<set _undressNPC2 to [ "Am I to your liking?", "How may I serve", "Are you going to use me", "I am happy to serve you, lord"]>> <<set _playerBJ to [ "I want your mouth on me — now.", "It's been a brutal day, and I need you to take care of me.", "On your knees. Show me how well you can serve me.", "Come closer… use that mouth and don’t stop until I’m satisfied.", "Kneel, and pleasure me until I’m spilling down your throat." ]>> <<set _guardBJ to [ "At once, my lord — I’ve been waiting for this command.", "Yes… I’ll make you forget your burdens tonight.", "As you wish. I’ll worship your cock until you can take no more.", "Gladly, my lord. I’ll serve you with every part of me.", "Anything for you — I’ll taste you, savor you, and drink every drop." ]>> <<set _guardGoesDownOnYou to [ "The guard kneels before you on the rug, firelight flickering over their face as they free your cock from your trousers. They wrap their lips around the swollen head, tongue swirling before they sink lower, taking you deep. The heat of their mouth makes your knees weak, the wet sounds echoing in the chamber.", "They glance up at you once, eyes glinting in the fire’s glow, before sliding their mouth down your length. Their tongue presses hard along the underside of your cock as they bob their head, spit dripping down their chin and onto their breastplate with every sloppy movement.", "Kneeling obediently, the guard grasps your hips and forces you into their throat, gagging lightly around your shaft but never pulling back. Their drool coats you, slicking your cock as they swallow again and again, the lewd sounds mixing with the crackle of the hearth behind you.", "The guard strokes your shaft with one hand while sucking the head greedily, tongue circling and flicking across the slit. Strings of spit gleam in the firelight as they pump their mouth up and down, moaning around your cock as if the taste of you alone was enough to make them lose control.", "They bury their face against your groin, nose pressed to your skin as they take you to the hilt. The heat of their throat surrounds you, tight and slick, while their tongue flickers along your length. Each time they pull back, a wet strand of saliva connects their lips to your cock, glistening in the fire’s glow before they swallow you down again."]>> <<set _guardBJIntense to [ "The guard takes you deep, throat straining around your length as they gag softly, spit streaming down their chin. Their tongue lashes wildly, desperate to push you over the edge while their hands clutch your thighs in a bruising grip.", "Their mouth works faster now, bobbing up and down your cock with wet, lewd slurps. Strings of saliva swing between their lips and shaft each time they pull back, only to swallow you again, moaning like they’re drunk on the taste of you.", "Kneeling obediently, the guard strokes your length with both hands while sucking the head with frantic hunger. They swirl their tongue across the slit, lapping up every drop of your pre-cum and whimpering as though it were wine.", "They push you deep into their throat, holding themselves there until their eyes water, then pulling back to suck noisily at the tip. Their lips are swollen and slick, face shining in the firelight as they pump their mouth urgently, coaxing your climax.", "The guard devours you with a fevered pace, spit and precum coating their chin as they slobber down your shaft. Their moans rumble in their throat, sending shivers up your spine, every sound begging you to finish for them."]>> <<set _guardBJFinish to [ "With a muffled moan, the guard keeps their lips sealed tight around your cock as you erupt in their mouth. Their throat works frantically, swallowing every hot spurt until they pull back, gasping, cum smeared across their lips.", "You groan as you spill across the guard’s tongue, their eyes fluttering shut while they swallow greedily. When you finally pull free, a dribble of seed escapes their lips and runs down their chin, glistening in the firelight.", "You hold the guard’s head in place as you unload down their throat. They choke, gag, then gulp it all down, eyes watering as they take every drop without complaint, your cock glistening with spit and cum as they finally release it with a wet pop.", "You tug your cock free at the last moment, spraying thick ropes across the guard’s face. Strands of cum streak their cheeks and lips, dripping onto their armor as they open their mouth eagerly, tongue lolling to catch more.", "With a sharp thrust, you finish hard, painting the guard’s face in hot seed. They smear it across their cheeks with pride, licking their lips and swallowing the drops that landed in their mouth, firelight gleaming off the mess you left on them."]>> <<set _BedLines to [ "I love feeling your fingers inside me Lord...", "Oh...", "Yes! Fuck me hard!", "Gods I need your cock Lord"]>> <<set _BedActions to [ "You push her onto the bed and she lets out an excited squeel before before letting out a soft moan as your fingers work into her", "She falls back onto the bed and lets out a gasp as you press your fingers into her", "Climbing on top of her, you press your cock into her wet mound and push deep", "You get on top, pinning her to the bed and being to fuck her"]>> <<set _tableActions to [ "You push your hips forward, feeling her tightness grip you as you penetrate her deeply", "Her legs wrap around your waist, pulling you closer as you thrust into her", "Her moans of pleasure echo around the room as you take her hard and fast", "You reach down to rub her clit, making her moans louder"]>> <<set _chairActions to [ "You watch as she straddles the chair, her ample breasts swaying enticingly", "You feel her wetness on your cock as she lowers herself onto you", "Her hips grind against yours, her pace growing faster and more intense", "She leans forward, her hands gripping the back of the chair for support as she slides down you"]>> <</nobr>>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _rand to random(0, 4)>> <<You>>_playerBJ[_rand]<</You>> <<set _chamberImagePath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/" + $chamberFolderNum + "/" + $chamberImageState + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_chamberImagePath" alt="<<_character.name>> Image"> </div> <<say _character.name _chamberImagePath>>_guardBJ[_rand]<</say>> <<if $chamberImageState === 1>> <<if $selectedCharacterSource === "barracks">> _guardGoesDownOnYou[_rand] <<set _int1 to random(1, 3)>> <<set _int2 to 4>> <<set _int3 to random(17,18)>> <<else>> <<set _int1 to random(11, 12)>> <<set _int2 to 13>> <<set _int3 to random(14, 16)>> <</if>> <<else>> <<set _int1 to random(6, 7)>> <<set _int2 to 8>> <<set _int3 to random(19, 20)>> <</if>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _int1 + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> _guardBJIntense[_rand] <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _int2 + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> _guardBJFinish[_rand] <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _int3 + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> </div> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss her">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 10)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "Chambers">> <</button>> </div> <<else>> <<button "Dismiss her">> <<goto "Chambers">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> She steps towards you and help you undress. Once nude you both embrace and explore your bodys<br> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/Grope/1.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<set _int1 to random(1, 2)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/Bound/" + _int1 + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<set _int1 to random(9, 10)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _int1 + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> </div> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss her">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 15)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "Chambers">> <</button>> </div> <<else>> <<button "Dismiss her">> <<goto "Chambers">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<include "ChamberCharacterDialogue">> <div class="text-box"> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<if $Position is "Chair">> <<set _rand to random(1, 3)>> <<elseif $Position is "Desk">> <<set _rand to random(1, 4)>> <<else>> <<set _rand to random(1, 2)>> <</if>> <<set _chamberImagePath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/" + $chamberFolderNum + "/" + $chamberImageState + ".png">> <<if $Position is "Bed">> <<set _int to random(0, 1)>> <<set _line to _BedActions[_int]>> _line <<set _img to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/Finger/1.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_img" alt="<<_character.name>> Image"> </div><br><br> <<set _int to random(0, 1)>> <<set _line to _BedLines[_int]>> <<say '_character.name' _chamberImagePath>>_line<</say>> <</if>> <<if $Position is "Table">> <<set _int to random(0, 3)>> <<set _line to _tableActions[_int]>> _line <<elseif $Position is "Chair">> <<set _int to random(0, 3)>> <<set _line to _chairActions[_int]>> _line <</if>> <<set _img to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/" + $Position + "/" + _rand + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_img" alt="<<_character.name>> Image"> </div> <<set _int to random(2, 3)>> <<set _line to _BedLines[_int]>> <<say '_character.name' _chamberImagePath>>_line<</say>> <span id="button1"><<button "Cum on her face">> <<replace "#face">> <<set _rand to random(19, 20)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _rand + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say '_character.name' _chamberImagePath>>Thank you...<</say>> Taking her head you pulls her back onto your cock allowing her mouth to clean you up <<set _rand to random(23, 24)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _rand + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<replace "#button2">><</replace>> <div style="text-align: center"> <<button "Dismiss her">> <<goto "Chambers">> <</button>> </div> <</replace>> <</button>></span> <div id="face"></div> <span id="button2"><<button "Cum on her chest">> <<replace "#chest">> <<set _rand to random(21, 22)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _rand + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say '_character.name' _chamberImagePath>>Thank you...<</say>> Taking her head you pulls her back onto your cock allowing her mouth to clean you up <<set _rand to random(23, 24)>> <<set _imgPath to "Images/Castle/Chambers/Summon/" + _character.hairColor + "/BJ/" + _rand + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<replace "#button1">><</replace>> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss her">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 20)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "Chambers">> <</button>> </div> <<else>> <<button "Dismiss her">> <<goto "Chambers">> <</button>> <</if>> </div> <</replace>> <</button>></span> <div id="chest"></div> </div> <</nobr>>
<style> .bj-container { max-width: 800px; margin: 0 auto; padding: 12px; display: flex; flex-direction: row; background: rgba(0,32,0,0.2); border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.2); } /* Left side with dealer image and controls */ .bj-dealer-side { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: space-between; padding-right: 12px; } .dealer-image { width: 220px; /* Increased by approx 20% */ height: auto; border-radius: 10px; box-shadow: 0 4px 16px rgba(0,0,0,0.35); margin-bottom: 15px; border: 2px solid #444; } .options-row { width: 100%; display: flex; flex-direction: column; gap: 8px; margin-top: 15px; } /* Scoped button styles removed so global button CSS applies */ /* Right side with cards and game status */ .bj-game-side { flex: 2; background: rgba(24, 24, 32, 0.98); border-radius: 8px; box-shadow: 0 2px 12px rgba(0,0,0,0.3); padding: 14px; color: #eee; display: flex; flex-direction: column; } .hand-container { margin-bottom: 12px; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 12px; } .hand-container:last-of-type { margin-bottom: 5px; } .hand-label { font-weight: bold; font-size: 1.3em; color: #fff; margin-bottom: 6px; letter-spacing: 0.02em; text-shadow: 0 1px 3px rgba(0,0,0,0.5); } .gold-display { font-size: 1.1em; color: #ffd700; text-align: right; margin-bottom: 8px; font-weight: bold; display: flex; align-items: center; justify-content: flex-end; } .gold-icon { width: 20px; height: 20px; margin-right: 5px; vertical-align: middle; } .wager-display { font-size: 1em; color: #ffd700; text-align: center; margin-top: 8px; font-weight: bold; padding: 5px; border-radius: 4px; background: rgba(0,0,0,0.2); display: flex; align-items: center; justify-content: center; } .wager-icon { width: 16px; height: 16px; margin-right: 5px; vertical-align: middle; } .cards { display: flex; flex-direction: row; gap: 6px; flex-wrap: nowrap; align-items: center; width: 100%; overflow: visible; /* Changed from hidden to visible */ margin-bottom: 10px; /* Add margin to prevent overflow issues */ } .card-wrapper { transition: transform 0.2s, width 0.3s ease; margin: 2px; flex: 1; min-width: 70px; max-width: 110px; /* Reduced from 180px */ } .card-wrapper:hover { transform: translateY(-5px) rotate(2deg); z-index: 5; } .card { width: 100%; display: inline-block; } .card img { width: 100%; height: auto; display: block; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); } /* Adjust card widths based on card count */ .cards[data-card-count="2"] .card-wrapper { max-width: 100px; } .cards[data-card-count="3"] .card-wrapper { max-width: 90px; } .cards[data-card-count="4"] .card-wrapper { max-width: 80px; } .cards[data-card-count="5"] .card-wrapper { max-width: 70px; } .cards[data-card-count="6+"] .card-wrapper { max-width: 60px; } .status { margin-top: 10px; font-weight: bold; color: #ffd700; font-size: 1.4em; text-align: center; text-shadow: 0 1px 3px rgba(0,0,0,0.5); } /* Responsive design */ @media (max-width: 768px) { .bj-container { flex-direction: column; } .bj-dealer-side { flex-direction: row; padding-right: 0; padding-bottom: 12px; align-items: center; margin-bottom: 12px; } .dealer-image { width: 150px; margin-bottom: 0; margin-right: 15px; } .options-row { flex: 1; flex-direction: row; margin-top: 0; } .card { width: 130px; } } @media (max-width: 480px) { .bj-dealer-side { flex-direction: column; padding-bottom: 8px; } .dealer-image { width: 120px; margin-right: 0; margin-bottom: 8px; } .card { width: 100px; } .hand-label { font-size: 1.1em; } .status { font-size: 1.1em; } } </style> <<script>> // Make global game handler functions available on window window.bjGame = (function() { const RANKS = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']; const WAGER_AMOUNT = 50; const PAYOUT_MULTIPLIER = 2; // Player gets 2x their bet when winning function makeDeck() { return RANKS.map(r => ({ rank: r, value: (r === 'A') ? 11 : (['J','Q','K'].includes(r) ? 10 : Number(r)) })).shuffle(); } function handValue(hand) { if (!hand || hand.length === 0) return 0; let total = 0, aces = 0; for (const c of hand) { if (c.rank === 'A') { total += 11; aces++; } else total += c.value; } while (total > 21 && aces) { total -= 10; aces--; } return total; } function initGame() { // Initialize BJDealer and BJDealersLoss if they don't exist if (State.variables.BJDealer === undefined) { State.variables.BJDealer = "Default"; } if (State.variables.BJDealersLoss === undefined) { State.variables.BJDealersLoss = 0; } if (State.variables.BJDealersLossMax === undefined) { State.variables.BJDealersLossMax = 3; // Default max losses before player wins } if (State.variables.Gold === undefined) { State.variables.Gold = 200; } if (!State.variables.bj) { const deck = makeDeck(); State.variables.bj = { deck: deck, player: [deck.pop(), deck.pop()], dealer: [deck.pop(), deck.pop()], stage: "wager", // New stage for wagering message: "", reveal: false, wager: WAGER_AMOUNT, dealerLostThisRound: false }; } } function canPlaceBet(amount) { // Check if player has enough gold return State.variables.Gold >= amount; } function placeBet(amount) { if (!canPlaceBet(amount)) return false; const G = State.variables.bj; G.stage = "play"; G.wager = amount; // We don't deduct gold yet - only when they lose or at game end Engine.play(passage()); return true; } function reset() { // Check if player has won the game if (State.variables.BJDealersLoss >= State.variables.BJDealersLossMax) { Engine.play("BJPlayerWins"); return; } const deck = makeDeck(); State.variables.bj = { deck: deck, player: [deck.pop(), deck.pop()], dealer: [deck.pop(), deck.pop()], stage: "wager", // Reset to wager stage message: "", reveal: false, wager: 10, dealerLostThisRound: false }; // Don't call Engine.play here - it will happen automatically } function hit() { const G = State.variables.bj; if (G.stage !== 'play' || !G.deck.length) return; G.player.push(G.deck.pop()); if (handValue(G.player) > 21) { G.stage = 'done'; G.reveal = true; G.message = 'Player busts. Dealer wins.'; // Player loses - deduct gold State.variables.Gold = Math.max(0, State.variables.Gold - G.wager); } Engine.play(passage()); } function stand() { const G = State.variables.bj; if (G.stage !== 'play') return; G.reveal = true; while (handValue(G.dealer) < 17 && G.deck.length) { G.dealer.push(G.deck.pop()); } G.stage = 'done'; const pv = handValue(G.player); const dv = handValue(G.dealer); let playerWins = false; if (pv > 21) { G.message = 'Player busts. Dealer wins.'; // Player loses - deduct gold State.variables.Gold = Math.max(0, State.variables.Gold - G.wager); } else if (dv > 21) { G.message = 'Dealer busts. Player wins!'; playerWins = true; // Player wins - add gold (2x wager) State.variables.Gold += G.wager * PAYOUT_MULTIPLIER; } else if (pv === dv) { G.message = 'Push. Bet returned.'; // No money changes hands } else if (pv > dv) { G.message = 'Player wins!'; playerWins = true; // Player wins - add gold (2x wager) State.variables.Gold += G.wager * PAYOUT_MULTIPLIER; } else { G.message = 'Dealer wins.'; // Player loses - deduct gold State.variables.Gold = Math.max(0, State.variables.Gold - G.wager); } // If player wins, set stage to 'won' to show continue button if (playerWins) { G.dealerLostThisRound = true; G.stage = 'won'; } Engine.play(passage()); } // Initialize the game when this script runs initGame(); return { hit, stand, reset, placeBet, canPlaceBet, handValue, WAGER_AMOUNT, initGame }; })(); <</script>> <<nobr>> <<silently>> <<if typeof $Gold === "undefined">> <<set $Gold to 200>> <</if>> <<if typeof $BJDealer === "undefined">> <<set $BJDealer to "Default">> <</if>> <<if typeof $BJDealersLoss === "undefined">> <<set $BJDealersLoss to 0>> <</if>> <<set _bj to $bj>> <<set _pv to window.bjGame.handValue(_bj.player)>> <<set _dv to _bj.reveal ? window.bjGame.handValue(_bj.dealer) : window.bjGame.handValue([_bj.dealer[0]])>> <<set _dlabel to _bj.reveal ? `Dealer (${_dv})` : "Dealer (??)">> <<set _canPlaceBet to window.bjGame.canPlaceBet()>> <<set _wagerAmount to window.bjGame.WAGER_AMOUNT>> <</silently>> <div class="bj-container"> <!-- Left side with dealer image and buttons --> <div class="bj-dealer-side"> <<set _dealerImg to "Images/Town/Inn/Dealer/" + $BJDealer + "/" + $BJDealersLoss + ".png" >> <div class="Random-image"> <img @src=_dealerImg alt="Guest Image"> </div> <div class="options-row"> <<if _bj.stage === "wager">> <<if $Gold >= 10>> <button onclick="window.bjGame.placeBet(10)">Bet 10 Gold</button> <<else>> <button disabled>Bet 10 Gold</button> <</if>> <<if $Gold >= 25>> <button onclick="window.bjGame.placeBet(25)">Bet 25 Gold</button> <<else>> <button disabled>Bet 25 Gold</button> <</if>> <<if $Gold >= 50>> <button onclick="window.bjGame.placeBet(50)">Bet 50 Gold</button> <<else>> <button disabled>Bet 50 Gold</button> <</if>> <<elseif _bj.stage === "play">> <button onclick="window.bjGame.hit()">Hit</button> <button onclick="window.bjGame.stand()">Stand</button> <<elseif _bj.stage === "won">> <<button "Continue">><<goto "BJDealerLossTransition">><</button>> <<elseif _bj.stage === "done">> <<button "Continue">><<script>>window.bjGame.reset();<</script>><<goto "hearts-blackjack">><</button>> <</if>> <<button "Leave">><<goto "ScarldaleTavLord">><</button>> </div> </div> <!-- Right side with cards and game state --> <div class="bj-game-side"> <div class="gold-display"> <img src="Images/Icons/Gold.png" class="gold-icon" alt="Gold"> <<print $Gold>> </div> <<if _bj.stage !== "wager">> <div class="hand-container"> <div class="hand-label"><<print _dlabel>></div> <div class="cards" data-card-count="<<print Math.min(6, _bj.dealer.length)>><<=_bj.dealer.length >= 6 ? '+' : ''>>"> <<for _i to 0; _i < _bj.dealer.length; _i++>> <div class="card-wrapper"><div class="card"> <<if !_bj.reveal and _i > 0>> <<print '<img src="Images/Cards/Playing/back.jpg">'>> <<else>> <<set _cardRank to _bj.dealer[_i].rank>> <<if _cardRank === 'J'>> <<set _cardFileName to "j">> <<elseif _cardRank === 'Q'>> <<set _cardFileName to "q">> <<elseif _cardRank === 'K'>> <<set _cardFileName to "k">> <<elseif _cardRank === 'A'>> <<set _cardFileName to "a">> <<else>> <<set _cardFileName to _cardRank.toLowerCase()>> <</if>> <<print '<img src="Images/Cards/Playing/' + _cardFileName + '.jpg">'>> <</if>> </div></div> <</for>> </div> </div> <div class="hand-container"> <div class="hand-label">Player (<<print _pv>>)</div> <div class="cards" data-card-count="<<print Math.min(6, _bj.player.length)>><<=_bj.player.length >= 6 ? '+' : ''>>"> <<for _i to 0; _i < _bj.player.length; _i++>> <div class="card-wrapper"><div class="card"> <<set _cardRank to _bj.player[_i].rank>> <<if _cardRank === 'J'>> <<set _cardFileName = "j">> <<elseif _cardRank === 'Q'>> <<set _cardFileName = "q">> <<elseif _cardRank === 'K'>> <<set _cardFileName = "k">> <<elseif _cardRank === 'A'>> <<set _cardFileName = "a">> <<else>> <<set _cardFileName = _cardRank.toLowerCase()>> <</if>> <<print '<img src="Images/Cards/Playing/' + _cardFileName + '.jpg">'>> </div></div> <</for>> </div> </div> <div class="wager-display"> <img src="Images/Icons/Gold.png" class="wager-icon" alt="Gold"> Current Bet: <<print _bj.wager>> (Win <<print _bj.wager * 2>>) </div> <<if _bj.stage === "play">> <div class="status"></div> <<else>> <div class="status"><<print _bj.message>></div> <</if>> <<else>> <div class="status">Place your bet to begin</div> <<if $Gold < 10>> <div class="status" style="color: #ff6666; font-size: 1em;">Not enough gold!</div> <</if>> <</if>> </div> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _img to "Images/Town/Inn/Dealer/" + $BJDealer + "/" + $BJDealersLoss + ".png">> <div class="Random-image"> <img @src=_img alt="Guest Image"> </div> <<include "BJDealerLines">> <<set _dealerKey to String($BJDealer)>> <<set _selectedLine to _dealerLossLines[_dealerKey][$BJDealerLineInt]>> <<say 'Dealer' _img>><<print _selectedLine>><</say>> <<set $BJDealerLineInt to $BJDealerLineInt + 1>> <<set _dealerKey to String($BJDealer)>> <<set _selectedLine to _dealerLossLines[_dealerKey][$BJDealerLineInt]>> <<say 'Dealer' _img>><<print _selectedLine>><</say>> <<button "Give her 25 gold back">> <<set $BJDealersLoss to $BJDealersLoss + 1>> <<set $BJDealerLineInt to $BJDealerLineInt + 1>> <<set $Position to "25">> <<set $Gold to $Gold - 25>> <<goto "BJPlayerWins2">> <</button>> <<button "Give her 50 gold back">> <<set $BJDealersLoss to $BJDealersLoss + 2>> <<set $BJDealerLineInt to $BJDealerLineInt + 2>> <<set $Position to "50">> <<set $Gold to $Gold - 50>> <<goto "BJPlayerWins2">> <</button>> <br> <<button "Take your winnings">> <<goto "ScarldaleTavLord">> <</button>> </div> <</nobr>>
<<nobr>> <<set _img to "Images/Town/Inn/Dealer/" + $BJDealer + "/" + $BJDealersLoss + ".png">> <div class="Random-image"> <img @src=_img alt="Guest Image"> </div> <<include "BJDealerLines">> <<set _dealerKey to String($BJDealer)>> <<set _selectedLine to _dealerLossLines[_dealerKey][$BJDealerLineInt]>> <<say 'Dealer' _img>><<print _selectedLine>><</say>> <<if $BJGameTrasistions isnot 2>> <<button "Continue">> <<set $BJDealerLineInt to $BJDealerLineInt + 1>> <<set $BJDealersLoss to $BJDealersLoss + 1>> <<set $BJGameTrasistions to 2>> <<goto "BJDealerLossTransition">> <</button>> <<else>> <<if $BJDealersLoss is $BJDealersLossMax>> <<button "Continue">> <<goto "BJPlayerWins" <</button>> <<else>> <<button "Continue">> <<set $BJDealerLineInt to $BJDealerLineInt + 1>> <<set $BJGameTrasistions to 1>> <<script>>window.bjGame.reset();<</script>> <<goto "hearts-blackjack">> <</button>> <</if>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $BJDealersLoss to 1>> <h2>Choose a dealer</h2> <div id="combat-spells" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Town/Inn/Dealer/1/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dealer 1</h3> <p>7 Images</p> <<if $Gold >= 50>> <<button "Choose her">> <<set $BJDealer to 1>> <<set $BJDealersLossMax to 7>> <<goto "hearts-blackjack">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Town/Inn/Dealer/2/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dealer 2</h3> <p>5 Images</p> <<if $Gold >= 50>> <<button "Choose her">> <<set $BJDealer to 2>> <<set $BJDealersLossMax to 5>> <<goto "hearts-blackjack">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Town/Inn/Dealer/3/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dealer 3</h3> <p>7 Images</p> <<if $Gold >= 50>> <<button "Choose her">> <<set $BJDealer to 3>> <<set $BJDealersLossMax to 7>> <<goto "hearts-blackjack">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Town/Inn/Dealer/4/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dealer 4</h3> <p>5 Images</p> <<if $Gold >= 50>> <<button "Choose her">> <<set $BJDealer to 4>> <<set $BJDealersLossMax to 5>> <<goto "hearts-blackjack">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img src="Images/Town/Inn/Dealer/5/1.png" style="width: 220px; height: 220px; object-fit: cover;"> <h3>Dealer 5</h3> <p>5 Images</p> <<if $Gold >= 50>> <<button "Choose her">> <<set $BJDealer to 5>> <<set $BJDealersLossMax to 5>> <<goto "hearts-blackjack">> <</button>> <<else>> <button disabled>Insufficient Gold</button> <</if>> </div> </div> <div style="text-align: center; margin-top: 20px;"> <<button "Leave">> <<goto "Merchant">> <</button>> </div> </div> <</nobr>> <<set $BJDealer to 1>> <<set $BJDealersLossMax to 7>>
<<nobr>> /* Check if settlement has local village guards who attack */ <<if _settlement.influence !== undefined && _settlement.influence <= 2 && random(1, 100) <= 10 && _settlement.garrison && _settlement.garrison.length > 0>> <<set _guardRaiders = []>> <<set _defenders = []>> <<set _combatLog = []>> /* Determine number of attacking guards based on influence level */ <<set _guardCount = 4 - _settlement.influence>> /* 0 influence = 4 guards, 1 influence = 3 guards, 2 influence = 2 guards */ /* Generate attacking guards */ <<for _i = 0; _i < _guardCount; _i++>> <<run _guardRaiders.push({ name: "Village Guard " + (_i + 1), health: 80, weapon: "Sword", damage: Math.floor(Math.random() * 6) + 20, armor: random(1, 2) === 1 ? "Light Armor" : "None" })>> <</for>> /* Setup settlement garrison defenders */ <<for _soldier range _settlement.garrison>> <<set _baseDamage = _soldier.weapon === "Sword" ? 35 : 30>> <<set _armorBonus = _soldier.armor !== "None" ? 25 : 0>> <<set _specializationBonus = 0>> /* Apply Defense specialization bonus if applicable */ <<if _soldier.specialization === "Defense">> <<if _soldier.skill >= 75>><<set _specializationBonus = 15>> <<elseif _soldier.skill >= 50>><<set _specializationBonus = 10>> <<elseif _soldier.skill >= 25>><<set _specializationBonus = 5>> <<else>><<set _specializationBonus = 2>><</if>> <</if>> <<run _defenders.push({ type: "Defender", name: _soldier.name, health: _soldier.health + _armorBonus, weapon: _soldier.weapon, damage: _baseDamage + (_specializationBonus/2), originalMember: _soldier, startingHealth: _soldier.health, defenseBonus: _specializationBonus })>> <</for>> /* Initialize combat report */ <<set _guardRaidReport = { day: $Day, settlement: _settlement.name, attackers: _guardCount, defenders: _settlement.garrison.length, outcome: "pending", combatLog: [] }>> <<run _reportEntry.events.push(`⚔️ ALERT: ${_guardCount} guards from the nearby village have attacked ${_settlement.name}!`)>> /* Combat processing */ <<for _round = 1; _defenders.length > 0 && _guardRaiders.length > 0; _round++>> <<set _currentRaider = _guardRaiders[0]>> <<set _currentDefender = _defenders[0]>> /* Village guard attacks */ <<set _raiderDamage = _currentRaider.damage>> <<set _defenderMitigated = Math.floor(_currentDefender.defenseBonus / 2)>> <<set _actualDamage = Math.max(1, _raiderDamage - _defenderMitigated)>> <<set _currentDefender.health -= _actualDamage>> <<run _guardRaidReport.combatLog.push(`Round ${_round}: ${_currentRaider.name} hits ${_currentDefender.name} for ${_actualDamage} damage${_defenderMitigated > 0 ? ` (${_defenderMitigated} mitigated)` : ''}`)>> /* Check defender death */ <<if _currentDefender.health <= 0>> <<run _guardRaidReport.combatLog.push(`${_currentDefender.name} has been killed!`)>> <<run _reportEntry.events.push(`${_currentDefender.name} was killed defending against village guards!`)>> <<run _settlement.garrison = _settlement.garrison.filter(g => g !== _currentDefender.originalMember)>> <<run _defenders.shift()>> <<else>> /* Defender counterattack */ <<set _currentRaider.health -= _currentDefender.damage>> <<run _guardRaidReport.combatLog.push(`${_currentDefender.name} counterattacks for ${_currentDefender.damage} damage`)>> /* Check raider death */ <<if _currentRaider.health <= 0>> <<run _guardRaidReport.combatLog.push(`${_currentRaider.name} has been defeated!`)>> <<run _guardRaiders.shift()>> <</if>> <</if>> <</for>> /* Update surviving garrison members' health */ <<for _defender range _defenders>> <<set _defender.originalMember.health = _defender.health>> <<if _defender.health < _defender.startingHealth + (_defender.originalMember.armor !== "None" ? 25 : 0)>> <<set _damageTaken = _defender.startingHealth - (_defender.health - (_defender.originalMember.armor !== "None" ? 25 : 0))>> <<if _damageTaken > 0>> <<run _reportEntry.events.push(`${_defender.name} was injured (${_damageTaken} damage taken, health now at ${_defender.originalMember.health})`)>> <</if>> <</if>> <</for>> /* Process raid results */ <<if _defenders.length === 0>> <<set _guardRaidReport.outcome = "settlement lost">> <div class="village-attack-warning" style="text-align: center; margin: 20px 0;"> <h2 style="color: #8b0000;">Guards Reclaimed: <<print _settlement.name>></h2> <h3 style="color: #4a4a4a;">The garrison has fallen to village guards</h3> <div style="font-style: italic; color: #666;"> The village guards have killed your garrison and liberated the settlement... </div> <hr style="border-color: #8b0000;"> </div> /* Create new raid location from lost settlement */ <<set $RaidLocationDetails = { locationId: $locationIdCounter ?? 100 + Math.floor(Math.random() * 900), NPCCount: _settlement.capturedVillagers ? _settlement.capturedVillagers.length : 0, name: _settlement.name, location: _settlement.location || "Forest", type: _settlement.type, size: _settlement.size, scouted: true, keys: 0, raidBuildingCount: _settlement.buildings ? Object.keys(_settlement.buildings).length : 4, raidGuardCount: _guardCount + 2, /* They fortified after fighting back */ raidVillagersCount: _settlement.capturedVillagers ? _settlement.capturedVillagers.length : "Unknown", imagePath: _settlement.imagePath }>> /* Add to raid location list if it exists */ <<if typeof $RaidLocationList !== "undefined">> <<run $RaidLocationList.push($RaidLocationDetails)>> <</if>> /* Remove from captured locations */ <<run $CapturedLocations = $CapturedLocations.filter(loc => loc.name !== _settlement.name)>> <<run _reportEntry.events.push(`You have lost control of ${_settlement.name}. The village guards have reclaimed the settlement.`)>> <<set _settlement.isLost = true>> <<else>> <<set _guardRaidReport.outcome = "attack repelled">> <<set _settlement.influence = Math.min(3, _settlement.influence + 1)>> /* Defeating guards increases influence */ <div class="village-attack-suppressed" style="text-align: center; margin: 20px 0;"> <h2 style="color: #006400;">Village Attack Repelled: <<print _settlement.name>></h2> <h3 style="color: #4a4a4a;">The garrison maintained control</h3> <div style="font-style: italic; color: #666;"> The attacking village guards were defeated... </div> <hr style="border-color: #006400;"> </div> <<run _reportEntry.events.push(`Your garrison successfully repelled the attack from ${_guardCount} village guards.`)>> <<run _reportEntry.events.push(`The settlement's influence has slightly improved after defeating the attackers.`)>> <</if>> /* Store combat report */ <<if !$guardRaidReports>> <<set $guardRaidReports = []>> <</if>> <<run $guardRaidReports.push(_guardRaidReport)>> <</if>> <</nobr>>
<<nobr>> <div class="text-box"> <<set $LucyFuckState to "Clothed">> <<if $LucyGlamour isnot true>> <<set $LucySexImg to "Images/Castle/Lucy/Fuck/Standing/1.png">> <<set _imagePath to "Images/Castle/Lucy/Fuck/2.png">> <<else>> <<set $LucySexImg to "Images/Castle/Lucy/Fuck/Standing/5.png">> <<set _imagePath to "Images/Castle/Lucy/Fuck/1.png">> <</if>> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>How do you prefer I look?<</say>> <hr> Change Lucy's appearance<br> <<button "Glamour">> <<set $LucyGlamour to true>> <<goto "LucyFuck2">> <</button>> <<button "Succubus">> <<set $LucyGlamour to false>> <<goto "LucyFuck2">> <</button>> <hr> <<button "Undress Her">> <<goto "LucyFuckUndress">> <</button>> <<if $LucyGlamour isnot true>> <<button "Allow her to dominate you">> <<goto "LucyFuckDom">> <</button>><br> <<else>> <<button "Fuck her">> <<goto "LucyFuck">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<You>>I want you to use your powers on me<</You>> <<if $LucyFuckDom isnot false>> <<say 'Lucy' $LucySexImg>>I-I could not, it is my place to serve you<</say>> <<You>>I'm tired of giving orders today... For once I want to serve, just for a short time<</You>> You watch for a moment as your loyal servant is conflicted between her devotion to you and her true nature. After a long moment, a smile spreads across her face and her eyes begin to glow bright <<set $LucyFuckDom to false>> <</if>> <<say 'Lucy' $LucySexImg>>If you wish to serve, look into my eyes<</say>> <<if ($LucyFuckState is "Underware") or ($LucyFuckState is "Naked")>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/start2.png">> <<else>> <<set $LucySexImg to "Images/Castle/Lucy/Fuck/Standing/2.png">> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/start.png">> <</if>> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You obay, staring into her eyes. You've faced the corrupting influance of her kind before and resisted it, but now you were giving yourself over to her willingly, unsure if it was lust or a desire to momentarily escape your position of power. You allow yourself to become hers <<say 'Lucy' $LucySexImg>>Good... Now kneel<</say>> You don't make a conscious decision to kneel, you just find yourself sinking to the floor becoming smaller before your new mistress, she somehow looks taller than she should, towering over you <<set _rearView to random(1, 2)>> <<if ($LucyFuckState is "Clothed") or ($LucyFuckState is "Nude")>> <<set _img to 1>> <<elseif $LucyFuckState is "Underware">> <<set _img to 2>> <<else>> <<set _img to 4>> <</if>> <<if _rearView is 1>> <<set _img to "rim1">> <</if>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $LucyFuckState isnot "Naked">> <<say 'Lucy' $LucySexImg>>Humm, I think I should take these off<</say>> Her hips move forward presnting her self to you <<say 'Lucy' $LucySexImg>>You want to see whats under these don't you<</say>> <<if ($LucyFuckState is "Naked") or ($LucyFuckState is "Underware")>> <<set _img to "strip2">> <<set $LucySexImg to "Images/Castle/Lucy/Fuck/Standing/4.png">> <<else>> <<set _img to "strip">> <</if>> <<if _rearView is 1>> <<set _img to "rim2">> <</if>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Her hands hook under the straps of her underware and she lowers them an inch before you reach out and slide them down to the ground <<if ($LucyFuckState is "Naked") or ($LucyFuckState is "Underware")>> <<set _img to 4>> <<else>> <<set _img to 3>> <</if>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<say 'Lucy' $LucySexImg>>Now, open your mouth for me<</say>> You do so, without hesitation. Lucy takes a slow step forward stopping just befor you, with her womanhood inches from your mouth <<if ($LucyFuckState is "Naked") or ($LucyFuckState is "Underware")>> <<set _img to random(7, 8)>> <<else>> <<set _img to random(5, 6)>> <</if>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>Do you want to worship me?<</say>> <<You>>Y-<</You>> She takes the back of your head and pulls you into her letting out a gasp as your mouth envelops her and your tongue presses against her clit <<if ($LucyFuckState is "Naked") or ($LucyFuckState is "Underware")>> <<set _img to random(11, 12)>> <<else>> <<set _img to random(9, 10)>> <</if>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> She grinds on your face for what feels like hours, rocking her hips back and forth while you lap at her clit, swallowing her intoxicating juices. Eventually, after what felt like hours, she pulls you away from her and you both catch your breaths <<say 'Lucy' $LucySexImg>>Very good... Its time for a reward... Get on the bed<</say>> <div style="text-align: center"> <<button "Obay">> <<goto "LucyFuckDom2">> <</button>> </div> </div> <</nobr>>
<div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Path/1.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> <script> window.loopImgPaths = [ "Images/Castle/Lucy/Fuck/FDom/hj1.png", "Images/Castle/Lucy/Fuck/FDom/hj2.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <div class="text-box"> You stand, knees sore from being on the floor for so long. Then you lay back and watch as Lucy crawls onto the bed and takes hold of your cock <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Castle/Lucy/Fuck/FDom/hj1.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> <<say 'Lucy' $LucySexImg>>How would you like to cum?<</say>> <<set _rand to random(0, 1)>> @@#examine-button; <span id="button1"> <<button "Handjob">> <<replace "#button2">><</replace>> <<replace "#examine-button">> <<if _rand is 0>> <<You>>Don't stop<</You>> <<say 'Lucy' $LucySexImg>>You want me to keep stroking your cock?<</say>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/14.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div><br><br> Lucy unclips her bra and continues stroking your cock, your eyes move from her hand to her chest and she takes notice <<say 'Lucy' $LucySexImg>>Ohh you like my chest? Let me get closer<</say>> Lucy leans over you pressing her breasts into your waiting mouth while her hand works over your cock. You take her breast into your mouth and tease her nipple <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/nhj.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Lucy' $LucySexImg>>Good boy, cum for me<</say>> You lick and suck at her nipple while Lucy leans over you and picks up the pace <<You>>Umm<</You>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/nhj2.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<say 'Lucy' $LucySexImg>>Yesss<</say>> <<button "Things go black">><<fadeToPassage "LucyFuckDom3">><</button>> <<else>> <<say 'Lucy' $LucySexImg>>Hummm, so greedy<</say>> Lucy flicks the tip of your cock sending a sharp sting making you wince <<say 'Lucy' $LucySexImg>>I think I'm done with this for today...<</say>> She stands, facing away from you and leans forward <<say 'Lucy' $LucySexImg>>Do you like my ass?<</say>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/rim3.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<You>>Y-Yes<</You>> <<say 'Lucy' $LucySexImg>>I'll let you choose which hole you fuck<</say>> Your cock twitches at the thought as you stare at her and think about which hole you want to use<br> <<button "Fuck her ass">> <<set $Position to "ass">> <<goto "LucyFuckDomHJ2">> <</button>><br> <<button "Fuck her pussy">> <<set $Position to "pussy">> <<goto "LucyFuckDomHJ2">> <</button>> <</if>> <</replace>> <</button>></span> @@ <span id="button2"> @@#examine-button; <<button "Blowjob">> <<replace "#button1">><</replace>> <<replace "#examine-button">> <<You>>With your mouth<</You>> <<if _rand is 0>> <<say 'Lucy' $LucySexImg>>Hummm, its your lucky day<</say>> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/bj1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Her mouth wraps around the head of your cock as she begins to tease your cock in ways that makes you cry out in pleasure. Your moans clearly excite Lucy as she puts more effort in and also begins to moan onto your cock <<say 'Lucy' $LucySexImg>>Ummm<</say>> <<button "Things go black">><<fadeToPassage "LucyFuckDom3">><</button>> <<else>> She stops <<say 'Lucy' $LucySexImg>>Hummm, so greedy<</say>> Lucy flicks the tip of your cock sending a sharp sting making you wince <<say 'Lucy' $LucySexImg>>I think I'm done with this for today...<</say>> In a slow move, Lucy straddles you and crawls up the bed, for a moment you hope shes about to ride you, but then she crawls higher up you until her cunt rests just above your chin<br> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/15.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>I have one final game for us to play<</say>> Without thinking, your tongue slips out your mout and you strain your neck trying to reach her but her knees pin your sholder in place<br> <<say 'Lucy' $LucySexImg>>Greedy! So eager but you don't even know the rules! Well... You can win if you make me cum before you pass out ok?<</say>> <<You>>Wh-<</You>> She rolles her hips into you cutting you off and forcing your head down into the bed as her thighs and cunt smother you <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/17.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>Ummm, thats it eat me $LucyName<</say>> You try to push her off, but your body is numb the only part of yourself under your control is your tongue so you as you're told <<say 'Lucy' $LucySexImg>>Keep going... Almost...<</say>> Her words seem father away as the cornor of your vision starts to fade <<say 'Lucy' $LucySexImg>>There!<</say>> <<button "Things go black">><<fadeToPassage "LucyFuckDom3">><</button>> <</if>> <</replace>> <</button>> @@</span> <div id="more-text" style="max-width:500px; margin:8px auto; text-align:center;"></div> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Castle/Lucy/Fuck/FDom/hj1.png", "Images/Castle/Lucy/Fuck/FDom/hj2.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <div class="text-box"> <<if $CurrentPlayer is "Overlord">> <<button "Leave">> <<goto "Town">> <</button>> <<else>> Entering the town square, you observe your surroundings. The houses are far larger and nicer than you are used too, growing up on the farm. In the centre of the square there is a small market which you enter in an attemp to hide your true intentions.<br><br> From the market, you have an excelent position to observe the cathedral. Taking a seat near the edge of the markets, you watch what you assume are priests and other officals pass through the gates of the cathedral. <br><br> Amongst the men and women dressed in gray robes, you notice someone who stands out... <<set _imgPath to "Images/Town/Inquisition/5.png">> <div class="Random-image"> <img @src=_imgPath alt="Guest Image"> </div> <br><br> The woman is dressed in a single white robe which is are more revealing than anything the other holy men are wearing. Her robe is held tight to her body by a red belt, other than that, a few gold trinkets dangle from her robe... It takes you a moment to realise she isn't even wearing shoes. <br><br> <<say 'Alice' _CharProfileIMG>>Humm<</say>> Watching as she walks around the side of the cathedral, you consider what to do next...<br> <<button "Follow her">> <<goto "TownCathedralFollow">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You come to your senses and realise your standing in Lucys chambers with your clothes on. For a moment, you wonder if anything even happened <<say 'Lucy' $LucySexImg>>Well, I hope you enjoyed that as much as I did<</say>> <<set _imagePath to "Images/Castle/Lucy/Fuck/succSitting/1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div><br><br> <<button "Leave Lucy">> <<goto "Castle Chambers">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set $Time to $Time + 2>> <<if $LucyScarldaleWork isnot true>> You find a shaded wall to lean against and relax, watching the people go about their business <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Start/1.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> After spending some time watching different people and noting down guard patrol times... Someone comes over to you <<set $ScarNPCMale to random(1, 4)>> <<set $charPath to "Images/Forrest/Scarldale/Houses/Work/Men/" + $ScarNPCMale + ".png">> <div class="Random-image"> <img @src=$charPath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>I haven't seen you here before<</say>> <<Lucy>>Oh... Hello, I'm Lucy<</Lucy>> <<say 'Villager' $charPath>>So... How much<</say>> <<Lucy>>I-I'm not sure what you mean<</Lucy>> <<say 'Villager' $charPath>>Oh come on... I've been to the city, woman like you standing against wall waiting for men to ask for their 'services'<</say>> <<Lucy>>You think I'm a whore?<</Lucy>> <<say 'Villager' $charPath>>Well... Yes, I thought it was obvious I've seen the city whores and brothels, we don't have anything like that in our boring little village... So how much?<</say>> <<button "Walk Away">> <<goto "ScarldaleHouses">> <</button>><br> <<button "Say you want 30 gold">> <<set $Pay to 30>> <<goto "LucyScarWorkStart">> <</button>> <<else>> Leaning against the wall you've become acustome too, you relax and wait for a customer <<set _int to random(2, 3)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Start/" +_int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _rand to random(0, 2)>> <<if _rand is 0>> You wait a white, but no one comes... <<if $Time < 8>> <<button "Wait longer">> <<goto "LucyScarldaleWork">> <<else>> Its getting dark and is not safe to wait around <</if>> <<button "Leave">> <<goto "ScarldaleHouses">> <</button>> <<else>> After spending some time watching different people, someone comes over to you<br> <<set $ScarNPCMale to random(1, 5)>> <<set $charPath to "Images/Forrest/Scarldale/Houses/Work/Men/" + $ScarNPCMale + ".png">> <div class="Random-image"> <img @src=$charPath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>So... How much<</say>> <<if $ScarNPCMale lt 5>> A man in his 20's comes over to you, hes attractive enough and you wonder why he needs to pay for pleasure... Maybe there just aren't enough woman in this village you think<br> <<else>> Hes an older man, fat and unpleasnt... But gold is gold<br> <</if>> <<button "Walk Away">> <<goto "ScarldaleHouses">> <</button>><br> <<button "Say 30 gold">> <<set $Pay to 30>> <<goto "LucyScarWorkStart">> <</button>><br> <<button "Say 60 gold">> <<set $Pay to 60>> <<goto "LucyScarWorkStart">> <</button>> <</if>> <</if>> </div> <</nobr>>
<<nobr>> <<set _location to random(0, 1)>> <div class="text-box"> <<set _rand to random(0, 2)>> <<if $LucyScarldaleWork isnot true>> <<set $LucyScarldaleWork to true>> <<set _rand to 0>> <</if>> <<if _rand is 0>> He sucks in through his teath <<say 'Villager' $charPath>>$Pay gold?<</say>> <<Lucy>>$Pay gold<</Lucy>> You aswer back confidently, looking forward to whats coming. You press your chest out and he takes a firm grip of your breasts <<set _int to random (1, 2)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Grope/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> His reluctance melts as his lust rises <<elseif _rand is 1>> <<say 'Villager' $charPath>>$Pay gold coins isnt cheap...<</say>> You take his hand and guide it to your chest, he pauses and takes a handful of your breast <<set _int to random (1, 2)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Grope/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<Lucy>>You were saying?<</Lucy>> <<else>> <<say 'Villager' $charPath>>Humm, thats a good night at the tavern<</say>> He takes hold of your chest and gives it a squeeze as if inspecting you <<set _int to random (1, 2)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Grope/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>Are you going to do whatever I tell you too<</say>> <<Lucy>>Whatever you tell me too<</Lucy>> You say echoing his words <</if>> <br> <<if $ScarNPCMale lt 5>> <<if $Pay is 60>><<set _runChance to 4>><<else>><<set _runChance to 6>><</if>> <<set _run to random(0, _runChance)>> <<if _run is 0>> He takes hold of your chest and gives it a squeeze as if inspecting you <<set _int to random (1, 2)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Grope/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>Get on your knees<</say>> <<Lucy>>Right here?<</Lucy>> He answers by taking his cock out and thrusting it towards your face. Excitement takes over and you let him into your mouth, quickly working his cock while he looks around and trys not to moan <<set _int to random(1, 5)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Wall/BJ/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> It doesn't take long for him take hold of your head and begin to fuck your face. After a few minuets of being used, he drags his cock out of your mouth and sprays your face with cum<br><br> He runs without paying <<set _int to random(6, 7)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Wall/BJ/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Clean up">> <<goto "ScarldaleHouses">> <</button>> <<else>> <<if _location is 0>> <<say 'Villager' $charPath>>Theres a barn nearby, nice and secluded... Lets go<</say>> <<Lucy>>Lead the way<</Lucy>> <<button "Follow him">> <<goto "LucyScarBarn">> <</button>> <</if>> <<if _location is 1>> <<say 'Villager' $charPath>>Theres a river... Not far from here I go there to bathe, maybe you can help me<</say>> <<Lucy>>Lead the way<</Lucy>> <<button "Follow him">> <<goto "LucyScarRiver">> <</button>> <</if>> <</if>> <<else>> The fat man roughly grabs you, and truns you around before inspecting your ass with his hands<br><br> <<set _img to "Images/Forrest/Scarldale/Houses/Work/Grope/3.png">> <div class="Random-image"> <img @src=_img alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>Ha, fine. Follow me slut<</say>> <<Lucy>>Lead the way<</Lucy>> <<button "Follow him">> <<goto "LucyScarBarn">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $ScarNPCMale lt 5>> <<set _actions to ["BJ", "DT", "CG", "RCG", "BH"]>> <<else>> <<set _actions to ["BJF", "DTF", "CGF", "RCGF", "BHF", "SC"]>> <</if>> <<set _rand1 to random(0, _actions.length)>> <<if _rand1 isnot 0>><<set _rand1 to _rand1 - 1>><</if>> <<set _action1 to _actions[_rand1]>> <<run _actions.delete(_action1)>> <<set _rand2 to random(0, _actions.length)>> <<if _rand2 isnot 0>><<set _rand2 to _rand2 - 1>><</if>> <<set _action2 to _actions[_rand2]>> <<run _actions.delete(_action2)>> <<set _rand3 to random(0, _actions.length)>> <<if _rand3 isnot 0>><<set _rand3 to _rand3 - 1>><</if>> <<set _action3 to _actions[_rand3]>> <<include "LucyScarWorkLines">> <<set _line1 to _barnActions[_action1][0]>> <<set _line2 to _barnActions[_action2][1]>> <<set _line3 to _barnActions[_action3][2]>> <<set _NPCline1 to _barnNPCLines[_action1][0]>> <<set _NPCline2 to _barnNPCLines[_action2][1]>> <<set _NPCline3 to _barnNPCLines[_action3][2]>> As promised, the man leads you into a barn on the edge of town. The barn is quite and sells of fresh hay. You find it almost funny how woke up in a castle bed chamber this morning, and now your going to be rutted like a stable girl. The thought of it turned you on<br> <<say 'Villager' $charPath>>Undress<</say>> The man tosses a coin pouch to you which you place in your bag before unfastening your dress in front of him <<set _int to random (1, 3)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/Strip/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $ScarNPCMale lt 5>> <<set _lucyUndressLine to either(_undressNPCLines)>> <<Lucy>>_lucyUndressLine<</Lucy>> <<set _int to random (1, 3)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/Kiss/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<else>> <<set _int to random (1, 3)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/KissF/" + _int + ".png">> He removes his clothes while watching you do the same. Affter you're both naked, he sits down and you climb onto him. He's massive in every proportion and soon his hands are groping you, squeezing each inch of your firm body while you kiss<br><br> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> <<say 'Villager' $charPath>>_NPCline1<</say>> _line1 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/" + _action1 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>_NPCline2<</say>> _line2 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/" + _action2 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Villager' $charPath>>_NPCline3<</say>> _line3 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/" + _action3 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _face to ["BJ", "DT", "BJF", "DTF"]>> <<set _body to ["CGF", "RCGF", "BHF", "SC", "CG", "RCG", "BH"]>> <<if _face.includes(_action3)>> You kneel, looking your customer in the eyes and sticking your tounge out trying to look as cute as possible. It clearly works as your soon hit by rope after rope of cum, landing on your face and in your hungy mouth. After hes done, you swallow his cum making a show of emptying your mouth.<br> He looks shocked and lets out one last moan as you lick his cock and balls, cleaning your own juices off him before sitting back and scooping his seed off your face and into your mouth<br> Satified he leaves you to clean yourself up<br><br> <<if $ScarNPCMale lt 5>> <<set _int to random (4, 5)>> <<else>> <<set _int to random (6, 7)>> <</if>> <<else>> His hands grip you tight and fingers dig into your flesh as she spills into you. Warmth fills you and his cock slides out of your cunt. Falling onto the hay, he continues to shoot ropes over your body.<br> Laying on the hay, heart pounding you play with his cum while he dresses and leaves you in a mess, cum running down and dripping out of you<br><br> <<set _int to random (1, 3)>> <</if>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/Barn/Finish/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<button "Clean up and leave">> <<set $Gold to $Gold + $Pay>> <<goto "ScarldaleHouses">> <</button>> </div> <<set $BackgroundPath to "Images/Raids/Building/Barn/1.png">> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _lucyImg to "Images/Forrest/Scarldale/Houses/Work/River/1.png">> <<set _actions to ["BJ", "BH", "CG", "Cul", "BH", "FG", "HJ"]>> <<set _rand1 to random(0, _actions.length)>> <<if _rand1 isnot 0>><<set _rand1 to _rand1 - 1>><</if>> <<set _action1 to _actions[_rand1]>> <<run _actions.delete(_action1)>> <<set _rand2 to random(0, _actions.length)>> <<if _rand2 isnot 0>><<set _rand2 to _rand2 - 1>><</if>> <<set _action2 to _actions[_rand2]>> <<run _actions.delete(_action2)>> <<set _rand3 to random(0, _actions.length)>> <<if _rand3 isnot 0>><<set _rand3 to _rand3 - 1>><</if>> <<set _action3 to _actions[_rand3]>> <<include "LucyScarWorkLines">> <<set _line1 to _riverActions[_action1][0]>> <<set _line2 to _riverActions[_action2][1]>> <<set _line3 to _riverActions[_action3][2]>> <<set _NPCline1 to _riverLucyLines[_action1][0]>> <<set _NPCline2 to _riverLucyLines[_action2][1]>> <<set _NPCline3 to _riverLucyLines[_action3][2]>> You follow the man to a secluded part of the river. It's a peaceful place, a dence forest swallowing all sound besides the occasional bird, cut in two by a slow moving clear river flowing down from the northern mountains. The water is shallow enough to kneel in most places and there are rocks to sit on near the banks. You think about how nice it would be to relax here, but for now, you have work to do<br><br> Satified you're both alone, you take the lead by unfastening your dress and letting it fall to the floor <<say 'Lucy' _lucyImg>>Do you like what you see?<</say>> <<set _int to random (1, 2)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/Strip/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _int to random (1, 3)>> He begins to undress and you step forward to help, he's clearly lost some confidence since the village, so you take the lead, slipping his coin pouch out of his pocket and taking the agreed amount before helping him undress <<say 'Lucy' _lucyImg>>Allow me<</say>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/Kiss/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> Taking him by the hand, you lead the man down to the bank and step into the river. The man takes a seat on a rock and you go to work, bathing him and yourself, emphisising washing your own body while he watches. You dive under the water, and jump out infront of him, letting your wet body slide over his. <<set _int to random (1, 3)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/Bath/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' _lucyImg>>_NPCline1<</say>> _line1 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/" + _action1 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' _lucyImg>>_NPCline2<</say>> _line2 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/" + _action2 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' _lucyImg>>_NPCline3<</say>> _line3 <<set _int to random (1, 4)>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/" + _action3 + "/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _actions to ["BJ", "BH", "CG", "Cul", "BH", "FG", "HJ"]>> <<set _face to ["BJ", "HJ", "FG", "Cul"]>> <<set _body to ["BH", "CG"]>> <<if _face.includes(_action3)>> You drop to your knees and stroke his cock, stairing up into his eyes as he fights between wanting to continue and releasing his seed. <br> After a few more moment, he grones and sprays cum over your face. You keep pumping him, wanting to draw out as much pleasure as you can. <<set _int to random (6, 7)>> <<else>> His cock slides out of your dripping slit and relases his cum onto your ass. A bellow of pleasure escapes his mouth as he shoots ropes of hot cum onto you. <br> After a few moments he sits back on a rock and you follow him down continuing to grind on him while he comes down from the sensations. <<set _int to random (1, 3)>> <</if>> <<set _imagePath to "Images/Forrest/Scarldale/Houses/Work/River/Finish/" + _int + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> After making small talk, he thanks you and leaves the river. You clean youself off again and prepare to leave<br><br> <<button "Dry off and leave">> <<set $Gold to $Gold + $Pay>> <<goto "ScarldaleHouses">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> You follow the woman as carefully as possible. Life on a farm made you stronger than most woman but sneaking around seemed like a task best saved for your smaller more delicate companion Lucy. However, even with your lack of skill, it was easy to slip into the crowd and you soon find your target walking proudly down the left side of the cathedral. <br> Now, with a better view of her, you can see she walks with a significant pace and other towns folk around her seem to back away as if scared to block her path...<br> You loose her in the crowd, but a few moment later you see her entering a door in the side of the cathedral <<say 'Alice' _CharProfileIMG>>I have to get inside...<</say>> You aproach the door<br><br> @@#examine-button; <<button "Examine the door closely">> <<replace "#examine-button">> As you lean closer, the symbols begin to glow with an ethereal light. You notice intricate carvings depicting: <<say 'Alice' _CharProfileIMG>>I have to get inside...<</say>> [img[Ancient symbols glowing|ancient-symbols.jpg]] The door appears to be made of some unknown metal that feels warm to the touch. Strange whispers seem to emanate from beyond... [img[The mysterious door|mysterious-door.jpg]] What do you do next? [[Try to open the door|OpenDoor]] [[Step back cautiously|StepBack]] <</replace>> <</button>> @@ </div> <</nobr>>
<<nobr>> <div class="text-box"> <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Castle/Lucy/Fuck/Bj/bed/10.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Castle/Lucy/Fuck/Bj/bed/10.png", "Images/Castle/Lucy/Fuck/Bj/bed/11.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<if $razeConfirmStep === 1>> <div style="text-align: center; margin: 20px; padding: 20px; background: rgba(50, 0, 0, 0.8); border: 3px solid #ff4444; border-radius: 8px;"> <h2 style="color: #ff6666;">⚠️ WARNING ⚠️</h2> <h3 style="color: #ffcccc;">You are about to permanently destroy <<print _settlement.name>>!</h3> <div style="background: rgba(0, 0, 0, 0.8); padding: 15px; margin: 15px 0; border-radius: 5px;"> <p style="color: #ffdddd;"><strong>This will permanently destroy:</strong></p> <ul style="color: #ffdddd; text-align: left; display: inline-block;"> <li>Settlement: <<print _settlement.name>></li> <li><<print _settlement.capturedVillagers ? _settlement.capturedVillagers.length : 0>> villagers</li> <li><<print _settlement.garrison ? _settlement.garrison.length : 0>> garrison members</li> <li>All buildings and stored resources</li> </ul> <p style="color: #ff9999; font-weight: bold;">THIS ACTION CANNOT BE UNDONE!</p> </div> <div style="margin: 20px 0;"> <<button "DESTROY SETTLEMENT">> <<set $razeConfirmStep = 2>> <<goto "RazeSettlementConfirm">> <</button>> <<button "Cancel">> <<unset $razeConfirmStep>> <<goto "SettlementOverview">> <</button>> </div> </div> <<elseif $razeConfirmStep === 2>> <div style="text-align: center; margin: 20px; padding: 20px; background: rgba(100, 0, 0, 0.9); border: 3px solid #ff0000; border-radius: 8px;"> <h2 style="color: #ff0000;">Settlement Destroyed</h2> <p style="color: #ffcccc; font-size: 18px;"> <<print _settlement.name>> has been razed to the ground. </p> <p style="color: #ffdddd;"> All inhabitants and structures have been destroyed. </p> <<silently>> <!-- Remove the settlement from the array --> <<run $CapturedLocations.splice($currentSettlementId, 1)>> <!-- Reset settlement ID if it's out of bounds --> <<if $currentSettlementId >= $CapturedLocations.length>> <<set $currentSettlementId = Math.max(0, $CapturedLocations.length - 1)>> <</if>> <!-- Clean up variables --> <<unset $razeConfirmStep>> <</silently>> <div style="margin: 20px 0;"> <<if $CapturedLocations.length > 0>> <<button "Return to Captured Locations">> <<goto "CapturedLocations">> <</button>> <<else>> <<button "Return to Castle">> <<goto "Map Room">> <</button>> <</if>> </div> </div> <</if>> <</nobr>>
<<nobr>> <h1>Dismantle <<print $dismantleName>>?</h1> <div style="background: rgba(0, 0, 0, 0.7); border: 2px solid #ff9900; border-radius: 8px; padding: 20px; margin: 20px 0;"> <h2 style="color: #ff9900;">⚠️ Warning</h2> <p>You are about to dismantle the <strong><<print $dismantleName>></strong> in this settlement.</p> <div style="margin: 15px 0;"> <h3>You will receive:</h3> <ul> <<if $dismantleWoodReturn > 0>><li><<print $dismantleWoodReturn>> Wood</li><</if>> <<if $dismantleStoneReturn > 0>><li><<print $dismantleStoneReturn>> Stone</li><</if>> <<if $dismantleGoldReturn > 0>><li><<print $dismantleGoldReturn>> Gold</li><</if>> </ul> </div> <div style="margin: 15px 0;"> <h3 style="color: #ff6666;">Consequences:</h3> <ul> <li>All staff will be returned to the general population</li> <li>Production from this facility will stop</li> <li>The building will be completely removed</li> <li><strong>This action cannot be undone!</strong></li> </ul> </div> </div> <div style="text-align: center; margin: 20px 0;"> <<button "Confirm Dismantle">> <<set _settlement = $CapturedLocations[$currentSettlementId]>> <!-- Return staff to general population --> <<if _settlement.buildings[$dismantleBuilding] && _settlement.buildings[$dismantleBuilding].staff && _settlement.buildings[$dismantleBuilding].staff.length > 0>> <<for _i = 0; _i < _settlement.buildings[$dismantleBuilding].staff.length; _i++>> <<set _worker = _settlement.buildings[$dismantleBuilding].staff[_i]>> <!-- Add back to capturedVillagers if not already there --> <<if !_settlement.capturedVillagers.some(v => v.NPCID === _worker.NPCID)>> <<run _settlement.capturedVillagers.push(_worker)>> <</if>> <!-- Add to a random house if possible --> <<if _settlement.populatedBuildings>> <<set _availableHouses = []>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<set _baseType = String(_buildingId).split(' ')[0]>> <<if _baseType !== "Guard">> <<set _maxOccupants = { "House": 3, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<if Array.isArray(_residents) && _residents.length < _maxOccupants>> <<run _availableHouses.push(_buildingId)>> <</if>> <</if>> <</for>> <<if _availableHouses.length > 0>> <<set _randomHouse = _availableHouses[random(0, _availableHouses.length - 1)]>> <<run _settlement.populatedBuildings[_randomHouse].push(_worker)>> <</if>> <</if>> <</for>> <</if>> <!-- Return materials to settlement resources --> <<if $dismantleWoodReturn > 0>> <<set _settlement.woodReserves = (_settlement.woodReserves || 0) + $dismantleWoodReturn>> <</if>> <<if $dismantleStoneReturn > 0>> <<set $Stone = ($Stone || 0) + $dismantleStoneReturn>> <</if>> <<if $dismantleGoldReturn > 0>> <<set _settlement.goldReserves = (_settlement.goldReserves || 0) + $dismantleGoldReturn>> <</if>> <!-- Remove the building using JavaScript --> <<run delete _settlement.buildings[$dismantleBuilding]>> <!-- Clear dismantle variables --> <<set $dismantleBuilding = null>> <<set $dismantleName = null>> <<set $dismantleWoodReturn = null>> <<set $dismantleStoneReturn = null>> <<set $dismantleGoldReturn = null>> <<goto "SettlementOverview">> <</button>> <<button "Cancel">> <!-- Clear dismantle variables --> <<set $dismantleBuilding = null>> <<set $dismantleName = null>> <<set $dismantleWoodReturn = null>> <<set $dismantleStoneReturn = null>> <<set $dismantleGoldReturn = null>> <<goto "SettlementOverview">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _villager to $currentVillager>> <<set _settlement to $originSettlement>> <!-- Auto-assign name if villager doesn't have one --> <<if !_villager.name || _villager.name === "Unknown" || _villager.name === "">> <<silently>> <<if _villager.sex === "Female">> <<set $names = Story.get("FemaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <<else>> <<set $names = Story.get("MaleNamesList").text.split("\n").filter(name => name.trim() !== "")>> <</if>> <<set _villager.name = $names[random(0, $names.length - 1)]>> <!-- Update the name in all relevant locations --> <!-- Update in capturedVillagers --> <<if _settlement.capturedVillagers>> <<set _capturedIndex = _settlement.capturedVillagers.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _capturedIndex > -1>> <<set _settlement.capturedVillagers[_capturedIndex].name = _villager.name>> <</if>> <</if>> <!-- Update in populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _resIndex > -1>> <<set _residents[_resIndex].name = _villager.name>> <</if>> <</if>> <</for>> <</if>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => s.NPCID === _villager.NPCID)>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].name = _villager.name>> <</if>> <</if>> <</for>> <</if>> <!-- Update the current villager reference --> <<set $currentVillager.name = _villager.name>> <</silently>> <</if>> <div style="display: flex; gap: 20px;"> <!-- Left side - Image --> <div style="flex: 0 0 300px;"> <img @src="_villager.ImagePath" style="width: 100%; height: auto; border-radius: 5px;"> </div> <!-- Right side - Stats and Controls --> <div style="flex: 1;"> <h2><<print _villager.name || "Unnamed Villager">></h2> <div style="margin: 20px 0;"> <h3>Information</h3> <p><strong>Job:</strong> <<print _villager.job || "Villager">></p> <p><strong>Sex:</strong> <<print _villager.sex || "Unknown">></p> <p><strong>Hair Color:</strong> <<print _villager.hairColor || "Unknown">></p> <p><strong>Origin:</strong> <<print _villager.origin || _settlement.name>></p> <<if _villager.hiddenJob && _villager.hiddenJob !== _villager.job>> <p><strong>Hidden Skill:</strong> <<print _villager.hiddenJob>></p> <</if>> <<silently>> <!-- Initialize villager happiness if not set --> <<if typeof _villager.happiness === 'undefined'>> <<set _baseHappiness = _settlement.Happiness || 50>> <<set _villager.happiness = Math.max(0, Math.min(100, _baseHappiness + random(-5, 5)))>> <!-- Update the villager in all relevant locations --> <!-- Update in capturedVillagers --> <<if _settlement.capturedVillagers>> <<set _capturedIndex = _settlement.capturedVillagers.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _capturedIndex > -1>> <<set _settlement.capturedVillagers[_capturedIndex].happiness = _villager.happiness>> <</if>> <</if>> <!-- Update in populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _resIndex > -1>> <<set _residents[_resIndex].happiness = _villager.happiness>> <</if>> <</if>> <</for>> <</if>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => s.NPCID === _villager.NPCID)>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].happiness = _villager.happiness>> <</if>> <</if>> <</for>> <</if>> <!-- Update the current villager reference --> <<set $currentVillager.happiness = _villager.happiness>> <</if>> <!-- Initialize villager skill if not set --> <<if typeof _villager.skill === 'undefined'>> <<set _villager.skill = random(20, 50)>> <!-- Update the villager skill in all relevant locations --> <!-- Update in capturedVillagers --> <<if _settlement.capturedVillagers>> <<set _capturedIndex = _settlement.capturedVillagers.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _capturedIndex > -1>> <<set _settlement.capturedVillagers[_capturedIndex].skill = _villager.skill>> <</if>> <</if>> <!-- Update in populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _resIndex > -1>> <<set _residents[_resIndex].skill = _villager.skill>> <</if>> <</if>> <</for>> <</if>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => s.NPCID === _villager.NPCID)>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].skill = _villager.skill>> <</if>> <</if>> <</for>> <</if>> <!-- Update the current villager reference --> <<set $currentVillager.skill = _villager.skill>> <</if>> <</silently>> <h3>Happiness</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_villager.happiness" max="100"></progress> <span><<print _villager.happiness>>%</span> </div> <h3>Skill Level</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_villager.skill" max="100"></progress> <span><<print _villager.skill>>%</span> </div> <<silently>> <!-- Initialize villager corruption if not set --> <<if typeof _villager.corruption === 'undefined'>> <<set _baseCorruption = _settlement.corruption || 0>> <<set _villager.corruption = Math.max(0, Math.min(100, _baseCorruption + random(-5, 5)))>> <!-- Update the villager in all relevant locations --> <!-- Update in capturedVillagers --> <<if _settlement.capturedVillagers>> <<set _capturedIndex = _settlement.capturedVillagers.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _capturedIndex > -1>> <<set _settlement.capturedVillagers[_capturedIndex].corruption = _villager.corruption>> <</if>> <</if>> <!-- Update in populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _villager.NPCID)>> <<if _resIndex > -1>> <<set _residents[_resIndex].corruption = _villager.corruption>> <</if>> <</if>> <</for>> <</if>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => s.NPCID === _villager.NPCID)>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].corruption = _villager.corruption>> <</if>> <</if>> <</for>> <</if>> <!-- Update the current villager reference --> <<set $currentVillager.corruption = _villager.corruption>> <</if>> <</silently>> <h3>Corruption</h3> <div style="display: flex; align-items: center; gap: 10px;"> <progress @value="_villager.corruption" max="100"></progress> <span><<print _villager.corruption>>%</span> </div> </div> <div style="margin: 20px 0;"> <<silently>> <<set _hasJob = false>> <<set _currentJobBuilding = "">> <<set _villagerIdToCheck = _villager.NPCID || _villager.prisonerId>> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && _building.staff.some(s => (s.NPCID === _villagerIdToCheck || s.prisonerId === _villagerIdToCheck))>> <<set _hasJob = true>> <<set _currentJobBuilding = _buildingKey>> <</if>> <</for>> <</if>> <</silently>> <h3>Work Assignment</h3> <<if _hasJob>> <p style="color: orange;">Currently working at: <<print _currentJobBuilding.replace(/([A-Z])/g, ' $1').trim()>></p> <p style="color: red;">Cannot transfer while assigned to a job</p> <<else>> <p style="color: green;">Available for transfer</p> <</if>> </div> <div style="margin: 20px 0;"> <h3>Housing Assignment</h3> <p><strong>Current House:</strong> <<print _villager.building || "Unknown">></p> <<silently>> <<set _availableHouses to []>> <<if _settlement.populatedBuildings>> <<for _houseName, _residents range _settlement.populatedBuildings>> <<if _houseName !== _villager.building>> <<run _availableHouses.push(_houseName)>> <</if>> <</for>> <</if>> <</silently>> <<if _availableHouses.length > 0>> <p style="margin-top: 10px;">Move to a different house:</p> <div style="display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px;"> <<for _houseIndex = 0; _houseIndex < _availableHouses.length; _houseIndex++>> <<capture _houseIndex>> <<set _targetHouse to _availableHouses[_houseIndex]>> <<button _targetHouse>> <<set _npcId = _villager.NPCID || _villager.prisonerId>> <<set _oldHouse = _villager.building>> <!-- Remove from old house --> <<if _settlement.populatedBuildings[_oldHouse]>> <<set _settlement.populatedBuildings[_oldHouse] = _settlement.populatedBuildings[_oldHouse].filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <!-- Update building property --> <<set _villager.building = _targetHouse>> <<set $currentVillager.building = _targetHouse>> <!-- Add to new house --> <<if !_settlement.populatedBuildings[_targetHouse]>> <<set _settlement.populatedBuildings[_targetHouse] = []>> <</if>> <<run _settlement.populatedBuildings[_targetHouse].push(_villager)>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => (s.NPCID === _npcId || s.prisonerId === _npcId))>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].building = _targetHouse>> <</if>> <</if>> <</for>> <</if>> <!-- Save changes --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <<script>> UI.alert(State.temporary.villager.name + " has been moved to " + State.temporary.targetHouse + "."); <</script>> <<goto "ManageVillager">> <</button>> <</capture>> <</for>> </div> <<else>> <p style="color: #888; font-style: italic;">No other houses available in this settlement.</p> <</if>> </div> </div> </div> </div> <div class="text-box flex-buttons"> <!-- Return to Settlement Button --> <<button "Return to Settlement">> <<goto "SettlementVisit">> <</button>> <!-- Gift Gold Button --> <<if $Gold >= 50>> <<button "Give 50 Gold Gift">> <<set $Gold -= 50>> <<set _npcId = _villager.NPCID || _villager.prisonerId>> <!-- Update villager happiness --> <<set _villager.happiness = Math.min(100, (_villager.happiness || 50) + 10)>> <!-- Update settlement happiness --> <<set _settlement.Happiness = Math.min(100, (_settlement.Happiness || 50) + 10)>> <!-- Update happiness in all relevant locations --> <!-- Update in capturedVillagers --> <<if _settlement.capturedVillagers>> <<set _capturedIndex = _settlement.capturedVillagers.findIndex(v => (v.NPCID === _npcId || v.prisonerId === _npcId))>> <<if _capturedIndex > -1>> <<set _settlement.capturedVillagers[_capturedIndex].happiness = _villager.happiness>> <</if>> <</if>> <!-- Update in populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _resIndex = _residents.findIndex(v => (v.NPCID === _npcId || v.prisonerId === _npcId))>> <<if _resIndex > -1>> <<set _residents[_resIndex].happiness = _villager.happiness>> <</if>> <</if>> <</for>> <</if>> <!-- Update in building staff if assigned --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _staffIndex = _building.staff.findIndex(s => (s.NPCID === _npcId || s.prisonerId === _npcId))>> <<if _staffIndex > -1>> <<set _building.staff[_staffIndex].happiness = _villager.happiness>> <</if>> <</if>> <</for>> <</if>> <<set $currentVillager.happiness = _villager.happiness>> <<script>> UI.alert("You gave " + State.temporary.villager.name + " 50 gold. They are very pleased!"); <</script>> <<goto "ManageVillager">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Give 50 Gold Gift (Insufficient Gold)</button> <</if>> <!-- Banish Button --> <<button "Banish Villager">> <<set _npcId = _villager.NPCID || _villager.prisonerId>> <!-- Remove NPC from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Remove from capturedVillagers array if it exists --> <<if _settlement.capturedVillagers && Array.isArray(_settlement.capturedVillagers)>> <<set _settlement.capturedVillagers = _settlement.capturedVillagers.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <!-- Remove from building staff assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _building.staff = _building.staff.filter(function(s) { return (s.NPCID !== _npcId && s.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Apply settlement penalties --> <<set _settlement.Happiness = Math.max(0, (_settlement.Happiness || 50) - 10)>> <<set _settlement.state = Math.max(-10, (_settlement.state || 0) - 1)>> <!-- Save changes back to the main array --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <!-- Clear current villager reference --> <<unset $currentVillager>> <<unset $originSettlement>> <<script>> UI.alert("You banished " + State.temporary.villager.name + " from the settlement. The other villagers are troubled by this harsh decision."); <</script>> <<goto "SettlementVisit">> <</button>> <<if !_hasJob>> <<button "Send to New Settlement">> <<set $villagerForTransfer = _villager>> <<set _npcId = _villager.NPCID || _villager.prisonerId>> <!-- Remove NPC from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Remove from capturedVillagers array if it exists --> <<if _settlement.capturedVillagers && Array.isArray(_settlement.capturedVillagers)>> <<set _settlement.capturedVillagers = _settlement.capturedVillagers.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <!-- Remove from building staff assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _building.staff = _building.staff.filter(function(s) { return (s.NPCID !== _npcId && s.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Save changes back to the main array --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <<goto "SelectSettlementTransfer">> <</button>> <<button "Send to Castle">> <<set _npcId = _villager.NPCID>> /* Convert prisonerId to NPCID if needed */ <<if !_npcId && _villager.prisonerId>> <<set _npcId = Math.floor(Math.random() * 10000) + 1000>> <<set _villager.NPCID = _npcId>> <</if>> /* Create castle entry FIRST */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<set _int = random(1, 15)>> <<set _captive = { prisonerId: $prisonerIdCounter++, NPCID: _npcId, type: "Villager", name: _villager.name, specialization: _villager.job, skill: 15, health: 100, sex: _villager.sex || "Female", job: _villager.job, hiddenJob: _villager.hiddenJob, hairColor: _villager.hairColor || "Brown", corruption: _villager.corruption || 0, originSettlementId: _settlement.settlementId, status: "Clothed", ImagePath: _villager.sex === "Male" ? "Images/Castle/Living Quaters/Male/" + _int + ".png" : "Images/Castle/Living Quaters/Female/" + (_villager.hairColor || "Brown") + "/" + _int + ".png" }>> <<if !Array.isArray($QuartersOccupance)>><<set $QuartersOccupance = []>><</if>> <<run $QuartersOccupance.push(_captive)>> <!-- Remove from populatedBuildings --> <<if _settlement.populatedBuildings>> <<for _buildingId, _residents range _settlement.populatedBuildings>> <<if Array.isArray(_residents)>> <<set _settlement.populatedBuildings[_buildingId] = _residents.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Remove from capturedVillagers array if it exists --> <<if _settlement.capturedVillagers && Array.isArray(_settlement.capturedVillagers)>> <<set _settlement.capturedVillagers = _settlement.capturedVillagers.filter(function(v) { return (v.NPCID !== _npcId && v.prisonerId !== _npcId); })>> <</if>> <!-- Remove from building staff assignments --> <<if _settlement.buildings>> <<for _buildingKey, _building range _settlement.buildings>> <<if _building.staff && Array.isArray(_building.staff)>> <<set _building.staff = _building.staff.filter(function(s) { return (s.NPCID !== _npcId && s.prisonerId !== _npcId); })>> <</if>> <</for>> <</if>> <!-- Save changes back to the main array --> <<if $currentSettlementId !== undefined && $currentSettlementId !== null>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <</if>> <<goto "SettlementOverview">> <</button>> <<else>> <button disabled style="opacity: 0.5; cursor: not-allowed;">Send to New Settlement (Remove from job first)</button> <button disabled style="opacity: 0.5; cursor: not-allowed;">Send to Castle (Remove from job first)</button> <p style="color: red; font-style: italic;">This villager cannot be transferred while assigned to work at a building. Remove them from their job first.</p> <</if>> </div> <</nobr>>
<<nobr>> <<set _undressNPCLines to [ "Lets see whats under that blue dress", "Take it all off", "Undress for me"]>> <<set _undressLucyLine to [ "Let's get you out of those clothes", "I can help takes these off", "Come here, let me undress you"]>> <<set _barnActions = { "BJ": [ "You start off slow, helping him relax on the hay padded floor as you crawl between his legs and set to work gently sucking his cock", "Slowing things down, you get to work sucking the head of his cock while your hand works up and down. You look at him, watching as his eyes roll back'", "Clearly not wishing to cum yet, the man settles down into the bed of hay and watches as you suck his cock. You savour the taste and build his orgasm with your hands moving up and down" ], "BJF": [ "Kneeling, you bring your face in line with his manhood. His hugh cock is almost too big for your jaw, so you start by working on the head of his cock kissing and licking it while you play with is balls", "You get down, looking up at him innocently you take his thick manhood into your hands as best you can and work your hands up and down his shaft. After a few seconds, you open wide and wrap your lips around him.", "Wrapping your hands and lips around him you stroke his cock fast while sucking down the head of his cock. He places a hand on your head and begins to moan loudly. You use your free hand to tease his balls, making him moan louder" ], "DT": [ "Kneeling before the man, you give him smile before opeing your mouth and taking his cock. You lick the head twice before feeling two hands graps your head and the man force his cock into your throat", "You kneel and open your mouth, he takes hold of your head and presses his cock into your waiting mouth. You let out an moan of satifaction which is cut short as his cock presses deeper and into your throat", "Changing position he fucks your face hard, you focus on keeping your mouth open as his cock passes your teath, slides along your tounge and down your throat over and over. You feel his cock twich and hands tighten around your head as he gets closer" ], "DTF": [ "Sitting on the floor you start working your mouth on his cock. Opening your jaw as wide as you can, you work your mouth down down his shaft inch by inch. Suddenly, you gag but his firm hands grab your head and pull you back down", "His cock slides into your mouth as his hands grip your head. You try to releax as his hands pull you further and further down his cock till it begins to strech the back of your throat", "His cock slides into your mouth as his hands grip your head. You try to releax as his hands pull you further and further down his cock till it begins to strech the back of your throat" ], "CG": [ "He lays back into the lay and watches you straddle him. Lifting your hips you align yourself with his manhood and press it against the lips of your pussy. You both let out a moan as you slowly slide down his manhood", "You push him back and he falls willingly onto the soft hay. He watches as you climb onto him and sit on his thighs dragging out the moment. Then after a pause, you lean forward and guide him into you, easilly sliding to the base of his cock before bousing back up to the tip and repeating.", "You straddle him, in one motion mounting his hips and feeling his cock enter you. You let out a gasp as his hips buck upwards and he spears you with his cock. Holding position he pounds you from below as his breath becomes shorter and quicker" ], "CGF": [ "He lays back into the lay and watches you straddle him. Lifting your hips you align yourself with his manhood and press it against the lips of your pussy. You both let out a moan as you slowly slide down his manhood", "You push him back and he falls willingly onto the soft hay. He watches as you climb onto him and sit on his thighs dragging out the moment. Then after a pause, you lean forward and guide him into you, easilly sliding to the base of his cock before bousing back up to the tip and repeating.", "You straddle him, in one motion mounting his hips and feeling his cock enter you. You let out a gasp as his hips buck upwards and he spears you with his cock. Holding position he pounds you from below as his breath becomes shorter and quicker" ], "RCG": [ "Sitting on his chest, you play with the villagers cock, teasing him and allowing it to grow. He plays with your ass while you stroke him, building his pleasure before you lift up and push his cock inside you", "You feel a sharp sting as his and cracks against one of your ass cheeks. Both hand grip your hips and ass as he guides you up and down his shaft", "You bounce up and down on his cock while he plays with your ass. Picking up the pace you reach down and grip his balls, hearing moans behind you as his grip on your ass and hips tigthtens" ], "RCGF": [ "Sitting on his chest, you play with the villagers cock, teasing him and allowing it to grow. He plays with your ass while you stroke him, building his pleasure before you lift up and push his cock inside you", "You feel a sharp sting as his and cracks against one of your ass cheeks. Both hand grip your hips and ass as he guides you up and down his shaft", "You bounce up and down on his cock while he plays with your ass. Picking up the pace you reach down and grip his balls, hearing moans behind you as his grip on your ass and hips tigthtens" ], "BH": [ "He wastes no time, getting you on your knees and lineing his cock up with your wet slit. Theres a pause for a moment, then his thick cock presses into you, streching your tight hole you. A low moan escapes your mouth as he draws back befor slamming back into you. You let out a squeel of pleasure as he starts rhythmically fucking you ", "Pushing you to your knees, he takes you by the hips and slaps his leaking cock against your ass playfully. You giggle but it turns into a gasp as he burrys his cock inside you. You burry your head in your arms enjoying the pleasure of a hard pounding. A rough hand grabs your hair and pulls you back arching your back and making you scream into the open air as he picks up the pace", "You bend over for you 'customer' and present your dripping hole. He spears into you, sending a surge a pleasure through your body and making you scream. He pulls back, dragging his cock all the way out before thrusting into you again, this time you cum. Your knees go week but he locks you in place hammering into you over and over. Over the sounds of your own moans you hear his breathing increase as he gets close to cumming" ], "BH": [ "He wastes no time, getting you on your knees and lineing his cock up with your wet slit. Theres a pause for a moment, then his thick cock presses into you, streching your tight hole you. A low moan escapes your mouth as he draws back befor slamming back into you. You let out a squeel of pleasure as he starts rhythmically fucking you ", "Pushing you to your knees, he takes you by the hips and slaps his leaking cock against your ass playfully. You giggle but it turns into a gasp as he burrys his cock inside you. You burry your head in your arms enjoying the pleasure of a hard pounding. A rough hand grabs your hair and pulls you back arching your back and making you scream into the open air as he picks up the pace", "You bend over for you 'customer' and present your dripping hole. He spears into you, sending a surge a pleasure through your body and making you scream. He pulls back, dragging his cock all the way out before thrusting into you again, this time you cum. Your knees go week but he locks you in place hammering into you over and over. Over the sounds of your own moans you hear his breathing increase as he gets close to cumming" ], "SC": [ "He lifts you into the air causing you to yelp in suprise as his poweful arms lift you off your feet before bringing you back down onto the tip of his cock. You grab hold of him and dig your nails into him as his thick cock presses deeper into you", "You have a moment of disorientation as he pulls you off your feet and back dsown onto his manhood, spearing deep inside you. You moan loudly as his manhood is almost too much to take, but you're traped in his strong embrace as he begins to fuck you", "The man picks you up with ease and pulls you onto his cock. He lock you in place as his cock hammers into you over and over. You can hear him breathing hard, using all his stamina to to fuck you as hard as he can" ] }>> <<set _barnNPCLines = { "BJ": [ "Why don't you start by sucking my cock?", "Let's slow down, get those lips around my cock", "Fuck, finish me with that slutty mouth of yours" ], "BJF": [ "Why don't you start by sucking my cock?", "Let's slow down, get those lips around my cock", "Fuck, finish me with that slutty mouth of yours" ], "DT": [ "Your gona earn that gold today whore, lets start with that throat of yours", "Fuck, kneel in front of me slut, you're gona gag on it", "Kneel for me, you can breath after I cum" ], "DTF": [ "Your gona earn that gold today whore, lets start with that throat of yours", "Fuck, kneel in front of me slut, you're gona gag on it", "Kneel for me, you can breath after I cum" ], "CG": [ "Get on top slut, I want to watch you bounce on my cock", "Why don't you ride me for a bit", "Fuck, slide down my cock girl" ], "CGF": [ "Get on top slut, I want to watch you bounce on my cock", "Why don't you ride me for a bit", "Fuck, slide down my cock girl" ], "RCG": [ "Let me see that ass while you ride me", "Ahh fuck you've got a nice ass, come sit on my cock", "Fuck ride my cock slut" ], "RCGF": [ "Let me see that ass while you ride me", "Ahh fuck you've got a nice ass, come sit on my cock", "Fuck ride my cock slut" ], "BH": [ "Bend over", "Be a good slut and get on your knees for me", "I'm gona breed you" ], "BHF": [ "Bend over", "Be a good slut and get on your knees for me", "I'm gona breed you" ], "SC": [ "Come here, let me use you", "Fuck, you're not going anywhere now", "Let me pick you up and breed you" ] }>> <<set _riverActions = { "BJ": [ "Your customer purches on a rock while you kneel in the shallow river and take his cock into your mouth. It swells as you work over it with your experianced tounge and soon he's moaning while you suck away at him", "You kneel in the cool stream infront of your shy patron. Wanting to draw out the pleasure, you allow your hands to run down his chest and rest them on his thighs. His cock stands proud infront of your face and you get to work licking and sucking down as much as you can", "Dropping to your kness, deeper into the cool water, you stair at his slick cock, dragging out the moment before diving onto him, taking his cock as deep as you can into your mouth and getting to work" ], "BH": [ "After getting him cleaned up in the water, you bend over a rock and present your dripping wet ass for his use. Theres a pause before he grips your hips and presses his cock into you", "Bending over a rock you wiggle your ass and look back at him, theres a pause as he admires your dripping wet form before he takes a handful off your ass and begins fucking you hard from behind", "His cock pushes deep into you, hips slapping agaist your ass over and over while rough hands grip your hips, ass and breasts. You both moan as he picks up the pace and starts to cum" ], "CG": [ "Once you've cleaned every inch of your customer, you notices his stiffening cock and decide it time to move to the real fun. Climbing on top of him, you take his cock and press it against the lips of your pussy. A slow grone escapes his mouth as you slide down him", "Guiding him to sit down, you climb into your customers lap and waste no time mounting his cock. You both moan and his hands explore your body", "You get on top of him, aiming his cock towards your tight hole. His hips rise up to meet you and spears into you" ], "Cul": [ "You bend over a rock, presenting your ass and prepare yourself to be fucked from behind. Two hands tentatively grip your hips, and then move to your ass and your caught off guard as a wet tounge slids over your clit", "You bend over a rock, presenting your ass and prepare yourself to be fucked from behind. Two hands tentatively grip your hips, and then move to your ass and your caught off guard as a wet tounge slids over your clit", "You bend over a rock, presenting your ass and prepare yourself to be fucked from behind. Two hands tentatively grip your hips, and then move to your ass and your caught off guard as a wet tounge slids over your clit" ], "FG": [ "After bathing together, his hands start to explore your body. You lean back giving him access to every inch of your body and his hands and lips explore further", "Two fingers press into your wet hole, the sensations are almost too much as he uses both hands to explore your body whille his tounge plays with your nipple. The two fingers press deeper, applying preasure in just the right place. You moan as his pace quickens, bringing you to orgasm", "Two fingers press into your wet hole, the sensations are almost too much as he uses both hands to explore your body whille his tounge plays with your nipple. Moaning you reach for his cock and grasp it eager to retun the pleasure. Withing moments his fingers are deep inside you and your hand is stroking his cock as you both aproach climax" ], "BH": [ "Bending over and presenting your ass, you prepare yourself as both his hands grip your hips. Theres a pause, then preasure as his cock presses against your slit and then he's inside you.", "You bend over and enjoy his eyes looking up and down your body. His left hand grabs your ass and his right guides his cock into you.", "You turn around and he doesn't miss a beat, his hand bend you over a rock and he enters you. His pace increases quickly as he begins to hammer into you over and over, all sence of delicacy gone as hear him getting closer to cumming" ], "HJ": [ "You take his cock in your hand and begin to stroke it quickly. He lets out a low moan and you grip tigher working your hand up and down him over and over, looking into his eyes and occasionally glancing at his manhood", "You take his cock in your hand and begin to stroke it quickly. He lets out a low moan and you grip tigher working your hand up and down him over and over, looking into his eyes and occasionally glancing at his manhood", "You take his cock in your hand and begin to stroke it quickly. He lets out a low moan and you grip tigher working your hand up and down him over and over, looking into his eyes and occasionally glancing at his manhood" ] }>> <<set _riverLucyLines = { "BJ": [ "Now you're clean, let my focus on this", "Lets slow down, I want you in my mouth", "I want to suck you dry" ], "BH": [ "Like what you see?", "I want you to use me", "Fuck me hard" ], "CG": [ "Now for the main event, you can sit back and watch me work", "Fuck! put your hands all over me while I ride you", "Let me ride you" ], "Cul": [ "How would you like to start?", "Use me as you like. I want to feel your hands all over me", "Where do you want to cum?" ], "FG": [ "Now we're clean, how would you like to start?", "Play with my body", "Don't stop, please let me cum" ], "BH": [ "Come and get it", "I want you behind me", "Fuck me from behind, you can cum on my ass!" ], "HJ": [ "You've got a nice big cock, mind if I touch it?", "Lets slow down, let me stroke your cock for a bit", "Please, cum on my face" ] }>> <</nobr>>
<<nobr>> <<set _combatants = []>> <<if _combatants.length === 3>> <<if _combatants.join() === "Female,Female,Female">> <<elseif _combatants.join() === "Male,Male,Male">> <<elseif _combatants.filter(x => x === "Female").length === 2>> You enter a room to find three of your guards enjoying eachothers company<br> <<set _int to random(1 ,2)>> <<set _VidPath to "Images/Castle/Barracks/Sex/FFM/" + _int + ".webm">> <<else>> <<set _int to random(1 ,2)>> You enter a room to find three of your guards enjoying eachothers company<br> <<set _VidPath to "Images/Castle/Barracks/Sex/MMF/" + _int + ".webm">> <</if>> <<elseif _combatants.length === 2>> <<if _combatants.join() === "Female,Female">> You enter a room to find two of your guards enjoying eachothers company<br> <<set _int to random(4 ,6)>> <<set _VidPath to "Images/Castle/Raid/TrapDoor/" + _int + ".webm">> <<elseif _combatants.join() === "Male,Male">> <<else>> You enter a room to find two of your guards enjoying eachothers company<br> <<set _int to random(7 ,9)>> <<set _VidPath to "Images/Castle/Raid/TrapDoor/" + _int + ".webm">> <</if>> <<elseif _combatants.length === 1>> You enter a room to find a guard toying with herself<br> <<if _combatants[0] === "Female">> <<set _int to random(1 ,4)>> <<set _VidPath to "Images/Mountains/Ironpeak/Homes/Sex/Solo/" + _int + ".webm">> <<else>> <</if>> <</if>> <<if _VidPath>> <video autoplay loop> <source @src="_VidPath" type="video/webm" onerror="this.style.display='none'"> </video> <</if>> <</nobr>>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Map Maker</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } #map-container { display: flex; flex-direction: column; align-items: center; margin-bottom: 20px; min-height: 600px; border: 1px dashed #ccc; padding: 0 0 120px 0; overflow: visible; } .map-row { display: flex; justify-content: center; width: 100%; margin-bottom: -130px; position: relative; } .map-row:first-child { margin-top: -30px; } /* REVERSED Z-INDEX: Now lower rows appear above higher rows */ .map-row:nth-child(1) { z-index: 6; } .map-row:nth-child(2) { z-index: 7; } .map-row:nth-child(3) { z-index: 8; } .map-row:nth-child(4) { z-index: 9; } .map-row:nth-child(5) { z-index: 10; } .tile { position: relative; width: 256px; height: 384px; margin: 0; } .tile img.tile-image { position: absolute; left: 0; top: 0; width: 256px; height: 384px; z-index: 1; /* Base layer */ } .road-image { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 2 !important; /* Above tile, below buildings */ } .building-container { position: absolute; width: 100%; height: 170px; left: 0; display: flex; justify-content: center; align-items: center; z-index: 3; /* Above roads */ } .building-container.top { top: 100px; /* Adjusted position */ } .building-container.middle { top: 195px; /* Adjusted position */ } .building-container.bottom { bottom: 0; } .building-image { position: absolute; /* No max-width/height to allow proper sizing */ } .misc-item { position: absolute; max-width: 50px; max-height: 50px; z-index: 4; /* Place above buildings */ } .controls { margin-top: 20px; text-align: center; display: flex; flex-wrap: wrap; justify-content: center; } button { padding: 8px 16px; margin: 5px; cursor: pointer; } .sky-indicator { position: absolute; top: 0; left: 0; width: 256px; height: 128px; border-top: 1px dashed rgba(0,0,255,0.3); z-index: 3; pointer-events: none; } .road-image { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 1.5 !important; } .road-debug { position: absolute; top: 5px; left: 5px; background-color: rgba(255, 255, 255, 0.7); font-size: 10px; padding: 2px; z-index: 4; } </style> </head> <body> <h1>Map Maker</h1> <div id="map-container"> <!-- Tiles will be added here --> </div> <div class="controls"> <button onclick="addBuilding('Farm')">Farm</button> <button onclick="addBuilding('Forge')">Forge</button> <button onclick="addBuilding('Garrison')">Garrison</button> <button onclick="addBuilding('Guard Tower')">Guard Tower</button> <button onclick="addBuilding('House')">House</button> <button onclick="addBuilding('Lumber Mill')">Lumber Mill</button> <button onclick="addBuilding('Mill')">Mill</button> <button onclick="addBuilding('Tavern')">Tavern</button> <button onclick="addBuilding('Brewery')">Brewery</button> <button onclick="resetMap()">Reset Map</button> <button onclick="addTile()">Add Tile</button> <button onclick="debugRoads()">Debug Roads</button> <button onclick="generateConsistentRoads()">Generate Roads</button> <button onclick="generateSettlement()" style="background-color: #4CAF50; color: white; font-weight: bold;">Generate Random Settlement</button> <button onclick="generateFromStoredData()" style="background-color: #2196F3; color: white; font-weight: bold;">Generate From Analyzed Data</button> </div> <script> // Global variables var buildings = []; var miscItems = []; var tileCount = 0; var currentRow = null; var tilesInCurrentRow = 0; const TILES_PER_ROW = 3; const MISC_ITEMS_COUNT = 13; const MISC_ITEM_CHANCE = 0.4; // 40% chance to add a misc item when building // Mapping from display names to folder names var folderMapping = { 'Farm': 'Farm', 'Forge': 'Forge', 'Garrison': 'Garrison', 'Guard Tower': 'GuardTower', 'House': 'House', 'Lumber Mill': 'LumberMill', 'Mill': 'Mill', 'Tavern': 'Tavern', 'Brewery': 'Brewery' }; // Building sizes lookup table and variant counts var buildingTypes = { 'Brewery': { maxWidth: 190, maxHeight: 164, variants: 1 }, 'Farm': { maxWidth: 256, maxHeight: 384, variants: 2 }, 'Forge': { maxWidth: 256, maxHeight: 384, variants: 1 }, 'Garrison': { maxWidth: 256, maxHeight: 384, variants: 2 }, 'Guard Tower': { maxWidth: 76, maxHeight: 90, variants: 2 }, 'House': { maxWidth: 90, maxHeight: 88, variants: 7 }, 'Lumber Mill': { maxWidth: 178, maxHeight: 142, variants: 2 }, 'Mill': { maxWidth: 256, maxHeight: 384, variants: 2 }, 'Tavern': { maxWidth: 100, maxHeight: 109, variants: 2 } }; // Initialize map on page load document.addEventListener('DOMContentLoaded', function() { resetMap(); }); // Get a random number between min and max function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function createNewRow() { var mapContainer = document.getElementById('map-container'); var rowDiv = document.createElement('div'); rowDiv.className = 'map-row'; mapContainer.appendChild(rowDiv); currentRow = rowDiv; tilesInCurrentRow = 0; // Add all 3 tiles immediately when creating a new row for (let i = 0; i < TILES_PER_ROW; i++) { addTileToRow(rowDiv); } return rowDiv; } // New helper function to add a single tile to a specific row function addTileToRow(rowDiv) { var tileDiv = document.createElement('div'); tileDiv.className = 'tile'; tileDiv.dataset.tileIndex = tileCount; // Create the tile image var tileImg = document.createElement('img'); tileImg.className = 'tile-image'; tileImg.src = 'Images/Raids/Maps/Tiles/1.png'; tileImg.alt = 'Tile'; // Error handler for tile image tileImg.onerror = function() { console.error(`Failed to load tile image: ${tileImg.src}`); tileDiv.style.backgroundColor = '#f0f0f0'; tileDiv.style.border = '1px solid blue'; var skyIndicator = document.createElement('div'); skyIndicator.className = 'sky-indicator'; tileDiv.appendChild(skyIndicator); }; // Add tile image to tile div tileDiv.appendChild(tileImg); // Calculate indices var rowIndex = Math.floor(tileCount / TILES_PER_ROW); var colIndex = tileCount % TILES_PER_ROW; // Get road type var roadType = getValidRoadType(rowIndex, colIndex); if (!roadConnections[rowIndex]) { roadConnections[rowIndex] = []; } roadConnections[rowIndex][colIndex] = roadType; // Create and add road image if needed if (roadType.connections.length > 0) { var roadImgPath = getRoadImagePath(roadType.connections); if (roadImgPath) { console.log(`ROAD DEBUG - Tile ${tileCount}: Adding road with connections [${roadType.connections.join(', ')}]`); var roadImg = document.createElement('img'); roadImg.className = 'road-image'; roadImg.src = roadImgPath; roadImg.alt = 'Road'; // Debug label var debugLabel = document.createElement('div'); debugLabel.className = 'road-debug'; debugLabel.textContent = `Connections: ${roadType.connections.join(', ')}`; debugLabel.style.display = 'none'; // Append both to tile div tileDiv.appendChild(roadImg); tileDiv.appendChild(debugLabel); } } // Add the completed tile div to the row rowDiv.appendChild(tileDiv); tileCount++; tilesInCurrentRow++; return tileDiv; } function addTile() { // Create a new row if needed if (!currentRow || tilesInCurrentRow >= TILES_PER_ROW) { createNewRow(); return; // createNewRow already adds all tiles, so return early } // If we get here, we're adding a single tile to an existing row return addTileToRow(currentRow); } function resetMap(requestedTiles) { document.getElementById('map-container').innerHTML = ''; buildings = []; miscItems = []; tileCount = 0; currentRow = null; tilesInCurrentRow = 0; tilesWithLargeBuildings = []; roadConnections = []; // Calculate optimal grid layout based on requested tiles let totalTiles = requestedTiles || 6; // Default to 6 tiles (3x2) if not specified // Calculate rows and columns (trying to stay close to square) let columns = TILES_PER_ROW; // Keep default width let rows = Math.ceil(totalTiles / columns); // Create rows based on calculated layout for (let i = 0; i < rows; i++) { createNewRow(); } // Generate connected road network generateConsistentRoads(); } // Add these constants and variables after your existing global variables const ROAD_TYPES = { EMPTY: { id: 0, connections: [] }, TB: { id: 1, connections: ['top', 'bottom'] }, LR: { id: 2, connections: ['left', 'right'] }, TL: { id: 3, connections: ['top', 'left'] }, TR: { id: 4, connections: ['top', 'right'] }, BL: { id: 5, connections: ['bottom', 'left'] }, BR: { id: 6, connections: ['bottom', 'right'] }, TBL: { id: 7, connections: ['top', 'bottom', 'left'] }, TBR: { id: 8, connections: ['top', 'bottom', 'right'] }, TLR: { id: 9, connections: ['top', 'left', 'right'] }, BLR: { id: 10, connections: ['bottom', 'left', 'right'] }, TBLR: { id: 11, connections: ['top', 'bottom', 'left', 'right'] } }; // Map of each tile's road connections [row][col] var roadConnections = []; // Function to get a random road type that's compatible with adjacent tiles function getValidRoadType(rowIndex, colIndex) { // Initialize roadConnections array if needed if (!roadConnections[rowIndex]) { roadConnections[rowIndex] = []; } // Required connections based on adjacent tiles const requiredConnections = []; // Check left adjacent tile if (colIndex > 0 && roadConnections[rowIndex][colIndex-1]) { let leftTile = roadConnections[rowIndex][colIndex-1]; if (leftTile.connections.includes('right')) { requiredConnections.push('left'); } } // Check right adjacent tile if (roadConnections[rowIndex][colIndex+1]) { let rightTile = roadConnections[rowIndex][colIndex+1]; if (rightTile.connections.includes('left')) { requiredConnections.push('right'); } } // Check top adjacent tile if (rowIndex > 0 && roadConnections[rowIndex-1] && roadConnections[rowIndex-1][colIndex]) { let topTile = roadConnections[rowIndex-1][colIndex]; if (topTile.connections.includes('bottom')) { requiredConnections.push('top'); } } // Check bottom adjacent tile if (rowIndex+1 < roadConnections.length && roadConnections[rowIndex+1][colIndex]) { let bottomTile = roadConnections[rowIndex+1][colIndex]; if (bottomTile.connections.includes('top')) { requiredConnections.push('bottom'); } } // If no required connections, add random connections (or empty) if (requiredConnections.length === 0) { // 40% chance of having no road if (Math.random() < 0.4) { return ROAD_TYPES.EMPTY; } // Get a random road type with 1-3 connections const roadTypes = Object.values(ROAD_TYPES).filter(type => type.connections.length > 0 && type.connections.length <= 3); return roadTypes[Math.floor(Math.random() * roadTypes.length)]; } // Find road types that have all required connections const validRoadTypes = Object.values(ROAD_TYPES).filter(type => requiredConnections.every(conn => type.connections.includes(conn))); if (validRoadTypes.length > 0) { // Select a random valid road type return validRoadTypes[Math.floor(Math.random() * validRoadTypes.length)]; } // If no valid road types, log an error and return EMPTY console.error("No valid road types found with required connections:", requiredConnections); return ROAD_TYPES.EMPTY; } // Add this debugging function to test if road images exist function testRoadImages() { // Create a debug display div let debugDiv = document.createElement('div'); debugDiv.style.position = 'fixed'; debugDiv.style.top = '10px'; debugDiv.style.right = '10px'; debugDiv.style.width = '400px'; debugDiv.style.maxHeight = '80vh'; debugDiv.style.overflowY = 'auto'; debugDiv.style.backgroundColor = 'rgba(255, 255, 255, 0.9)'; debugDiv.style.border = '1px solid black'; debugDiv.style.padding = '10px'; debugDiv.style.zIndex = '1000'; debugDiv.style.fontSize = '14px'; debugDiv.innerHTML = '<h3>Road Image Test Results</h3><p>Testing all possible road image paths...</p>'; document.body.appendChild(debugDiv); // Test all possible road types const roadTypes = [ { name: "Cross", paths: ["Cross/1.png", "Cross/2.png", "Cross/3.png"] }, { name: "T-B", paths: ["T-B/1.png", "T-B/2.png", "T-B/3.png"] }, { name: "L-R", paths: ["L-R/1.png", "L-R/2.png", "L-R/3.png"] }, { name: "T-L", paths: ["T-L/1.png", "T-L/2.png", "T-L/3.png"] }, { name: "T-R", paths: ["T-R/1.png", "T-R/2.png", "T-R/3.png"] }, { name: "B-L", paths: ["B-L/1.png", "B-L/2.png", "B-L/3.png"] }, { name: "B-R", paths: ["B-R/1.png", "B-R/2.png", "B-R/3.png"] }, { name: "T-Junction", paths: ["T/1.png", "T/2.png", "T/3.png", "T/4.png"] } ]; // Base path for road images const basePath = "Images/Raids/Maps/Roads/"; let totalTests = 0; let successTests = 0; // Test each image path roadTypes.forEach(type => { let typeResult = `<div style="margin-top:10px;"><strong>${type.name}:</strong> `; type.paths.forEach(path => { totalTests++; const fullPath = basePath + path; const img = new Image(); img.style.width = '30px'; img.style.height = '30px'; img.style.marginRight = '5px'; img.style.border = '1px solid #ccc'; img.onload = function() { successTests++; img.style.borderColor = 'green'; updateSummary(); }; img.onerror = function() { img.style.borderColor = 'red'; img.style.backgroundColor = '#ffcccc'; updateSummary(); }; img.src = fullPath; typeResult += `<span title="${fullPath}">${img.outerHTML}</span>`; }); typeResult += '</div>'; debugDiv.innerHTML += typeResult; }); // Update summary of test results function updateSummary() { const summaryElem = debugDiv.querySelector('p'); if (summaryElem) { summaryElem.innerHTML = `Testing complete: ${successTests} of ${totalTests} images loaded successfully.`; // Add a note about folder structure if (successTests === 0) { summaryElem.innerHTML += `<br><br><strong>IMPORTANT:</strong> No images loaded successfully. Please verify that your image folder structure is: <pre> Images/ └── Raids/ └── Maps/ └── Roads/ ├── Cross/ │ └── 1.png, 2.png, 3.png ├── T-B/ │ └── 1.png, 2.png, 3.png └── ... other folders </pre>`; } } } // Add close button const closeButton = document.createElement('button'); closeButton.textContent = 'Close'; closeButton.onclick = function() { document.body.removeChild(debugDiv); }; closeButton.style.marginTop = '10px'; debugDiv.appendChild(closeButton); } // Enhance the getRoadImagePath function with better logging function getRoadImagePath(connections) { let imgPath = "Images/Raids/Maps/Roads/"; let variant = Math.floor(Math.random() * 3) + 1; // Random variant 1-3 let resultPath = null; if (connections.length === 0) { return null; // No road for this tile } else if (connections.length === 4) { resultPath = `${imgPath}Cross/${variant}.png`; } else if (connections.length === 3) { // T junctions - USING ELSE IF to make these mutually exclusive if (!connections.includes('left')) resultPath = `${imgPath}T/1.png`; else if (!connections.includes('top')) resultPath = `${imgPath}T/2.png`; else if (!connections.includes('right')) resultPath = `${imgPath}T/3.png`; else if (!connections.includes('bottom')) resultPath = `${imgPath}T/4.png`; } else if (connections.length === 2) { // Ensure consistent naming format - USING ELSE IF if (connections.includes('top') && connections.includes('bottom')) { resultPath = `${imgPath}T-B/${variant}.png`; } else if (connections.includes('left') && connections.includes('right')) { resultPath = `${imgPath}L-R/${variant}.png`; } else if (connections.includes('top') && connections.includes('left')) { resultPath = `${imgPath}T-L/${variant}.png`; } else if (connections.includes('top') && connections.includes('right')) { resultPath = `${imgPath}T-R/${variant}.png`; } else if (connections.includes('bottom') && connections.includes('left')) { resultPath = `${imgPath}B-L/${variant}.png`; } else if (connections.includes('bottom') && connections.includes('right')) { resultPath = `${imgPath}B-R/${variant}.png`; } } else if (connections.length === 1) { // Add support for dead-end roads - USING ELSE IF if (connections.includes('top')) resultPath = `${imgPath}T-B/1.png`; else if (connections.includes('bottom')) resultPath = `${imgPath}T-B/1.png`; else if (connections.includes('left')) resultPath = `${imgPath}L-R/1.png`; else if (connections.includes('right')) resultPath = `${imgPath}L-R/1.png`; } if (resultPath) { console.log(`For connections [${connections.join(',')}], using image: ${resultPath}`); } else { console.error(`Invalid road connections: ${connections}`); } return resultPath; } // Update the addTile function - the critical part where the road is added function addTile() { // Create a new row if needed if (!currentRow || tilesInCurrentRow >= TILES_PER_ROW) { createNewRow(); return; // createNewRow already adds all tiles, so return early } // If we get here, we're adding a single tile to an existing row return addTileToRow(currentRow); } // Add this function to help debug road connections visually function drawRoadConnections(container, connections) { // For each connection, draw a line from center to edge var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.setAttribute('width', '100%'); svg.setAttribute('height', '100%'); svg.style.position = 'absolute'; svg.style.top = '0'; svg.style.left = '0'; svg.style.zIndex = '1.5'; svg.style.pointerEvents = 'none'; var centerX = 128; // Half of 256 var centerY = 192; // Half of 384 connections.forEach(function(direction) { var line = document.createElementNS("http://www.w3.org/2000/svg", "line"); line.setAttribute('stroke', 'red'); line.setAttribute('stroke-width', '5'); line.setAttribute('x1', centerX); line.setAttribute('y1', centerY); switch(direction) { case 'top': line.setAttribute('x2', centerX); line.setAttribute('y2', 0); break; case 'bottom': line.setAttribute('x2', centerX); line.setAttribute('y2', 384); break; case 'left': line.setAttribute('x2', 0); line.setAttribute('y2', centerY); break; case 'right': line.setAttribute('x2', 256); line.setAttribute('y2', centerY); break; } svg.appendChild(line); }); container.appendChild(svg); } // Add a debug function to show road connections function debugRoads() { var roadDebugElements = document.querySelectorAll('.road-debug'); var isVisible = roadDebugElements.length > 0 && roadDebugElements[0].style.display !== 'none'; roadDebugElements.forEach(function(el) { el.style.display = isVisible ? 'none' : 'block'; }); // Also log road connections to console for debugging console.clear(); console.log("=== ROAD CONNECTION MAP ==="); roadConnections.forEach((row, rowIndex) => { let rowStr = ""; row.forEach((cell, colIndex) => { if (cell) { rowStr += `[${cell.connections.join(',')}] `; } else { rowStr += "[empty] "; } }); console.log(`Row ${rowIndex}: ${rowStr}`); }); // Add missing placeholder for tiles that have connections but no visible road document.querySelectorAll('.tile').forEach((tile, index) => { var rowIndex = Math.floor(index / TILES_PER_ROW); var colIndex = index % TILES_PER_ROW; if (roadConnections[rowIndex] && roadConnections[rowIndex][colIndex] && roadConnections[rowIndex][colIndex].connections.length > 0) { // Check if this tile already has a road image or placeholder var hasRoad = tile.querySelector('.road-image') || tile.querySelector('svg'); if (!hasRoad) { var connections = roadConnections[rowIndex][colIndex].connections; console.log(`Adding missing road visualization to tile ${index} with connections: ${connections}`); var container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.width = '100%'; container.style.height = '100%'; container.style.zIndex = '1.5'; drawRoadConnections(container, connections); tile.appendChild(container); } } }); } // Update the getRoadImagePath function to include full paths for debugging function getRoadImagePath(connections) { let imgPath = "Images/Raids/Maps/Roads/"; let variant = Math.floor(Math.random() * 3) + 1; // Random variant 1-3 let resultPath = null; if (connections.length === 0) { return null; // No road for this tile } else if (connections.length === 4) { resultPath = `${imgPath}Cross/${variant}.png`; } else if (connections.length === 3) { // T junctions - fixed to use variant numbers if (!connections.includes('left')) resultPath = `${imgPath}T/1.png`; if (!connections.includes('top')) resultPath = `${imgPath}T/2.png`; if (!connections.includes('right')) resultPath = `${imgPath}T/3.png`; if (!connections.includes('bottom')) resultPath = `${imgPath}T/4.png`; } else if (connections.length === 2) { // Ensure consistent naming format if (connections.includes('top') && connections.includes('bottom')) { resultPath = `${imgPath}T-B/${variant}.png`; } if (connections.includes('left') && connections.includes('right')) { resultPath = `${imgPath}L-R/${variant}.png`; } if (connections.includes('top') && connections.includes('left')) { resultPath = `${imgPath}T-L/${variant}.png`; } if (connections.includes('top') && connections.includes('right')) { resultPath = `${imgPath}T-R/${variant}.png`; } if (connections.includes('bottom') && connections.includes('left')) { resultPath = `${imgPath}B-L/${variant}.png`; } if (connections.includes('bottom') && connections.includes('right')) { resultPath = `${imgPath}B-R/${variant}.png`; } } else if (connections.length === 1) { // Add support for dead-end roads - use fallbacks if (connections.includes('top')) resultPath = `${imgPath}T-B/1.png`; if (connections.includes('bottom')) resultPath = `${imgPath}T-B/1.png`; if (connections.includes('left')) resultPath = `${imgPath}L-R/1.png`; if (connections.includes('right')) resultPath = `${imgPath}L-R/1.png`; } if (resultPath) { console.log(`For connections [${connections.join(',')}], using image: ${resultPath}`); } else { console.error(`Invalid road connections: ${connections}`); } return resultPath; } // Replace the LARGE_BUILDINGS constant with size categories const LARGE_BUILDINGS = ['Forge', 'Garrison', 'Mill', 'Farm', 'Brewery']; // Buildings that get their own tile const MEDIUM_BUILDINGS = ['Tavern', 'Lumber Mill']; // Buildings that take up 2/3 of a panel // Add this variable with your other globals to track which tiles contain large buildings var tilesWithLargeBuildings = []; // Replace the addBuilding function with this fixed version function addBuilding(buildingType) { // Check building size var isLargeBuilding = LARGE_BUILDINGS.includes(buildingType); var isMediumBuilding = MEDIUM_BUILDINGS.includes(buildingType); var tileIndex, positionIndex, position; // Calculate if we need to add tiles const totalTiles = document.querySelectorAll('.tile').length; const usedTiles = new Set(); // Mark tiles that are already fully used buildings.forEach(building => { if (building.isLarge) { usedTiles.add(building.tileIndex); } }); // Only add another row if we're truly running out of usable space const availableTiles = totalTiles - usedTiles.size; const neededForBuilding = isLargeBuilding ? 1 : (isMediumBuilding ? 0.5 : 0.33); if (availableTiles < neededForBuilding * 3) { // Need at least 3x the space needed for current building console.log("Adding additional row due to insufficient remaining space"); createNewRow(); } if (isLargeBuilding) { // Find the next available tile that doesn't have any buildings tileIndex = 0; // Find a tile that has no buildings at all while (true) { let tileHasBuildings = false; // Check if any building exists on this tile for (var i = 0; i < buildings.length; i++) { if (buildings[i].tileIndex === tileIndex) { tileHasBuildings = true; break; } } if (!tileHasBuildings) { // Found an empty tile break; } // Try next tile tileIndex++; } // Always use middle position for large buildings positionIndex = 1; position = 'middle'; // Mark this tile as containing a large building tilesWithLargeBuildings.push(tileIndex); console.log(`Large building will use dedicated tile ${tileIndex}`); } else if (isMediumBuilding) { // For medium buildings, find a tile that doesn't have a large building // and has at most 1 regular building or no other medium buildings tileIndex = 0; var foundTile = false; while (!foundTile) { // Skip tiles with large buildings if (tilesWithLargeBuildings.includes(tileIndex)) { tileIndex++; continue; } // Count buildings in this tile var regularBuildingsInTile = 0; var mediumBuildingsInTile = 0; for (var i = 0; i < buildings.length; i++) { if (buildings[i].tileIndex === tileIndex) { if (MEDIUM_BUILDINGS.includes(buildings[i].type)) { mediumBuildingsInTile++; } else { regularBuildingsInTile++; } } } // Medium buildings can share with at most 1 regular building // but not with other medium buildings if (mediumBuildingsInTile === 0 && regularBuildingsInTile <= 1) { foundTile = true; } else { tileIndex++; } } // Medium buildings can go in top or bottom positions // Choose position based on existing buildings positionIndex = 0; // Default to top // Check if top position is occupied for (var i = 0; i < buildings.length; i++) { if (buildings[i].tileIndex === tileIndex && buildings[i].position === 'top') { positionIndex = 2; // Use bottom instead break; } } // Map position index to position name position = positionIndex === 0 ? 'top' : 'bottom'; console.log(`Medium building will use tile ${tileIndex}, position: ${position}`); } else { // For regular buildings, find next available position // that's not on a tile with a large building // Start checking from the beginning tileIndex = 0; positionIndex = 0; // Find next available position var positionsChecked = 0; var foundPosition = false; while (!foundPosition) { // Check if current tile has a large building if (tilesWithLargeBuildings.includes(tileIndex)) { // Skip this entire tile tileIndex++; continue; } // Check if this specific position is occupied var positionOccupied = false; for (var i = 0; i < buildings.length; i++) { if (buildings[i].tileIndex === tileIndex && buildings[i].position === ['top', 'middle', 'bottom'][positionIndex]) { positionOccupied = true; break; } } if (!positionOccupied) { // Found an available position foundPosition = true; } else { // Move to next position positionIndex++; if (positionIndex >= 3) { // If we've checked all positions in this tile, move to next tile positionIndex = 0; tileIndex++; } } // Safety check to prevent infinite loop positionsChecked++; if (positionsChecked > 1000) { console.error("Error: Too many positions checked. Breaking loop."); break; } } // Map position index to position name var positions = ['top', 'middle', 'bottom']; position = positions[positionIndex]; } console.log(`Placing ${buildingType} on tile ${tileIndex+1}, position: ${position}`); // Make sure we have enough tiles while (document.querySelectorAll('.tile').length <= tileIndex) { addTile(); } // Get the target tile var tiles = document.querySelectorAll('.tile'); var targetTile = tiles[tileIndex]; // Create a container for the building var container = document.createElement('div'); container.className = 'building-container ' + position; // For large buildings, make the container fill more of the tile if (isLargeBuilding) { container.style.height = "240px"; // Make container larger if (position === 'middle') { container.style.top = "100px"; // Center it better } } // For medium buildings, make the container larger than regular buildings else if (isMediumBuilding) { container.style.height = "200px"; // Make container larger for medium buildings // Adjust position for medium buildings if (position === 'top') { container.style.top = "80px"; } else if (position === 'bottom') { container.style.bottom = "20px"; } } // Get building info var buildingInfo = buildingTypes[buildingType]; // Get random variant var variant = 1; // Default to 1 if no variants if (buildingInfo && buildingInfo.variants > 1) { variant = getRandomInt(1, buildingInfo.variants); } // Get the correct folder name for this building type var folderName = folderMapping[buildingType] || buildingType.replace(/ /g, ''); // Create and add the building image var buildingImg = document.createElement('img'); buildingImg.className = 'building-image'; buildingImg.src = `Images/Raids/Maps/Buildings/${folderName}/${variant}.png`; buildingImg.alt = buildingType; console.log(`Loading image from: ${buildingImg.src}`); // Handle image loading to get actual dimensions buildingImg.onload = function() { // Get actual image dimensions var actualWidth = buildingImg.naturalWidth; var actualHeight = buildingImg.naturalHeight; console.log(`${buildingType} ${variant} original dimensions: ${actualWidth}x${actualHeight}`); // Scale the image to a reasonable size if needed // Instead of constraining to container, scale to reasonable visual size if (actualWidth > 0 && actualHeight > 0) { // For regular buildings, use the defined maxWidth/maxHeight var desiredWidth = buildingInfo.maxWidth; var desiredHeight = buildingInfo.maxHeight; // Calculate scale ratio to maintain aspect ratio var widthRatio = desiredWidth / actualWidth; var heightRatio = desiredHeight / actualHeight; var ratio = Math.min(widthRatio, heightRatio); // Apply scaling buildingImg.width = Math.floor(actualWidth * ratio); buildingImg.height = Math.floor(actualHeight * ratio); console.log(`Image scaled to: ${buildingImg.width}x${buildingImg.height}`); } // Position the building after determining dimensions positionBuildingRandomly(buildingImg, container); }; // Error handler for building image buildingImg.onerror = function() { console.error(`Failed to load image: ${buildingImg.src}`); // If image fails, use colored div instead var fallbackDiv = document.createElement('div'); var fallbackWidth = buildingInfo ? buildingInfo.maxWidth : 50; var fallbackHeight = buildingInfo ? buildingInfo.maxHeight : 50; fallbackDiv.style.width = fallbackWidth + 'px'; fallbackDiv.style.height = fallbackHeight + 'px'; // Different colors for different positions var colors = { 'top': 'rgba(255,0,0,0.2)', 'middle': 'rgba(0,0,255,0.2)', 'bottom': 'rgba(0,255,0,0.2)' }; fallbackDiv.style.backgroundColor = colors[position]; fallbackDiv.style.position = 'absolute'; container.appendChild(fallbackDiv); positionBuildingRandomly(fallbackDiv, container); buildingImg.style.display = 'none'; // Hide the failed image }; // Add image to container, container to tile container.appendChild(buildingImg); targetTile.appendChild(container); // Track the building buildings.push({ type: buildingType, tileIndex: tileIndex, position: position, variant: variant, isLarge: isLargeBuilding, isMedium: isMediumBuilding }); // Only add misc items for regular buildings, to avoid clutter with large/medium buildings if (!isLargeBuilding && !isMediumBuilding && Math.random() < MISC_ITEM_CHANCE) { addMiscItem(document.querySelector('.map-row:nth-child(' + Math.ceil((tileIndex + 1) / TILES_PER_ROW) + ')')); } } // Updated positioning function for better placement function positionBuildingRandomly(element, container) { // Get element dimensions - respecting natural size var width = element.width || parseInt(element.style.width) || 50; var height = element.height || parseInt(element.style.height) || 50; // Calculate maximum offsets to ensure building stays within tile var maxHorizontalOffset = Math.max(10, (256 - width) / 2); var maxVerticalOffset = Math.max(10, (170 - height) / 2); // Generate random offsets with reasonable constraints var horizontalOffset = getRandomInt(-maxHorizontalOffset * 0.8, maxHorizontalOffset * 0.8); var verticalOffset = getRandomInt(-maxVerticalOffset * 0.7, maxVerticalOffset * 0.7); // Apply positioning element.style.left = `calc(50% + ${horizontalOffset}px)`; element.style.top = `calc(50% + ${verticalOffset}px)`; element.style.transform = 'translate(-50%, -50%)'; } // Add a random miscellaneous item to the map function addMiscItem(row) { // Get a random tile in this row var tilesInRow = row.querySelectorAll('.tile'); if (tilesInRow.length === 0) return; var randomTileIndex = getRandomInt(0, tilesInRow.length - 1); var targetTile = tilesInRow[randomTileIndex]; // Get a random misc item (1-13) var itemNumber = getRandomInt(1, MISC_ITEMS_COUNT); // Create and add the misc item image var miscImg = document.createElement('img'); miscImg.className = 'misc-item'; miscImg.src = `Images/Raids/Maps/Buildings/Misc/${itemNumber}.png`; miscImg.alt = `Misc Item ${itemNumber}`; // Position randomly on the tile var xPosition = getRandomInt(20, 236); // Keep slightly away from edges var yPosition = getRandomInt(100, 300); // Avoid sky area and very bottom miscImg.style.left = xPosition + 'px'; miscImg.style.top = yPosition + 'px'; // Handle image loading miscImg.onload = function() { console.log(`Misc item ${itemNumber} added successfully`); }; // Error handler miscImg.onerror = function() { console.error(`Failed to load misc item: ${miscImg.src}`); miscImg.style.display = 'none'; }; // Add to tile targetTile.appendChild(miscImg); // Track the misc item miscItems.push({ itemNumber: itemNumber, tileIndex: randomTileIndex, rowIndex: Array.from(document.querySelectorAll('.map-row')).indexOf(row) }); } // Improved road connection system for MapMaker.html function generateConsistentRoads() { // Reset existing road connections roadConnections = []; const rows = document.querySelectorAll('.map-row').length; const cols = TILES_PER_ROW; // Initialize empty road connection grid for (let r = 0; r < rows; r++) { roadConnections[r] = []; for (let c = 0; c < cols; c++) { roadConnections[r][c] = null; } } // First pass - generate a connected road network starting from entry points // Create entry/exit points on map edges const entryPoints = []; // Add random entry points on edges (1-2 per edge) // Top edge for (let i = 0; i < getRandomInt(1, 2); i++) { const col = getRandomInt(0, cols - 1); entryPoints.push({row: 0, col: col, direction: 'top'}); if (!roadConnections[0][col]) roadConnections[0][col] = {connections: []}; roadConnections[0][col].connections.push('top'); } // Bottom edge for (let i = 0; i < getRandomInt(1, 2); i++) { const col = getRandomInt(0, cols - 1); entryPoints.push({row: rows-1, col: col, direction: 'bottom'}); if (!roadConnections[rows-1][col]) roadConnections[rows-1][col] = {connections: []}; roadConnections[rows-1][col].connections.push('bottom'); } // Left edge for (let i = 0; i < getRandomInt(1, 2); i++) { const row = getRandomInt(0, rows - 1); entryPoints.push({row: row, col: 0, direction: 'left'}); if (!roadConnections[row][0]) roadConnections[row][0] = {connections: []}; roadConnections[row][0].connections.push('left'); } // Right edge for (let i = 0; i < getRandomInt(1, 2); i++) { const row = getRandomInt(0, rows - 1); entryPoints.push({row: row, col: cols-1, direction: 'right'}); if (!roadConnections[row][cols-1]) roadConnections[row][cols-1] = {connections: []}; roadConnections[row][cols-1].connections.push('right'); } // Connect entry points with roads for (let i = 0; i < entryPoints.length - 1; i++) { connectEntryPoints(entryPoints[i], entryPoints[i+1]); } // Second pass - ensure all connections are reciprocated ensureReciprocatedConnections(); // Third pass - add some random roads for variety addRandomRoads(); // Render roads renderRoadNetwork(); } function connectEntryPoints(start, end) { // Simple pathfinding to connect two entry points let currentRow = start.row; let currentCol = start.col; // Get general direction to move const rowDirection = end.row > start.row ? 1 : (end.row < start.row ? -1 : 0); const colDirection = end.col > start.col ? 1 : (end.col < start.col ? -1 : 0); // Move in a mix of row and column directions until we reach the destination while (currentRow !== end.row || currentCol !== end.col) { // Decide whether to move in row or column direction let moveRow = false; if (currentRow === end.row) moveRow = false; else if (currentCol === end.col) moveRow = true; else moveRow = Math.random() > 0.5; if (moveRow) { // Move in row direction const nextRow = currentRow + rowDirection; // Add connections between current tile and next tile if (!roadConnections[currentRow][currentCol]) roadConnections[currentRow][currentCol] = {connections: []}; if (!roadConnections[nextRow][currentCol]) roadConnections[nextRow][currentCol] = {connections: []}; if (rowDirection > 0) { roadConnections[currentRow][currentCol].connections.push('bottom'); roadConnections[nextRow][currentCol].connections.push('top'); } else { roadConnections[currentRow][currentCol].connections.push('top'); roadConnections[nextRow][currentCol].connections.push('bottom'); } currentRow = nextRow; } else { // Move in column direction const nextCol = currentCol + colDirection; // Add connections between current tile and next tile if (!roadConnections[currentRow][currentCol]) roadConnections[currentRow][currentCol] = {connections: []}; if (!roadConnections[currentRow][nextCol]) roadConnections[currentRow][nextCol] = {connections: []}; if (colDirection > 0) { roadConnections[currentRow][currentCol].connections.push('right'); roadConnections[currentRow][nextCol].connections.push('left'); } else { roadConnections[currentRow][currentCol].connections.push('left'); roadConnections[currentRow][nextCol].connections.push('right'); } currentCol = nextCol; } } } function ensureReciprocatedConnections() { const rows = roadConnections.length; const cols = roadConnections[0].length; for (let r = 0; r < rows; r++) { for (let c = 0; c < cols; c++) { if (!roadConnections[r][c]) continue; // Check and ensure right-left connections if (c < cols - 1 && roadConnections[r][c].connections.includes('right')) { if (!roadConnections[r][c+1]) roadConnections[r][c+1] = {connections: []}; if (!roadConnections[r][c+1].connections.includes('left')) roadConnections[r][c+1].connections.push('left'); } // Check and ensure bottom-top connections if (r < rows - 1 && roadConnections[r][c].connections.includes('bottom')) { if (!roadConnections[r+1][c]) roadConnections[r+1][c] = {connections: []}; if (!roadConnections[r+1][c].connections.includes('top')) roadConnections[r+1][c].connections.push('top'); } } } } function addRandomRoads() { const rows = roadConnections.length; const cols = roadConnections[0].length; // Add some random additional connections const randomConnections = Math.floor(rows * cols * 0.1); // 10% of tiles for (let i = 0; i < randomConnections; i++) { const r = getRandomInt(0, rows - 1); const c = getRandomInt(0, cols - 1); // If no road exists here yet if (!roadConnections[r][c] || roadConnections[r][c].connections.length === 0) { // Add a random road configuration const roadType = Object.values(ROAD_TYPES).filter( type => type.id !== 0 && type.connections.length <= 2 )[getRandomInt(0, 5)]; // Pick from simple road types roadConnections[r][c] = { connections: [...roadType.connections] }; // Ensure connections with adjacent tiles if (roadType.connections.includes('right') && c < cols - 1) { if (!roadConnections[r][c+1]) roadConnections[r][c+1] = {connections: []}; if (!roadConnections[r][c+1].connections.includes('left')) roadConnections[r][c+1].connections.push('left'); } if (roadType.connections.includes('bottom') && r < rows - 1) { if (!roadConnections[r+1][c]) roadConnections[r+1][c] = {connections: []}; if (!roadConnections[r+1][c].connections.includes('top')) roadConnections[r+1][c].connections.push('top'); } } } } function renderRoadNetwork() { document.querySelectorAll('.road-image, svg').forEach(el => el.remove()); document.querySelectorAll('.tile').forEach((tile, index) => { const rowIndex = Math.floor(index / TILES_PER_ROW); const colIndex = index % TILES_PER_ROW; if (roadConnections[rowIndex] && roadConnections[rowIndex][colIndex] && roadConnections[rowIndex][colIndex].connections.length > 0) { const connections = roadConnections[rowIndex][colIndex].connections; const roadImgPath = getRoadImagePath(connections); if (roadImgPath) { const roadImg = document.createElement('img'); roadImg.className = 'road-image'; roadImg.src = roadImgPath; roadImg.alt = 'Road'; roadImg.onerror = function() { console.error(`Failed to load road image: ${roadImg.src}`); // Create visual indicator using SVG instead const container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.width = '100%'; container.style.height = '100%'; container.style.zIndex = '1.5'; drawRoadConnections(container, connections); tile.appendChild(container); }; tile.appendChild(roadImg); // Add debug label const debugLabel = document.createElement('div'); debugLabel.className = 'road-debug'; debugLabel.textContent = `Connections: ${connections.join(', ')}`; debugLabel.style.display = 'none'; tile.appendChild(debugLabel); } } }); } // Settlement generator function generateSettlement() { // Determine settlement size const settlementSize = getRandomSettlementSize(); console.log(`Generating a ${settlementSize.name} settlement`); // Count buildings by type const buildingCounts = {}; // Estimate count for each building type based on settlement size const totalBuildings = getRandomInt(settlementSize.buildings.min, settlementSize.buildings.max); // Add required buildings based on features buildingCounts['Farm'] = Math.ceil(totalBuildings / 6); // At least some farms if (Math.random() < settlementSize.features.hasTavern) buildingCounts['Tavern'] = 1; if (Math.random() < settlementSize.features.hasForge) buildingCounts['Forge'] = 1; if (Math.random() < settlementSize.features.hasGuardTower) buildingCounts['Guard Tower'] = 1; if (settlementSize.name !== 'hamlet' && Math.random() < 0.7) buildingCounts['Mill'] = 1; if (Math.random() < (settlementSize.name === 'hamlet' ? 0.1 : 0.5)) buildingCounts['Brewery'] = 1; if (Math.random() < 0.4 && settlementSize.name !== 'hamlet') buildingCounts['Lumber Mill'] = 1; if (settlementSize.name === 'town' && Math.random() < 0.6) buildingCounts['Garrison'] = 1; // Fill remaining with houses const countedBuildings = Object.values(buildingCounts).reduce((a, b) => a + b, 0); buildingCounts['House'] = Math.max(0, totalBuildings - countedBuildings); // Calculate required tiles and reset map with that size const requiredTiles = calculateRequiredTiles(buildingCounts); resetMap(requiredTiles); // Place buildings according to settlement rules placeSettlementBuildings(settlementSize); // Add appropriate decorative elements addSettlementDecorations(settlementSize); } function generateFromBuildingData(data) { // Calculate the minimum tiles needed based on building counts const requiredTiles = calculateRequiredTiles(data.buildings); // Reset the map with calculated number of tiles resetMap(requiredTiles); // Process each building type and add the appropriate number Object.entries(data.buildings).forEach(([type, count]) => { // Map settlement building types to MapMaker building types let mapMakerType = mapSettlementBuildingType(type); // Skip unknown building types if (!mapMakerType) { console.log(`Skipping unknown building type: ${type}`); return; } // Add each building of this type for (let i = 0; i < count; i++) { console.log(`Adding building: ${mapMakerType}`); addBuilding(mapMakerType); } }); // Add some decorations based on settlement size const totalBuildingCount = Object.values(data.buildings).reduce((a, b) => a + b, 0); const decorationCount = Math.floor(totalBuildingCount * 0.7); for (let i = 0; i < decorationCount; i++) { const rows = document.querySelectorAll('.map-row'); const randomRowIndex = getRandomInt(0, rows.length - 1); addMiscItem(rows[randomRowIndex]); } } // Update the calculateRequiredTiles function to be more precise function calculateRequiredTiles(buildingCounts) { // Calculate minimum tiles needed based on building types let requiredTiles = 0; // Large buildings need dedicated tiles for (const [type, count] of Object.entries(buildingCounts)) { if (LARGE_BUILDINGS.includes(type)) { requiredTiles += count; // Each large building needs its own tile } else if (MEDIUM_BUILDINGS.includes(type)) { requiredTiles += Math.ceil(count / 2); // 2 medium buildings per tile at most } else { requiredTiles += Math.ceil(count / 3); // 3 small buildings per tile at most } } // Calculate how many full rows we need for the buildings const rowsNeeded = Math.ceil(requiredTiles / TILES_PER_ROW); const tilesInFullRows = rowsNeeded * TILES_PER_ROW; // We only add buffer if there's already significant empty space in the last row const emptyTilesInLastRow = tilesInFullRows - requiredTiles; // If we have less than 1 empty tile in the last row, add a small buffer let finalTileCount = tilesInFullRows; if (emptyTilesInLastRow < 1) { // Only add at most 1 additional tile, not a percentage finalTileCount += 1; } // Ensure we have at least 6 tiles (3x2 grid) finalTileCount = Math.max(6, finalTileCount); console.log(`Building calculation: Required=${requiredTiles}, Full rows=${tilesInFullRows}, Final=${finalTileCount}`); return finalTileCount; } // Add the missing function to generate from stored data function generateFromStoredData() { // Example settlement data - in a real app, this would come from storage const settlementData = { name: "Small Village", buildings: { "House": 5, "Tavern": 1, "Farm": 1 } }; console.log("Generating settlement from stored data:", settlementData); generateFromBuildingData(settlementData); } // Add a helper function to map settlement building types if needed function mapSettlementBuildingType(settlementType) { // Map settlement data building types to the types used in MapMaker const typeMapping = { "house": "House", "tavern": "Tavern", "farm": "Farm", "forge": "Forge", "garrison": "Garrison", "guardtower": "Guard Tower", "mill": "Mill", "lumbermill": "Lumber Mill", "brewery": "Brewery" }; // Try exact match first if (folderMapping[settlementType]) { return settlementType; } // Try case-insensitive match const lowercaseType = settlementType.toLowerCase(); return typeMapping[lowercaseType] || null; } // Add a function to determine settlement size if not already defined function getRandomSettlementSize() { const sizes = [ { name: 'hamlet', buildings: { min: 3, max: 7 }, features: { hasTavern: 0.3, hasForge: 0.2, hasGuardTower: 0.1 } }, { name: 'village', buildings: { min: 6, max: 12 }, features: { hasTavern: 0.8, hasForge: 0.6, hasGuardTower: 0.4 } }, { name: 'town', buildings: { min: 10, max: 18 }, features: { hasTavern: 1.0, hasForge: 0.9, hasGuardTower: 0.8 } } ]; return sizes[getRandomInt(0, sizes.length - 1)]; } // Add a function to place settlement buildings if not already defined function placeSettlementBuildings(settlementSize) { // Calculate building counts based on settlement size const buildingCounts = {}; // Add required buildings based on features if (Math.random() < settlementSize.features.hasTavern) buildingCounts['Tavern'] = 1; if (Math.random() < settlementSize.features.hasForge) buildingCounts['Forge'] = 1; if (Math.random() < settlementSize.features.hasGuardTower) buildingCounts['Guard Tower'] = 1; // Add some farms buildingCounts['Farm'] = Math.ceil(settlementSize.buildings.min / 6); // Fill the rest with houses const countedBuildings = Object.values(buildingCounts).reduce((a, b) => a + b, 0); const totalBuildings = getRandomInt(settlementSize.buildings.min, settlementSize.buildings.max); buildingCounts['House'] = Math.max(0, totalBuildings - countedBuildings); // Place each building Object.entries(buildingCounts).forEach(([type, count]) => { for (let i = 0; i < count; i++) { addBuilding(type); } }); } // Add a function to add decorations based on settlement size function addSettlementDecorations(settlementSize) { // Add decorations based on settlement size const decorations = Math.floor(settlementSize.buildings.min * 0.7); for (let i = 0; i < decorations; i++) { const rows = document.querySelectorAll('.map-row'); if (rows.length > 0) { const randomRowIndex = getRandomInt(0, rows.length - 1); addMiscItem(rows[randomRowIndex]); } } } </script> </body> </html>
:: Building Analyzer <h2>Settlement Building Analyzer</h2> <div> <textarea id="jsonInput" rows="10" style="width: 90%;" placeholder="Paste settlement JSON data here..."></textarea> </div> <button id="analyzeBtn">Analyze Buildings</button> <div id="resultArea" style="margin-top: 20px; border: 1px solid #ccc; padding: 10px; display: none;"> <h3>Building Analysis</h3> <pre id="buildingResults"></pre> <span id="mapLinkContainer"></span> </div> <script> document.getElementById('analyzeBtn').addEventListener('click', function() { const jsonInput = document.getElementById('jsonInput').value; const resultArea = document.getElementById('resultArea'); const buildingResults = document.getElementById('buildingResults'); const mapLinkContainer = document.getElementById('mapLinkContainer'); if (!jsonInput.trim()) { buildingResults.textContent = "Please enter JSON data."; resultArea.style.display = 'block'; mapLinkContainer.innerHTML = ''; return; } function getBuildingSummary(jsonData) { try { // Parse the JSON string into an object const data = JSON.parse(jsonData); let buildingSummary = {}; let totalBuildings = 0; // Count populated buildings (houses, etc.) if (data.populatedBuildings) { Object.keys(data.populatedBuildings).forEach(buildingName => { // Extract building type if available, or use the name const buildingType = data.populatedBuildings[buildingName][0]?.buildingType || buildingName.split(" ")[0]; if (!buildingSummary[buildingType]) { buildingSummary[buildingType] = 0; } buildingSummary[buildingType]++; totalBuildings++; }); } // Count other buildings (farm, brewery, etc.) if (data.buildings) { Object.keys(data.buildings).forEach(buildingType => { const building = data.buildings[buildingType]; // Only count if the building is built or under construction if (building.built || building.underConstruction) { const capitalizedType = buildingType.charAt(0).toUpperCase() + buildingType.slice(1); if (!buildingSummary[capitalizedType]) { buildingSummary[capitalizedType] = 0; } buildingSummary[capitalizedType]++; totalBuildings++; } }); } // Prepare the output text let output = `Settlement: ${data.name}\n`; output += `Location: ${data.location}\n`; output += `Size: ${data.size}\n`; output += `Total buildings: ${totalBuildings}\n\n`; output += "Building types:\n"; for (const [type, count] of Object.entries(buildingSummary)) { output += `- ${type}: ${count}\n`; } // Store building data in Twine's $SelectedMapsData variable const settlementData = { name: data.name, location: data.location, size: data.size, buildings: buildingSummary }; // Set the data in Twine's variable system if (window.SugarCube) { window.SugarCube.State.variables.SelectedMapsData = settlementData; } else { // For testing outside of Twine window.$SelectedMapsData = settlementData; } // Create a "Generate Map" button that uses Twine links mapLinkContainer.innerHTML = ` <div style="margin-top: 15px;"> <a id="generateMapBtn" style="background-color: #4CAF50; color: white; padding: 8px 16px; text-decoration: none; display: inline-block; cursor: pointer;">Generate Map</a> </div> `; document.getElementById('generateMapBtn').addEventListener('click', function() { if (window.SugarCube) { // Navigate to MapMaker passage in Twine window.SugarCube.Engine.play("MapMaker"); } else { // For testing outside Twine alert("Map data stored in $SelectedMapsData: " + JSON.stringify(window.$SelectedMapsData)); } }); return output; } catch (error) { return `Error processing JSON: ${error.message}`; } } buildingResults.textContent = getBuildingSummary(jsonInput); resultArea.style.display = 'block'; }); </script>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> <<set _residentAtCult to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Check if resident is currently at the cult */ <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.currentVisitor>> <<set _cultVisitor to _settlement.buildings.cult.currentVisitor>> <<set _cultVisitorId to _cultVisitor.NPCID || _cultVisitor.prisonerId>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<if _cultVisitorId === _residentId>> <<set _residentAtCult to true>> <</if>> <</if>> /* Add to home list if not at work and not at cult */ <<if !_residentAtWork && !_residentAtCult>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _residentsAtHome.length is 1>> <<if _doorGreeter.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<set _rand to random(1, 3)>> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Blonde/" + _rand + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Red/" + _rand + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Brown/" + _rand + ".png">> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <</if>> <<if _residentsAtHome.length is 2>> <<set _villager1 = _residentsAtHome[0]>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager1.sex is "Female" and _villager2.sex is "Female">> <<if _villager1.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<if _villager2.hairColor>><<else>><<set _villager2.hairColor to "Brown">><</if>> <<set _rand to random(1, 2)>> <<if _rand is 1>> <<set _pos to "Standing">> <<else>> <<set _pos to "Bed">> <</if>> <<if _villager1.hairColor is "Red" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/R-R.png">> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BL-BL.png">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BR-BR.png">>> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BL-R.png">> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BL-BR.png">> <<elseif _villager1.hairColor is "Red" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BL-R.png">> <<elseif _villager1.hairColor is "Red" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/R-BR.png">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/R-BR.png">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FF/" + _pos + "/BL-BR.png">> <</if>> <</if>> <</if>> <div class="text-box"> <<if _residentsAtHome.length is 1>> Entering the house you hear moaning coming from the living room. Walking over to the door, you it over and open it slowly. Inside you see a woman layed out on a settee, pleasuring herself <</if>> <<if _residentsAtHome.length is 2>> <<if _villager1.corruption >= _villager2.corruption>> <<set _dom to _villager1>> <<set _sub to _villager2>> <<else>> <<set _dom to _villager2>> <<set _sub to _villager1>> <</if>> <<if _dom.ImgNumber < 15>><<set _dom.ImgNumber to _dom.ImgNumber + 15>><</if>> <<if _sub.ImgNumber < 15>><<set _sub.ImgNumber to _sub.ImgNumber + 15>><</if>> <<if _dom.name is _villager1.name>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager1.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<else>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <</if>> <<if _pos is "Standing">> You enter to see two woman, naked. One is pressing the other to a wall, working her fingers in and out of the others dripping cunt<br> <<else>> Working your way through the house, following the moans, you reach a bedroom and enter. Before you is two woman, one sprawling on the bed, moaning while the other burries her face in her ass. You can hear stifled moaning from the woman as she tounge fucks her lovers holes<br> <</if>> <<say '_dom.name' _domImg>>Umm, does that feel good?<</say>> <<say '_sub.name' _subImg>>Gods!<</say>> <</if>> <div class="Random-image"> <img @src="$greeterImage" alt="Guest Image"> </div> <<if _residentsAtHome.length is 1>> She sees you and her eyes go wide, her fingers slow, but she doesn't stop teasing herself<br> <<set _lines to [ "I-I was just...", "How did you get in... ah", "It's you... My Lord... I was just"]>> <<set _greeting to either(_lines)>> <<say '_doorGreeter.name' _charImg>>_greeting<</say>> There's an internal struggle as she's trying to fight the urge to continue. Eventually she stops and stands to look at you <div class="Random-image"> <img @src="_charImg" alt="Guest Image"> </div> You consider waht to do with her...<br> <<button "Push her against the wall">> <<set $Position to "Wall">> <<goto "SettlementHouseVisitAlone2">> <</button>><br> <<button "Tell her to bend over">> <<set $Position to "Table">> <<goto "SettlementHouseVisitAlone2">> <</button>><br> <<button "Leave her alone">> <<goto "SettlementVisit">> <</button>> <</if>> <<if _residentsAtHome.length is 2>> _dom.name turns and sees you. Your expecting a scream but instead she smiles... <<say '_dom.name' _domImg>>Well, look whos here...<</say>> _domImg _sub.name, looks uneasy but excited <<say '_sub.name' _subImg>>H-Hello, lord<</say>> <<say '_dom.name' _domImg>>Care to join us? Or maybe you'd like to use one of us while the other watches?<</say>> <div class="image-container"> <div class="image-wrapper"> <img @src=_domImg alt="First Image"> <br> <<button "Fuck _dom.name">> <<goto "HouseVisitFuckDom">> <</button>> </div> <div class="image-wrapper"> <img @src=_subImg alt="Second Image"> <br> <<button "Fuck _sub.name">> <<goto "HouseVisitFuckSub">> <</button>> </div> </div> <<button "Let them both worship you">> <<goto "HouseVisitMFF">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <<if $Position is "Wall">> <<set _rand to random(1, 2)>> <<set _img to "Images/Raids/NPC/Event/MF/Wall/" + _doorGreeter.hairColor + _rand + ".png">> <<else>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + ".png">> <</if>> <div class="text-box"> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <<if $Position is "Table">> <<button "Spank her">> <<replace "#spank">> With out warning you raise your hand and slap _doorGreeter.name across the ass. She lets out a yelp but doesn't protest as you bring your hand back down in the same place, with a smack. <<if _doorGreeter.corruption < 50>> <<say '_doorGreeter.name' _charImg>>Be- be gentle with me<</say>> You can hear a lack of conviction in her tone and can tell she enjoyed that, but you ease off <<else>> <<say '_doorGreeter.name' _charImg>>Umm ha, fuck smack me harder<</say>> You comply, bringing your hand down again over her ass and she gasps, her knees buckle slightly <</if>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor +"/1.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <</replace>> <</button>> <div id="spank"></div> <<button "Tease her ass">> <<replace "#tease">> <<You>>You've got a nice soft ass<</You>> You compliment her as you squeeze her cheek firmly, exposing her holes <<if _doorGreeter.corruption < 50>> <<say '_doorGreeter.name' _charImg>>Thank you, lord<</say>> Your thumb touches her hole and gently circles it <<say '_doorGreeter.name' _charImg>>Wait what are yo-<</say>> Pressing gently, your thumb enters her thight ass and she gasps. <<You>>Just exploring<</You>> You ease off the preasure before pushing your thumb back into her hole, this time she lets out a soft moan <<else>> <<say '_doorGreeter.name' _charImg>>It's all yours...<</say>> Your thumb touches her hole and gently circles it <<say '_doorGreeter.name' _charImg>>Oooo you want that hole?<</say>> Pressing gently, your thumb enters her thight ass <<say '_doorGreeter.name' _charImg>>Deeper.<</say>> You compy pushing your thumb into her as she moans <</if>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor +"/2.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <</replace>> <</button>> <div id="tease"></div> <<button "Go down on her">> <<replace "#lick">> Dropping to your knees, you spread her cheeks admiring both holes before burring your face in her ass. Her juices are already flowing and soon there dripping down your chin. <<say '_doorGreeter.name' _charImg>>Oh gods!<</say>> Pressing your tounge into her cunt you can tell shes close from touching herself moments ago so you slow down, licking everywhere and smearing her fluids over your face and her ass <<say '_doorGreeter.name' _charImg>>Please! I need to cum!<</say>> You grant her wish. Gripping her thighs you press your face deep and flick her clit with your tounge over and over, in moments shes lets out a loud moan and grips the table, you feel her knees tremble and support her by the hips as she cums. <br> Eventually you stop and pull away, both of you catching your breaths <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor +"/6.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <</replace>> <</button>> <div id="lick"></div> <<button "Fuck her">> <<if _doorGreeter.hairColor is "Red">> <<goto "SettlementHouseVisitFuckRed">> <<elseif _doorGreeter.hairColor is "Brown">> <<goto "SettlementHouseVisitFuckBrown">> <<else>> <<goto "SettlementHouseVisitFuckBlonde">> <</if>> <</button>> <</if>> <<if $Position is "Wall">> <<button "Go down on her">> <<replace "#action">> <<set _img to "Images/Raids/NPC/Event/MF/Wall/Lick/" + _doorGreeter.hairColor + "/" + _rand + ".png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <</replace>> <</button>> <div id="action"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <div class="text-box"> <<You>>Do you like it being bent over like that?<</You>> <<if _doorGreeter.corruption < 50>> <<say '_doorGreeter.name' _charImg>>I'm ready<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>Give it to me master, take me<</say>> <</if>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/3.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <br><br> You press your cock up to her wet mound and stop <<if _doorGreeter.corruption < 50>> <<You>>Beg<</You>> <<say '_doorGreeter.name' _charImg>>Please... I need to be fucked!<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>I want you to break me<</say>> <<Thoughts>>I already have<</Thoughts>> <</if>> Your cock presses into her tight hole and she moans, pushing deeper you burry your sword to the hilt, pressing your hips against her ass as she lets out a wimper. You keep her locked in place, gripping her hips as you draw back and thrust into her again. She lets out a yelp and you pick up the pace<br><br> <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Raids/NPC/Event/MF/Table/Red/4.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> _doorGreeter.name lets out a loud moan as she cums and you feel her tight walls pulse with pleasure. You continue hammering her from behind as she lets out another moan. <br> <span id="button1"><<button "Cum inside">><<replace "#button2">><</replace>> <<replace "#inside">> The feeling on her tight walls plusing against you is too much to bare and you release, spilling into her. Thrusting deep, you burry your cock in her can fill her with your seed. <br> You both hold, catching your breaths and both enjoying the feeling of your cock throbbing and her pussy pulsing in pleasure. <br> After a moment you step back and admire your work<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum2.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <<say '_doorGreeter.name' _charImg>>Th-Thankyou<</say>> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>></span> <div id="inside"></div> <br> <span id="button2"><<button "Cum outside">><<replace "#button1">><</replace>> <<replace "#outside">> Feeling your own pleasure built to a climax you pull back and paint her with your seed.<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> Stepping away, you admire the mess. _doorGreeter.name stays still, breating hard, a mess of cum and sweat over her skin. You leave her bent over the table, and wonder if she will recover before someone comes to the home<br><br> <div id="inside"></div> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>></span> <div id="outside"></div> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Raids/NPC/Event/MF/Table/Red/4.png", "Images/Raids/NPC/Event/MF/Table/Red/5.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <div class="text-box"> <<You>>Do you like it being bent over like that?<</You>> <<if _doorGreeter.corruption < 50>> <<say '_doorGreeter.name' _charImg>>I'm ready<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>Give it to me master, take me<</say>> <</if>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/3.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <br><br> You press your cock up to her wet mound and stop <<if _doorGreeter.corruption < 50>> <<You>>Beg<</You>> <<say '_doorGreeter.name' _charImg>>Please... I need to be fucked!<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>I want you to break me<</say>> <<Thoughts>>I already have<</Thoughts>> <</if>> Your cock presses into her tight hole and she moans, pushing deeper you burry your sword to the hilt, pressing your hips against her ass as she lets out a wimper. You keep her locked in place, gripping her hips as you draw back and thrust into her again. She lets out a yelp and you pick up the pace<br><br> <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Raids/NPC/Event/MF/Table/Brown/4.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> _doorGreeter.name lets out a loud moan as she cums and you feel her tight walls pulse with pleasure. You continue hammering her from behind as she lets out another moan <br> <<button "Cum inside">> <<replace "#inside">> The feeling on her tight walls plusing against you is too much to bare and you release, spilling into her. Thrusting deep, you burry your cock in her can fill her with your seed. <br> You both hold, catching your breaths and both enjoying the feeling of your cock throbbing and her pussy pulsing in pleasure. <br> After a moment you step back and admire your work<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum2.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <<say '_doorGreeter.name' _charImg>>Th-Thankyou<</say>> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>> <div id="inside"></div> <br> <<button "Cum outside">> <<replace "#outside">> Feeling your own pleasure built to a climax you pull back and paint her with your seed.<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> Stepping away, you admire the mess. _doorGreeter.name stays still, breating hard, a mess of cum and sweat over her skin. You leave her bent over the table, and wonder if she will recover before someone comes to the home<br><br> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>> <div id="outside"></div> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Raids/NPC/Event/MF/Table/Brown/4.png", "Images/Raids/NPC/Event/MF/Table/Brown/5.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <div class="text-box"> <<You>>Do you like it being bent over like that?<</You>> <<if _doorGreeter.corruption < 50>> <<say '_doorGreeter.name' _charImg>>I'm ready<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>Give it to me master, take me<</say>> <</if>> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/3.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <br><br> You press your cock up to her wet mound and stop <<if _doorGreeter.corruption < 50>> <<You>>Beg<</You>> <<say '_doorGreeter.name' _charImg>>Please... I need to be fucked!<</say>> <<else>> <<say '_doorGreeter.name' _charImg>>I want you to break me<</say>> <<Thoughts>>I already have<</Thoughts>> <</if>> Your cock presses into her tight hole and she moans, pushing deeper you burry your sword to the hilt, pressing your hips against her ass as she lets out a wimper. You keep her locked in place, gripping her hips as you draw back and thrust into her again. She lets out a yelp and you pick up the pace<br><br> <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Raids/NPC/Event/MF/Table/Blonde/4.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> _doorGreeter.name lets out a loud moan as she cums and you feel her tight walls pulse with pleasure. You continue hammering her from behind as she lets out another moan. <br> <<button "Cum inside">> <<replace "#inside">> The feeling on her tight walls plusing against you is too much to bare and you release, spilling into her. Thrusting deep, you burry your cock in her can fill her with your seed. <br> You both hold, catching your breaths and both enjoying the feeling of your cock throbbing and her pussy pulsing in pleasure. <br> After a moment you step back and admire your work<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum2.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> <<say '_doorGreeter.name' _charImg>>Th-Thankyou<</say>> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>> <div id="inside"></div> <br> <<button "Cum outside">> <<replace "#outside">> Feeling your own pleasure built to a climax you pull back and paint her with your seed.<br><br> <<set _img to "Images/Raids/NPC/Event/MF/Table/" + _doorGreeter.hairColor + "/Cum.png">> <div class="Random-image"> <img @src="_img" alt="Guest Image"> </div> Stepping away, you admire the mess. _doorGreeter.name stays still, breating hard, a mess of cum and sweat over her skin. You leave her bent over the table, and wonder if she will recover before someone comes to the home<br><br> <<button "Leave">> <<goto "SettlementVisit">> <</button>> <</replace>> <</button>> <div id="outside"></div> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Raids/NPC/Event/MF/Table/Blonde/4.png", "Images/Raids/NPC/Event/MF/Table/Blonde/5.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <<set _villager1 = _residentsAtHome[0]>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager1.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<if _villager2.hairColor>><<else>><<set _villager2.hairColor to "Brown">><</if>> <<if _villager1.sex is "Female">><<set _woman to _villager1>><<else>> <<set _woman to _villager2>><</if>> <<set _positions to ["CG", "BJ"]>> <<set _rand to random(0, 1)>> <<set _position to _positions[_rand]>> <<set _int to random(1, 3)>> <<set _img to "Images/Raids/NPC/Event/FM/" + _woman.hairColor + "/" + _position + "/" + _int + ".png">> <div class="text-box"> <div class="Random-image"> <<if $greeterImage>> <img @src="_img" alt="Guest Image"> <<else>> <img src="Images/Icons/Person.png" alt="Default Image"> <</if>> </div> <br><br> <<button "Move away">> <<goto "SettlementVisit">> <</button>> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _residentsAtHome.length is 1>> <<if _doorGreeter.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<set _rand to random(1, 3)>> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Blonde/" + _rand + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Red/" + _rand + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Brown/" + _rand + ".png">> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <</if>> <<if _residentsAtHome.length is 2>> <<set _villager1 = _residentsAtHome[0]>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager1.sex is "Female" and _villager2.sex is "Female">> <<set _rand to random(1, 3)>> <<if _villager1.hairColor is "Red" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-R/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/R-R/1.webp">> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM//BL-BL/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BL/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BL-BL/1.webp">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BR-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BR-BR/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BR-BR/1.webp">> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BL-BL/1.webp">> <<elseif _villager1.hairColor is "Blonde" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BL-BR/1.webp">> <<elseif _villager1.hairColor is "Red" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BL-R/1.webp">> <<elseif _villager1.hairColor is "Red" and _villager2.hairColor is "Brown">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/R-BR/1.webp">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/R-BR/1.webp">> <<elseif _villager1.hairColor is "Brown" and _villager2.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumShare.png">> <<set _vidPath to "Images/Raids/NPC/Event/FFM/BL-BR/1.webp">> <</if>> <</if>> <</if>> <div class="text-box"> <<if _residentsAtHome.length is 2>> <<if _villager1.corruption >= _villager2.corruption>> <<set _dom to _villager1>> <<set _sub to _villager2>> <<else>> <<set _dom to _villager2>> <<set _sub to _villager1>> <</if>> <<if _dom.ImgNumber < 15>><<set _dom.ImgNumber to _dom.ImgNumber + 15>><</if>> <<if _sub.ImgNumber < 15>><<set _sub.ImgNumber to _sub.ImgNumber + 15>><</if>> <<if _dom.name is _villager1.name>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<else>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <</if>> The two woman take turns sucking you <<say '_dom.name' _domImg>>Swallow his cock _sub.name<</say>> <<say '_sub.name' _subImg>>Uph!<</say>> <</if>> <div class="Random-image"> <img @src="$greeterImage" alt="Guest Image"> </div> <<print '<img src="' + _vidPath + '" alt="animation" style="max-width:100vw; max-height:100vh; width:auto; height:auto; display:block; margin:10px auto;">'>> <br><br> Eventually you cum and leave them to their fun <div class="Random-image"> <img @src="_finishImg" alt="Guest Image"> </div> <<button "Leave them to their fun">> <<goto "SettlementVisit">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _residentsAtHome.length is 1>> <<if _doorGreeter.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<set _rand to random(1, 3)>> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Blonde/" + _rand + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Red/" + _rand + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Brown/" + _rand + ".png">> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <</if>> <<set _villager1 = _residentsAtHome[0]>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager1.corruption >= _villager2.corruption>> <<set _dom to _villager1>> <<set _sub to _villager2>> <<else>> <<set _dom to _villager2>> <<set _sub to _villager1>> <</if>> <<if _residentsAtHome.length is 2>> <<if _dom.hairColor is "Red" and _sub.hairColor is "Red">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-R/Cum.png">> <<elseif _dom.hairColor is "Blonde" and _sub.hairColor is "Blonde">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM//BL-BL/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BL/Cum.png">> <<elseif _dom.hairColor is "Brown" and _sub.hairColor is "Brown">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BR-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BR-BR/Cum.png">> <<elseif _dom.hairColor is "Blonde" and _sub.hairColor is "Red">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumBL.png">> <<elseif _dom.hairColor is "Blonde" and _sub.hairColor is "Brown">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumBL.png">> <<elseif _dom.hairColor is "Red" and _sub.hairColor is "Blonde">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumR.png">> <<elseif _dom.hairColor is "Red" and _sub.hairColor is "Brown">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumR.png">> <<elseif _dom.hairColor is "Brown" and _sub.hairColor is "Red">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumBR.png">> <<elseif _dom.hairColor is "Brown" and _sub.hairColor is "Blonde">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumBR.png">> <</if>> <</if>> _dom.name | _villager1.name<br> _sub.name | _sub.name<br> _dom.ImgNumber<br> _dom.hairColor<br> <div class="text-box"> <<if _residentsAtHome.length is 2>> <<if _dom.ImgNumber < 15>><<set _dom.ImgNumber to _dom.ImgNumber + 15>><</if>> <<if _sub.ImgNumber < 15>><<set _sub.ImgNumber to _sub.ImgNumber + 15>><</if>> <<if _dom.name is _villager1.name>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<else>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <</if>> <<say '_dom.name' _domImg>>Umm, you should try this _sub.name<</say>> _sub.name watches in awe and lust as _dom.name rides your cock <<say '_dom.name' _domImg>>I want your cum all over my body...<</say>> <</if>> <div class="Random-image"> <img @src="$greeterImage" alt="Guest Image"> </div> <br><br> She picks up the pace and you soon oblige her, pulling out and shooting thick ropes onto her face, chest and stomach <div class="Random-image"> <img @src="_finishImg" alt="Guest Image"> </div> <<say '_sub.name' _subImg>>Gods!<</say>> _sub.name dives on _dom.name eager to join the pleasure <<say '_dom.name' _domImg>>Good girl, now clean me and we can go again<</say>> <<button "Leave them to their fun">> <<goto "SettlementVisit">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <!-- Find the greeter using the ID that was passed from the previous page --> <<set _doorGreeter to null>> <<if $GreeterID>> <<for _resident range _building>> <<set _residentID to _resident.NPCID || _resident.prisonerId>> <<if _residentID === $GreeterID>> <<set _doorGreeter to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _residentsAtHome.length is 1>> <<if _doorGreeter.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<set _rand to random(1, 3)>> <<if _doorGreeter.hairColor is "Blonde">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Blonde/" + _rand + ".png">> <<elseif _doorGreeter.hairColor is "Red">> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Red/" + _rand + ".png">> <<else>> <<set $greeterImage to "Images/Raids/NPC/Event/Solo/Brown/" + _rand + ".png">> <</if>> <<if _doorGreeter.hairColor is "Brown">> <<set _charImg to "Images/Raids/NPC/Female/Nude/" + _doorGreeter.ImgNumber + ".png">> <<else>> <<set _charInt to _doorGreeter.ImgNumber + 15>> <<set _charImg to "Images/Raids/NPC/Female/" + _doorGreeter.hairColor + "/Nude/" + _charInt + ".png">> <</if>> <</if>> <<set _villager1 = _residentsAtHome[0]>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager1.corruption >= _villager2.corruption>> <<set _dom to _villager1>> <<set _sub to _villager2>> <<else>> <<set _dom to _villager2>> <<set _sub to _villager1>> <</if>> <<if _residentsAtHome.length is 2>> <<if _sub.hairColor is "Red" and _dom.hairColor is "Red">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-R/Cum.png">> <<elseif _sub.hairColor is "Blonde" and _dom.hairColor is "Blonde">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM//BL-BL/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BL/Cum.png">> <<elseif _sub.hairColor is "Brown" and _dom.hairColor is "Brown">> <<set _rand to random(5, 6)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BR-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BR-BR/Cum.png">> <<elseif _sub.hairColor is "Blonde" and _dom.hairColor is "Red">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumBL.png">> <<elseif _sub.hairColor is "Blonde" and _dom.hairColor is "Brown">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumBL.png">> <<elseif _sub.hairColor is "Red" and _dom.hairColor is "Blonde">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-R/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-R/CumR.png">> <<elseif _sub.hairColor is "Red" and _dom.hairColor is "Brown">> <<set _rand to random(4, 5)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumR.png">> <<elseif _sub.hairColor is "Brown" and _dom.hairColor is "Red">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/R-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/R-BR/CumBR.png">> <<elseif _sub.hairColor is "Brown" and _dom.hairColor is "Blonde">> <<set _rand to random(6, 7)>> <<set $greeterImage to "Images/Raids/NPC/Event/FFM/BL-BR/" + _rand +".png">> <<set _finishImg to "Images/Raids/NPC/Event/FFM/BL-BR/CumBR.png">> <</if>> <</if>> <div class="text-box"> <<if _residentsAtHome.length is 2>> <<if _dom.ImgNumber < 15>><<set _dom.ImgNumber to _dom.ImgNumber + 15>><</if>> <<if _sub.ImgNumber < 15>><<set _sub.ImgNumber to _sub.ImgNumber + 15>><</if>> <<if _dom.name is _villager1.name>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<else>> <<if _dom.hairColor is "Brown">> <<set _domImg to "Images/Raids/NPC/Female/Nude/" + _villager2.ImgNumber + ".png">> <<else>> <<set _domImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager2.ImgNumber + ".png">> <</if>> <<if _sub.hairColor is "Brown">> <<set _subImg to "Images/Raids/NPC/Female/Nude/" + _villager1.ImgNumber + ".png">> <<else>> <<set _subImg to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Nude/" + _villager1.ImgNumber + ".png">> <</if>> <</if>> <</if>> You pull _sub.name down onto your cock and she lets out a cry <<say '_sub.name' _subImg>>Oh... Fuck!<</say>> <div class="Random-image"> <img @src="$greeterImage" alt="Guest Image"> </div> <br><br> <<say '_dom.name' _domImg>>Umm, does that feel good?<</say>> <<say '_sub.name' _subImg>>Yes, Yes! FUCK!!<</say>> She clentches and then pulses around your cock as she cums <<say '_dom.name' _domImg>>I want our lord to make a mess of you, mark you as his<</say>> While you don't like the fact _dom.name believes shes in control... It does sound fun so you pull out and shoot thick ropes onto her face, chest and stomach <div class="Random-image"> <img @src="_finishImg" alt="Guest Image"> </div> <<button "Leave them to their fun">> <<goto "SettlementVisit">> <</button>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff>> <<set _cultStaff to _settlement.buildings.cult.staff>> <</if>> <<set _visitor to null>> <<if _settlement.buildings.cult.currentVisitor>> <<set _visitor to _settlement.buildings.cult.currentVisitor>> <</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/" + _rand + ".png">> <<set _demon to _cultStaff[0]>> <<if $Position is "Start">> <<set $NPCCum to 30>> <<set $PlayerCum to 0>> She leads you to a small side room, entering you see _visitor.name || _visitor.job layed out on the bed, bound and blindfolded. Hearing the door open she grins, clearing finding a lot of excitment from her vultability...<br><br> _demon.name leans in close and wispers in your ear <<say '_demon.name' _demon.ImagePath>>I've been teasing her for hours now... Would you like to finish her corruption for today? Or leave her to me?<</say>> <<You>>Leave us<</You>> Both the demon _demon.name and _visitor.name smile, as demon.name exits the room and locks the door<br><br> Wordlessly you look at at her, thinking about what you do. Pleasing her may boose her corruption... But, on the other hand _demon.name can handle that so maybe she can just be your toy for a while<br><br> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to $CharImg>> <</if>> <<if $Position is "Wax">> You pause, dragging out the moment and letting her anticipation build _visitor.name layed on the bed, breathing slowly and clearly aching for more stimulation. Silently, you reach for a candle, one of the many burining if your loyal demons sanctum and hold it over _visitor.name unexpecting form.<br><br> Slowly, you tilt the candle to one side and the hot red wax drips onto her, landing on her ass and cooling in moments. She lets out a yelp, caught by suprise due to her lack of vision. A second drop falls running down her left cheek before turning opaque. She yeps again, but this time its followed by a moan. You continue letting more of the hot wax land on her, each time she twiches but doesn't ask you to stop.<br><br> After coating her ass with a satifying amount of wax, you move to her back, as the red liquid drips she moans louder and digs her nails into the bed. You respond my moving your free hand to her womanhood and probing her gently. Another drop lands and she arches her back, you take the opportunity and work two fingers into her, mixing the sharpness of the hot wax landing on her flesh with the teasing feeling of your exploring digits.<br><br> Eventually you grow tired of this and peel the red hardend wax off her<br><br> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/Wax/" + _rand + ".png">> <<set $NPCCum to $NPCCum + 5>> <</if>> <<if $Position is "TF">> You roll _visitor.name onto her back with little grace with her arms being bound. She flops onto her back breasts jiggeling for a moment. You then grab her ankles and swing her around so her head is at the bottom of the bed <<say '_visitor.name' $CharImg>>What are yo-<</say>> _visitor.name is cut off as your cock enters her mouth, she responds by wrapping her lips around you and sucking you in as your cock passes her teeth. Then along her touge, making her moan till the heat of your cock hits her throat. You push deeper sending your manhood into tight throat, only stopping when your balls touch her nose.<br><br> After a moment, you draw back letting her breath before pushing your cock back down her throat over and over. You see her strain against her bonds, trying in vain to pleasure herself as you slam your cock into her. You enjoy watching her squerm trying scrach the itch you and your demon have built inside her. You enjoy denying her, for now. Holding her breats as you pound her throat, denying her of air and release and you focuse on your own pleasure<br><br> After a few moments you pull away. _visitor.name gasps for air but keeps her mouth wide open, inviting you to use her throat more. Her face is a mess of spit, dripping down her face and onto her blindfold. Waing to take a moment to maintain your stamina, you place yourself over her face, allowing your balls to fall on her hungry lips as she licks and sucks at them <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/TF/" + _rand + ".png">> <<set $PlayerCum to $PlayerCum + 10>> <</if>> <<if $Position is "Anal">> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/Anal/" + _rand + ".png">> <<set $PlayerCum to $PlayerCum + 15>> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "BH">> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/BH/" + _rand + ".png">> <<set $PlayerCum to $PlayerCum + 10>> <<set $NPCCum to $NPCCum + 15>> <</if>> <<if $Position is "Spank">> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/Spank/" + _rand + ".png">> <<set $NPCCum to $NPCCum + 10>> <</if>> <<if $Position is "Finger">> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/Finger/" + _rand + ".png">> <<set $NPCCum to $NPCCum + 15>> <</if>> <div class="Random-image"> <img @src="_charImg" alt="Guest Image"> </div> <<if $NPCCum >= 100>> <<set _rand to random(1, 2)>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/FCum/" + _rand + ".png">> <br><br>She orgasms...<br><br> <div class="Random-image"> <img @src="_charImg" alt="Guest Image"> </div> <<set $NPCCum to 0>> <</if>> <<if $PlayerCum >= 100>> <<if _visitor.hairColor>><<else>><<set _visitor.hairColor to "Brown">><</if>> <<set _charImg to "Images/Raids/Building/Cult/CorruptionF/" + _visitor.hairColor + "/Finish/" + _rand + ".png">> <br><br>You cum...<br><br> <div class="Random-image"> <img @src="_charImg" alt="Guest Image"> </div> <</if>> Her Orgasm:<br> <progress @value=" $NPCCum" max="100"></progress> Your Orgasm: <br> <progress @value=" $PlayerCum" max="100"></progress> </div> <div class="text-box flex-buttons"> <<if $PlayerCum lt 100>> <<button "Spank her">> <<set $Position to "Spank">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<button "Finger her">> <<set $Position to "Finger">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<button "Fuck her">> <<set $Position to "BH">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<button "Fuck her ass">> <<set $Position to "Anal">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<button "Fuck her mouth">> <<set $Position to "TF">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<button "Use candle wax">> <<set $Position to "Wax">> <<goto "Settlment_CultCorruptionMenu">> <</button>> <<else>> <<button "Leave her">> <<goto "SettlementVisit">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <<set $SettlementLocation to "Inside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $selectedBuilding to $clickedBuilding>> <<set _building to _settlement.populatedBuildings[$selectedBuilding]>> <<set _int to random(1, 3)>> <<set $BackgroundPath to "Images/Raids/Building/House/" + _int + ".png">> <<set $selectedNPC to null>> <<set _residentsAtHome to []>> <<set _residentsAtHome to []>> <<set _isWorkTime = (typeof $Time !== 'undefined' && $Time >= 2 && $Time <= 6)>> <<for _resident range _building>> <<set _residentAtWork to false>> /* Check if resident is assigned to any building staff */ <<if _isWorkTime && _settlement.buildings>> <<set _residentId to _resident.NPCID || _resident.prisonerId>> <<for _bldgKey, _bldgData range _settlement.buildings>> <<if _bldgData.staff && _bldgData.staff.length > 0>> <<for _staffMember range _bldgData.staff>> <<set _staffId to _staffMember.NPCID || _staffMember.prisonerId>> <<if _staffId === _residentId>> <<set _residentAtWork to true>> <<break>> <</if>> <</for>> <</if>> <<if _residentAtWork>><<break>><</if>> <</for>> <</if>> /* Add to home list if not at work */ <<if !_residentAtWork>> <<run _residentsAtHome.push(_resident)>> <</if>> <</for>> <<if _residentsAtHome.length >= 1>> <<set _villager1 = _residentsAtHome[0]>> <<if _villager1.sex is "Male">> <<set _charImg to "Images/Raids/NPC/Male/Inside/" + _villager1.ImgNumber + ".png">> <<else>> <<if _villager1.hairColor>><<else>><<set _villager1.hairColor to "Brown">><</if>> <<if _villager1.hairColor is "Brown">> <<set _charImg to "Images/Raids/NPC/Female/Inside/" + _villager1.ImgNumber + ".png">> <<else>> <<set _charImg to "Images/Raids/NPC/Female/" + _villager1.hairColor + "/Inside/" + _villager1.ImgNumber + ".png">> <</if>> <</if>> <</if>> <<if _residentsAtHome.length >= 2>> <<set _villager2 = _residentsAtHome[1]>> <<if _villager2.sex is "Male">> <<set _charImg2 to "Images/Raids/NPC/Male/Inside/" + _villager2.ImgNumber + ".png">> <<else>> <<if _villager2.hairColor>><<else>><<set _villager2.hairColor to "Brown">><</if>> <<if _villager2.hairColor is "Brown">> <<set _charImg2 to "Images/Raids/NPC/Female/Inside/" + _villager2.ImgNumber + ".png">> <<else>> <<set _charImg2 to "Images/Raids/NPC/Female/" + _villager2.hairColor + "/Inside/" + _villager2.ImgNumber + ".png">> <</if>> <</if>> <</if>> <<if _residentsAtHome.length is 3>> <<set _villager3 = _residentsAtHome[2]>> <<if _villager3.sex is "Male">> <<set _charImg3 to "Images/Raids/NPC/Male/Inside/" + _villager3.ImgNumber + ".png">> <<else>> <<if _villager3.hairColor>><<else>><<set _villager3.hairColor to "Brown">><</if>> <<if _villager3.hairColor is "Brown">> <<set _charImg3 to "Images/Raids/NPC/Female/Inside/" + _villager3.ImgNumber + ".png">> <<else>> <<set _charImg3 to "Images/Raids/NPC/Female/" + _villager3.hairColor + "/Inside/" + _villager3.ImgNumber + ".png">> <</if>> <</if>> <</if>> <div class="text-box"> <<if _residentsAtHome.length is 1>> _villager1.name is the only person home<br><br> <div class="Random-image"> <img @src="_charImg" alt="Guest Image"> </div> <</if>> <<if _residentsAtHome.length is 2>> _villager1.name and _villager2.name are home<br><br> <div class="image-container"> <div class="image-wrapper"> <img @src=_charImg alt="First Image"> <br> </div> <div class="image-wrapper"> <img @src=_charImg2 alt="Second Image"> <br> </div> </div> <</if>> </div> <<run jQuery(document.body).attr('style', 'background-image: url("' + $BackgroundPath + '");' + 'background-size: cover;' + 'background-position: center;' + 'background-repeat: no-repeat;' + 'background-attachment: fixed;' + 'min-height: 100vh;' )>> <</nobr>>
<<nobr>> <<set _Int = random(1, 6)>> <<set _banditImg to "Images/Forrest/Encounters/Human/Male/Bandit/" + _Int + ".png">> <div class="text-box"> <p>As you inspect your farm, a group of rough-looking bandits emerge from the tree line. Their leader steps forward with a menacing grin</p> <<say 'Bandit' _banditImg>>Nice farm you got here... would be a shame if something happened to it. We've been watching this place, and we think it's time you paid for our 'protection services'.<</say>> <p>He gestures to your fields</p> <<say 'Bandit' _banditImg>>Pay us regularly, or give us back one of our brothers or sisters you're holding prisoner, and we'll make sure no 'accidents' happen to your crops or workers. Otherwise...<</say>> <p>He lets the threat hang in the air.</p> <<say 'Bandit' _banditImg>>You can find us at our camp in the forest. Think it over carefully.<</say>> <br> <<button "Visit the Bandit Camp">> <<goto "FarmBanditCamp">> <</button>> <<button "Return to the Farm">> <<goto "Oakshade Farm">> <</button>> <<button "Return to the Forest">> <<set $ForestLocation to "Images/Forrest/Maps/BanditCamp.jpg">> <<goto "ForestExplore">> <</button>> </div> <</nobr>>
<<nobr>> <<set _Int = random(1, 6)>> <<set _banditImg to "Images/Forrest/Encounters/Human/Male/Bandit/" + _Int + ".png">> <<if !$FarmProtectionDaysRemaining>> <<set $FarmProtectionDaysRemaining to 0>> <</if>> <div class="text-box"> <h1>Bandit Camp</h1> <p>You arrive at the bandit camp hidden deep in the forest. The leader approaches you with a calculating smile.</p> <<if $FarmProtectionDaysRemaining > 0>> <h2 style="color: green;">Farm Protection Active</h2> <<say 'Bandit' _banditImg>>Your farm is safe for now. We won't bother your workers or crops for another $FarmProtectionDaysRemaining days.<</say>> <<else>> <h2 style="color: red;">No Protection</h2> <<say 'Bandit' _banditImg>>Your protection has expired. Your farm is vulnerable. Make a deal with us, or face the consequences.<</say>> <</if>> <hr> <h2>Protection Options</h2> </div> <div class="text-box"> <h3>Pay Gold</h3> <p>Pay 10 gold for 1 day of protection</p> <<if $Gold >= 10>> <<button "Pay 10 Gold (1 Day Protection)">> <<set $Gold -= 10>> <<set $FarmProtectionDaysRemaining += 1>> <<goto "FarmBanditCamp">> <</button>> <<else>> <p style="color: red;">You don't have enough gold.</p> <</if>> <br><br> <<if $Gold >= 50>> <<button "Pay 50 Gold (5 Days Protection)">> <<set $Gold -= 50>> <<set $FarmProtectionDaysRemaining += 5>> <<goto "FarmBanditCamp">> <</button>> <br><br> <</if>> <<if $Gold >= 100>> <<button "Pay 100 Gold (10 Days Protection)">> <<set $Gold -= 100>> <<set $FarmProtectionDaysRemaining += 10>> <<goto "FarmBanditCamp">> <</button>> <</if>> </div> <div class="text-box"> <h3>Release a Prisoner</h3> <p>Return one of their captured comrades for 7 days of protection</p> <<if $DungonOccupance && $DungonOccupance.length > 0>> <div id="prisoner-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px;"> <<for _i to 0; _i < $DungonOccupance.length; _i++>> <<capture _prisoner>> <<set _prisoner to $DungonOccupance[_i]>> <div style="text-align: center; margin: 10px; width: 250px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <<if _prisoner.specialization>> <p><<print _prisoner.specialization>></p> <</if>> <<button "Release for 7 Days Protection">> <<run $DungonOccupance.delete(_prisoner)>> <<set $FarmProtectionDaysRemaining += 7>> <<script>> UI.alert("The bandits are pleased. They take their comrade and promise not to attack your farm for 7 days."); <</script>> <<goto "FarmBanditCamp">> <</button>> </div> <</capture>> <</for>> </div> <<else>> <p style="color: gray;">You have no prisoners to release.</p> <</if>> </div> <div class="text-box" style="text-align: center;"> <<button "Leave the Camp">> <<set $ForestLocation to "Images/Forrest/Maps/BanditCamp.jpg">> <<goto "ForestExplore">> <</button>> <<button "Return to the Farm">> <<goto "Oakshade Farm">> <</button>> </div> <</nobr>>
<<nobr>> <<if ($FramGrainPlanted is true) and ($FarmGrainGroth >= 7)>> <h2>The farm grain is ready to be havested</h2> <<if $FarmingTeam.length === 0>> <h3>There is no one working at the farm, sent staff or farm the land yourself</h3> <<else>> <!-- Auto-harvest with farmers --> <<set _totalSkill to 0>> <<for _i to 0; _i < $FarmingTeam.length; _i++>> <<set _totalSkill += $FarmingTeam[_i].skill>> <</for>> <<set _averageSkill to _totalSkill / $FarmingTeam.length>> <!-- Determine yield multiplier based on average skill --> <<if _averageSkill < 33>> <<set _minMultiplier to 1>> <<set _maxMultiplier to 2>> <<elseif _averageSkill < 66>> <<set _minMultiplier to 2>> <<set _maxMultiplier to 2>> <<else>> <<set _minMultiplier to 2>> <<set _maxMultiplier to 3>> <</if>> <!-- Calculate yield --> <<set _multiplier to random(_minMultiplier, _maxMultiplier)>> <<set _yeald to $FarmPlandedGrain * _multiplier>> <!-- Add to appropriate resource --> <<if $FarmHasMill is true>> <<if $Food>> <<set $Food to $Food + _yeald>> <<else>> <<set $Food to _yeald>> <</if>> <p>Your farmers harvested <<print _yeald>> Food!</p> <<else>> <<if $Grain>> <<set $Grain to $Grain + _yeald>> <<else>> <<set $Grain to _yeald>> <</if>> <p>Your farmers harvested <<print _yeald>> Grain!</p> <</if>> <!-- Increase farmer skills --> <<for _i to 0; _i < $FarmingTeam.length; _i++>> <<if $FarmingTeam[_i].skill < 100>> <<set $FarmingTeam[_i].skill += 20>> <<if $FarmingTeam[_i].skill > 100>> <<set $FarmingTeam[_i].skill to 100>> <</if>> <</if>> <</for>> <!-- Reset farm --> <<set $FramGrainPlanted to false>> <<set $FarmPlandedGrain to 0>> <<set $FarmGrainGroth to 0>> <!-- Auto-replant if enabled --> <<if $AutoFarmGrain is true and $Grain gt 0>> <<if $Grain gt $FarmGrainCapacity>> <<set $FarmPlandedGrain to $FarmGrainCapacity>> <<set $Grain to $Grain - $FarmGrainCapacity>> <<else>> <<set $FarmPlandedGrain to $Grain>> <<set $Grain to 0>> <</if>> <<set $FramGrainPlanted to true>> <<set $FarmGrainGroth to 0>> <p>Your farmers have planted <<print $FarmPlandedGrain>> grain for the next harvest!</p> <</if>> <</if>> <</if>> <</nobr>>
<<nobr>> /* Farm Bandit Raid System - Triggered when protection expires */ <<if $FarmProtectionDaysRemaining !== undefined && $FarmProtectionDaysRemaining <= 0 && $FarmingTeamUnlocked is true>> /* Calculate attack chance based on Notoriety (0 = 10%, 5 = 60%) */ <<if !$Notoriaty>> <<set $Notoriaty to 0>> <</if>> <<set _attackChance to 10 + ($Notoriaty * 10)>> <<if random(1, 100) <= _attackChance>> <<set _banditsAttacking = []>> <<set _farmDefenders = []>> <<set _farmCombatLog = []>> /* Determine number of attacking bandits (2-5) */ <<set _banditCount to random(2, 5)>> /* Generate attacking bandits */ <<for _i = 0; _i < _banditCount; _i++>> <<run _banditsAttacking.push({ name: "Bandit " + (_i + 1), health: random(60, 80), weapon: "Sword", damage: random(15, 25) })>> <</for>> /* Setup farm guard defenders */. <<if $FarmingGuards && $FarmingGuards.length > 0>> <<for _guard range $FarmingGuards>> <<set _baseDamage to 25>> <<set _armorBonus to 0>> <<set _specializationBonus to 0>> /* Sword bonus - more damage */ <<if _guard.weapon === "Sword">> <<set _baseDamage to 35>> <</if>> /* Armor bonus - more health/defense */ <<if _guard.armor === "Armored">> <<set _armorBonus to 25>> <</if>> /* Defense specialization bonus */ <<if _guard.specialization === "Defense">> <<if _guard.skill >= 75>><<set _specializationBonus to 15>> <<elseif _guard.skill >= 50>><<set _specializationBonus to 10>> <<elseif _guard.skill >= 25>><<set _specializationBonus to 5>> <<else>><<set _specializationBonus to 2>><</if>> <</if>> /* Guard tower bonus */ <<set _towerBonus to $FarmHasGuardTower is true ? 10 : 0>> <<run _farmDefenders.push({ type: "Defender", name: _guard.name, health: _guard.health + _armorBonus, weapon: _guard.weapon, damage: _baseDamage + (_specializationBonus / 2) + _towerBonus, originalMember: _guard, startingHealth: _guard.health, defenseBonus: _specializationBonus + _towerBonus, armorBonus: _armorBonus })>> <</for>> <</if>> /* Initialize combat report */ <<set _farmRaidReport = { day: $Day, attackers: _banditCount, defenders: _farmDefenders.length, outcome: "pending", combatLog: [], farmersKidnapped: 0 }>> <<if !$DailyReports>> <<set $DailyReports to []>> <</if>> <<set _reportEntry = { day: $Day, events: [] }>> <<run _reportEntry.events.push(`⚔️ ALERT: ${_banditCount} bandits have attacked Oakshade Farm!`)>> /* Combat processing */ <<if _farmDefenders.length > 0>> <<for _round = 1; _farmDefenders.length > 0 && _banditsAttacking.length > 0; _round++>> <<set _currentBandit = _banditsAttacking[0]>> <<set _currentDefender = _farmDefenders[0]>> /* Bandit attacks */ <<set _banditDamage to _currentBandit.damage>> <<set _defenderMitigated to Math.floor(_currentDefender.defenseBonus / 2)>> <<set _actualDamage to Math.max(1, _banditDamage - _defenderMitigated)>> <<set _currentDefender.health -= _actualDamage>> <<set _combatMessage to `Round ${_round}: ${_currentBandit.name} hits ${_currentDefender.name} for ${_actualDamage} damage${_defenderMitigated > 0 ? ` (${_defenderMitigated} mitigated)` : ''}`>> <<run _farmRaidReport.combatLog.push(_combatMessage)>> /* Check defender death */ <<if _currentDefender.health <= 0>> <<run _farmRaidReport.combatLog.push(`${_currentDefender.name} has been killed!`)>> <<run _reportEntry.events.push(`${_currentDefender.name} was killed defending the farm!`)>> <<run $FarmingGuards = $FarmingGuards.filter(g => g !== _currentDefender.originalMember)>> <<run _farmDefenders.shift()>> <<else>> /* Defender counterattack */ <<set _currentBandit.health -= _currentDefender.damage>> <<run _farmRaidReport.combatLog.push(`${_currentDefender.name} counterattacks for ${_currentDefender.damage} damage`)>> /* Check bandit death */ <<if _currentBandit.health <= 0>> <<run _farmRaidReport.combatLog.push(`${_currentBandit.name} has been defeated!`)>> <<run _banditsAttacking.shift()>> <</if>> <</if>> <</for>> /* Update surviving guards' health */ <<for _defender range _farmDefenders>> <<set _defender.originalMember.health = Math.max(1, _defender.health - _defender.armorBonus)>> <<set _damageTaken to _defender.startingHealth - _defender.originalMember.health>> <<if _damageTaken > 0>> <<run _reportEntry.events.push(`${_defender.name} was injured (${_damageTaken} damage, health now ${_defender.originalMember.health})`)>> <</if>> <</for>> <</if>> /* Process raid results */ <<if _banditsAttacking.length > 0>> /* Bandits won or no defenders */ <<set _farmRaidReport.outcome = "farm overrun">> /* Calculate farmer kidnapping based on surviving guards */ <<set _survivingGuards to _farmDefenders.length>> <<set _kidnappingChance to 0>> <<if _survivingGuards === 0>> <<set _kidnappingChance to 75>> /* 75% chance per farmer */ <<elseif _survivingGuards === 1>> <<set _kidnappingChance to 40>> /* 40% chance per farmer */ <<elseif _survivingGuards === 2>> <<set _kidnappingChance to 20>> /* 20% chance per farmer */ <<else>> <<set _kidnappingChance to 5>> /* 5% chance per farmer */ <</if>> /* Check each farmer for kidnapping */ <<if $FarmingTeam && $FarmingTeam.length > 0>> <<set _farmersToRemove to []>> <<for _i to 0; _i < $FarmingTeam.length; _i++>> <<if random(1, 100) <= _kidnappingChance>> <<run _farmersToRemove.push($FarmingTeam[_i])>> <<run _reportEntry.events.push(`${$FarmingTeam[_i].name} was kidnapped by the bandits!`)>> <<set _farmRaidReport.farmersKidnapped += 1>> <</if>> <</for>> /* Remove kidnapped farmers */ <<for _farmer range _farmersToRemove>> <<run $FarmingTeam.delete(_farmer)>> <</for>> <</if>> <<run _reportEntry.events.push(`The bandits successfully raided the farm! ${_farmRaidReport.farmersKidnapped} farmers were kidnapped.`)>> <<else>> /* Guards won */ <<set _farmRaidReport.outcome = "attack repelled">> <<run _reportEntry.events.push(`Your guards successfully repelled the bandit attack on the farm!`)>> <</if>> /* Store combat report */ <<if !$farmRaidReports>> <<set $farmRaidReports to []>> <</if>> <<run $farmRaidReports.push(_farmRaidReport)>> /* Add to daily reports */ <<run $DailyReports.push(_reportEntry)>> <</if>> <</if>> <</nobr>>
<<nobr>> <div class="text-box" style="position: relative; text-align: center;"> <h2>Defence Overview</h2> <div style="position: relative; display: inline-block; max-width: 100%;"> <!-- Base Map Image --> <img src="Images/Seige/Map/1.png" style="width: 100%; max-width: 1024px; height: auto; display: block;"> <!-- Container for positioning elements relative to the image --> <div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"> <!-- Barracks Forces (Blue) --> <<if $BarraksOccupance && $BarraksOccupance.length > 0>> <div style="position: absolute; left: 61.04%; top: 3.91%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(0, 100, 255, 0.8); border: 3px solid #0050ff; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(0, 100, 255, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print $BarraksOccupance.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;">Barracks</span> </div> </div> <</if>> <!-- Vanguard Forces (Cyan) --> <<if $SeigeVanguardForce && $SeigeVanguardForce.length > 0>> <<if $VanguardRetreated is true>> <!-- If retreated, show in courtyard --> <<set _vanguardX to 30.84>> <<set _vanguardY to 29.04>> <<elseif $SeigeDistance <= 0>> <!-- At the gate, engaged --> <<set _vanguardX to 62.40>> <<set _vanguardY to 57.91>> <<else>> <!-- In pre-battle position --> <<set _vanguardX to 40.54>> <<set _vanguardY to 39.41>> <</if>> <<set _vanguardLabel to "Vanguard">> <<set _vanguardCommander to "">> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<if $SeigeVanguardForce[_i].name === "Lucy" || $SeigeVanguardForce[_i].name === "Alice">> <<set _vanguardCommander to $SeigeVanguardForce[_i].name>> <<break>> <</if>> <</for>> <<if _vanguardCommander !== "">> <<set _vanguardLabel to "Vanguard (" + _vanguardCommander + ")">> <</if>> <<if $VanguardRetreated is true>> <<set _vanguardLabel to _vanguardLabel + " (Retreated)">> <</if>> <div @style="'position: absolute; left: ' + _vanguardX + '%; top: ' + _vanguardY + '%; transform: translate(-50%, -50%);'"> <div style="background-color: rgba(0, 255, 255, 0.8); border: 3px solid #00cccc; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(0, 255, 255, 0.8);"> <span style="color: black; font-weight: bold; font-size: 20px;"><<print $SeigeVanguardForce.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print _vanguardLabel>></span> </div> </div> <</if>> <!-- Archers on Wall (Green) --> <<if $SeigeArcherForce && $SeigeArcherForce.length > 0>> <<if $ArchersRetreated is true>> <!-- Archers retreated to safety --> <<set _archerX to 7.13>> <!-- 73/1024 * 100 --> <<set _archerY to 6.64>> <!-- 68/1024 * 100 --> <<else>> <!-- Archers on wall --> <<set _archerX to 91.80>> <!-- 940/1024 * 100 --> <<set _archerY to 4.88>> <!-- 50/1024 * 100 --> <</if>> <<set _archerLabel to "Archers">> <<if $ArcherCommander && $ArcherCommander !== "none">> <<set _archerLabel to "Archers (" + $ArcherCommander + ")">> <</if>> <<if $ArchersRetreated is true>> <<set _archerLabel to _archerLabel + " (Retreated)">> <</if>> <div @style="'position: absolute; left: ' + _archerX + '%; top: ' + _archerY + '%; transform: translate(-50%, -50%);'"> <div style="background-color: rgba(0, 200, 0, 0.8); border: 3px solid #00aa00; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(0, 200, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print $SeigeArcherForce.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print _archerLabel>></span> </div> </div> <</if>> <!-- Courtyard Defenders (Orange) --> <<if $CourtyardDefenders && $CourtyardDefenders.length > 0>> <div style="position: absolute; left: 30.84%; top: 29.04%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 140, 0, 0.8); border: 3px solid #ff8c00; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 140, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print $CourtyardDefenders.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;">Courtyard</span> </div> </div> <</if>> <!-- Wall Defense Forces (Purple) --> <<if $SeigeWallForce && $SeigeWallForce.length > 0>> <<set _wallLabel to "Wall Defenders">> <<set _wallCommander to "">> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<if $SeigeWallForce[_i].name === "Lucy" || $SeigeWallForce[_i].name === "Alice">> <<set _wallCommander to $SeigeWallForce[_i].name>> <<break>> <</if>> <</for>> <<if _wallCommander !== "">> <<set _wallLabel to "Wall Defenders (" + _wallCommander + ")">> <</if>> <<if $SeigeWallForce.length > 1>> <!-- Split wall defenders into two groups --> <<set _wallGroup1 to Math.ceil($SeigeWallForce.length / 2)>> <<set _wallGroup2 to $SeigeWallForce.length - _wallGroup1>> <!-- First wall defender group --> <div style="position: absolute; left: 40.00%; top: 71.19%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(150, 0, 255, 0.8); border: 3px solid #9900ff; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(150, 0, 255, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _wallGroup1>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print _wallLabel>></span> </div> </div> <!-- Second wall defender group --> <div style="position: absolute; left: 77.50%; top: 25.79%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(150, 0, 255, 0.8); border: 3px solid #9900ff; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(150, 0, 255, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _wallGroup2>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;">Wall Defenders</span> </div> </div> <<else>> <!-- Single wall defender --> <div style="position: absolute; left: 40.00%; top: 71.19%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(150, 0, 255, 0.8); border: 3px solid #9900ff; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(150, 0, 255, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print $SeigeWallForce.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print _wallLabel>></span> </div> </div> <</if>> <</if>> <!-- Enemy Forces (Red) --> <<if $SiegeCombatants && $SiegeCombatants > 0>> <!-- Check if we're in wall battle mode --> <<if typeof $WallEnemies !== "undefined" && $WallEnemies !== null>> <!-- Wall battle: Show enemies on wall and at base --> <<set _enemiesOnWall to $WallEnemies.length || 0>> <<set _enemiesBelow to ($SiegeEnemiesClimbing || 0) + ($SiegeEnemiesAtBase || 0)>> <!-- Show enemies on the wall if any --> <<if _enemiesOnWall > 0>> <<if _enemiesOnWall > 1>> <!-- Split wall enemies into two groups --> <<set _wallEnemyGroup1 to Math.ceil(_enemiesOnWall / 2)>> <<set _wallEnemyGroup2 to _enemiesOnWall - _wallEnemyGroup1>> <!-- First enemy group on wall --> <div style="position: absolute; left: 43.50%; top: 66.65%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _wallEnemyGroup1>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (On Wall)</span> </div> </div> <!-- Second enemy group on wall --> <div style="position: absolute; left: 70.50%; top: 34.49%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _wallEnemyGroup2>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (On Wall)</span> </div> </div> <<else>> <!-- Single enemy on wall --> <div style="position: absolute; left: 43.50%; top: 66.65%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 37px; height: 37px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _enemiesOnWall>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (On Wall)</span> </div> </div> <</if>> <</if>> <!-- Show enemies at base if any --> <<if _enemiesBelow > 0>> <div style="position: absolute; left: 72.70%; top: 67.40%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print _enemiesBelow>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (Below)</span> </div> </div> <</if>> <<elseif $SeigeDistance <= 0>> <!-- Regular siege: If vanguard defeated or retreated and multiple enemies remain, show split positions --> <<if ($VanguardDefeated is true || $VanguardRetreated is true) && $SiegeCombatants > 1>> <!-- Split enemies into two groups --> <<set _enemyGroup1 to Math.ceil($SiegeCombatants / 2)>> <<set _enemyGroup2 to $SiegeCombatants - _enemyGroup1>> <!-- First enemy group at wall --> <div style="position: absolute; left: 44.70%; top: 79.89%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _enemyGroup1>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (Wall)</span> </div> </div> <!-- Second enemy group climbing --> <div style="position: absolute; left: 81.40%; top: 37.14%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print _enemyGroup2>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 10px; font-weight: bold;"><<print $SeigingFaction || "Enemy">> (Climbing)</span> </div> </div> <<else>> <!-- Single enemy group at the gate --> <<set _enemyX to 72.70>> <<set _enemyY to 67.40>> <div @style="'position: absolute; left: ' + _enemyX + '%; top: ' + _enemyY + '%; transform: translate(-50%, -50%);'"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print $SiegeCombatants>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print $SeigingFaction || "Enemy">></span> </div> </div> <</if>> <<else>> <!-- Starting position --> <<set _enemyX to 96.00>> <!-- 983/1024 * 100 - starting position --> <<set _enemyY to 85.00>> <!-- 870/1024 * 100 - starting position --> <div @style="'position: absolute; left: ' + _enemyX + '%; top: ' + _enemyY + '%; transform: translate(-50%, -50%);'"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print $SiegeCombatants>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print $SeigingFaction || "Enemy">></span> </div> </div> <</if>> <</if>> </div> </div> <!-- Legend --> <div style="margin-top: 15px; display: flex; justify-content: center; gap: 20px; flex-wrap: wrap;"> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(0, 100, 255, 0.8); border: 2px solid #0050ff; border-radius: 50%;"></div> <span style="font-size: 12px;">Barracks</span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(0, 255, 255, 0.8); border: 2px solid #00cccc; border-radius: 50%;"></div> <span style="font-size: 12px;">Vanguard</span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(0, 200, 0, 0.8); border: 2px solid #00aa00; border-radius: 50%;"></div> <span style="font-size: 12px;">Archers</span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(150, 0, 255, 0.8); border: 2px solid #9900ff; border-radius: 50%;"></div> <span style="font-size: 12px;">Wall Defenders</span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(255, 140, 0, 0.8); border: 2px solid #ff8c00; border-radius: 50%;"></div> <span style="font-size: 12px;">Courtyard</span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <div style="width: 20px; height: 20px; background-color: rgba(255, 0, 0, 0.8); border: 2px solid #cc0000; border-radius: 50%;"></div> <span style="font-size: 12px;">Enemy</span> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize forces if undefined --> <<if typeof $SeigeArcherForce === "undefined">><<set $SeigeArcherForce = []>><</if>> <<if typeof $SeigeWallForce === "undefined">><<set $SeigeWallForce = []>><</if>> <<if typeof $SeigeVanguardForce === "undefined">><<set $SeigeVanguardForce = []>><</if>> <<if typeof $BarraksOccupance === "undefined">><<set $BarraksOccupance = []>><</if>> <<if typeof $SiegeCaptives === "undefined">><<set $SiegeCaptives = []>><</if>> <<if typeof $DeadCourtyardDefenders === "undefined">><<set $DeadCourtyardDefenders = []>><</if>> <<if typeof $DeadArchers === "undefined">><<set $DeadArchers = []>><</if>> <<if typeof $SiegeKilledEnemies === "undefined">><<set $SiegeKilledEnemies = 0>><</if>> <<if typeof $LucyPower === "undefined">><<set $LucyPower = 20>><</if>> <<if typeof $AlicePower === "undefined">><<set $AlicePower = 25>><</if>> <div class="text-box"> <h1>Battle in the Courtyard</h1> <div class="battle-phase-alert"> <p>Your forces have regrouped in the courtyard for a desperate last stand!</p> </div> <!-- Initialize arrays if undefined --> <<if typeof $CourtyardDefenders === "undefined">> <<set $CourtyardDefenders = []>> <</if>> <<if typeof $CourtyardEnemies === "undefined">> <<set $CourtyardEnemies = []>> <</if>> <!-- Combine all forces into courtyard defenders on first load --> <<if $CourtyardDefenders.length === 0>> <!-- Add vanguard forces --> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<run $CourtyardDefenders.push($SeigeVanguardForce[_i])>> <</for>> <!-- Add wall defenders --> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<run $CourtyardDefenders.push($SeigeWallForce[_i])>> <</for>> <!-- Add barracks forces --> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<run $CourtyardDefenders.push($BarraksOccupance[_i])>> <</for>> <!-- Clear the source arrays --> <<set $SeigeVanguardForce = []>> <<set $SeigeWallForce = []>> <<set $BarraksOccupance = []>> <</if>> <!-- Initialize enemy array if needed --> <<if $CourtyardEnemies.length === 0 && $SiegeCombatants > 0>> <<for _i to 0; _i < $SiegeCombatants; _i++>> <<set _gender = random(1, 2) === 1 ? "Male" : "Female">> <<set _banditNumber = Math.ceil(random(1, 7))>> <<run $CourtyardEnemies.push({ id: "bandit-" + _i, gender: _gender, banditNumber: _banditNumber, health: 100, corruption: 0, maxHealth: 100, ImagePath: _gender === "Male" ? "Images/Forrest/Encounters/Human/Male/Bandit/" + _banditNumber + ".jpg" : "Images/Forrest/Encounters/Human/Female/Bandit/Brown/" + _banditNumber + ".jpg" })>> <</for>> <</if>> <!-- Tentacle Trap System --> <<if $CourtyardTentaclesDefence is true && typeof $CourtyardEnemies !== "undefined" && $CourtyardEnemies.length > 0>> <<set _trapTriggered = random(1, 100) <= 50>> <<if _trapTriggered>> <<set _trappedEnemyIndex = random(0, $CourtyardEnemies.length - 1)>> <<set _trappedEnemy = $CourtyardEnemies[_trappedEnemyIndex]>> <<set _trapImage = random(1, 8)>> <div class="trap-event" style="background: linear-gradient(135deg, #1a0a2e 0%, #0f051d 100%); border: 3px solid #8b00ff; border-radius: 10px; padding: 20px; margin: 20px 0; box-shadow: 0 0 20px rgba(139, 0, 255, 0.5);"> <h3 style="color: #bf40bf; text-align: center; margin-top: 0;">Tentacle Trap Activated!</h3> <div style="text-align: center; margin: 15px 0;"> <img @src="'Images/Seige/Trap/' + _trapImage + '.png'" alt="Tentacle Trap" style="max-width: 100%; max-height: 400px; height: auto; border: 2px solid #8b00ff; border-radius: 8px; box-shadow: 0 0 15px rgba(139, 0, 255, 0.7);"> </div> <p style="color: #d8bfd8; text-align: center; font-size: 1.1em; margin: 15px 0;"> <b>A bandit is suddenly grabbed by writhing tentacles emerging from the courtyard shadows!</b><br> The attacker is dragged away, their screams echoing as they disappear into the depths... </p> </div> <!-- Remove the trapped enemy from combat --> <<run $CourtyardEnemies.splice(_trappedEnemyIndex, 1)>> <<set $SiegeCombatants -= 1>> <</if>> <</if>> <!-- Combat round calculations --> <<set _defendersCasualties = 0>> <<set _archerCasualties = 0>> <<set _enemiesDefeated = 0>> <<set _enemiesCorrupted = 0>> <<set _roundDescription = "">> <<set _lucyCorrupting = false>> <<set _aliceCorrupting = false>> <<set _banishedDemons = []>> <<set _combatLog = []>> <!-- Detailed combat log --> <!-- Check for commanders --> <<set _lucyCommanding = false>> <<set _aliceCommanding = false>> <<for _i to 0; _i < $CourtyardDefenders.length; _i++>> <<if $CourtyardDefenders[_i].name === "Lucy">><<set _lucyCommanding = true>><</if>> <<if $CourtyardDefenders[_i].name === "Alice">><<set _aliceCommanding = true>><</if>> <</for>> <<set _commanderBonus = _lucyCommanding ? 15 : (_aliceCommanding ? 18 : 0)>> <!-- Assign targets to defenders --> <<if $CourtyardDefenders.length > 0 && $CourtyardEnemies.length > 0>> <!-- Reset enemy targeting --> <<for _i to 0; _i < $CourtyardEnemies.length; _i++>> <<set $CourtyardEnemies[_i].targetedBy = []>> <</for>> <!-- Assign targets to each defender - allow multiple defenders per enemy --> <<set _defendersPerEnemy = Math.max(1, Math.floor($CourtyardDefenders.length / Math.max(1, $CourtyardEnemies.length)))>> <<set _defendersAssigned = 0>> <!-- First pass - assign defenders evenly --> <<for _i to 0; _i < $CourtyardEnemies.length && _defendersAssigned < $CourtyardDefenders.length; _i++>> <<for _j to 0; _j < _defendersPerEnemy && _defendersAssigned < $CourtyardDefenders.length; _j++>> <<run $CourtyardEnemies[_i].targetedBy.push($CourtyardDefenders[_defendersAssigned].name)>> <<set _defendersAssigned++>> <</for>> <</for>> <!-- Second pass - assign any remaining defenders --> <<for _i to 0; _defendersAssigned < $CourtyardDefenders.length; _i = (_i + 1) % $CourtyardEnemies.length>> <<run $CourtyardEnemies[_i].targetedBy.push($CourtyardDefenders[_defendersAssigned].name)>> <<set _defendersAssigned++>> <</for>> <!-- Execute combat for each enemy --> <<for _i to 0; _i < $CourtyardEnemies.length; _i++>> <<capture _enemy>> <<set _enemy = $CourtyardEnemies[_i]>> <<set _enemyDefeated = false>> <<set _enemyCorrupted = false>> <<set _targetingDefenders = []>> <!-- Find all defenders targeting this enemy --> <<for _j to 0; _j < _enemy.targetedBy.length; _j++>> <<for _k to 0; _k < $CourtyardDefenders.length; _k++>> <<if $CourtyardDefenders[_k].name === _enemy.targetedBy[_j]>> <<run _targetingDefenders.push($CourtyardDefenders[_k])>> <</if>> <</for>> <</for>> <!-- Process each defender's attack --> <<for _j to 0; _j < _targetingDefenders.length; _j++>> <<set _defender = _targetingDefenders[_j]>> <!-- Skip if enemy already defeated or corrupted --> <<if _enemy.health <= 0 || _enemy.corruption >= 100>><<continue>><</if>> <!-- Defender combat check --> <<set _baseSkill = _defender.skill || 30>> <<set _armorBonus = _defender.armor === "Armoured" ? 10 : 0>> <<set _weaponBonus = _defender.weapon === "Sword" ? 15 : 0>> <<set _defenderPower = _baseSkill + _armorBonus + _weaponBonus + _commanderBonus>> <!-- Enemy combat power includes numerical advantage --> <<set _enemyAdvantage = Math.min(15, Math.floor(($CourtyardEnemies.length - $CourtyardDefenders.length) * 1.5))>> <<if _enemyAdvantage < 0>><<set _enemyAdvantage = 0>><</if>> <<set _enemyPower = 40 + _enemyAdvantage>> <!-- Special handling for Lucy and Alice who corrupt instead of damage --> <<if _defender.name === "Lucy">> <!-- Lucy applies corruption --> <<set _corruptionAmount = $LucyPower + 20>> <<set _enemy.corruption += _corruptionAmount>> <<set _lucyCorrupting = true>> <<run _combatLog.push({type: "corruption", attacker: "Lucy", target: _enemy.gender + " Bandit", amount: _corruptionAmount, completed: _enemy.corruption >= 100})>> <!-- Check if corruption is complete --> <<if _enemy.corruption >= 100 && !_enemyCorrupted>> <<set _enemiesCorrupted += 1>> <<set _enemyCorrupted = true>> <<set _enemy.corruption = 100>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: "Lucy", gender: _enemy.gender, banditNumber: _enemy.banditNumber, ImagePath: _enemy.ImagePath })>> <</if>> <<elseif _defender.name === "Alice">> <!-- Alice applies corruption --> <<set _corruptionAmount = $AlicePower + 20>> <<set _enemy.corruption += _corruptionAmount>> <<set _aliceCorrupting = true>> <<run _combatLog.push({type: "corruption", attacker: "Alice", target: _enemy.gender + " Bandit", amount: _corruptionAmount, completed: _enemy.corruption >= 100})>> <!-- Check if corruption is complete --> <<if _enemy.corruption >= 100 && !_enemyCorrupted>> <<set _enemiesCorrupted += 1>> <<set _enemyCorrupted = true>> <<set _enemy.corruption = 100>> <<run $SiegeCaptives.push({ type: "Bandit", health: 100, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: "Alice", gender: _enemy.gender, banditNumber: _enemy.banditNumber, ImagePath: _enemy.ImagePath })>> <</if>> <<else>> <!-- Regular combat --> <<set _defenderWins = false>> <!-- Combat calculation --> <<if _defenderPower > _enemyPower>> <<if random(1, 100) <= 75>> <<set _defenderWins = true>> <</if>> <<elseif _enemyPower > _defenderPower>> <<if random(1, 100) <= 40>> <<set _defenderWins = true>> <</if>> <<else>> <<if random(1, 100) <= 55>> <<set _defenderWins = true>> <</if>> <</if>> <!-- Apply combat results --> <<if _defenderWins>> <<set _damageAmount = random(30, 50)>> <<set _enemy.health -= _damageAmount>> <<run _combatLog.push({type: "damage", attacker: _defender.name, target: _enemy.gender + " Bandit", amount: _damageAmount, killed: _enemy.health <= 0})>> <<if _enemy.health <= 0 && !_enemyDefeated>> <<set _enemiesDefeated += 1>> <<set _enemyDefeated = true>> <<set _enemy.health = 0>> <</if>> <</if>> <</if>> <</for>> <!-- Enemy gets to attack all defenders targeting it --> <<if !_enemyDefeated && !_enemyCorrupted>> <<for _j to 0; _j < _targetingDefenders.length; _j++>> <<set _defender = _targetingDefenders[_j]>> <!-- Enemy combat power includes numerical advantage --> <<set _enemyAdvantage = Math.min(15, Math.floor(($CourtyardEnemies.length - $CourtyardDefenders.length) * 1.5))>> <<if _enemyAdvantage < 0>><<set _enemyAdvantage = 0>><</if>> <<set _enemyPower = 40 + _enemyAdvantage>> <!-- Defender power calculation --> <<set _baseSkill = _defender.skill || 30>> <<set _armorBonus = _defender.armor === "Armoured" ? 10 : 0>> <<set _weaponBonus = _defender.weapon === "Sword" ? 15 : 0>> <<set _defenderPower = _baseSkill + _armorBonus + _weaponBonus + _commanderBonus>> <<set _enemyHits = false>> <<if _enemyPower > _defenderPower>> <<if random(1, 100) <= 60>> <<set _enemyHits = true>> <</if>> <<elseif _defenderPower > _enemyPower>> <<if random(1, 100) <= 30>> <<set _enemyHits = true>> <</if>> <<else>> <<if random(1, 100) <= 50>> <<set _enemyHits = true>> <</if>> <</if>> <<if _enemyHits>> <<set _damageAmount = random(25, 45)>> <<set _defender.health -= _damageAmount>> <<run _combatLog.push({type: "damage", attacker: _enemy.gender + " Bandit", target: _defender.name, amount: _damageAmount, killed: _defender.health <= 0})>> <<if _defender.health <= 0>> <<set _defendersCasualties += 1>> <<run $DeadCourtyardDefenders.push(_defender)>> <<if _defender.name === "Lucy" || _defender.name === "Alice">> <<run _banishedDemons.push(_defender.name)>> <</if>> <</if>> <</if>> <</for>> <</if>> <</capture>> <</for>> <!-- Remove dead defenders --> <<set $CourtyardDefenders = $CourtyardDefenders.filter(defender => defender.health > 0)>> <!-- Remove defeated or corrupted enemies --> <<set $CourtyardEnemies = $CourtyardEnemies.filter(enemy => enemy.health > 0 && enemy.corruption < 100)>> <!-- Add description --> <<set _roundDescription += "The courtyard battle rages on. ">> <<if _defendersCasualties > 0>> <<set _roundDescription += _defendersCasualties === 1 ? "One defender falls in combat. " : _defendersCasualties + " defenders fall in combat. ">> <</if>> <<if _enemiesDefeated > 0>> <<set _roundDescription += _enemiesDefeated === 1 ? "Your forces manage to defeat one bandit. " : "Your forces defeat " + _enemiesDefeated + " bandits. ">> <<set $SiegeKilledEnemies += _enemiesDefeated>> <</if>> <<if _enemiesCorrupted > 0>> <<set _roundDescription += _enemiesCorrupted === 1 ? "One bandit is corrupted and now serves you. " : _enemiesCorrupted + " bandits are corrupted and now serve you. ">> <</if>> <<elseif $CourtyardDefenders.length > 0 && $CourtyardEnemies.length <= 0>> <<set _roundDescription += "Your defenders stand ready in the courtyard. ">> <<elseif $CourtyardDefenders.length <= 0 && $CourtyardEnemies.length > 0>> <<set _roundDescription += "With no defenders remaining, the bandits surge forward. ">> <</if>> <!-- Archer support fire from the walls --> <<if $SeigeArcherForce.length > 0 && $CourtyardEnemies.length > 0>> <<set _archerHitChance = 40>> <!-- Base archer hit chance for courtyard support --> <<set _archerCommanderBonus = $ArcherCommander === "Lucy" ? 10 : ($ArcherCommander === "Alice" ? 12 : 0)>> <<set _archersKilled = 0>> <<set _arrowsUsed = 0>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<capture _archer>> <<set _archer = $SeigeArcherForce[_i]>> <!-- Check if archer has arrows to shoot --> <<set _hasArrows = ($ArcherArrowType === "regular" && $ArmouryArrows > 0) || ($ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0)>> <!-- Archers provide support fire --> <<if _archer.health > 0 && $CourtyardEnemies.length > 0 && _hasArrows && random(1, 100) <= (_archerHitChance + _archerCommanderBonus)>> <<set _targetIndex = random(0, $CourtyardEnemies.length - 1)>> <!-- Consume arrow --> <<if $ArcherArrowType === "regular" && $ArmouryArrows > 0>> <<set $ArmouryArrows -= 1>> <<set _arrowsUsed += 1>> <<set _arrowDamage = random(20, 35)>> <<set $CourtyardEnemies[_targetIndex].health -= _arrowDamage>> <<if $CourtyardEnemies[_targetIndex].health <= 0>> <<set _archersKilled += 1>> <<set $SiegeKilledEnemies += 1>> <</if>> <<elseif $ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows > 0>> <<set $ArmouryCorruptedArrows -= 1>> <<set _arrowsUsed += 1>> <!-- Corrupted arrows apply corruption damage --> <<set $CourtyardEnemies[_targetIndex].corruption += random(30, 50)>> <<if $CourtyardEnemies[_targetIndex].corruption >= 100>> <<set $CourtyardEnemies[_targetIndex].corruption = 100>> <<set _archersKilled += 1>> <<run $SiegeCaptives.push({ type: "Bandit", health: $CourtyardEnemies[_targetIndex].health, skill: Math.floor(random(30, 70)), armor: random(1, 10) > 7 ? "Medium Armor" : "Light Armor", weapon: random(1, 10) > 5 ? "Sword" : "Dagger", corruption: 100, corruptedBy: $ArcherCommander !== "none" ? $ArcherCommander : "archers", gender: $CourtyardEnemies[_targetIndex].gender, banditNumber: $CourtyardEnemies[_targetIndex].banditNumber, ImagePath: $CourtyardEnemies[_targetIndex].ImagePath })>> <</if>> <</if>> <</if>> <</capture>> <</for>> <!-- Remove killed/corrupted enemies from archer fire --> <<set $CourtyardEnemies = $CourtyardEnemies.filter(enemy => enemy.health > 0 && enemy.corruption < 100)>> <<if _archersKilled > 0>> <<if $ArcherArrowType === "regular">> <<set _roundDescription += _archersKilled === 1 ? "Your archers shoot down one bandit from the walls. " : "Your archers shoot down " + _archersKilled + " bandits from the walls. ">> <<else>> <<set _roundDescription += _archersKilled === 1 ? "Your archers corrupt one bandit from the walls. " : "Your archers corrupt " + _archersKilled + " bandits from the walls. ">> <</if>> <</if>> <!-- Warn if arrows are running low --> <<if ($ArcherArrowType === "regular" && $ArmouryArrows <= 5 && $ArmouryArrows > 0) || ($ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows <= 5 && $ArmouryCorruptedArrows > 0)>> <<set _roundDescription += "Your archers are running low on arrows! ">> <<elseif ($ArcherArrowType === "regular" && $ArmouryArrows === 0) || ($ArcherArrowType === "corrupted" && $ArmouryCorruptedArrows === 0)>> <<set _roundDescription += "Your archers have run out of arrows! ">> <</if>> <</if>> <!-- If all courtyard defenders are dead, archers are overrun and deleted --> <<if $CourtyardDefenders.length === 0 && $SeigeArcherForce.length > 0>> <<set _roundDescription += "With no defenders in the courtyard, the bandits storm the walls and overwhelm the archers! ">> <<set $SeigeArcherForce = []>> <</if>> <!-- Combat Summary MOVED ABOVE CARDS --> <div class="combat-round"> <h2>Battle Results</h2> <p><<print _roundDescription>></p> <!-- Detailed Combat Summary --> <<if _combatLog.length > 0>> <div style="background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; padding: 10px; margin: 15px 0;"> <h3 style="margin-top: 0;">Combat Details:</h3> <ul style="margin: 5px 0; padding-left: 20px; max-height: 300px; overflow-y: auto;"> <<for _i to 0; _i < _combatLog.length; _i++>> <<set _log = _combatLog[_i]>> <<if _log.type === "damage">> <<if _log.killed>> <li style="color: #8b0000; font-weight: bold;"><<print _log.attacker>> dealt <<print _log.amount>> damage to <<print _log.target>> - <strong>KILLED</strong></li> <<else>> <li style="color: #444;"><<print _log.attacker>> dealt <<print _log.amount>> damage to <<print _log.target>></li> <</if>> <<elseif _log.type === "corruption">> <<if _log.completed>> <li style="color: purple; font-weight: bold;"><<print _log.attacker>> corrupted <<print _log.target>> (+<<print _log.amount>>) - <strong>CAPTURED</strong></li> <<else>> <li style="color: #9c27b0;"><<print _log.attacker>> applied <<print _log.amount>> corruption to <<print _log.target>></li> <</if>> <</if>> <</for>> </ul> </div> <</if>> <!-- Display corruption image for Lucy if she corrupted enemies --> <<if _lucyCorrupting>> <<set _lucyImageNum = Math.ceil(random(1, 3))>> <<set _lucyCorruptPath = "Images/Seige/Lucy/" + _lucyImageNum + ".png">> <div class="battle-image"> <img @src="_lucyCorruptPath" alt="Lucy Corrupting"> <p style="color: purple; font-style: italic;">Lucy unleashes her corruption magic, binding enemies to her will.</p> </div> <</if>> <!-- Display corruption image for Alice if she corrupted enemies --> <<if _aliceCorrupting>> <<set _aliceImageNum = Math.ceil(random(1, 3))>> <<set _aliceCorruptPath = "Images/Seige/Alice/" + _aliceImageNum + ".png">> <div class="battle-image"> <img @src="_aliceCorruptPath" alt="Alice Corrupting"> <p style="color: purple; font-style: italic;">Alice's corruption power flows through the battlefield, ensnaring her foes.</p> </div> <</if>> <!-- Banished demons notification --> <<if _banishedDemons.length > 0>> <div class="battle-image" style="background-color: rgba(128, 0, 128, 0.1); border: 2px solid purple; padding: 15px; margin: 15px 0;"> <h3 style="color: purple;">Banished!</h3> <p style="color: purple;"><<print _banishedDemons.join(", ")>> <<if _banishedDemons.length === 1>>has<<else>>have<</if>> been banished back to the void</p> <p style="color: #9c27b0; font-style: italic;"><<if _banishedDemons.length === 1>>They<<else>>She<</if>> will recover her power and return to her chambers in time.</p> </div> <</if>> <!-- Show combat image --> <<if $CourtyardDefenders.length > 0 && $CourtyardEnemies.length > 0 && (_enemiesDefeated > 0 || _enemiesCorrupted > 0) && !_lucyCorrupting && !_aliceCorrupting>> <<set _combatImageNum = Math.ceil(random(1, 6))>> <<set _courtyardCombatPath = "Images/Seige/Combat/" + _combatImageNum + ".png">> <div class="battle-image"> <img @src="_courtyardCombatPath" alt="Courtyard Combat"> </div> <</if>> </div> <!-- Battle Visualization with Side-by-Side Cards --> <div class="battle-visualization"> <h2>Forces in the Courtyard</h2> <div class="ground-battle-section"> <!-- Defender Forces --> <<if $CourtyardDefenders.length > 0>> <div class="vanguard-forces text-box"> <h3>Your Defenders (<<print $CourtyardDefenders.length>>)</h3> <div class="combat-table"> <<for _i to 0; _i < $CourtyardDefenders.length; _i++>> <<capture _defender>> <<set _defender = $CourtyardDefenders[_i]>> <!-- Set default image path if missing --> <<if !_defender.ImagePath>> <<if _defender.name === "Lucy">> <<set _defender.ImagePath = "Images/Seige/Lucy/portrait.png">> <<elseif _defender.name === "Alice">> <<set _defender.ImagePath = "Images/Seige/Alice/portrait.png">> <<else>> <<set _defender.ImagePath = "Images/Seige/Icons/fighter.png">> <</if>> <</if>> <div class="character-card card"> <div class="card-name"><<print _defender.name>></div> <div class="card-image"> <img @src="_defender.ImagePath" alt="<<print _defender.name>>"> </div> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em;">Health:</h4> <progress @value="_defender.health" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: <<print _defender.health || 100>>/100</p> <<if _defender.name === "Lucy">> <p class="card-description" style="color: purple;">Corruption: <<print $LucyPower + 20>> per turn</p> <<elseif _defender.name === "Alice">> <p class="card-description" style="color: purple;">Corruption: <<print $AlicePower + 20>> per turn</p> <</if>> <<if _defender.weapon>> <p class="card-effects">Weapon: <<print _defender.weapon>></p> <</if>> <<if _defender.armor>> <p class="card-effects">Armor: <<print _defender.armor>></p> <</if>> </div> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Enemy Forces --> <<if $CourtyardEnemies.length > 0>> <div class="enemy-forces text-box"> <h3>Enemies in Courtyard (<<print $CourtyardEnemies.length>>)</h3> <div class="combat-table"> <<set _displayedEnemies = Math.min($CourtyardEnemies.length, 6)>> <<for _i to 0; _i < _displayedEnemies; _i++>> <<capture _enemy>> <<set _enemy = $CourtyardEnemies[_i]>> <div class="character-card card enemy-card"> <div class="card-name"><<print _enemy.gender>> Bandit</div> <div class="card-image"> <img @src="_enemy.ImagePath" alt="Bandit"> </div> <div class="card-stats"> <h4 style="margin: 0; font-size: 0.8em; color: #ff6666;">Health:</h4> <progress @value="_enemy.health" max="100" style="width: 100%;"></progress> <p class="card-damage">Health: <<print _enemy.health>>/100</p> <<if _enemy.corruption > 0>> <h4 style="margin: 0; font-size: 0.8em; color: #9c27b0;">Corruption:</h4> <progress @value="_enemy.corruption" max="100%" style="width: 100%;" class="corruption-progress"></progress> <p class="card-effects">Corruption: <<print Math.floor(_enemy.corruption)>>/100</p> <</if>> </div> </div> <</capture>> <</for>> <<if $CourtyardEnemies.length > 6>> <div class="more-enemies"> <div class="card enemy-card" style="width: 80px; min-height: 120px; display: flex; align-items: center; justify-content: center;"> <div style="text-align: center;"> <strong style="font-size: 1.5em;">+<<print $CourtyardEnemies.length - 6>></strong><br> <span style="font-size: 0.8em;">more</span> </div> </div> </div> <</if>> </div> </div> <</if>> </div> </div> <!-- Tactical Map Visualization --> <div class="wall-battle-visualization"> <h2>Tactical Overview</h2> <!-- Custom map for courtyard battle --> <div class="text-box" style="position: relative; text-align: center;"> <div style="position: relative; display: inline-block; max-width: 100%;"> <!-- Base Map Image --> <img src="Images/Seige/Map/1.png" style="width: 100%; max-width: 1024px; height: auto; display: block;"> <!-- Container for positioning elements relative to the image --> <div style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"> <!-- Courtyard Defenders (Purple) at 300,300 = 29.30%, 29.30% --> <<if $CourtyardDefenders.length > 0>> <div style="position: absolute; left: 29.30%; top: 29.30%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(150, 0, 255, 0.8); border: 3px solid #9900ff; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(150, 0, 255, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print $CourtyardDefenders.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <<set _courtyardLabel = "Courtyard Defenders">> <<set _courtyardCommander to "">> <<for _i to 0; _i < $CourtyardDefenders.length; _i++>> <<if $CourtyardDefenders[_i].name === "Lucy" || $CourtyardDefenders[_i].name === "Alice">> <<set _courtyardCommander to $CourtyardDefenders[_i].name>> <<break>> <</if>> <</for>> <<if _courtyardCommander !== "">> <<set _courtyardLabel to "Courtyard Defenders (" + _courtyardCommander + ")">> <</if>> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print _courtyardLabel>></span> </div> </div> <</if>> <!-- Archers on Wall (Green) - if any remain and not retreated --> <<if $SeigeArcherForce.length > 0>> <<if $ArchersRetreated is true>> <!-- Archers retreated to courtyard --> <<set _archerX to 7.13>> <<set _archerY to 6.64>> <<else>> <!-- Archers on wall --> <<set _archerX to 91.80>> <<set _archerY to 4.88>> <</if>> <div @style="'position: absolute; left: ' + _archerX + '%; top: ' + _archerY + '%; transform: translate(-50%, -50%);'"> <div style="background-color: rgba(0, 200, 0, 0.8); border: 3px solid #00aa00; border-radius: 50%; width: 50px; height: 50px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(0, 200, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 20px;"><<print $SeigeArcherForce.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <<set _archerLabel = "Archers">> <<if $ArchersRetreated is true>> <<set _archerLabel to "Archers (Retreated)">> <<elseif $ArcherCommander && $ArcherCommander !== "none">> <<set _archerLabel to "Archers (" + $ArcherCommander + ")">>> <</if>> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;"><<print _archerLabel>></span> </div> </div> <</if>> <!-- Enemies (Red) at 330,330 = 32.23%, 32.23% --> <<if $CourtyardEnemies.length > 0>> <div style="position: absolute; left: 32.23%; top: 32.23%; transform: translate(-50%, -50%);"> <div style="background-color: rgba(255, 0, 0, 0.8); border: 3px solid #cc0000; border-radius: 50%; width: 60px; height: 60px; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 10px rgba(255, 0, 0, 0.8);"> <span style="color: white; font-weight: bold; font-size: 24px;"><<print $CourtyardEnemies.length>></span> </div> <div style="text-align: center; margin-top: 5px;"> <span style="background-color: rgba(0, 0, 0, 0.7); color: white; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: bold;">Bandits</span> </div> </div> <</if>> </div> </div> </div> <div class="battle-stats"> <div class="enemy-stats text-box"> <h3>Enemy Forces</h3> <p>Bandits in Courtyard: <<print $CourtyardEnemies.length>></p> </div> <div class="defender-stats text-box"> <h3>Your Defenses</h3> <p>Courtyard Defenders: <<print $CourtyardDefenders.length>></p> <<if $SeigeArcherForce.length > 0>> <p>Archers (Supporting): <<print $SeigeArcherForce.length>></p> <</if>> <p>Captive Bandits: <<print $SiegeCaptives.length>></p> <p>Bandits Killed: <<print $SiegeKilledEnemies>></p> </div> </div> </div> <!-- Battle options --> <div class="battle-options"> <<if $CourtyardDefenders.length > 0>> <<if $CourtyardEnemies.length > 0>> <div class="option-box"> <h3>Continue Fighting</h3> <p>Your forces make their last stand in the courtyard. There is no retreat!</p> <<button "Fight On" class="execute-combat-btn">> <<goto "CourtyardBattle">> <</button>> </div> <<else>> <!-- Victory --> <div class="option-box" style="background-color: rgba(0, 200, 0, 0.1); border-color: #0a0;"> <h3>Victory!</h3> <p>You have successfully defended the courtyard! The bandits are defeated!</p> <<button "Secure the Castle" class="execute-combat-btn">> <!-- Return forces to barracks --> <<for _i to 0; _i < $CourtyardDefenders.length; _i++>> <<run $BarraksOccupance.push($CourtyardDefenders[_i])>> <</for>> <<set $CourtyardDefenders = []>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<run $BarraksOccupance.push($SeigeArcherForce[_i])>> <</for>> <<set $SeigeArcherForce = []>> <<set $BeingSeiged = false>> <<goto "SiegeVictory">> <</button>> </div> <</if>> <<else>> <div class="option-box defeated"> <h3>Your forces have been defeated</h3> <p>All your defenders have fallen. The bandits have taken the courtyard.</p> <<button "Continue">> <<goto "SiegeDefeated">> <</button>> </div> <</if>> </div> </div> <style> /* Use same styles as WallTopBattle */ .battle-phase-alert { background-color: #ffe6e6; border: 2px solid #ff0000; padding: 15px; margin-bottom: 20px; text-align: center; font-weight: bold; font-size: 1.2em; } .battle-image { text-align: center; margin: 15px 0; } .battle-image img { max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } .combat-round { margin: 20px 0; padding: 15px; background-color: rgba(0, 0, 0, 0.05); border: 1px solid #ccc; border-radius: 5px; } .battle-stats { display: flex; justify-content: space-between; margin: 20px 0; } .enemy-stats, .defender-stats { width: 48%; padding: 15px; border-radius: 5px; background-color: rgba(0, 0, 0, 0.05); } .combat-visualization { margin: 20px 0; padding: 15px; background-color: rgba(0, 0, 0, 0.03); border: 1px solid #ddd; border-radius: 5px; } /* Ground Battle Section - Side by Side Layout */ .ground-battle-section { display: flex; gap: 20px; margin: 20px 0; flex-wrap: wrap; } .vanguard-forces, .enemy-forces { flex: 1; min-width: 300px; background-color: rgba(255, 255, 255, 0.8); border: 2px solid #8b4513; border-radius: 8px; padding: 15px; } .enemy-forces { border-color: #8b0000; background-color: rgba(255, 240, 240, 0.8); } .combat-area { display: flex; flex-wrap: wrap; gap: 20px; margin-top: 15px; } .combat-table { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; min-height: 80px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .character-card.card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4), 0 0 15px rgba(139, 69, 19, 0.3); } .enemy-card { background: linear-gradient(to bottom, #2a1a1a 0%, #1a0a0a 100%); color: #ff4444; border-color: #8b0000; } .enemy-card .card-name { color: #ff6666; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; color: #1a0a00; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .enemy-card .card-name { color: #ff6666; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.5); } .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .card-damage, .card-effects, .card-description { font-size: 0.75em; text-align: center; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; margin: 3px 0; } .card-damage { font-weight: bold; color: #8b0000; } .card-effects { color: #444; } .card-description { color: #666; font-style: italic; margin-top: auto; } .wall-battle-visualization { margin: 30px 0; padding: 20px; background-color: rgba(0, 0, 0, 0.03); border: 1px solid #ddd; border-radius: 5px; } .more-enemies { margin-left: 15px; } .battle-options { margin: 30px 0; } .option-box { padding: 15px; margin: 15px 0; background-color: rgba(255, 255, 255, 0.7); border: 1px solid #aaa; border-radius: 5px; text-align: center; } .option-box button { margin-top: 10px; padding: 10px 20px; font-size: 1.1em; cursor: pointer; } .option-box.defeated { background-color: rgba(139, 0, 0, 0.1); border-color: #900; } .execute-combat-btn { background: linear-gradient(to bottom, #8b0000 0%, #600000 100%) !important; border: 3px solid #ffd700 !important; color: #ffd700 !important; font-size: 1.1em !important; padding: 12px 25px !important; text-shadow: 0 0 10px #ff8c00 !important; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3) !important; } .execute-combat-btn:hover { background: linear-gradient(to bottom, #a00000 0%, #800000 100%) !important; box-shadow: 0 0 20px rgba(255, 215, 0, 0.5) !important; transform: scale(1.05) !important; } </style> <</nobr>>
<<nobr>> <!-- Resource and NPC losses - random between 20% and 50% lost --> <<set _resourceLossPercent = 0.2 + (random(0, 30) / 100)>> <!-- 20% to 50% loss --> <<set $Gold = Math.floor($Gold * (1 - _resourceLossPercent))>> <<set $Wood = Math.floor($Wood * (1 - _resourceLossPercent))>> <<set $Stone = Math.floor($Stone * (1 - _resourceLossPercent))>> <<set $Grain = Math.floor($Grain * (1 - _resourceLossPercent))>> <<set $Food = Math.floor($Food * (1 - _resourceLossPercent))>> <!-- Kidnap NPCs from quarters - random between 20% and 50% --> <<if typeof $QuartersOccupance !== "undefined" && $QuartersOccupance.length > 0>> <<set _kidnappedCount = 0>> <<set _remainingNPCs = []>> <<set _npcKidnapChance = 20 + random(0, 30)>> <!-- 20% to 50% chance per NPC --> <<for _i to 0; _i < $QuartersOccupance.length; _i++>> <<if random(1, 100) <= _npcKidnapChance>> <<set _kidnappedCount += 1>> <<else>> <<run _remainingNPCs.push($QuartersOccupance[_i])>> <</if>> <</for>> <<set $QuartersOccupance = _remainingNPCs>> <</if>> <!-- Process dead defenders - 70% die, 30% survive with Mara's help --> <<set _survivingDefenders = []>> <<set _permanentDeaths = 0>> <<set _lucySaved = false>> <<set _aliceSaved = false>> <<if typeof $DeadCourtyardDefenders !== "undefined" && $DeadCourtyardDefenders.length > 0>> <<for _i to 0; _i < $DeadCourtyardDefenders.length; _i++>> <<capture _defender>> <<set _defender = $DeadCourtyardDefenders[_i]>> <<if _defender.name === "Lucy" || _defender.name === "Alice">> <!-- Demons don't die, they're banished and automatically reform --> <<if _defender.name === "Lucy">> <<set _lucySaved = true>> <</if>> <<if _defender.name === "Alice">> <<set _aliceSaved = true>> <</if>> <<elseif random(1, 100) > 70>> <!-- Human survivor - restore to 30% health --> <<set _defender.health = 30>> <<run _survivingDefenders.push(_defender)>> <<else>> <<set _permanentDeaths += 1>> <</if>> <</capture>> <</for>> <</if>> <<if typeof $DeadWallDefenders !== "undefined" && $DeadWallDefenders.length > 0>> <<for _i to 0; _i < $DeadWallDefenders.length; _i++>> <<capture _defender>> <<set _defender = $DeadWallDefenders[_i]>> <<if _defender.name === "Lucy" || _defender.name === "Alice">> <!-- Demons don't die, they're banished and automatically reform --> <<if _defender.name === "Lucy">> <<set _lucySaved = true>> <</if>> <<if _defender.name === "Alice">> <<set _aliceSaved = true>> <</if>> <<elseif random(1, 100) > 70>> <!-- Human survivor - restore to 30% health --> <<set _defender.health = 30>> <<run _survivingDefenders.push(_defender)>> <<else>> <<set _permanentDeaths += 1>> <</if>> <</capture>> <</for>> <</if>> <<if typeof $DeadArchers !== "undefined" && $DeadArchers.length > 0>> <<for _i to 0; _i < $DeadArchers.length; _i++>> <<capture _defender>> <<set _defender = $DeadArchers[_i]>> <<if _defender.name === "Lucy" || _defender.name === "Alice">> <!-- Demons don't die, they're banished and automatically reform --> <<if _defender.name === "Lucy">> <<set _lucySaved = true>> <</if>> <<if _defender.name === "Alice">> <<set _aliceSaved = true>> <</if>> <<elseif random(1, 100) > 70>> <!-- Human survivor - restore to 30% health --> <<set _defender.health = 30>> <<run _survivingDefenders.push(_defender)>> <<else>> <<set _permanentDeaths += 1>> <</if>> <</capture>> <</for>> <</if>> <!-- Return survivors to barracks --> <<for _i to 0; _i < _survivingDefenders.length; _i++>> <<run $BarraksOccupance.push(_survivingDefenders[_i])>> <</for>> <!-- Clear dead arrays --> <<set $DeadCourtyardDefenders = []>> <<set $DeadWallDefenders = []>> <<set $DeadArchers = []>> <!-- Clear combat forces --> <<set $CourtyardDefenders = []>> <<set $CourtyardEnemies = []>> <<set $SeigeWallForce = []>> <<set $SeigeVanguardForce = []>> <<set $WallEnemies = []>> <!-- Player death - deduct soul --> <<if typeof $Souls === "undefined">><<set $Souls = 3>><</if>> <<set $Souls -= 1>> <!-- End siege state --> <<set $BeingSeiged = false>> <div class="text-box defeat-scene"> <!-- Ember overlay effect --> <div class="ember-overlay"></div> <h1 style="color: #8b0000; text-align: center;">The Castle Falls</h1> <div class="defeat-narrative"> <p>The last of your defenders falls. The clash of steel fades into the victorious roar of the bandits as they surge through your broken defenses.</p> <p>Smoke rises from a dozen fires as the raiders ransack the castle. They move through the halls like locusts, tearing apart what you've built, seizing anything of value. The screams of servants echo through the courtyards as families are torn apart, able-bodied workers dragged away in chains to be sold to distant slavers.</p> <p>Your treasury is plundered. Supply stores are emptied or set ablaze. What cannot be carried is destroyed out of spite. Years of careful accumulation scattered to the wind in a single terrible night.</p> <p>You fight to the last, but you are mortal. Steel finds flesh. Your vision darkens as you fall among the ashes of your domain.</p> <p style="text-align: center; font-style: italic; color: #666; margin-top: 30px;">But death is not the end for you...</p> </div> <div class="defeat-summary"> <h2>The Aftermath</h2> <div class="losses-box"> <h3 style="color: #8b0000;">Losses Suffered</h3> <div class="loss-category"> <h4>Resources Plundered</h4> <p>Gold, wood, stone, grain, and food stores ransacked.</p> </div> <<if _kidnappedCount > 0>> <div class="loss-category"> <h4>People Kidnapped</h4> <p><<print _kidnappedCount>> <<if _kidnappedCount === 1>>person has<<else>>people have<</if>> been taken by the raiders, dragged away into slavery.</p> </div> <</if>> <<if _permanentDeaths > 0>> <div class="loss-category"> <h4>Defenders Slain</h4> <p><<print _permanentDeaths>> of your guards <<if _permanentDeaths === 1>>has<<else>>have<</if>> fallen in battle, their bodies left among the ruins.</p> </div> <</if>> <<if _survivingDefenders.length > 0>> <div class="loss-category" style="border-color: #4a7c59;"> <h4>Survivors</h4> <p>Mara, the castle healer, managed to save <<print _survivingDefenders.length>> wounded <<if _survivingDefenders.length === 1>>defender<<else>>defenders<</if>> from the brink of death. <<if _survivingDefenders.length === 1>>They rest<<else>>They rest<</if>> in the barracks, grievously wounded but alive.</p> </div> <</if>> <<if _lucySaved || _aliceSaved>> <div class="loss-category" style="border-color: #9400d3;"> <h4>Demonic Allies</h4> <<if _lucySaved && _aliceSaved>> <p style="color: #9400d3; font-style: italic;">Both Lucy and Alice were banished during the battle, but as demons they cannot truly die. They will reform in their chambers.</p> <<elseif _lucySaved>> <p style="color: #9400d3; font-style: italic;">Lucy was banished during the battle, but as a demon she cannot truly die. She will reform in her chambers.</p> <<elseif _aliceSaved>> <p style="color: #9400d3; font-style: italic;">Alice was banished during the battle, but as a demon she cannot truly die. She will reform in her chambers.</p> <</if>> </div> <</if>> <div class="loss-category soul-loss"> <h4>Death's Price</h4> <p>You have fallen in battle. One soul consumed by death's embrace.</p> <p style="font-size: 1.2em; font-weight: bold; color: #9400d3;">Souls Remaining: <<print $Souls>></p> </div> </div> </div> <div style="text-align: center; margin: 30px 0;"> <<if $Souls > 0>> <<button "Awaken" class="respawn-btn">> <<goto "Respawn">> <</button>> <<else>> <<button "Final Death" class="respawn-btn">> <<goto "GameOver">> <</button>> <</if>> </div> </div> <style> /* Defeat scene container */ .defeat-scene { position: relative; background: linear-gradient(to bottom, #1a0a00 0%, #0a0000 100%); color: #d0d0d0; overflow: hidden; } /* Ember overlay effect */ .ember-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1000; background-image: radial-gradient(4px 4px at 20% 30%, rgba(255, 140, 0, 1), rgba(255, 69, 0, 0.6) 40%, transparent), radial-gradient(3px 3px at 60% 70%, rgba(255, 69, 0, 1), rgba(255, 140, 0, 0.5) 40%, transparent), radial-gradient(5px 5px at 50% 50%, rgba(255, 140, 0, 0.9), rgba(255, 69, 0, 0.4) 50%, transparent), radial-gradient(2px 2px at 80% 10%, rgba(255, 69, 0, 1), transparent), radial-gradient(4px 4px at 90% 60%, rgba(255, 140, 0, 1), rgba(255, 69, 0, 0.6) 40%, transparent), radial-gradient(3px 3px at 33% 80%, rgba(255, 69, 0, 0.9), transparent), radial-gradient(5px 5px at 15% 90%, rgba(255, 140, 0, 1), rgba(255, 100, 0, 0.5) 40%, transparent), radial-gradient(2px 2px at 45% 20%, rgba(255, 100, 0, 0.9), transparent), radial-gradient(3px 3px at 70% 40%, rgba(255, 140, 0, 1), transparent), radial-gradient(4px 4px at 25% 60%, rgba(255, 69, 0, 0.9), rgba(255, 140, 0, 0.4) 50%, transparent), radial-gradient(2px 2px at 85% 85%, rgba(255, 100, 0, 1), transparent), radial-gradient(3px 3px at 10% 40%, rgba(255, 140, 0, 0.8), transparent); background-size: 200% 200%; background-position: 0% 0%; animation: emberFloat 15s ease-in-out infinite, emberDrift 20s linear infinite; opacity: 0.9; } .ember-overlay::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: radial-gradient(6px 6px at 35% 15%, rgba(255, 200, 100, 0.7), transparent), radial-gradient(4px 4px at 75% 55%, rgba(255, 150, 50, 0.8), transparent), radial-gradient(5px 5px at 55% 85%, rgba(255, 100, 0, 0.7), transparent); animation: emberFloat 12s ease-in-out infinite reverse, emberDrift 25s linear infinite; } @keyframes emberFloat { 0%, 100% { background-position: 0% 0%; opacity: 0.8; } 25% { background-position: 100% 100%; opacity: 1; } 50% { background-position: 0% 100%; opacity: 0.7; } 75% { background-position: 100% 0%; opacity: 0.9; } } @keyframes emberDrift { 0% { transform: translateY(0) translateX(0) rotate(0deg); } 100% { transform: translateY(-100%) translateX(20%) rotate(5deg); } } /* Defeat image */ .defeat-image { text-align: center; margin: 20px 0; border: 3px solid #8b0000; border-radius: 5px; overflow: hidden; box-shadow: 0 0 20px rgba(139, 0, 0, 0.5); } .defeat-image img { width: 100%; max-height: 400px; object-fit: cover; filter: brightness(0.7) saturate(0.8); } /* Defeat narrative */ .defeat-narrative { background-color: rgba(0, 0, 0, 0.6); padding: 20px; margin: 20px 0; border-left: 4px solid #8b0000; border-radius: 5px; line-height: 1.8; } .defeat-narrative p { margin: 15px 0; font-size: 1.05em; color: #c0c0c0; } /* Defeat summary */ .defeat-summary { margin: 30px 0; } .defeat-summary h2 { color: #ff6666; text-align: center; margin-bottom: 20px; text-shadow: 0 0 10px rgba(255, 0, 0, 0.5); } /* Losses box */ .losses-box { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.2) 0%, rgba(80, 0, 0, 0.2) 100%); border: 2px solid #8b0000; border-radius: 8px; padding: 20px; margin: 20px 0; box-shadow: 0 0 15px rgba(139, 0, 0, 0.3); } .losses-box h3 { text-align: center; margin-bottom: 20px; font-size: 1.3em; } /* Loss category */ .loss-category { background-color: rgba(0, 0, 0, 0.4); border-left: 4px solid #cc0000; padding: 15px; margin: 15px 0; border-radius: 5px; } .loss-category h4 { color: #ff8888; margin-top: 0; margin-bottom: 10px; } .loss-category p { margin: 5px 0; color: #d0d0d0; } /* Soul loss special styling */ .soul-loss { border-left-color: #9400d3; background: linear-gradient(to right, rgba(148, 0, 211, 0.2) 0%, rgba(0, 0, 0, 0.4) 100%); } .soul-loss h4 { color: #da70d6; } /* Respawn button */ .respawn-btn { background: linear-gradient(to bottom, #4a0080 0%, #2a0050 100%) !important; border: 3px solid #9400d3 !important; color: #e6e6fa !important; font-size: 1.3em !important; padding: 15px 40px !important; text-shadow: 0 0 10px #9400d3 !important; box-shadow: 0 0 20px rgba(148, 0, 211, 0.5) !important; cursor: pointer !important; transition: all 0.3s !important; } .respawn-btn:hover { background: linear-gradient(to bottom, #6a00a0 0%, #4a0080 100%) !important; box-shadow: 0 0 30px rgba(148, 0, 211, 0.8) !important; transform: scale(1.05) !important; } /* Glow effect for text */ h1 { text-shadow: 0 0 20px rgba(139, 0, 0, 0.8); } /* Responsive design */ @media (max-width: 768px) { .defeat-narrative { padding: 15px; font-size: 0.95em; } .losses-box { padding: 15px; } .loss-category { padding: 10px; } } </style> <</nobr>>
<<nobr>> <style> .coord-tester * { box-sizing: border-box; } .coord-tester { font-family: Arial, sans-serif; background-color: #1a1a1a; color: #ffffff; padding: 20px; border-radius: 8px; margin: 20px 0; } .coord-tester h1 { text-align: center; margin-bottom: 20px; color: #4a9eff; } .coord-layout { display: grid; grid-template-columns: 350px 1fr; gap: 20px; margin-top: 20px; } @media (max-width: 1200px) { .coord-layout { grid-template-columns: 1fr; } } .coord-controls { background-color: #2a2a2a; padding: 20px; border-radius: 8px; height: fit-content; max-height: 90vh; overflow-y: auto; } .coord-control-group { margin-bottom: 25px; padding-bottom: 20px; border-bottom: 1px solid #444; } .coord-control-group:last-child { border-bottom: none; } .coord-control-group h3 { margin-bottom: 15px; color: #4a9eff; font-size: 14px; text-transform: uppercase; } .coord-control-item { margin-bottom: 12px; } .coord-control-item label { display: block; margin-bottom: 5px; font-size: 12px; color: #aaa; } .coord-control-item input[type="number"], .coord-control-item input[type="text"] { width: 100%; padding: 8px; background-color: #1a1a1a; border: 1px solid #444; border-radius: 4px; color: #fff; font-size: 14px; } .coord-control-item input[type="range"] { width: 100%; } .coord-slider-container { display: flex; align-items: center; gap: 10px; } .coord-slider-container input[type="range"] { flex: 1; } .coord-slider-container .coord-value { min-width: 60px; text-align: right; font-weight: bold; color: #4a9eff; } .coord-control-item input[type="checkbox"] { margin-right: 8px; } .coord-color-picker { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 8px; } .coord-color-option { width: 30px; height: 30px; border-radius: 50%; cursor: pointer; border: 3px solid transparent; transition: all 0.2s; } .coord-color-option:hover { transform: scale(1.1); } .coord-color-option.active { border-color: #fff; box-shadow: 0 0 10px rgba(255,255,255,0.5); } .coord-map-container { background-color: #2a2a2a; padding: 20px; border-radius: 8px; text-align: center; } .coord-map-wrapper { position: relative; display: inline-block; max-width: 100%; } .coord-map-wrapper img { width: 100%; max-width: 1024px; height: auto; display: block; border-radius: 4px; user-select: none; -webkit-user-drag: none; } .coord-pin-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; } .coord-pin { position: absolute; transform: translate(-50%, -50%); transition: all 0.1s; pointer-events: none; } .coord-pin-circle { border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 0 15px rgba(0,0,0,0.5); font-weight: bold; border: 3px solid; } .coord-pin-label { position: absolute; top: 100%; left: 50%; transform: translateX(-50%); background-color: rgba(0, 0, 0, 0.8); color: white; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: bold; white-space: nowrap; margin-top: 5px; } .coord-coordinates-display { background-color: #1a1a1a; padding: 15px; border-radius: 4px; margin-top: 15px; font-family: 'Courier New', monospace; font-size: 13px; line-height: 1.8; cursor: pointer; } .coord-coordinates-display:hover { background-color: #2a2a2a; } .coord-line { color: #4a9eff; } .coord-button { width: 100%; padding: 12px; background-color: #4a9eff; border: none; border-radius: 4px; color: white; font-weight: bold; cursor: pointer; font-size: 14px; margin-top: 10px; transition: background-color 0.2s; } .coord-button:hover { background-color: #3a8eef; } .coord-button:active { background-color: #2a7edf; } </style> <div class="coord-tester"> <h1>🎯 Siege Map Coordinate Tester</h1> <p style="text-align: center; color: #888; margin-bottom: 20px;"> Adjust the sliders to position your pin on the map. Click the coordinates to copy them. </p> <div class="coord-layout"> <div class="coord-controls"> <div class="coord-control-group"> <h3>Pin Position</h3> <div class="coord-control-item"> <label>X Position (%)</label> <div class="coord-slider-container"> <input type="range" id="coordXPos" min="0" max="100" step="0.01" value="50"> <span class="coord-value" id="coordXValue">50.00</span> </div> </div> <div class="coord-control-item"> <label>Y Position (%)</label> <div class="coord-slider-container"> <input type="range" id="coordYPos" min="0" max="100" step="0.01" value="50"> <span class="coord-value" id="coordYValue">50.00</span> </div> </div> </div> <div class="coord-control-group"> <h3>Pin Appearance</h3> <div class="coord-control-item"> <label>Pin Size (px)</label> <div class="coord-slider-container"> <input type="range" id="coordPinSize" min="30" max="80" step="1" value="50"> <span class="coord-value" id="coordSizeValue">50</span> </div> </div> <div class="coord-control-item"> <label>Pin Label</label> <input type="text" id="coordPinLabel" value="Test Pin" placeholder="Enter label..."> </div> <div class="coord-control-item"> <label>Pin Color</label> <div class="coord-color-picker"> <div class="coord-color-option active" data-color="rgba(255, 0, 0, 0.8)" data-border="#cc0000" style="background-color: rgba(255, 0, 0, 0.8); border-color: #cc0000;"></div> <div class="coord-color-option" data-color="rgba(0, 100, 255, 0.8)" data-border="#0050ff" style="background-color: rgba(0, 100, 255, 0.8); border-color: #0050ff;"></div> <div class="coord-color-option" data-color="rgba(0, 255, 255, 0.8)" data-border="#00cccc" style="background-color: rgba(0, 255, 255, 0.8); border-color: #00cccc;"></div> <div class="coord-color-option" data-color="rgba(0, 200, 0, 0.8)" data-border="#00aa00" style="background-color: rgba(0, 200, 0, 0.8); border-color: #00aa00;"></div> <div class="coord-color-option" data-color="rgba(150, 0, 255, 0.8)" data-border="#9900ff" style="background-color: rgba(150, 0, 255, 0.8); border-color: #9900ff;"></div> </div> </div> <div class="coord-control-item"> <label> <input type="checkbox" id="coordShowLabel" checked> Show Label </label> </div> </div> <div class="coord-control-group"> <h3>Quick Presets</h3> <button class="coord-button" onclick="loadCoordPreset('barracks')">Barracks (61.04%, 3.91%)</button> <button class="coord-button" onclick="loadCoordPreset('vanguardPre')">Vanguard Pre-Battle (43.46%, 41.21%)</button> <button class="coord-button" onclick="loadCoordPreset('vanguardGate')">Vanguard at Gate (62.40%, 57.91%)</button> <button class="coord-button" onclick="loadCoordPreset('vanguardRetreat')">Vanguard Retreat (29.30%, 29.30%)</button> <button class="coord-button" onclick="loadCoordPreset('archers')">Archers on Wall (91.80%, 4.88%)</button> <button class="coord-button" onclick="loadCoordPreset('archersRetreat')">Archers Retreat (7.13%, 6.64%)</button> <button class="coord-button" onclick="loadCoordPreset('wallDef1')">Wall Defenders 1 (33.79%, 84.12%)</button> <button class="coord-button" onclick="loadCoordPreset('wallDef2')">Wall Defenders 2 (69.14%, 36.66%)</button> <button class="coord-button" onclick="loadCoordPreset('courtyard')">Courtyard (29.30%, 29.30%)</button> <button class="coord-button" onclick="loadCoordPreset('gate')">Gate (78.75%, 76.31%)</button> <button class="coord-button" onclick="loadCoordPreset('enemyStart')">Enemy Start (96.00%, 85.00%)</button> <button class="coord-button" onclick="loadCoordPreset('enemyWall1')">Enemy Wall 1 (39.36%, 74.75%)</button> <button class="coord-button" onclick="loadCoordPreset('enemyWall2')">Enemy Wall 2 (78.52%, 27.09%)</button> <button class="coord-button" onclick="loadCoordPreset('enemySplit1')">Enemy Split 1 (47.30%, 94.28%)</button> <button class="coord-button" onclick="loadCoordPreset('enemySplit2')">Enemy Split 2 (89.88%, 41.05%)</button> </div> <div class="coord-coordinates-display" onclick="copyCoordCode()"> <strong>Twine Code (click to copy):</strong><br> <div class="coord-line" id="coordTwineCode"> left: 50.00%; top: 50.00%; </div> </div> </div> <div class="coord-map-container"> <div class="coord-map-wrapper" id="coordMapWrapper"> <img src="Images/Seige/Map/1.png" alt="Siege Map" id="coordMapImage"> <div class="coord-pin-container"> <div class="coord-pin" id="coordTestPin"> <div class="coord-pin-circle" id="coordPinCircle"> <span style="color: white; font-size: 20px;">1</span> </div> <div class="coord-pin-label" id="coordPinLabelDiv">Test Pin</div> </div> </div> </div> <div style="margin-top: 20px; color: #888; font-size: 12px;"> 💡 Tip: Click anywhere on the map to instantly move the pin to that location </div> </div> </div> </div> <<script>> $(document).ready(function() { const xPosSlider = document.getElementById('coordXPos'); const yPosSlider = document.getElementById('coordYPos'); const pinSizeSlider = document.getElementById('coordPinSize'); const pinLabelInput = document.getElementById('coordPinLabel'); const showLabelCheckbox = document.getElementById('coordShowLabel'); const xValueDisplay = document.getElementById('coordXValue'); const yValueDisplay = document.getElementById('coordYValue'); const sizeValueDisplay = document.getElementById('coordSizeValue'); const testPin = document.getElementById('coordTestPin'); const pinCircle = document.getElementById('coordPinCircle'); const pinLabelDiv = document.getElementById('coordPinLabelDiv'); const twineCodeDisplay = document.getElementById('coordTwineCode'); const mapImage = document.getElementById('coordMapImage'); const mapWrapper = document.getElementById('coordMapWrapper'); let currentColor = 'rgba(255, 0, 0, 0.8)'; let currentBorder = '#cc0000'; window.updateCoordPin = function() { const x = parseFloat(xPosSlider.value); const y = parseFloat(yPosSlider.value); const size = parseInt(pinSizeSlider.value); const label = pinLabelInput.value; const showLabel = showLabelCheckbox.checked; testPin.style.left = x + '%'; testPin.style.top = y + '%'; pinCircle.style.width = size + 'px'; pinCircle.style.height = size + 'px'; pinCircle.style.fontSize = (size * 0.4) + 'px'; pinLabelDiv.textContent = label; pinLabelDiv.style.display = showLabel ? 'block' : 'none'; pinCircle.style.backgroundColor = currentColor; pinCircle.style.borderColor = currentBorder; pinCircle.style.boxShadow = '0 0 10px ' + currentColor; xValueDisplay.textContent = x.toFixed(2); yValueDisplay.textContent = y.toFixed(2); sizeValueDisplay.textContent = size; twineCodeDisplay.textContent = 'left: ' + x.toFixed(2) + '%; top: ' + y.toFixed(2) + '%;'; }; window.loadCoordPreset = function(preset) { const presets = { barracks: { x: 61.04, y: 3.91, size: 60, label: 'Barracks', color: 'rgba(0, 100, 255, 0.8)', border: '#0050ff' }, vanguardPre: { x: 43.46, y: 41.21, size: 50, label: 'Vanguard Pre-Battle', color: 'rgba(0, 255, 255, 0.8)', border: '#00cccc' }, vanguardGate: { x: 62.40, y: 57.91, size: 50, label: 'Vanguard at Gate', color: 'rgba(0, 255, 255, 0.8)', border: '#00cccc' }, vanguardRetreat: { x: 29.30, y: 29.30, size: 50, label: 'Vanguard Retreat', color: 'rgba(0, 255, 255, 0.8)', border: '#00cccc' }, archers: { x: 91.80, y: 4.88, size: 50, label: 'Archers', color: 'rgba(0, 200, 0, 0.8)', border: '#00aa00' }, archersRetreat: { x: 7.13, y: 6.64, size: 50, label: 'Archers Retreat', color: 'rgba(0, 200, 0, 0.8)', border: '#00aa00' }, wallDef1: { x: 33.79, y: 84.12, size: 50, label: 'Wall Defenders 1', color: 'rgba(150, 0, 255, 0.8)', border: '#9900ff' }, wallDef2: { x: 69.14, y: 36.66, size: 50, label: 'Wall Defenders 2', color: 'rgba(150, 0, 255, 0.8)', border: '#9900ff' }, courtyard: { x: 29.30, y: 29.30, size: 60, label: 'Courtyard', color: 'rgba(150, 0, 255, 0.8)', border: '#9900ff' }, gate: { x: 78.75, y: 76.31, size: 60, label: 'Gate', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' }, enemyStart: { x: 96.00, y: 85.00, size: 60, label: 'Enemy Start', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' }, enemyWall1: { x: 39.36, y: 74.75, size: 50, label: 'Enemy Wall 1', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' }, enemyWall2: { x: 78.52, y: 27.09, size: 50, label: 'Enemy Wall 2', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' }, enemySplit1: { x: 47.30, y: 94.28, size: 50, label: 'Enemy Split 1', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' }, enemySplit2: { x: 89.88, y: 41.05, size: 50, label: 'Enemy Split 2', color: 'rgba(255, 0, 0, 0.8)', border: '#cc0000' } }; const p = presets[preset]; if (p) { xPosSlider.value = p.x; yPosSlider.value = p.y; pinSizeSlider.value = p.size; pinLabelInput.value = p.label; currentColor = p.color; currentBorder = p.border; document.querySelectorAll('.coord-color-option').forEach(opt => { opt.classList.remove('active'); if (opt.dataset.color === p.color) { opt.classList.add('active'); } }); window.updateCoordPin(); } }; window.copyCoordCode = function() { const text = twineCodeDisplay.textContent; navigator.clipboard.writeText(text).then(() => { const originalText = twineCodeDisplay.textContent; twineCodeDisplay.textContent = '✓ Copied!'; twineCodeDisplay.style.color = '#4aff4a'; setTimeout(() => { twineCodeDisplay.textContent = originalText; twineCodeDisplay.style.color = '#4a9eff'; }, 1500); }); }; xPosSlider.addEventListener('input', window.updateCoordPin); yPosSlider.addEventListener('input', window.updateCoordPin); pinSizeSlider.addEventListener('input', window.updateCoordPin); pinLabelInput.addEventListener('input', window.updateCoordPin); showLabelCheckbox.addEventListener('change', window.updateCoordPin); document.querySelectorAll('.coord-color-option').forEach(option => { option.addEventListener('click', function() { document.querySelectorAll('.coord-color-option').forEach(opt => opt.classList.remove('active')); this.classList.add('active'); currentColor = this.dataset.color; currentBorder = this.dataset.border; window.updateCoordPin(); }); }); mapWrapper.addEventListener('click', function(e) { const rect = mapImage.getBoundingClientRect(); const x = ((e.clientX - rect.left) / rect.width) * 100; const y = ((e.clientY - rect.top) / rect.height) * 100; xPosSlider.value = x.toFixed(2); yPosSlider.value = y.toFixed(2); window.updateCoordPin(); }); window.updateCoordPin(); }); <</script>> <<button "Back">><<goto "Barracks">><</button>> <</nobr>>
<<nobr>> <!-- Victory! Clear siege state and return forces --> <<set $BeingSeiged = false>> <!-- Return all surviving forces to barracks --> <<if typeof $CourtyardDefenders !== "undefined" && $CourtyardDefenders.length > 0>> <<for _i to 0; _i < $CourtyardDefenders.length; _i++>> <<run $BarraksOccupance.push($CourtyardDefenders[_i])>> <</for>> <</if>> <<if typeof $SeigeWallForce !== "undefined" && $SeigeWallForce.length > 0>> <<for _i to 0; _i < $SeigeWallForce.length; _i++>> <<run $BarraksOccupance.push($SeigeWallForce[_i])>> <</for>> <</if>> <<if typeof $SeigeVanguardForce !== "undefined" && $SeigeVanguardForce.length > 0>> <<for _i to 0; _i < $SeigeVanguardForce.length; _i++>> <<run $BarraksOccupance.push($SeigeVanguardForce[_i])>> <</for>> <</if>> <!-- Calculate rewards --> <<set _capturedCount = typeof $SiegeCaptives !== "undefined" ? $SiegeCaptives.length : 0>> <<set _armorReward = random(1, 2)>> <<set _weaponReward = random(1, 2)>> <<set _goldReward = random(50, 150)>> <!-- Apply rewards --> <<if typeof $ArmouryArmour === "undefined">><<set $ArmouryArmour = 0>><</if>> <<if typeof $ArmourySwords === "undefined">><<set $ArmourySwords = 0>><</if>> <<if typeof $Gold === "undefined">><<set $Gold = 0>><</if>> <<set $ArmouryArmour += _armorReward>> <<set $ArmourySwords += _weaponReward>> <<set $Gold += _goldReward>> <!-- Reduce notoriety (successful defense lowers reputation as target) --> <<if typeof $Notoriety === "undefined">><<set $Notoriety = 0>><</if>> <<if $Notoriety > 0>> <<set $Notoriety -= 1>> <</if>> <!-- Clear combat arrays --> <<set $CourtyardDefenders = []>> <<set $CourtyardEnemies = []>> <<set $SeigeWallForce = []>> <<set $SeigeVanguardForce = []>> <<set $WallEnemies = []>> <<set $DeadVanguard = []>> <<set $DeadWallDefenders = []>> <<set $DeadArchers = []>> <<set $DeadCourtyardDefenders = []>> <div class="text-box victory-scene"> <h1 style="color: #2a7c2a; text-align: center;">Victory!</h1> <div class="victory-narrative"> <p>The last bandit falls, and a weary cheer rises from your defenders. The assault is broken. Bodies litter the courtyard and walls, but they are enemy dead.</p> <p>Your forces stand bloodied but triumphant. The castle is secure. The raiders who survive flee into the forest, their assault shattered against your walls.</p> <p>As the dust settles, you survey the aftermath. Your people move through the battlefield, collecting weapons and armor from the fallen enemies. The defense has cost you, but you have held.</p> <<if _capturedCount > 0>> <p style="color: #9400d3; font-style: italic;">Your corrupted servants have converted <<print _capturedCount>> of the bandits to your cause. They now serve you willingly, their minds twisted by demonic influence.</p> <</if>> </div> <div class="victory-summary"> <h2>The Spoils of Victory</h2> <div class="rewards-box"> <h3 style="color: #2a7c2a;">Rewards</h3> <div class="reward-category"> <h4>Gold Looted</h4> <p>Your forces recover <strong><<print _goldReward>> gold</strong> from the enemy dead.</p> </div> <div class="reward-category"> <h4>Equipment Salvaged</h4> <p>Recovered <strong><<print _armorReward>> <<if _armorReward === 1>>suit<<else>>suits<</if>> of armor</strong> from fallen bandits.</p> <p>Claimed <strong><<print _weaponReward>> <<if _weaponReward === 1>>sword<<else>>swords<</if>></strong> from enemy warriors.</p> </div> <<if _capturedCount > 0>> <!-- Initialize dungeon variables if needed --> <<if typeof $DungonOccupance === "undefined">><<set $DungonOccupance = []>><</if>> <<if typeof $CellsCount === "undefined">><<set $CellsCount = 0>><</if>> <<if typeof $prisonerIdCounter === "undefined">><<set $prisonerIdCounter = 1>><</if>> <!-- Process each captive --> <<set _addedToDungeon = 0>> <<set _soulsDrained = 0>> <<set _drainedBy = "">> <<for _i to 0; _i < $SiegeCaptives.length; _i++>> <<set _captive = $SiegeCaptives[_i]>> <<if $DungonOccupance.length < $CellsCount>> <!-- Add to dungeon --> <<if _captive.gender === "Male">> <<set _int = random(1, 10)>> <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "male", hairColor: "Brown", ImagePath: "Images/Castle/Dungon/Men/Bandit/" + _int + ".png", corruption: 0, status: "Clothed" })>> <<else>> <!-- Female captive --> <<set _hairColors = ["Brown", "Red", "Blonde"]>> <<set _NPCHairColor = _hairColors[random(0, 2)]>> <<set _int = random(1, 15)>> <<run $DungonOccupance.push({ prisonerId: $prisonerIdCounter++, name: "Bandit", sex: "Female", hairColor: _NPCHairColor, ImagePath: "Images/Castle/Dungon/Woman/" + _NPCHairColor + "/Clothed/" + _int + ".png", corruption: 0, status: "Clothed" })>> <</if>> <<set _addedToDungeon += 1>> <<else>> <!-- No room in dungeon - drain their soul --> <<set _soulsDrained += 1>> <<if _captive.corruptedBy === "Lucy">> <<set _drainedBy = "Lucy">> <<elseif _captive.corruptedBy === "Alice">> <<set _drainedBy = "Alice">> <<else>> <!-- If corrupted by someone else, randomly assign to Lucy or Alice --> <<set _drainedBy = random(1, 2) === 1 ? "Lucy" : "Alice">> <</if>> <</if>> <</for>> <!-- Display results --> <<if _addedToDungeon > 0>> <div class="reward-category" style="border-color: #9400d3;"> <h4>Corrupted Captives - Imprisoned</h4> <p><strong><<print _addedToDungeon>> <<if _addedToDungeon === 1>>bandit has<<else>>bandits have<</if>></strong> been locked in your dungeon cells.</p> <p style="font-size: 0.9em; color: #d8bfd8;">They await further corruption and training in the dungeons below.</p> </div> <</if>> <<if _soulsDrained > 0>> <div class="reward-category" style="border-color: #9400d3;"> <h4>Souls Consumed</h4> <p><strong><<print _soulsDrained>> <<if _soulsDrained === 1>>captive<<else>>captives<</if>></strong> could not be imprisoned due to lack of dungeon space.</p> <p style="color: purple; font-style: italic;"><<print _drainedBy>> has drained their souls to sustain herself.</p> <!-- Display soul drain image --> <<set _drainImageNum = Math.ceil(random(1, 3))>> <<if _drainedBy === "Lucy">> <<set _drainPath = "Images/Seige/Lucy/" + _drainImageNum + ".png">> <<else>> <<set _drainPath = "Images/Seige/Alice/" + _drainImageNum + ".png">> <</if>> <div style="text-align: center; margin: 15px 0;"> <img @src="_drainPath" alt="Soul Drain" style="max-width: 100%; max-height: 400px; border-radius: 5px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);"> <p style="color: #9c27b0; font-style: italic; margin-top: 10px;"><<print _drainedBy>> feeds on the corrupted souls, their essence fueling her demonic power.</p> </div> </div> <</if>> <</if>> <div class="reward-category"> <h4>Surviving Defenders</h4> <p>All surviving forces have returned to the barracks to rest and recover.</p> <!-- Count defenders excluding Lucy and Alice --> <<set _humanDefenders = 0>> <<set _lucySurvived = false>> <<set _aliceSurvived = false>> <<if $BarraksOccupance && $BarraksOccupance.length > 0>> <<for _i to 0; _i < $BarraksOccupance.length; _i++>> <<if $BarraksOccupance[_i].name === "Lucy">> <<set _lucySurvived = true>> <<elseif $BarraksOccupance[_i].name === "Alice">> <<set _aliceSurvived = true>> <<else>> <<set _humanDefenders += 1>> <</if>> <</for>> <</if>> <<if $SeigeArcherForce && $SeigeArcherForce.length > 0>> <<for _i to 0; _i < $SeigeArcherForce.length; _i++>> <<if $SeigeArcherForce[_i].name !== "Lucy" && $SeigeArcherForce[_i].name !== "Alice">> <<set _humanDefenders += 1>> <</if>> <</for>> <</if>> <<if _humanDefenders > 0>> <p><strong><<print _humanDefenders>> <<if _humanDefenders === 1>>defender<<else>>defenders<</if>></strong> survived the battle.</p> <</if>> <<if _lucySurvived>> <p style="color: #9400d3;">Lucy fought alongside your forces and survived.</p> <</if>> <<if _aliceSurvived>> <p style="color: #9400d3;">Alice fought alongside your forces and survived.</p> <</if>> <!-- Check if Lucy or Alice were banished --> <<set _lucyBanished = false>> <<set _aliceBanished = false>> <<if typeof $DeadVanguard !== "undefined" && $DeadVanguard.length > 0>> <<for _i to 0; _i < $DeadVanguard.length; _i++>> <<if $DeadVanguard[_i].name === "Lucy">> <<set _lucyBanished = true>> <<elseif $DeadVanguard[_i].name === "Alice">> <<set _aliceBanished = true>> <</if>> <</for>> <</if>> <<if typeof $DeadWallDefenders !== "undefined" && $DeadWallDefenders.length > 0>> <<for _i to 0; _i < $DeadWallDefenders.length; _i++>> <<if $DeadWallDefenders[_i].name === "Lucy">> <<set _lucyBanished = true>> <<elseif $DeadWallDefenders[_i].name === "Alice">> <<set _aliceBanished = true>> <</if>> <</for>> <</if>> <<if typeof $DeadCourtyardDefenders !== "undefined" && $DeadCourtyardDefenders.length > 0>> <<for _i to 0; _i < $DeadCourtyardDefenders.length; _i++>> <<if $DeadCourtyardDefenders[_i].name === "Lucy">> <<set _lucyBanished = true>> <<elseif $DeadCourtyardDefenders[_i].name === "Alice">> <<set _aliceBanished = true>> <</if>> <</for>> <</if>> <<if _lucyBanished>> <p style="color: #9400d3; font-style: italic;">Lucy was banished during the fighting, but will reform in her chambers.</p> <</if>> <<if _aliceBanished>> <p style="color: #9400d3; font-style: italic;">Alice was banished during the fighting, but will reform in her chambers.</p> <</if>> </div> </div> </div> <div style="text-align: center; margin: 30px 0;"> <<if typeof $SiegeCaptives !== "undefined" && $SiegeCaptives.length > 0>> <<button "Finish the seige" class="victory-btn">> <<goto "Base Intro">> <</button>> <<else>> <<button "Return to Barracks" class="victory-btn">> <<goto "Barracks">> <</button>> <</if>> </div> </div> <style> /* Victory scene container */ .victory-scene { position: relative; background: linear-gradient(to bottom, #0a2a0a 0%, #001a00 100%); color: #d0d0d0; } .victory-image { text-align: center; margin: 20px 0; } .victory-image img { max-width: 100%; height: auto; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5); } .victory-narrative { margin: 20px 0; padding: 20px; background-color: rgba(42, 124, 42, 0.1); border-left: 4px solid #2a7c2a; border-radius: 4px; } .victory-narrative p { margin: 15px 0; line-height: 1.6; } .victory-summary { margin: 30px 0; } .victory-summary h2 { color: #2a7c2a; text-align: center; margin-bottom: 20px; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); } .rewards-box { background-color: rgba(0, 0, 0, 0.4); padding: 20px; border-radius: 8px; border: 2px solid #2a7c2a; } .rewards-box h3 { color: #2a7c2a; margin-bottom: 20px; text-align: center; font-size: 1.3em; } .reward-category { margin: 20px 0; padding: 15px; background-color: rgba(42, 124, 42, 0.1); border-left: 4px solid #2a7c2a; border-radius: 4px; } .reward-category h4 { color: #4a9c4a; margin-bottom: 10px; font-size: 1.1em; } .reward-category p { margin: 8px 0; line-height: 1.5; } .victory-btn { padding: 15px 40px; background: linear-gradient(to bottom, #2a7c2a 0%, #1a5c1a 100%); border: 2px solid #4a9c4a; border-radius: 8px; color: white; font-weight: bold; font-size: 1.1em; cursor: pointer; transition: all 0.3s; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5); } .victory-btn:hover { background: linear-gradient(to bottom, #3a8c3a 0%, #2a6c2a 100%); transform: translateY(-2px); box-shadow: 0 4px 8px rgba(42, 124, 42, 0.5); } .victory-btn:active { transform: translateY(0); } /* Combat Table and Card Styles */ .combat-table { background: linear-gradient(to bottom, #2a1a0a 0%, #1a0a00 100%); border: 2px solid #8b4513; border-radius: 8px; min-height: 80px; padding: 15px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.5); } .character-card.card { background: linear-gradient(to bottom, #f4e4bc 0%, #e6d3a3 100%); border: 3px solid #8b4513; border-radius: 8px; width: 140px; min-height: 200px; padding: 8px; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.2); font-family: 'Cinzel', serif; color: #2c1810; position: relative; display: flex; flex-direction: column; } .character-card.card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.4), 0 0 15px rgba(139, 69, 19, 0.3); } .card-type { text-align: center; font-size: 0.7em; font-weight: bold; text-transform: uppercase; letter-spacing: 1px; padding: 2px 4px; border-radius: 3px; margin-bottom: 5px; } .card-type.spell { background: linear-gradient(to right, #4b0082, #6a0dad); color: white; } .card-name { text-align: center; font-weight: bold; font-size: 0.9em; margin-bottom: 8px; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.3); line-height: 1.1; } .card-image { text-align: center; height: 80px; width: 80px; margin: 0 auto 8px auto; display: flex; align-items: center; justify-content: center; background: linear-gradient(to bottom, #f0f0f0 0%, #d0d0d0 100%); border: 1px solid #999; border-radius: 4px; position: relative; overflow: hidden; } .card-image img { width: 100%; height: 100%; object-fit: cover; border-radius: 3px; } .card-stats { display: flex; flex-direction: column; flex-grow: 1; } .more-captives { margin-left: 15px; } </style> <</nobr>>
<<nobr>> <div class="text-box"> <<set $BJDealersLoss to 1>> <<set _dealer to random(1, 5)>> <<set $BJDealer to _dealer>> <<if _dealer is 1>> <<set $BJDealersLossMax to 7>> <<elseif _dealer is 2>> <<set $BJDealersLossMax to 5>> <<elseif _dealer is 3>> <<set $BJDealersLossMax to 7>> <<elseif _dealer is 4>> <<set $BJDealersLossMax to 6>> <<else>> <<set $BJDealersLossMax to 5>> <</if>> <<set $BJDealerLineInt to 0>> You enter to find a woman standing behind a table, she gives you a warm smile <<set _imagePath to "Images/Town/Inn/Dealer/" + $BJDealer + "/1.png">> <<say 'Dealer' _imagePath>>Welcome, would you like to play a game?<</say>> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <div style="text-align: center; margin-top: 20px;"> <<if $Gold >= 50>> <<button "Take a seat">> <<goto "hearts-blackjack">> <</button>> <<if $ScarldaleBJGameWone is true>> <<button "Choose a dealer">> <<goto "BJDealerSelection">> <</button>> <</if>> <<else>> You cannot aford to play the game <</if>> <br> <<button "Leave">> <<goto "ScarldaleTavLord">> <</button>> </div> <</nobr>>
<<nobr>> <<set _dealerLossLines = { "1": [ "Let me start by taking this belt off", "Thats better, feel free to get more comfortable too", "Fine, fine I'll remove my dress", "Do you like by lingerie? Keep playing if you want to see the rest", "You're actually doing quite well... off comes my shirt", "Get a good look, its the best view your getting", "What should I take off next...", "Awww did you think you were going to see my breasts? You need to keep playing for that", "Fine, the bra can come off... Don't loose too much focus", "You're very good at this... Do you like my breasts? I'll let you touch them if you win", "Well done! I supose I can slide the rest off for you", "Well... Im naked, so I suppose you win!", "Shit... Ok look, I can't tell my boss I've lost all this money, so maybe you can give me a tip? I'll make it up to you?", "Thank you so much... Ok, let me get on my knees for you", "Well... I think that much of a tip deserves a big thank you... How about you fuck me right now", "You've got a nice tasty cock", "Oh, cuck you fuck like a beast..." ], "2": [ "Well played Sir... I suppose you want me to take something off? I can do that", "There we go...", "You win again... Ok, I'll remove my shirt", "I like showing myself off to you Sir", "Oh, I suppose I should take something else off...", "Do you like me petite breasts?", "Well... I don't have much left on...", "I suppose you win!", "Err, I'm sorry to ask Sir... but maybe you can help me... I could do with a tip?", "Thank you so much... Ok, let me get on my knees for you", "Well... I think that much of a tip deserves a big thank you... How about you fuck me right now", "I hope this shows my appreciation", "Oh-Oh gods... You can cum inside me if you like?" ], "3": [ "Lucky... Ill take braces off for now", "Don't look so disapointed. The rest will come off... If you keep winning", "Good boy... I supose my top can come off for now", "There we go, do you want to see whats underneath?", "You're luck will run out soon... And I still have some clothes on", "Yes I'm wearing red panties... If you want to see the rest youll have to keep playing", "Fine-Fine I'll take the shirt off", "I bet you didn't expect this under my clothes. Want me to take it off?", "You should have lost a few more rounds do you could continue enjoying the view", "Aha, you wanted to see my breasts?", "And finally, my panties are on the floor", "Damn, I suppose you win...", "Shit... Ok look, I can't tell my boss I've lost all this money, so maybe you can give me a tip? I'll make it up to you?", "Thank you so much... Ok, let me get on my knees for you", "Well... I think that much of a tip deserves a big thank you... How about you fuck me right now", "Ummm, is that good?", "Fuck don't stop big boy..." ], "4": [ "I'll remove my cardigan, it's a little warm in here anyway", "There we go... Shall we continue", "Ok, ok... let me just unfasten my skirt", "I promise you want to see whats under this shirt, keep playing", "Ugh... Ok but my shirt is the last thing which is coming off", "Do you like what you see?", "Fine, you can see my breasts, I hope it takes you off your game...", "I'll move my hands soon... I promis", "Well... You win I suppose", "I hope you feel good about winning", "Shit... Ok look, I can't tell my boss I've lost all this money, so maybe you can give me a tip? I'll make it up to you?", "Thank you so much... Ok, let me get on my knees for you", "Well... I think that much of a tip deserves a big thank you... How about you fuck me right now", "I'm gona suck you dry!", "Oh fuck! You better come back and win again so you can fuck me" ], "5": [ "Fine fine... Ill take SOMETHING off as a little reward", "Oh, did you think I was going to take my dress off so soon? No", "Well played, I'll slip this dress off, but I promise you'll be going home with lighter pockets", "Umm do you prefer me with or without the dress?", "Well... I wasn't wearing any panties... So the bar is staying on for now", "I hope you don't mind if I tough myself just a bit? Undressing for you is getting me turned on", "Well done... I guess I should take this bra off now", "Ahh, fine you win...", "Shit... Ok look, I can't tell my boss I've lost all this money, so maybe you can give me a tip? I'll make it up to you?", "Thank you so much... Ok, let me get on my knees for you", "Well... I think that much of a tip deserves a big thank you... How about you fuck me right now", "Ugh, I don't do this too often but I do like this cock", "Oh fuck, do-don't think I let just any lucky card player do this" ] }>> <</nobr>>
<<nobr>> <div class="text-box"> <<set _img to "Images/Town/Inn/Dealer/" + $BJDealer + "/" + $BJDealersLoss + ".png">> <<include "BJDealerLines">> <<set _dealerKey to String($BJDealer)>> <<set _selectedLine to _dealerLossLines[_dealerKey][$BJDealerLineInt]>> <<say 'Dealer' _dealerImg>><<print _selectedLine>><</say>> <div class="Random-image"> <img @src=_img alt="Guest Image"> </div> <<if $Position is "25">> You stand and watch the woman show her gratitude on her knees, swallowing your cock as best she can<br><br> <<set $BJDealerLineInt to $BJDealerLineInt + 2>> <<else>> The dealer bends over and you waste no time taking her and using her like a cheap whore<br><br> <<set $BJDealerLineInt to $BJDealerLineInt + 2>> <</if>> <<set _dealerKey to String($BJDealer)>> <<set _selectedLine to _dealerLossLines[_dealerKey][$BJDealerLineInt]>> <<say 'Dealer' _dealerImg>><<print _selectedLine>><</say>> <br> <<button "Leave">> <<set $ScarldaleBJGameWone to true>> <<set $Position to "Start">> <<goto "ScarldaleTavLord">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<if $AliceBarKnowJob is false>> <<say 'Alice' $AliceTavImg>>So... $AliceBarMeetName, tell me what use you are to me<</say>> <<say '$AliceBarMeetName' $CharImg>>I'm just a simple $AliceBarMeetJob, mistress<</say>> <<else>> <<say 'Alice' $AliceTavImg>>Sooo.... you're a $AliceBarMeetJob yes?<</say>> <<say '$AliceBarMeetName' $CharImg>>Yes, mistress<</say>> <</if>> <<if $AliceBarMeetJob is "Guard">> <<say 'Alice' $AliceTavImg>>Lets see... I need you to help me get an audiance with someone at the main hall tomorrow<</say>> <<say '$AliceBarMeetName' $CharImg>>Of course....<</say>> <<say 'Alice' $AliceTavImg>>That's a good boy, now come join me in the bed Im not done with you yet<</say>> You take him back to his bed and enjoy his efforts at satifying your unquenchable desired till you both fall asleep <<button "The next morning">> <<goto "AliceTavGuard">> <</button>> <<elseif $AliceBarMeetJob is "Farm hand">> <<say 'Alice' $AliceTavImg>>Tomorrow, you're going to give me a little tour of your farm and show me your grain stores... Understood?<</say>> <<say '$AliceBarMeetName' $CharImg>>I... yes mistress<</say>> <<say 'Alice' $AliceTavImg>>That's a good boy, now come join me in the bed Im not done with you yet<</say>> You take him back to his bed and enjoy his efforts at satifying your unquenchable desired till you both fall asleep <<button "The next morning">> <<goto "AliceTavFarm">> <</button>> <<elseif $AliceBarMeetJob is "Clerk">> <<say 'Alice' $AliceTavImg>>Lets see... Tomorrow I'm going to stop by your office and we can discuss your uses, understood?<</say>> <<say '$AliceBarMeetName' $CharImg>>Of course....<</say>> <<say 'Alice' $AliceTavImg>>That's a good boy, now come join me in the bed Im not done with you yet<</say>> You take him back to his bed and enjoy his efforts at satifying your unquenchable desired till you both fall asleep <<button "The next morning">> <<goto "AliceTavClerk">> <</button>> <<else>> <<say 'Alice' $AliceTavImg>>A merchant? $AliceName will be happy... Tomorrow you're going to show me your shop<</say>> <<say '$AliceBarMeetName' $CharImg>>Of course....<</say>> <<say 'Alice' $AliceTavImg>>That's a good boy, now come join me in the bed Im not done with you yet<</say>> You take him back to his bed and enjoy his efforts at satifying your unquenchable desired till you both fall asleep <<button "The next morning">> <<goto "AliceTavMerchant">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> In the morning, obaying your orders the merchant leads you to his store, its a small general store with supplies <<say 'Alice' _CharProfileIMG>>Humm, soo many nice things... Don't worry I won't take too much... We need to be subtle and a you suddenly going out of business may draw some eyes<</say>> You pause survaying this stock <<say '$AliceBarMeetName' $CharImg>>Take what you need mistress<</say>> <<if $IronPeakVisited is true>> <<set _ironFinds to random(1, 3)>> <</if>> <<set _goldFinds to random(50, 200)>> <<set _grainFinds to random(30, 100)>> <<set _meadFinds to random (2, 10)>> In his stock you see:<br> <<if $IronPeakVisited is true>> Iron: _ironFinds<br> <</if>> Gold: _goldFinds<br> Grain: _grainFinds<br> Mead: _meadFinds<br><br> Choose one and retun to the castle:<br> <<if $IronPeakVisited is true>> <<button "Iron">> <<set $Iron to $Iron + _ironFinds>> <<goto "Base Intro">> <</button>><br> <</if>> <<button "Gold">> <<set $Gold to $Gold + _goldFinds>> <<goto "Base Intro">> <</button>><br> <<button "Grain">> <<set $Grain to $Grain + _grainFinds>> <<goto "Base Intro">> <</button>><br> <<button "Mead">> <<set $Mead to $Mead + _meadFinds>> <<goto "Base Intro">> <</button>><br> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<set _grainFinds to random(500, 150)>> <<set _meadFinds to random (2, 10)>> In the morning, the young farm hand leads you to the outskirts and into some farm land which feeds the town. He leads you to an office and you look over the paperwork <<say 'Alice' _CharProfileIMG>>Oh... Your grain stores are full and you have some mead... Lovely. Don't worry, I wont take too much, just deliver _grainFinds grain and _meadFinds mead to this location<</say>> <<say '$AliceBarMeetName' $CharImg>>As you say<</say>> <<say 'Alice' _CharProfileIMG>>Good boy<</say>> <<button "Return to the castle">> <<set $Grain to $Grain + _grainFinds>> <<set $Mead to $Mead + _meadFinds>> <<goto "Base Intro">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> In the morning, the guard follows your orders exactly, leading you to the town hall. A second guard stops you for a moment <<Guard>>Halt, this area is off limits to the public<</Guard>> <<say '$AliceBarMeetName' $CharImg>>It's ok, she's with me<</say>> <<Guard>>$AliceBarMeetName? I didn't recognise you without your uniform... As you were<</Guard>> You pass the guard and continue into the large hall <<say 'Alice' _CharProfileIMG>>Well done... Now help me find a clerks office<</say>> As you order, he leads you to a small area with wooden doors, before stopping and gesturing to a door <<say '$AliceBarMeetName' $CharImg>>Here... There's a clerk in this office. I know him and he will do what you say with some convincing...<</say>> <<say 'Alice' _CharProfileIMG>>Good boy, now go home sleep<</say>> You can tell he does not want to leave your side but he obays without another word... Leaving you alone <<button "Enter the office">> <<goto "AliceTavGuard1">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> Opening the door, you step inside and see a man writing at his desk. He doesn't stop to look at you <<set _goldFinds to random(50, 200)>> <<set _grainFinds to random(30, 100)>> <<set _meadFinds to random (2, 10)>> <<say 'Clerk' $CharImg>>Yes<</say>> <<say 'Alice' _CharProfileIMG>>I've come to make a request<</say>> <<say 'Clerk' $CharImg>>All requests are handled by the lords I suggest you make an audiance with them<</say>> You step closer and place a hand on his desk covering the paper work he was reading <<say 'Clerk' $CharImg>>Didn't you hear me...<</say>> He looks up and pauses<br><br> <<set _rand to random(3, 4)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' _CharProfileIMG>>Surely you can help me out?<</say>> <<say 'Clerk' $CharImg>>I...<</say>> You walk around the front of his desk and take a seet, opening your legs. A page on his desk catches your eye, picking it up you read it<br><br> <<set _rand to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' _CharProfileIMG>>Oh... Look at this, lets see a delivery of _goldFinds gold and _grainFinds grain oh and _meadFinds bottls of mead... I think you made a mistake on here<</say>> Looking down at him, he's staring at your pussy, you place a finger under his chin and guide his eyes up to you <<say 'Alice' _CharProfileIMG>>Did you make a mistake on his paperwork?<</say>> <<say 'Clerk' $CharImg>>I... I don't<</say>> Grabbing the back of his head you guide his face between your legs, he doesn't resist<br><br> <<set _rand to random(5, 6)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' _CharProfileIMG>>I think we need to fix this... It's clearly going to the wrong location<</say>> You release him from your grip <<say 'Clerk' $CharImg>>That's a lot of resources to loose<</say>> <<say 'Alice' _CharProfileIMG>>I'm sure bandits raid your caravans all the time...<</say>> Sliding off the desk, you bend over the desk and lift up your skirt, his ands start exploring your ass, groping your cheeks<br><br> <<set _rand to random(3, 4)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/Behind/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> His will saps away and a thumbles with his trousers to fish out his cock, and clumbserly press it between your thighs<br><br> <<set _rand to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/Behind/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Clerk' $CharImg>>Fuck...<</say>> You feel warmth flood into you and try not to giggle at how short the fun was <<say 'Alice' _CharProfileIMG>>Now... About this paperwork I need this caravan to go here...<</say>> You hand him a note with instructions and leave<br><br> <<button "Return to the castle">> <<set $Gold to $Gold + _goldFinds>> <<set $Grain to $Grain + _grainFinds>> <<set $Mead to $Mead + _meadFinds>> <<goto "Base Intro">> <</button>> <</nobr>>
<<nobr>> <div class="text-box"> Opening the door, you see $AliceBarMeetName writing at this desk, he notices you and stops all work <<say '$AliceBarMeetName' $CharImg>>How may I assist?<</say>> You stroll over to his desk and prech youself on top, taking a hand full of paperwork <<set _goldFinds to random(50, 200)>> <<set _grainFinds to random(30, 100)>> <<set _meadFinds to random (2, 10)>> <<set _rand to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' _CharProfileIMG>>Lets see... taxes... Goats... Pertitions...<</say>> The pages slip though your fingers making a mess of his desk till one catches your eye <<say 'Alice' _CharProfileIMG>>Oh... Look at this, lets see a delivery of _goldFinds gold and _grainFinds grain oh and _meadFinds bottls of mead... Hummm<</say>> You notice hes started licking your pussy and try not to laugh at the pathetic show <<set _rand to random(5, 6)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Alice' _CharProfileIMG>>Ummm, I think you're going to make a change to where this is taken, understood?<</say>> He moans into your pussy and you take that as a yes<br><br> Finding his attempts at pleasuing you mediocore, you pull him away. Then, taking a quill you note down where you want the delivery of the goods and leave him to his work<br><br> <<button "Return to the castle">> <<set $Gold to $Gold + _goldFinds>> <<set $Grain to $Grain + _grainFinds>> <<set $Mead to $Mead + _meadFinds>> <<goto "Base Intro">> <</button>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $Position is "pussy">> In a slow move, Lucy straddles you and crawls up the bed, for a moment you hope shes about to ride you, but then she crawls higher up you until her cunt rests just above your chin<br> <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/15.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>Oh, did you think you were going to fuck me with your cock? No no, I have one final game for us to play<</say>> Without thinking, your tongue slips out your mout and you strain your neck trying to reach her but her knees pin your sholder in place<br> <<say 'Lucy' $LucySexImg>>Greedy! So eager but you don't even know the rules! Well... You can win if you make me cum before you pass out ok?<</say>> <<You>>Wh-<</You>> She rolles her hips into you cutting you off and forcing your head down into the bed as her thighs and cunt smother you <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/17.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>Ummm, thats it eat me $LucyName<</say>> You try to push her off, but your body is numb the only part of yourself under your control is your tongue so you as you're told <<say 'Lucy' $LucySexImg>>Keep going... Almost...<</say>> Her words seem father away as the cornor of your vision starts to fade <<say 'Lucy' $LucySexImg>>There!<</say>> <<else>> <<say 'Lucy' $LucySexImg>>Oh you want to fuck my ass? Ok... But, I did say I was board of your cock, so we'll use your tonge instead<</say>> Crawling onto the floor, you lower your face to her ass and take hold of her thighs, you hessitate for a moment but some force pulls you into her as you burry your faces into her soft ass and you touge finds her hole <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/rim5.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<say 'Lucy' $LucySexImg>>Thats it... fuck, I need to lay down you're making my knees shake<</say>> She crawls forward onto the bed and you follow, keeping your ass glued to her. Once Lucy is comfortable you push deeper, forgoing air to push further and smother yourself. She coos as you do, and then begins to moan loudly <<set _imagePath to "Images/Castle/Lucy/Fuck/FDom/rim6.png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> You quickly realise its been a while since you last drew breath but something is keeping you pinned in service to her <<say 'Lucy' $LucySexImg>>Keep going... Almost...<</say>> Her words seem father away as the cornor of your vision starts to fade <<say 'Lucy' $LucySexImg>>There!<</say>> <</if>> <<button "Things go black">><<fadeToPassage "LucyFuckDom3">><</button>> </div> <</nobr>>
<<nobr>> <<set _settlement to $CapturedLocations[$CultFeedSettlementId]>> <!-- Get the succubus from cult staff --> <<set _succubus to null>> <<if _settlement.buildings && _settlement.buildings.cult && _settlement.buildings.cult.staff && _settlement.buildings.cult.staff.length > 0>> <<set _succubus to _settlement.buildings.cult.staff[0]>> <</if>> <!-- Extract hair color from ImagePath if not already set --> <<if _succubus && !_succubus.hairColor && _succubus.ImagePath>> <<set _pathParts to _succubus.ImagePath.split("/")>> <<set _succubus.hairColor to _pathParts[_pathParts.length - 2]>> <</if>> <!-- Find the selected villager by NPCID --> <<set _villager to null>> <<if _settlement.populatedBuildings>> <<for _houseId, _houseData range _settlement.populatedBuildings>> <<if Array.isArray(_houseData) && _houseData.length > 0>> <!-- Direct array format --> <<for _resident range _houseData>> <<if _resident.NPCID === $CultFeedTargetNPCID>> <<set _villager to _resident>> <<break>> <</if>> <</for>> <<elseif _houseData.residents && _houseData.residents.length > 0>> <!-- Nested residents format --> <<for _resident range _houseData.residents>> <<if _resident.NPCID === $CultFeedTargetNPCID>> <<set _villager to _resident>> <<break>> <</if>> <</for>> <</if>> <<if _villager>><<break>><</if>> <</for>> <</if>> <div class="text-box"> <h1>Offering a Soul</h1> <hr> <<if !_succubus>> <p>Error: No succubus found at the cult shrine.</p> <<button "Return">> <<goto "Settlement_Cult">> <</button>> <<elseif !_villager>> <p>Error: No villager selected.</p> <<button "Return">> <<goto "Settlement_Cult">> <</button>> <<else>> <!-- Both succubus and villager are present --> <p>You lead <<print _villager.name || _villager.job || "the villager">> into the cult shrine where <<print _succubus.name>> awaits.</p> <<say '_succubus.name' _succubus.ImagePath>> Ah, a fresh soul for me to devour... How generous, my Lord. <</say>> <<if _villager.ImagePath>> <div class="villager-image" style="text-align: center; margin: 20px 0;"> <img @src="_villager.ImagePath" alt="<<print _villager.name || _villager.job || 'Villager'>>" style="max-width: 300px; border-radius: 8px; border: 1px solid #555;"> </div> <</if>> <p><<print _villager.name || _villager.job || "The villager">> looks nervous, but the succubus's power is already beginning to work on them...</p> <<if _succubus.hairColor is "Red">><<set _color to "R">><</if>> <<if _succubus.hairColor is "Brown">><<set _color to "BR">><</if>> <<if _succubus.hairColor is "Blonde">><<set _color to "BL">><</if>> <<if _villager.sex is "Male">> <<set _imgPath to "Images/Raids/Building/Cult/" + _color + "-M.png">> <div class="Random-image"> <img @src="_imgPath" alt="Guest Image"> </div> <<else>> <<set _vColor to "BR">> <<if _villager.hairColor is "Red">><<set _vColor to "R">><</if>> <<if _villager.hairColor is "Brown">><<set _vColor to "BR">><</if>> <<if _villager.hairColor is "Blonde">><<set _vColor to "BL">><</if>> <<set _imgPath to "Images/Raids/Building/Cult/" + _color + "-" + _vColor + ".png">> <div class="Random-image"> <img @src="_imgPath" alt="Guest Image"> </div> <</if>> <p>You leave <<print _villager.name || _villager.job || "The villager">> to her fate, feeding the hunger of <<print _succubus.name>></p> <<button "Continue">> <!-- Reduce succubus hunger --> <<if _succubus.hunger > 0>> <<set _succubus.hunger to 7>> <<set $CapturedLocations[$CultFeedSettlementId].buildings.cult.staff[0].hunger = _succubus.hunger>> <</if>> <!-- Remove villager from settlement --> <<set _removed to false>> <<if _settlement.populatedBuildings>> <<for _houseId, _houseData range _settlement.populatedBuildings>> <<if Array.isArray(_houseData)>> <<for _i = 0; _i < _houseData.length; _i++>> <<if _houseData[_i].NPCID === _villager.NPCID>> <<run _settlement.populatedBuildings[_houseId].splice(_i, 1)>> <<set _removed to true>> <<break>> <</if>> <</for>> <</if>> <<if _removed>><<break>><</if>> <</for>> <</if>> <!-- Update settlement --> <<set $CapturedLocations[$CultFeedSettlementId] = _settlement>> <<goto "Settlement_Cult">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <style> input[type=range].shipment-slider { width: 160px; } input[type=range].shipment-slider::-webkit-slider-thumb { background-color: #ff4444; } input[type=range].shipment-slider::-moz-range-thumb { background-color: #ff4444; } input[type=range].shipment-slider::-ms-thumb { background-color: #ff4444; } input[type=range].shipment-slider::-webkit-slider-runnable-track, input[type=range].shipment-slider::-moz-range-track, input[type=range].shipment-slider::-ms-track { background-color: #660000; } </style> <<set _settlement to $CapturedLocations[$currentSettlementId]>> <<if !_settlement>> <p>Error: No settlement selected.</p> <<goto "CapturedLocations">> <</if>> <<if !_settlement.shipments>> <<set _settlement.shipments = []>> <</if>> <!-- Determine current shipment target --> <<set _currentTargetName = "None">> <<if typeof _settlement.shippingTargetId === 'number' && _settlement.shippingTargetId >= 0 && _settlement.shippingTargetId < $CapturedLocations.length>> <<set _target = $CapturedLocations[_settlement.shippingTargetId]>> <<if _target>> <<set _currentTargetName = _target.name>> <</if>> <</if>> <!-- Estimate daily production for key resources (same logic style as overview) --> <<silently>> <<set _grainPerDay = 0>> <<set _woodPerDay = 0>> <<set _meadPerDay = 0>> <<set _toolsPerDay = 0>> <<set _goldPerDay = 0>> <<if _settlement.buildings>> <!-- Lumber Mill → Wood --> <<if _settlement.buildings.lumberMill && _settlement.buildings.lumberMill.staff && _settlement.buildings.lumberMill.staff.length > 0>> <<set _lumberStaff = _settlement.buildings.lumberMill.staff>> <<for _i = 0; _i < _lumberStaff.length; _i++>> <<if _lumberStaff[_i].job && _lumberStaff[_i].job.toLowerCase() === "lumber jack">> <<set _woodPerDay += random(10, 15)>> <<else>> <<set _woodPerDay += random(5, 10)>> <</if>> <</for>> <</if>> <!-- Farm → Grain --> <<if _settlement.buildings.farm && _settlement.buildings.farm.staff && _settlement.buildings.farm.staff.length > 0>> <<set _farmStaff = _settlement.buildings.farm.staff>> <<for _i = 0; _i < _farmStaff.length; _i++>> <<if _farmStaff[_i].job && _farmStaff[_i].job.toLowerCase() === "farmer">> <<set _grainPerDay += random(5, 6)>> <<else>> <<set _grainPerDay += random(2, 3)>> <</if>> <</for>> <</if>> <!-- Tavern → Gold & Mead (approximate) --> <<if _settlement.buildings.tavern && _settlement.buildings.tavern.staff && _settlement.buildings.tavern.staff.length > 0>> <<set _tavernStaff = _settlement.buildings.tavern.staff>> <<for _i = 0; _i < _tavernStaff.length; _i++>> <<if _tavernStaff[_i].job && _tavernStaff[_i].job.toLowerCase() === "tavern keep">> <<set _goldPerDay += random(8, 12)>> <<else>> <<set _goldPerDay += random(5, 10)>> <</if>> <<if _tavernStaff[_i].job && _tavernStaff[_i].job.toLowerCase() === "brewer">> <<set _meadPerDay += random(2, 3)>> <<else>> <<set _meadPerDay += random(1, 2)>> <</if>> <</for>> <</if>> <!-- Forge → Tools --> <<if _settlement.buildings.forge && _settlement.buildings.forge.staff && _settlement.buildings.forge.staff.length > 0>> <<set _forgeStaff = _settlement.buildings.forge.staff>> <<for _i = 0; _i < _forgeStaff.length; _i++>> <<if _forgeStaff[_i].job && _forgeStaff[_i].job.toLowerCase() === "blacksmith">> <<set _toolsPerDay += random(3, 5)>> <<else>> <<set _toolsPerDay += random(1, 3)>> <</if>> <</for>> <</if>> <</if>> <!-- Build list of resources this settlement can export (from produces/Export) --> <<set _resources = []>> <<if _settlement.produces && Array.isArray(_settlement.produces)>> <<for _i = 0; _i < _settlement.produces.length; _i++>> <<set _p = _settlement.produces[_i]>> <<if !_resources.includes(_p)>> <<set _resources.push(_p)>> <</if>> <</for>> <<elseif _settlement.Export && Array.isArray(_settlement.Export)>> <<for _i = 0; _i < _settlement.Export.length; _i++>> <<set _p = _settlement.Export[_i]>> <<if !_resources.includes(_p)>> <<set _resources.push(_p)>> <</if>> <</for>> <<elseif _settlement.Export && typeof _settlement.Export === "string">> <<if !_resources.includes(_settlement.Export)>> <<set _resources.push(_settlement.Export)>> <</if>> <</if>> <</silently>> <div class="text-box"> <h1>Manage Shipments - <<print _settlement.name>></h1> <p>Set up daily shipments of resources produced here to another settlement. Shipments will only send if the origin keeps at least your minimum stock.</p> <!-- Settlement overview cards, similar to CapturedLocations --> <div id="settlements-container" style="display: flex; flex-wrap: wrap; justify-content: center; gap: 20px; margin-top: 10px;"> <<for _i to 0; _i < $CapturedLocations.length; _i++>> <<capture _s _cardIndex>> <<set _cardIndex to _i>> <<set _s to $CapturedLocations[_i]>> <<set _totalCapacity to 0>> <<if _s.populatedBuildings>> <<for _entry range Object.entries(_s.populatedBuildings)>> <<set _buildingId to _entry[0]>> <<set _building to _entry[1]>> <<set _baseType to _buildingId.replace(/\s*\d+$/, '')>> <<if _baseType !== "Guard House">> <<set _maxOccupants = { "House": 3, "Guard House": 2, "Manor House": 4, "Tavern": 5, "Church": 2, "Camp": 4, "Barn": 1 }[_baseType] || 0>> <<set _totalCapacity += _maxOccupants>> <</if>> <</for>> <</if>> <<set _isCurrent to (_cardIndex === $currentSettlementId)>> <<set _isTarget to (typeof _settlement.shippingTargetId === 'number' && _settlement.shippingTargetId === _cardIndex)>> <div style="text-align: center; margin: 10px; width: 250px; border: 2px solid <<print _isCurrent ? '#ffd700' : (_isTarget ? '#4caf50' : '#ccc')>>; padding: 10px; border-radius: 5px; background: rgba(0,0,0,0.5);"> <img @src="_s.imagePath" alt="<<_s.name>>" style="width: 220px; height: 220px; object-fit: cover;"> <h3><<print _s.name>></h3> <<if _isCurrent>> <p style="color: #ffd700; font-weight: bold;">Origin</p> <<elseif _cardIndex !== $currentSettlementId>> <p>Destination: <<if _isTarget>><span style="color: #4caf50; font-weight: bold;">Current Target</span><<else>>Not Selected<</if>></p> <<button "Send from here to " + _s.name>> <<set _settlement.shippingTargetId = _cardIndex>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <<goto "SettlementShipments">> <</button>> <</if>> </div> <</capture>> <</for>> </div> <h2 style="margin-top: 20px;">Destination Settlement</h2> <p>Current destination: <strong><<print _currentTargetName>></strong></p> <<if _settlement.shipments && _settlement.shipments.length > 0>> <h3>Active Shipments</h3> <div style="margin-bottom: 15px;"> <<for _sIdx = 0; _sIdx < _settlement.shipments.length; _sIdx++>> <<set _ship = _settlement.shipments[_sIdx]>> <<if !_ship>> <<continue>> <</if>> <<set _resName = _ship.resource || "?">> <<set _daily = Number(_ship.dailyAmount) || 0>> <<set _min = Number(_ship.minStock) || 0>> <div style="display: flex; justify-content: space-between; align-items: center; padding: 6px 10px; margin: 4px 0; background: rgba(0,0,0,0.5); border: 1px solid #555; border-radius: 4px;"> <div> <strong><<print _resName>></strong> <span style="color: #ccc;"> - <<print _daily>>/day, keep at least <<print _min>></span> <<if _currentTargetName !== "None">> <span style="color: #8fc785;"> → <<print _currentTargetName>></span> <</if>> </div> <div> <<button "Delete">> <<set _settlement.shipments = _settlement.shipments.filter(s => s && s.resource !== _resName)>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <<goto "SettlementShipments">> <</button>> </div> </div> <</for>> </div> <</if>> <<if _resources.length === 0>> <p>This settlement has no defined exportable resources.</p> <<else>> <h2>Resource Shipments</h2> <p>For each resource, set how much to send each day and the minimum stock to keep here. Daily production numbers are estimates based on current staffing.</p> <<for _ri = 0; _ri < _resources.length; _ri++>> <<set _resName = _resources[_ri]>> <!-- Map resource to current stock and estimated production --> <<set _currentStock = 0>> <<set _estPerDay = 0>> <<switch _resName>> <<case "Grain">> <<set _currentStock = _settlement.grainReserves || 0>> <<set _estPerDay = _grainPerDay>> <<case "Mead">> <<set _currentStock = _settlement.meadReserves || 0>> <<set _estPerDay = _meadPerDay>> <<case "Tools">> <<set _currentStock = _settlement.toolReserves || 0>> <<set _estPerDay = _toolsPerDay>> <<case "Wood">> <<set _currentStock = _settlement.woodReserves || 0>> <<set _estPerDay = _woodPerDay>> <<case "Gold">> <<set _currentStock = _settlement.goldReserves || 0>> <<set _estPerDay = _goldPerDay>> <</switch>> <!-- Find existing config for this resource --> <<set _config = null>> <<if _settlement.shipments && Array.isArray(_settlement.shipments)>> <<for _ci = 0; _ci < _settlement.shipments.length; _ci++>> <<if _settlement.shipments[_ci].resource === _resName>> <<set _config = _settlement.shipments[_ci]>> <<break>> <</if>> <</for>> <</if>> <<if !_config>> <<set _config = { resource: _resName, dailyAmount: 0, minStock: 0 }>> <</if>> <!-- Initialize UI variables per known resource type --> <<if _resName === "Grain">> <<set $ShipmentGrainDaily = _config.dailyAmount || 0>> <<set $ShipmentGrainMin = _config.minStock || 0>> <<elseif _resName === "Mead">> <<set $ShipmentMeadDaily = _config.dailyAmount || 0>> <<set $ShipmentMeadMin = _config.minStock || 0>> <<elseif _resName === "Tools">> <<set $ShipmentToolsDaily = _config.dailyAmount || 0>> <<set $ShipmentToolsMin = _config.minStock || 0>> <<elseif _resName === "Wood">> <<set $ShipmentWoodDaily = _config.dailyAmount || 0>> <<set $ShipmentWoodMin = _config.minStock || 0>> <<elseif _resName === "Gold">> <<set $ShipmentGoldDaily = _config.dailyAmount || 0>> <<set $ShipmentGoldMin = _config.minStock || 0>> <</if>> <div style="margin: 10px 0; padding: 10px; border: 1px solid #444; border-radius: 5px; background: rgba(0,0,0,0.5);"> <h3 style="margin-top: 0;"><<print _resName>></h3> <p>Current stock: <<print Math.floor(_currentStock)>></p> <p>Estimated daily production: <<print Math.floor(_estPerDay || 0)>></p> <div style="display: flex; flex-wrap: wrap; gap: 10px; align-items: center;"> <div> <label><strong>Send per day:</strong></label><br> <span style="font-size: 0.9em; color: #aaa;">(0–10 units per day)</span><br> <<if _resName === "Grain">> <input type="range" min="0" max="10" step="1" value="<<print Number($ShipmentGrainDaily) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentGrainDaily = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentGrainDaily>></span> <<elseif _resName === "Mead">> <input type="range" min="0" max="10" step="1" value="<<print Number($ShipmentMeadDaily) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentMeadDaily = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentMeadDaily>></span> <<elseif _resName === "Tools">> <input type="range" min="0" max="10" step="1" value="<<print Number($ShipmentToolsDaily) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentToolsDaily = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentToolsDaily>></span> <<elseif _resName === "Wood">> <input type="range" min="0" max="10" step="1" value="<<print Number($ShipmentWoodDaily) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentWoodDaily = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentWoodDaily>></span> <<elseif _resName === "Gold">> <input type="range" min="0" max="10" step="1" value="<<print Number($ShipmentGoldDaily) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentGoldDaily = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentGoldDaily>></span> <</if>> </div> <div> <label><strong>Minimum stock to keep:</strong></label><br> <<set _minSliderMax = Math.max(100, Math.floor(_currentStock || 0))>> <span style="font-size: 0.9em; color: #aaa;">(0–<<print _minSliderMax>> kept here)</span><br> <<if _resName === "Grain">> <input type="range" min="0" max="<<print _minSliderMax>>" step="1" value="<<print Number($ShipmentGrainMin) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentGrainMin = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentGrainMin>></span> <<elseif _resName === "Mead">> <input type="range" min="0" max="<<print _minSliderMax>>" step="1" value="<<print Number($ShipmentMeadMin) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentMeadMin = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentMeadMin>></span> <<elseif _resName === "Tools">> <input type="range" min="0" max="<<print _minSliderMax>>" step="1" value="<<print Number($ShipmentToolsMin) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentToolsMin = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentToolsMin>></span> <<elseif _resName === "Wood">> <input type="range" min="0" max="<<print _minSliderMax>>" step="1" value="<<print Number($ShipmentWoodMin) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentWoodMin = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentWoodMin>></span> <<elseif _resName === "Gold">> <input type="range" min="0" max="<<print _minSliderMax>>" step="1" value="<<print Number($ShipmentGoldMin) || 0>>" class="shipment-slider" oninput="State.variables.ShipmentGoldMin = parseInt(this.value)||0; this.nextElementSibling.textContent = ' ' + this.value;"> <span><<print $ShipmentGoldMin>></span> <</if>> </div> </div> <p style="font-size: 0.85em; color: #aaa; margin-top: 5px;">If current stock is at or below the minimum, no shipment will be sent that day.</p> </div> <</for>> <div style="margin-top: 15px; text-align: center;"> <<button "Save Shipment Settings">> <<set _newShipments = []>> <!-- Build shipment configs from UI variables; zero/blank values are ignored --> <<if typeof $ShipmentGrainDaily !== 'undefined' && (Number($ShipmentGrainDaily) || 0) > 0>> <<run _newShipments.push({ resource: "Grain", dailyAmount: Number($ShipmentGrainDaily) || 0, minStock: Number($ShipmentGrainMin) || 0 })>> <</if>> <<if typeof $ShipmentMeadDaily !== 'undefined' && (Number($ShipmentMeadDaily) || 0) > 0>> <<run _newShipments.push({ resource: "Mead", dailyAmount: Number($ShipmentMeadDaily) || 0, minStock: Number($ShipmentMeadMin) || 0 })>> <</if>> <<if typeof $ShipmentToolsDaily !== 'undefined' && (Number($ShipmentToolsDaily) || 0) > 0>> <<run _newShipments.push({ resource: "Tools", dailyAmount: Number($ShipmentToolsDaily) || 0, minStock: Number($ShipmentToolsMin) || 0 })>> <</if>> <<if typeof $ShipmentWoodDaily !== 'undefined' && (Number($ShipmentWoodDaily) || 0) > 0>> <<run _newShipments.push({ resource: "Wood", dailyAmount: Number($ShipmentWoodDaily) || 0, minStock: Number($ShipmentWoodMin) || 0 })>> <</if>> <<if typeof $ShipmentGoldDaily !== 'undefined' && (Number($ShipmentGoldDaily) || 0) > 0>> <<run _newShipments.push({ resource: "Gold", dailyAmount: Number($ShipmentGoldDaily) || 0, minStock: Number($ShipmentGoldMin) || 0 })>> <</if>> <<set _settlement.shipments = _newShipments>> <<set $CapturedLocations[$currentSettlementId] = _settlement>> <<goto "SettlementOverview">> <</button>> </div> <</if>> <div style="margin-top: 15px; text-align: center;"> <<button "Back to Overview">> <<goto "SettlementOverview">> <</button>> </div> </div> <</nobr>>
<!-- SummonToChambersMale passage --> <<nobr>> <div class="text-box"> <h1>Summon to Chambers</h1> <p>Select a character to summon to your chambers:</p> <!-- Barracks Characters Section --> <div style="margin-bottom: 30px; border: 1px solid #555; padding: 15px; border-radius: 5px;"> <h2 style="text-align: center; margin-top: 0;">Barracks Guards</h2> <<set _maleBarracksCharacters = $BarraksOccupance.filter(prisoner => prisoner.sex === "Male" && prisoner.specialization !== "Succubus")>> <<if _maleBarracksCharacters.length === 0>> <p>There are no male guards available in the barracks.</p> <<else>> <div style="display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 20px;"> <<for _i to 0; _i < _maleBarracksCharacters.length; _i++>> <<capture _prisoner>> <<set _prisoner to _maleBarracksCharacters[_i]>> <div style="text-align: center; margin: 10px; width: 200px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_prisoner.ImagePath" alt="<<_prisoner.name>>" style="width: 180px; height: 180px; object-fit: cover;"> <h3><<print _prisoner.name>></h3> <<button "Summon">> <<set $currentPrisonerId to _prisoner.prisonerId>> <<set $selectedCharacterSource = "barracks">> <<if $CurrentPlayer is "Lucy">> <<goto "CharacterInChambersLucy">> <<else>> <<goto "CharacterInChambersAlice">> <</if>> <</button>> </div> <</capture>> <</for>> </div> <</if>> </div> <!-- Living Quarters Characters Section --> <div style="margin-bottom: 30px; border: 1px solid #555; padding: 15px; border-radius: 5px;"> <h2 style="text-align: center; margin-top: 0;">Living Quarters Subjects</h2> <<if !$QuartersOccupance || $QuartersOccupance.length === 0>> <p>There are no characters available in the living quarters.</p> <<else>> <<set _maleQuartersResidents = $QuartersOccupance.filter(resident => resident.sex === "Male")>> <<if _maleQuartersResidents.length === 0>> <p>There are no male residents in the living quarters.</p> <<else>> <div style="display: flex; flex-wrap: wrap; justify-content: flex-start; gap: 20px;"> <<for _i to 0; _i < _maleQuartersResidents.length; _i++>> <<capture _resident>> <<set _resident to _maleQuartersResidents[_i]>> <div style="text-align: center; margin: 10px; width: 200px; border: 1px solid #ccc; padding: 10px; border-radius: 5px;"> <img @src="_resident.ImagePath" alt="<<_resident.name>>" style="width: 180px; height: 180px; object-fit: cover;"> <h3><<print _resident.name>></h3> <<button "Summon">> <<set $currentPrisonerId to _resident.prisonerId>> <<set $selectedCharacterSource = "quarters">> <<if $CurrentPlayer is "Lucy">> <<goto "CharacterInChambersLucy">> <<else>> <<goto "CharacterInChambersAlice">> <</if>> <</button>> </div> <</capture>> <</for>> </div> <</if>> <</if>> </div> </div> <div style="text-align: center"> <<button "Return">> <<goto "LucyBase">> <</button>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _LucyImg to "Images/Castle/Lucy/Fuck/Standing/2.png">> You wait for _character.name to come to your chambers. After a short while theres a knock at the door and he enters <<say '_character.name' _character.ImagePath>>You summoned me Mistress?<</say>> Welcoming him in, you close the door behind him, he seems nervous around you, unsure what to do. Enjoying the silence, you dial up his unease by allowing the red robe you were waring to fall off your body <<set _imgPath to "Images/Castle/Lucy/Fuck/2.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say 'Lucy' _LucyImg>>How have you been<</say>> He hesitates, caught somewhere between lust and unease. You relish in the moment enjoying the power you hold without even needing to use your dominating skills <<say '_character.name' _character.ImagePath>>Well, Mistress<</say>> <<say 'Lucy' _LucyImg>>Good... Undress<</say>> He looks confused and uneasy, but follows your commands removing his garments. His manhood springs out infront of you and you drop to your knees to get a better look <<set _imgPath to "Images/Castle/Lucy/Fuck/NPC/1.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<set _wants to ["bj", "sex", "cul"]>> <<set _int to random(0, 2)>> <<set _want to _wants[_int]>> <<say '_character.name' _character.ImagePath>>Mistress, it would not be right for me to-<</say>> <<say 'Lucy' _LucyImg>>Shhh, I asked you a question... I'll ask again, if I was some drunk taven girl you brought home... How would you use me?<</say>> You can see his lust overcoming his discomfort as he realises whats in store for him <<if _want is "bj">> <<say '_character.name' _character.ImagePath>>Your mouth... I want to feel your lips around me<</say>> <<button "Give him what he wants">> <<set $Position to _want>> <<goto "CharacterInChambersLucyBJ">> <</button>> <<button "Have him satify you">> <<set $Position to _want>> <<goto "CharacterInChambersLucyCul">> <</button>> <<elseif _want is "sex">> <<say '_character.name' _character.ImagePath>>I'd fuck you till my legs gave in<</say>> <<button "Give him what he wants">> <<set $Position to _want>> <<goto "CharacterInChambersLucySex">> <</button>> <<button "Have him satify you">> <<set $Position to _want>> <<goto "CharacterInChambersLucyCul">> <</button>> <<else>> <<say '_character.name' _character.ImagePath>>I'd worship you, taste your juices till you were satified<</say>> <<button "Have him satify you">> <<set $Position to _want>> <<goto "CharacterInChambersLucyCul">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _LucyImg to "Images/Castle/Lucy/Fuck/Standing/2.png">> <<say 'Lucy' _LucyImg>>Its your lucy day<</say>> Dropping to your knees you take _character.name's cock into your mouth <<say '_character.name' _character.ImagePath>>Gods...<</say>> He mutters to himself watching you suck him <<set _imgPath to "Images/Castle/Lucy/Fuck/Bj/11.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> You continue sucking his cock, enjoying the moans escaping him, encouraging you to go deeper. After a while you feel his hand on the back of your head as he guides you up and down his manhood<br><br> <<set _int to random(9, 10)>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Bj/" + _int + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <br><br> <<say 'Lucy' _LucyImg>>I need more... Come<</say>> You lead him to the bed, lay on your back and open wide so he can fuck your face <div id="loop-img-container" style="max-width:500px; width:100%; aspect-ratio:1/1; margin:0 auto;"> <img id="loop-img" src="Images/Castle/Lucy/Fuck/Bj/bed/10.png" style="width:100%; height:100%; object-fit:contain; display:block;"> </div> As you hoped he doesn't hold back, using your throat like a cheap whore and gripping it while his cock burrys deep <br><br> <<set _imgPath to "Images/Castle/Lucy/Fuck/Bj/bed/12.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> It doesnt take long for him to start to throb and shoot cum down your throat and onto your face<br><br> <<set _imgPath to "Images/Castle/Lucy/Fuck/Bj/bed/13.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <br><br> </div> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss him">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 10)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "LucyBase">> <</button>> </div> <<else>> <<button "Dismiss him">> <<goto "LucyBase">> <</button>> <</if>> </div> <</nobr>> <script> window.loopImgPaths = [ "Images/Castle/Lucy/Fuck/Bj/bed/10.png", "Images/Castle/Lucy/Fuck/Bj/bed/11.png" ]; window.loopImgIndex = 0; window.loopImgInterval = null; window.loopImgSpeed = 300; // milliseconds, adjust as needed function validatePaths(paths){ if (!Array.isArray(paths) || paths.length === 0) return false; for (let p of paths) if (typeof p !== "string" || p.trim() === "") return false; return true; } function preloadImages(paths, cb){ let loaded = 0, errored = 0; if (!paths || paths.length === 0) return cb && cb({loaded, errored}); paths.forEach((src, i) => { const img = new Image(); img.onload = () => { loaded++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.onerror = () => { errored++; if (loaded + errored === paths.length) cb && cb({loaded, errored}); }; img.src = src; }); } function startLoopImg() { const el = document.getElementById("loop-img"); if (!el) return; el.onerror = function(){ el.style.outline = "3px solid red"; }; el.onload = function(){ el.style.outline = ""; }; if (!validatePaths(window.loopImgPaths)) { console.error("loopImgPaths invalid:", window.loopImgPaths); return; } // Set initial image el.src = window.loopImgPaths[window.loopImgIndex] || el.src; // Preload then start interval preloadImages(window.loopImgPaths, function(){ if (window.loopImgInterval) clearInterval(window.loopImgInterval); window.loopImgInterval = setInterval(function() { window.loopImgIndex = (window.loopImgIndex + 1) % window.loopImgPaths.length; el.src = window.loopImgPaths[window.loopImgIndex]; }, Number(window.loopImgSpeed) || 500); }); } function stopLoopImg() { if (window.loopImgInterval) { clearInterval(window.loopImgInterval); window.loopImgInterval = null; } } // Start/stop hooks: SugarCube events if present, otherwise page load fallback if (typeof $ === "function" && typeof $(document).on === "function") { $(document).on(':passageshow', function () { setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); $(document).on(':passagehide', function () { stopLoopImg(); }); } else { window.addEventListener("load", function(){ setTimeout(function(){ if (document.getElementById("loop-img")) startLoopImg(); }, 10); }); window.addEventListener("beforeunload", stopLoopImg); } // Immediate fallback for testing when editing the static file if (document.getElementById("loop-img")) startLoopImg(); // Expose controls window.startLoopImg = startLoopImg; window.stopLoopImg = stopLoopImg; </script>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _LucyImg to "Images/Castle/Lucy/Fuck/Standing/2.png">> <<say 'Lucy' _LucyImg>>It's your lucky day! Get on the bed<</say>> _character.name does as you ask, laying back while you straddle him. You mount him with ease and aim his cock at your slit before working down him inch by inch <<set _img to random(1, 3)>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Cg/" + _img + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> He takes control, thusting up into you over and over while enjoying your breasts <video autoplay loop> <source src="Images/Castle/Lucy/Fuck/Cg/1.webm" type="video/webm"> </video> After an anoyingly short amount of time, you hear _character.name's breath get shorter and quicker and feel he is close to the edge. So, just for fun, you slide off him and let him cum, making a mess of both of you<br><br> <<set _img to random(4, 5)>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Cg/" + _img + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div><br><br> </div> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss him">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 10)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "LucyBase">> <</button>> </div> <<else>> <<button "Dismiss him">> <<goto "LucyBase">> <</button>> <</if>> </div> <</nobr>>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _LucyImg to "Images/Castle/Lucy/Fuck/Standing/2.png">> You stand and sit on the edge of the bed <<if $Position is "bj">> _character.name steps forward expectantly and you take his cock and bring your mouth to it <<say 'Lucy' _LucyImg>>You want me to suck it do you? You want to see how much of this nice cock fits down my throat?<</say>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Cul/6.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say '_character.name' _character.ImagePath>>I do...<</say>> <<say 'Lucy' _LucyImg>>Well... Maybe later I have a job for you first<</say>> He looks disapointed as you move away from his aching cock <<elseif $Position is "sex">> _character.name steps forward expectantly you can see his aching cock waiting for you <<say 'Lucy' _LucyImg>>I bet you want to fuck me... Watch me slide down your shaft<</say>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Cul/7.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say '_character.name' _character.ImagePath>>I do...<</say>> <<say 'Lucy' _LucyImg>>Well... Maybe later I have a job for you first<</say>> He looks disapointed as you move away from his aching cock <<else>> <<say 'Lucy' _LucyImg>>Such a good boy, so eager to please<</say>> <</if>> <<say 'Lucy' _LucyImg>>Kneel<</say>> <<include "Interactable images code">> <<set _image1 to "Images/Castle/Lucy/Fuck/succSitting/4.png">> <<set _image2 to "Images/Castle/Lucy/Fuck/succSitting/5.png">> <<set _image3 to "Images/Castle/Lucy/Fuck/succSitting/6.png">> <<set $image1State = 0>> <style> #hotspot-pack { pointer-events: all !important; cursor: pointer !important; } #tooltip-pack { pointer-events: all !important; cursor: pointer !important; } </style> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> <img @src="_image3" alt="Image 3" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _tooltipText to "Remove">> <<if $image1State >= 1>><<set _tooltipText to "Take">><</if>> <<set _hotspotData to [ { x: 225, y: 350, tooltip: _tooltipText } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" id="hotspot-pack" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip" id="tooltip-pack" style="display: none;"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle" id="circle-pack"></div> </div> <</for>> </div> </div> <div id="dialogue-state-0" class="dialogue-section"> <<say 'Lucy' _LucyImg>>Take my underware off<</say>> </div> <div id="dialogue-state-1" class="dialogue-section" style="display: none;"> _character.name slips off your underware and stares as your slit <<say 'Lucy' _LucyImg>>Good boy, you can follow instructions well $LucyName must like you... Now, I want you to pleasure me with your fingers<</say>> </div> <div id="dialogue-state-2" class="dialogue-section" style="display: none;"> _character.name works his fingers into your wet slit over and over sending waves of pleasure through your body <<say 'Lucy' _LucyImg>>Fuck... Thats it<</say>> <<button "Have him lick you">> <<set $Position to "cul">> <<goto "CharacterInChambersLucyCul2">> <</button>><br> <<button "Let him continue">> <<set $Position to "finger">> <<goto "CharacterInChambersLucyCul2">> <</button>><br> </div> <<script>> $(document).ready(function() { var v = State.variables; var processing = false; $(document).off('click', '.dynamic-image-hotspot'); $('.dynamic-image-hotspot').on('click', function (ev) { ev.preventDefault(); ev.stopPropagation(); ev.stopImmediatePropagation(); if (processing) return false; processing = true; setTimeout(function() { processing = false; }, 100); var $wrapper = $('.dynamic-image-wrapper'); var $circle = $('#circle-pack'); var $hotspot = $('#hotspot-pack'); console.log('Current state before click:', v.image1State); if (v.image1State === 0) { v.image1State = 1; $wrapper.find('img').css('opacity', 0).eq(1).css('opacity', 1); $circle.css({'display': 'block', 'visibility': 'visible', 'opacity': '1'}); $hotspot.css({'display': 'block', 'visibility': 'visible', 'opacity': '1'}); $('#dialogue-state-0').hide(); $('#dialogue-state-1').show(); console.log('Advanced to state 1'); } else if (v.image1State === 1) { v.image1State = 2; $wrapper.find('img').css('opacity', 0).eq(2).css('opacity', 1); $circle.css({'display': 'none', 'visibility': 'hidden', 'opacity': '0'}); $hotspot.css({'display': 'none', 'visibility': 'hidden', 'opacity': '0'}); $('#dialogue-state-1').hide(); $('#dialogue-state-2').show(); console.log('Advanced to state 2, circle hidden'); } return false; }); }); <</script>> <</nobr>>
<<nobr>> <div class="text-box"> <<include "ChamberCharacterDialogue">> <<if $selectedCharacterSource === "barracks">> <<set _character to $BarraksOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <<else>> <<set _character to $QuartersOccupance.find(p => p.prisonerId === $currentPrisonerId)>> <</if>> <<set _LucyImg to "Images/Castle/Lucy/Fuck/Standing/4.png">> <<if $Position is "finger">> You slip off your bra and _character.name takes in the view <<include "Interactable images code">> <<set _image1 to "Images/Castle/Lucy/Fuck/succSitting/7.png">> <<set _image2 to "Images/Castle/Lucy/Fuck/succSitting/8.png">> <<set _image3 to "Images/Castle/Lucy/Fuck/succSitting/9.png">> <<set $image1State = 0>> <style> #hotspot-pack { pointer-events: all !important; cursor: pointer !important; } #tooltip-pack { pointer-events: all !important; cursor: pointer !important; } </style> <div class="dynamic-text-box"> <div class="dynamic-image-container dynamic-image-repair-mode"> <div class="dynamic-image-wrapper"> <img @src="_image1" alt="Image 1" width="500" height="500"> <img @src="_image2" alt="Image 2" width="500" height="500" style="opacity: 0;"> <img @src="_image3" alt="Image 3" width="500" height="500" style="opacity: 0;"> </div> /* Define hotspots directly in passage */ <<set _tooltipText to "Remove">> <<if $image1State >= 1>><<set _tooltipText to "Take">><</if>> <<set _hotspotData to [ { x: 225, y: 350, tooltip: _tooltipText } ]>> <<for _hotspot range _hotspotData>> <div class="dynamic-image-hotspot" id="hotspot-pack" @style="'left:' + _hotspot.x + 'px; top:' + _hotspot.y + 'px;'"> <div class="dynamic-image-tooltip" id="tooltip-pack" style="display: none;"><<print _hotspot.tooltip>></div> <div class="dynamic-image-circle" id="circle-pack"></div> </div> <</for>> </div> </div> <div id="dialogue-state-0" class="dialogue-section"> <<say 'Lucy' _LucyImg>>Get back to work<</say>> </div> <div id="dialogue-state-1" class="dialogue-section" style="display: none;"> _character.name continues, quicky pushing you closer and closer <<say 'Lucy' _LucyImg>>Fuck, thats good I... Going to cum don't stop<</say>> </div> <div id="dialogue-state-2" class="dialogue-section" style="display: none;"> _character.name keeps going as you start to cum, wanting to maximise your own pleasure, you push his hand away and tease your slit while you spray your juices over your bed and _character.name <<say 'Lucy' _LucyImg>>Gods that was good<</say>> You take a moment to catch your breath before standing <<say 'Lucy' _LucyImg>>But now you've made a mess you need to clean up<</say>> _character.name crawls over to you and behings to lick at your thighs, working his way to your clit <<set _imgPath to "Images/Castle/Lucy/Fuck/FDom/11.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> </div> <<script>> $(document).ready(function() { var v = State.variables; var processing = false; $(document).off('click', '.dynamic-image-hotspot'); $('.dynamic-image-hotspot').on('click', function (ev) { ev.preventDefault(); ev.stopPropagation(); ev.stopImmediatePropagation(); if (processing) return false; processing = true; setTimeout(function() { processing = false; }, 100); var $wrapper = $('.dynamic-image-wrapper'); var $circle = $('#circle-pack'); var $hotspot = $('#hotspot-pack'); console.log('Current state before click:', v.image1State); if (v.image1State === 0) { v.image1State = 1; $wrapper.find('img').css('opacity', 0).eq(1).css('opacity', 1); $circle.css({'display': 'block', 'visibility': 'visible', 'opacity': '1'}); $hotspot.css({'display': 'block', 'visibility': 'visible', 'opacity': '1'}); $('#dialogue-state-0').hide(); $('#dialogue-state-1').show(); console.log('Advanced to state 1'); } else if (v.image1State === 1) { v.image1State = 2; $wrapper.find('img').css('opacity', 0).eq(2).css('opacity', 1); $circle.css({'display': 'none', 'visibility': 'hidden', 'opacity': '0'}); $hotspot.css({'display': 'none', 'visibility': 'hidden', 'opacity': '0'}); $('#dialogue-state-1').hide(); $('#dialogue-state-2').show(); console.log('Advanced to state 2, circle hidden'); } return false; }); }); <</script>> <<else>> <<say 'Lucy' _LucyImg>>Ok... I have a new job for you<</say>> You lean back and collect a book from the side of your bed. <<set _imgPath to "Images/Castle/Lucy/Fuck/Cul/5.png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div> <<say 'Lucy' _LucyImg>>I'm going to read a few chapters of this book while you lick me, understood?<</say>> <<say '_character.name' _chamberImagePath>>Of course, mistress...<</say>> <<say 'Lucy' _LucyImg>>Good, best get started... I'm a slow reader<</say>> <<set _int to random(1, 4)>> <<set _imgPath to "Images/Castle/Lucy/Fuck/Cul/" + _int + ".png">> <div class="Random-image" style="max-width: 600px; margin: 0 auto;"> <img @src="_imgPath" alt="<<_character.name>> Image"> </div><br><br> He sets to work servicing you while you read for a few hours<br><br> <</if>> <div style="text-align: center"> <!-- Corruption adjust button for quarters residents --> <<if $selectedCharacterSource === "quarters">> <div style="margin-top: 10px;"> <i> _character.name's corruption has increased </i><br> <<button "Dismiss him">> <<set _prisonerIndex = $QuartersOccupance.findIndex(p => p.prisonerId === _character.prisonerId)>> <<if _prisonerIndex > -1>> <<set $QuartersOccupance[_prisonerIndex].corruption = Math.min(100, ($QuartersOccupance[_prisonerIndex].corruption || 0) + 20)>> <<set _character.corruption = $QuartersOccupance[_prisonerIndex].corruption>> <</if>> <<goto "LucyBase">> <</button>> </div> <<else>> <<button "Dismiss him">> <<goto "LucyBase">> <</button>> <</if>> </div> <</nobr>>
<!-- DEBUG: Settlement Data Display (for testing) --> <div class="debug-section" style="margin: 30px 0; padding: 15px; background: rgba(40, 40, 40, 0.9); border-radius: 8px; border: 1px dashed #666;"> <h2 style="color: #ff9966;">Debug: Settlement Data</h2> <button id="toggleDebugBtn" onclick="document.getElementById('settlementDebug').style.display = document.getElementById('settlementDebug').style.display === 'none' ? 'block' : 'none';"> Show/Hide Raw Settlement Data </button> <div id="settlementDebug" style="display: none; margin-top: 15px;"> <pre style="background: rgba(0, 0, 0, 0.7); padding: 10px; border-radius: 5px; max-height: 500px; overflow: auto; font-family: monospace; white-space: pre-wrap; word-break: break-all; color: #7FFF7F; font-size: 12px;"><<print JSON.stringify(_settlement, null, 2)>></pre> </div> </div>
<<nobr>> <div class="text-box"> <<if $LucyGlamour isnot true>> <<if $LucyFuckState is "Clothed">> <<set _img to 1>> <<elseif $LucyFuckState is "Nude">> <<set _img to 2>> <<elseif $LucyFuckState is "Underware">> <<set _img to 3>> <<else>> <<set _img to 4>> <</if>> <<else>> <<if $LucyFuckState is "Clothed">> <<set _img to 5>> <<elseif $LucyFuckState is "Nude">> <<set _img to 6>> <<elseif $LucyFuckState is "Underware">> <<set _img to 7>> <<else>> <<set _img to 8>> <</if>> <</if>> <<set $LucySexImg to "Images/Castle/Lucy/Fuck/Standing/" + _img + ".png">> <<set _imagePath to "Images/Castle/Lucy/Fuck/Standing/" + _img + ".png">> <div class="Random-image"> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<if $LucyFuckState isnot "Naked">> <<button "Undress Her">> <<if $LucyFuckState is "Clothed">> <<set $LucyFuckState to "Nude">> <<elseif $LucyFuckState is "Nude">> <<set $LucyFuckState to "Underware">> <<elseif $LucyFuckState is "Underware">> <<set $LucyFuckState to "Naked">> <</if>> <<goto "LucyFuckUndress">> <</button>> <</if>> <hr> Change Lucy's appearance<br> <<button "Glamour">> <<set $LucyGlamour to true>> <<goto "LucyFuckUndress">> <</button>> <<button "Succubus">> <<set $LucyGlamour to false>> <<goto "LucyFuckUndress">> <</button>> <hr> <<if $LucyGlamour isnot true>> <<button "Allow her to dominate you">> <<goto "LucyFuckDom">> <</button>><br> <<else>> <<button "Fuck her">> <<goto "LucyFuck">> <</button>> <</if>> </div> <</nobr>>