JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<nobr>> <div class="custom-title">Overlord</div><br> <div class="text-box"> Welcome to Overlord! A game inspired by "Dungeon Overlord" and "Adam & Gaia". This game is intended as light hearted entertainment, but it does contain themes of corruption, domination and mind control, there is also *non sexual* violence. <b>All sexual acts depicted are intended as consentual and all characters depicted are over the age of 18 and fictional</b><br><br> Are you over the age of 18? <br><br> <<button "Yes">> <<goto "Intro">> <</button>><br><br> <<button "Yes (skip Into)">> <<set $VisitedVault to true>> <<set $VisitedDungeon to true>> <<set $VisitedChambers to true>> <<set $VisitedDefences to true>> <<run Engine.play('PlayerCreation2')>> <</button>><br> </div> <div class="text-box"> Note from the developer...<br><br> Hi, thanks so much for trying my game, this is definatly a working progress, so there will be bugs, typos and unfinished content. Please feel free to report any to me.<br>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!<br><br> Thanks,<br><br> North<br><br> </div> <div class="text-box"> <h2>Audio Settings</h2> This game uses videos and audio files. By defult the videos are muted. You can customise this below. You can change these settings later... <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 (sound effects)</h3> <<button "Toggle Audio Sound">> <<toggleAudioSound>> <</button>> <span id="audioStatus"> <<if $audioMuted>> Audio is currently muted. <<else>> Audio is currently unmuted. <</if>> </span> <div id="output"> </div> <</nobr>> <<addclass "#right-ui-bar" "stowed">>
<div class="text-box"> <p style="font-family:Arial;font-size:40px;font-style:normal;font-weight:normal;color:#FFFFFF;">Introduction</p> Decades have passed since the Dark Sorcerer last cast his shadow over the land. His once formidable presence, which struck terror into the hearts of the bravest knights and most cunning thieves, had faded into legend. One night, the ground trembled as ancient wards shattered, and a foreboding presence reawakened. The Dark Sorcerer had returned, drawn back by a mysterious force, and with him came the promise of renewed terror and untold power. In this game you play as a scorcerer with the power to cast spells and steal souls. You will set out with the goal of re-establishing your dominion over the area. However, be warned as the towns foke will hear about your return soon and will try to stop you. You must upgrade your castle, find followers and become more powerful. But be careful, as there are darker things out there than even you... <<button "Continue">> <<goto "PlayerCreation2">> <</button>> </div>
<div class="text-box"> <<nobr>> <<if $Question is "null">> You enter your decrepit and collapsing castle, sacked by the local villagers and reclaimed by nature Walking through the rubble, you find a a small figure approaching<br> <div align="center"> <img src="Images/Castle/Gnarlak/1.png" width="700" height="700"> </div> <<Gnarlak>>Lord, you have returned!<</Gnarlak>><br> <<You>>Who are you?<</You>><br> <<Gnarlak>>I am Gnarlak my lord, I have looked after the castle while you have been gone<</Gnarlak>><br> <<You>>This place is falling apart<</You>><br> <<Gnarlak>>I am sorry my lord, I have not been able to secure the resourses we need to keep the castle maintained<</Gnarlak>><br> <<Gnarlak>>But now you are back we can rebuild!<</Gnarlak>><br> <<You>>How?<</You>><br> <<Gnarlak>>I will deal with everything my Lord, you need need to bring me the resources and possibly gold to construct repairs and upgrades to your will<</Gnarlak>><br> <<Gnarlak>>We still have some rooms which are useable, my Lord. I have made sure your personal chambers are pristine, we also have some dungeons and a few rooms which can be used for defences<</Gnarlak>><br> <<button "Tell me about the dungeons">><<set $Question to "Dungeon">><<run Engine.play('GnarlakEncounter')>><</button>><br> <<button "Tell me about the defences">><<set $Question to "Defences">><<run Engine.play('GnarlakEncounter')>><</button>><br> <</if>> <<if $Question is "Dungeon">> <<Gnarlak>>Ah the dungeon! Yes we have a few cells in there for your "future subjects", we also have the capacity to build more, upon your request. I will explain it more when you next visit<</Gnarlak>><br> <<button "What about the defences">><<set $Question to "Defences">><<run Engine.play('GnarlakEncounter')>><</button>><br> <<button "We are done for now">><<set $Question to "Done">><<run Engine.play('GnarlakEncounter')>><</button>> <</if>> <<if $Question is "Defences">> <<Gnarlak>>Of course my Lord, word will soon spread that you have returned and some "would be heroes" or thieves looking for gold will come to raid the castle. We will look at it in more detail when you are next in the room<</Gnarlak>><br> <<button "Tell me about the dungeons">><<set $Question to "Dungeon">><<run Engine.play('GnarlakEncounter')>><</button>><br> <<button "We are done for now">><<set $Question to "Done">><<run Engine.play('GnarlakEncounter')>><</button>> <</if>> <<if $Question is "Done">> <<Gnarlak>>Of course my Lord, as you familiarise yourself with your castle I will make sure everything makes sence, I'm am afraid that in my old age all I am good for is council and building improvements<</Gnarlak>><br> <<button "leave">> <<script>> UI.alert("New Quest! <br>Visit each area of the base"); <</script>> <<set $Quest1 to true>> <<run $Quests.push("Visit each area of the base")>> <<run Engine.play('Base Intro')>> <</button>> <</if>> <</nobr>> </div>
<<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> <h1>Courtyard</h1> <br> <div class="menu-item" data-image="Images/Castle/Portal/1.png"> [[Enter the castle|Inside Castle]] </div> <div class="menu-item" data-image="Images/Castle/Defences/Wallpaper.png"> [[Manage Defences|Defences]] </div> <<if $BarracksUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Barracks/1.png"> [[Visit the Barracks|Barracks]] </div> <</if>> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Courtyard|CourtyardTraining]] </div> <br> <hr> <h1>Explore</h1> <br> <<if $Time < 9>> <<if $OwnesHorse is false>> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Explore the area]] </div><</if>> <<if $OwnesHorse is true>> <div class="menu-item" data-image="Images/Town/6.png"> [[Ride to the coast|South]] </div> <<if $InnPurchased is true>> <div class="menu-item" data-image="Images/Town/Inn/Rooms/FOH/1.png"> [[Visit your inn|Inn]] </div> <</if>> <<if $ArmouryVisisted isnot true>> <div class="menu-item disabled" data-image="Images/Mountains/1.png"> Progress further before visiting the mountains </div> <<elseif $PortalVisited isnot true>> <div class="menu-item disabled" data-image="Images/Mountains/1.png"> Build and visit the portal room before visiting the mountains </div> <<elseif $IronPeakVisited is true>> <div class="menu-item" data-image="Images/Mountains/1.png"> [[Ride to the mountains|Ironpeak Outpost]] </div> <<else>> <div class="menu-item" data-image="Images/Mountains/1.png"> [[Ride to the mountains|North]] </div> <</if>> <div class="menu-item" data-image="Images/Forrest/Exploring/Path/1.png"> [[Explore the forest|East]] </div> <div class="menu-item disabled" data-image="Images/Plains/1.png"> Ride to the plains (in dev) </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Horse/1.png"> You need a horse to explore further </div> <</if>> <<else>> <div class="menu-item disabled" data-image="Images/Forrest/Exploring/Path/1.png"> It's too late to go out </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: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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>> <<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>>
<div class="text-box"> <<nobr>> <<if $VisitedVault is false>> <<include "DialogueStorage">> <<startdialogue "_TutorialVault">> <</if>> Gold: $Gold<br> Wood: $Wood<br> Stone: $Stone<br> <<set $ImagePath to "Images/Castle/Vault/2.jpg">> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <<button "Leave">> <<goto "Inside Castle">> <</button>> <</nobr>> <<set $VisitedVault to true>> </div>
<div class="text-box"> <<nobr>> <h1>Defences</h1> <<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>> You can currently space for $DefenceCount defence(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 class="text-box"> You Set out...<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 "Head for the forest">> <<goto "East">> <</button>> <</if>> <<addclass "#right-ui-bar" "stowed">> </div> <</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 $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 forst">> <<goto "ForestExplore">> <</button>> <br> <<button "Return home">> <<goto "Base Intro">> <</button>> <<addclass "#right-ui-bar" "stowed">> </div> <</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">>
The Planes... In Development [[Return|Base Intro]]
<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()>>
<<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.jpg">> <<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 walk along side the river following it deeper into the forest [[Continue|River 2]] <<return "Return">> </div>
<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>> <<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/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> <</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.jpg">> <<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 "WeaponData">> <<include "CombatCSS">> <<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>>
<<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>> <<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"> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Your Chambers</p><br> <hr> <div class="menu-item" data-image="Images/Castle/Chambers/5.png"> [[Upgrade the castle|BaseManagement]] </div> <<if typeof $CapturedLocations === 'undefined'>> <<else>> <<if $CapturedLocations.length >= 1>> <div class="menu-item" data-image="Images/Castle/Chambers/7.png"> [[Read daily settlement reports|SettlementReports]] </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"> Explore the rest of the castle before resting </div> <<else>> <div class="menu-item" data-image="Images/Icons/EndDay.png"> [[End Day]] </div><</if>> <<if $TarotCardInvet.includes("Hermit")>> <div class="menu-item" data-image="Images/Castle/Chambers/6.png"> <<link "Meditate">> <<run setup.closeEyesAndTransition('Meditate')>> <</link>> </div> <</if>> <div class="menu-item" data-image="Images/Crypt/Chamber/1.png"> [[Visit the hall of lords|HallOfLords]] </div> <div class="menu-item" data-image="Images/Castle/Portal/1.png"> [[Leave your chambers|Castle Chambers]] </div> </div> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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>> <<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>
<div class="text-box"> <<nobr>> <<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 === $currentLocationid)>> <<set $currentRaidLocation = _location>> <<set $currentRaidParty = $RaidingParty.filter(raider => raider !== null)>> <<run console.log("Raid Location:", $currentRaidLocation)>> <<run console.log("Raid Party:", $currentRaidParty)>> <<if $Strategy is "Capture">> <<goto "RaidResultsCapture">> <<elseif $Strategy is "Pillage">> <<goto "RaidResultsPillage">> <<else>> <<goto "RaidResultsRaze">> <</if>> <</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> Looking down to find Lucy sucking your cock <video autoplay loop> <source src="Images/Castle/Chambers/sex/4.webm" type="video/webm"> </video> <</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> <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)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 <video autoplay loop> <source src="Images/Castle/Chambers/sex/5.webm" type="video/webm"> </video> <<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)>> <<set _gender to _genders[_int]>> <<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>> <</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>>
<<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 "Noon">><</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>>
<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>You defeated the $CurrentEnemy</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 $HouseVisit isnot true>> <<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]] <<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>> The $CurrentEnemy lays dead <<run State.variables.Raiders.shift()>> <<set $RaidersNumber to $RaidersNumber - 1>> <<button "Continue Raid">><<goto "Raid">><</button>><</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>>
<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>> <<if ($Souls gt 0) and ($TarotCardInvet.includes("Strength"))>> Having the strength tarot card causes you to loose two souls<br><br> <<set $Souls to $Souls - 1>><</if>> <<if ($PlayerHealth lt 1) and ($Souls gt 0)>> <<if $BeingRaided is false>> You sactifce one of your souls and live on, reforming in your chambers...<br>[[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]] <<set $Souls to $Souls - 1>> <</if>> <<set $Souls to $Souls - 1>> <<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>> You wake up in your chambers <br> <<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 */ [[Get up|Chambers]] <</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>>
<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>> <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 $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>>
<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 $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>
<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>
<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()>>
<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 continue following the river [[Continue|River 3]] <<return "Return">> </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>>
<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>>
<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()>>
<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>> <<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>
<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>>
<<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>>
<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>
<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 trys 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>
<div class="text-box"> <<nobr>> <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>> Lucy's Power:<br> <progress @value="$LucyPower" max="30"></progress><br><br> Lucy's Hunger:<br> <progress @value="$LucyHunger" max="3"></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 "LucyFuck">> <</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>> <</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> 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> Alice's Power:<br> <progress @value="$AlicePower" max="30"></progress><br><br> Alice's Hunger:<br> <progress @value="$AliceHunger" max="3"></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>> <</nobr>> </div>
<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>
<<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>
<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>
<<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>
<<nobr>> <div class="text-box"> <<if $RaidersNumber == 0>> <<set $RaidTime to 0>> <<set $Int to 0>> <<set $Position to "null">> <<if $RaidCaptives.length >= 1>> The raid is over but you have captures some of the raiders, now you need to choose what to do with them<br><br> <<button "Continue">> <<goto "RaidCell">> <</button>> <<set $BeingRaided to false>> <<else>> The raid is over <br><br> <<button "Continue">> <<goto "Resporn">> <</button>> <<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"> 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>> <p style="font-family:Arial;font-size:22px;font-style:normal;font-weight:normal;color:#FFFFFF;">Raid Captives</p><br><br> <<if $RaidCaptives.length == 0>> You have no prisoners left to sort so you go back to your chamber to sleep till morning [[continue|Resporn]] <</if>> <<if $RaidCaptives.length >= 1>> Choose what to do with your captives...<br><br> The next captive is a: <br> <<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> <hr> <h2>Choose what to do with your captive</h2> <<button "Take soul">> <<goto "RaidOverSoul">> <</button>><br><br> <<if ($CellsCount > $DungonOccupance.length)>> <<set _int to random(1, 15)>> <<if $RaidCaptives[0].gender is "Male">> <<button "Send to dungeon">> <<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: 0, status: "Clothed"}>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<run $RaidCaptives.splice($Int, 1)>><<run Engine.show()>> <</button>><br><br> <</if>> <<if $RaidCaptives[0].gender is "Female">> <<button "Send to dungeon">> <<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: 0, status: "Clothed" }>> <<run State.variables.DungonOccupance.push($CurrentCaptive)>> <<run $RaidCaptives.splice($Int, 1)>><<run Engine.show()>> <</button>><br><br> <</if>><</if>> <<if $Notoriety gt 0>> <<button "Release (lowers notoriety)">><<set $Notoriety to $Notoriety - 10>><<run $RaidCaptives.splice($Int, 1)>> <<script>> UI.alert("You allow the terrified raider to run free, fleeing the castle in fear to spread storys of what awaits anyone who comes to your home"); <</script>> <<run Engine.show()>><</button>><br><br> <</if>> <<if $LumberMillBuilt is true>> <<if $LumberStaff < 50>> <<button "Send to lumber mill">> <<set $LumberStaff to $LumberStaff + 1>> <<run $RaidCaptives.splice($Int, 1)>>> <<run Engine.show()>><</button>> <</if>> <</if>> <<if $QuarryDiscovered is true>> <<if $QuarryStaff < 50>> <<button "Send to stone quary">> <<set $QuarryStaff to $QuarryStaff + 1>> <<run $RaidCaptives.splice($Int, 1)>>> <<run Engine.show()>><</button>> <</if>> <</if>> <hr> <h2>Give to Monster</h2> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Spider Lair">> <<capture _i>> <<button `"Give to the spider in room " + _i`>> <<set $Room = _i>> <<goto "RaidOverSpider">> <</button>> <</capture>> <</if>> <</for>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Black Pool">> <<capture _i>> <<button `"Give to the black pool in room " + _i`>> <<set $Room = _i>> <<goto "RaidOverPool">> <</button>> <</capture>> <</if>> <</for>> <<for _i = 1; _i <= 5; _i++>> <<if $Defences[_i] && $Defences[_i].name is "Guardian">> <<capture _i>> <<button `"Give to the guardian in room " + _i`>> <<set $Room = _i>> <<goto "RaidOverGuardian">> <</button>> <</capture>> <</if>> <</for>> <</if>> <</nobr>> </div>
<<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>> <<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 strenght 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 !$Defences[1]>> Defence 1: Empty<br><<else>> Defence 1: $Defences[1].name<br><</if>> <<if $DefenceCount >= 2>><<if !$Defences[2]>> Defence 2: Empty<<else>> Defence 2: $Defences[2].name<br><</if>><</if>> <<if $DefenceCount >= 3>><<if !$Defences[3]>> Defence 3: Empty<<else>> Defence 3: $Defences[3].name<br><</if>><</if>> <<if $DefenceCount >= 4>><<if !$Defences[4]>> Defence 4: Empty<<else>> Defence 4: $Defences[4].name<br><</if>><</if>> <<if $DefenceCount >= 5>><<if !$Defences[5]>> Defence 5: Empty<<else>> Defence 5: $Defences[5].name<br><</if>><</if>> <hr> <h2>Resources: </h2> Wood: $Wood<br> Stone: $Stone<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>>
<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 powerfull 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 _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>>
<<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>
<div class="text-box"> <<nobr>> <<if $Gold >= 50>> <<link "100 Wood - Costs 50 gold">><<set $Gold to $Gold - 50>><<set $Wood to $Wood + 100>><<run Engine.play('Merchant_Shop')>><</link>><<else>>Wood- Costs 50 gold (you cant afford this)<</if>><br><br> <<if $Gold >= 50>> <<link "100 Stone - Costs 50 gold">><<set $Gold to $Gold - 50>>><<set $Stone to $Stone + 100>><<run Engine.play('Merchant_Shop')>><</link>><<else>>Stone - Costs 50 gold (you cant afford this)<</if>><br><br> <<if $OwnesHorse is true>> <<else>> <<if $Gold >= 200>> <<link "Horse - Costs 200 gold">><<set $Gold to $Gold - 200>>><<set $OwnesHorse to true>><<run Engine.play('Merchant_Shop')>><</link>><<else>>Horse - Costs 200 gold (you cant afford this)<</if>><br> <</if>> <</nobr>> [[Leave|Merchant]] </div>
<div class="text-box"> <<nobr>> <<if $Wood >= 100>> <<link "Sell 100 Wood - Worth 50 gold">><<set $Gold to $Gold+ 50>><<set $Wood to $Wood - 100>><<run Engine.play('Merchant_Sell')>><</link>><<else>>You dont have any wood to sell<</if>><br><br> <<if $Stone >= 100>> <<link "Sell 100 Stone - Worth 50 gold">><<set $Gold to $Gold + 50>>><<set $Stone to $Stone - 100>><<run Engine.play('Merchant_Sell')>><</link>><<else>>You dont have any stone to sell<</if>><br><br> <<if $Pelts >= 1>> <<link "Sell 1 pelt - Worth 50 gold">><<set $Gold to $Gold + 50>>><<set $Pelts to $Pelts -= 1>><<run Engine.play('Merchant_Sell')>><</link>><<else>>You dont have any pelts to sell<</if>><br> <</nobr>> [[Leave|Merchant]] </div>
<<set $ConsoleDebug to false>> <<set $PlayerCorruption to 0>> <<set $CombatTutorialComplete to false>> <<set $PlayerSpellCards to []>> <<set $combatCardsMax to 2>> <<set $CombatCardEffects to []>> <<set $CombatCardOrder to true>> <<set $OwnedWeapons = []>> <<set $MediumWeaponSlot = true>> <<set $BackWeaponSlot = false>> <<set $PurchasedMeleeWeapons to []>> <<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>> <<widget "checkForUpdates">> <<include "UpdateCheck">> <</widget>> Config.autosave.slots = 1; Config.autosave.enabled = true; <<set $PlaceHolder to "to sort/Brunette/4154.png">> <<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'>> <<script>> window.setGivenCard = function(card) { SugarCube.State.variables.GivenCard = card; }; <</script>> <<set $mute to false>> <<set $Day to 1>> <<set $Time to 1>> <<set $PlayerHealth to 100>> <<set $PlayerMaxMagic to 20>> <<set $PlayerEnergy to 100>> <<set $PlayerPower to 5>> <<set $CurrentPlayer to "Null">> <<set $Cheats to false>> <<set $Cloaked to false>> <<set $InTown to false>> <<set $BaseLoc to "East">> <<set $PlayerSpells to ["Heal"]>> <<set $PlayerMagic to $PlayerMaxMagic>> <<set $Souls to 1>> <<set $Notoriety to 0>> <<set $MaxNotoriety to 20>> <<set $PlayerRangedWeapon to "null">> <<set $MeleeWeaponDamage to 5>> <<set $PlayerMeleeWeapon to "iron sword">> <<set $PlayerPack to "basic">> <<set $MinorHealingPotion to 2>> <<set $HealingPotion to 0>> <<set $MagicPotion to 0>> <<set $EnergyPotion to 2>> <<set $Pelts to 0>> <<set $Iron to 0>> <<set $MeleeWeaponDamage to 5>> <<set $LockPicks to 0>> <<set $ArmorDefence to 0>> <<set $MagicDamage to 10>> <<set $BaseLoc to "North">> <<set $Chamber1 to "Empty">> <<set $Chamber2 to "Empty">> <<set $Chamber3 to "Empty">> <<set $Chamber4 to "Gnarlak">> <<set $Gold to 250>> <<set $Wood to 500>> <<set $Stone to 500>> <<set $OwnesHorse to false>> <<set $DungonSpace to 4>> <<set $DungonCaptives to 0>> <<set $DefencesLevel to 1>> <<set $VaultLevel to 1>> <<set $DungonOccupance = []>> <<set $prisonerIdCounter = 0>> <<set $CellCorruption to [0, 0, 0, 0, 0]>> <<set $CellsCount to 2>> <<set $Flower to false>> <<set $Defences to [null, null, null, null, null, null]>> <<set $DefenceCount to 1>> <<set $DefenceRoom1 to "null">> <<set $DefenceRoom2 to "null">> <<set $DefenceRoom3 to "null">> <<set $DefenceRoom4 to "null">> <<set $DefenceRoom5 to "null">> <<set $AliceCorruption to 0>> <<set $LucyCorruption to 0>> <<set $LucyDefend to false>> <<set $AliceDefend to false>> <<set $LucyPower to 5>> <<set $AlicePower to 5>> <<set $LucyCorrupt to false>> <<set $AliceCorrupt to false>> <<set $LucyBrothel to false>> <<set $AliceBrothel to false>> <<set $EishethMet to false>> <<set $LucyMetInt to 0>> <<set $LucyMet to false>> <<set $LucyName to "Master">> <<set $AliceName to "Master">> <<set $MaraName to "Sir">> <<set $ForestShackDiscovered to false>> <<set $ForestMerchantDiscovered to false>> <<set $LumberMillBuilt to false>> <<set $LumberStaff to 1>> <<set $BossFight to false>> <<set $PlayerEquipment to ["Iron Sword"]>> <<set $RaidTime to 0>> <<set $BeingRaided to false>> <<set $WhichRaiders to 1>> <<set $RaidCaptives to []>> <<set $Question to "null">> <<set $Quests to []>> <<set $Quest1 to false>> <<set $Quest2 to false>> <<set $Quest3 to false>> <<set $QuestNumber to 1>> <<set $QuestCloak to false>> <<set $RiverUnlocked to false>> <<set $Flower to false>> <<set $LucyQuest to false>> <<set $LucQuestFinished to false>> <<set $MaraAtBase to false>> <<set $MaraChamberFirstVisit to true>> <<set $MaraQuestFinished to false>> <<set $HenryQuestStatus to "NotStarted">> <<set $HallGuardStatus to "Normal">> <<set $TavQuestName to "null">> <<set $TavQuestTime to 0>> <<set $TavQuest to 0>> <<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 $VisitedBathHouse to false>> <<set $VisitedScarldale to false>> <<set $VisistedScarldaleBacksmith to false>> <<set $TarotCardInvet to []>> <<set $TarotCardCount to 0>> <<set $Tip to false>> <<set $Massage to 0>> <<set $Finished to false>> <<set $NPCCum to 0>> <<set $ScarldaleTithe to "null">> <<if !$Quests>> <<set $Quests = { active: [], completed: [] }>> <</if>> :: StoryInit [nobr] <<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>> <<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>> $(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>>
<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"> <<Eisheth>>Yes, come to me<</Eisheth>> [[Continue|Cave2]] [[Leave|ForestCave]] </div>
<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>
<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>
<<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>>
<<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> <<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>> <<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"> <<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>
<<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>>
<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 powerfull 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>
<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>> <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>> <<set _int to random(0, 1)>> <<set $Time to $Time + 1>> <<set $AliceHunger to 3>> <<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 satifying 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>> <<set _int to random(0, 1)>> <<set $Time to $Time + 1>> <<set $LucyHunger to 3>> <<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 satifying 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 $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 $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>
<<if $CruptMapFound is true>> [[Crypt Map|CryptMap1]] <</if>> <<if ($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 "wait till dark">><<set $Time to 9>><<run Engine.show()>><</link>> [[Roadmap]]
<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>
<<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|Base Intro]] its getting dark<</You>><br><br> <<set $Flower to false>> <<set $LucyQuest to true>> <</if>> <<else>> <<You>>I need to hide who I really am for now<</You>><br> <</if>> <</if>> <</nobr>> </div>
<<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 simular, but different to that of your master. Like him, if you can seduce a person and make them orgasm, they are your's either to steal there 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 influance 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. Once 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<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>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>>
<<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 strenght 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>>
<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> Inn (Patreon only content) expansion - New content to come here soon<br><br> New Image pack Anime Art Style (Patreon Members Only)<br><br> Ironpeak - Full story and quests coming here<br><br> Pirates/Naval content - This hasn't been planned out fully but it's coming<br><br> Seiges - Raids on a large scale with your forces against enemy attackets<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"> 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>>
<<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>>
<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>
<<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>>
<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>
<<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>>
<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>
<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>
<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"> <<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>
<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>
<<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>
<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>
<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>> 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>> <<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>
<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>> Dispite 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>
<div class="text-box"> You deal a stike to the succubus <<set $Damage to $MeleeWeaponDamage + $PlayerPower + 3>> <<nobr>> Damage dealt: $Damage <<set $EnemyHealth to $EnemyHealth - $Damage>> <</nobr>> <<if $EnemyHealth lt 1>>[[Continue|DefeatSuccubus]]<<else>>[[Continue|SuccubusAttack]]<</if>> </div>
<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"> 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>
<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>
<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"> <<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"> <<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">>
[[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>>
<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>> <<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"> 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>
<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>>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>> <<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>> 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>> 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>> <<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>
<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>> <<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>
<<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>
<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>
<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>> <<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> <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>>
<<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 influance, 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>>
<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>> <<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>> <<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>> 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")>> The guard wont be home yet<br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <<elseif ($CurrentPlayer is "LucyCloaked")>> nothing here <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>>
<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"> <<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 vilage, 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 $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 influance 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 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>> <<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>
<<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 influance 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>>
<<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"> <<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>> <<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>
<<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>
<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>
<<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 strenght. 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>>
<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>> <<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 about the area|TavQuests]]<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 ($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"> <<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>
<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>>
<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>> <<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="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 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>
<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 $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>
<<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 influance 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>>
<<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 influance 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>>
<<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>> <<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 looses 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 influance 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 suprise 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 suprise 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 influance 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>
<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 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 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>>
<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>
<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>
<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 continue through the gravestones before finding the enterance to a crypt...<br><br> You walk over to the crypt, realing the wispering has stopped<br><br> <div align="center"> <img src="Images/Forrest/Exploring/Cemetery/3.png" width="700" height="700"> </div> [[Enter|GhoulQuestCrypt]] </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>> 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 influance 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>> <<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 influance 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 influance 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 influance 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>> <<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">>
<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>> 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 influance 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>>
<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 influance 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>> <<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"> <<nobr>> <<if ($CurrentPlayer is "LucyCloaked") and ($HallGuardStatus is "Interested")>> Vist the guards [[home|ScarldaleGuardHouse]]<br><br> <<else>> nothing here <br><br> <<button "Leave">> <<goto "Scarldale">> <</button>> <</if>> <</nobr>> </div>
<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>> 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>> 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>
<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>
<div class="text-box"> <<nobr>> <</nobr>> </div>
<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>> 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>> <<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> Dispite 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>
<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>> <<Gnarlak>>My Lord?<</Gnarlak>><br><br> <<You>>I found something in the forest<</You>><br><br> <<Gnarlak>>What was it?<</Gnarlak>><br><br> <<You>>I am not sure... It was like a wolf, but much larger and it stood like a man<</You>><br><br> <<Gnarlak>>Did it stand taller than you?<</Gnarlak>><br><br> <<You>>Yes<</You>><br><br> <<Gnarlak>>And it had the face of a wolf and the body of a man?<</Gnarlak>><br><br> <<You>>Yes<</You>><br><br> <<Gnarlak>>You're lucky to be alive lord, prehaps the werewolf was not hunting<</Gnarlak>><br><br> <<You>>A Werewolf?<</You>><br><br> <<Gnarlak>>Yes, Lord. An ancient curse which causes men to turn into beasts during the full moon<</Gnarlak>><br><br> <<You>>My sword glanced off, I didn't see it scratch the beast, how do I kill it?<</You>><br><br> <<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>><br><br> <<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>> <</nobr>> </div>
<div class="text-box"> <<nobr>> $WolfQuestStatus $SilverNeed <<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>
<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>
<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>> <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 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>>
<<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>> <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>>
<<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>>
<<nobr>> <div class="text-box"> You lean over the sleeping woman and wisper 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>>
<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>> <<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>> 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>> You draw your dagger as the beast gets closer<br><br> Within moments its on you and begins slashing at you with its claws<br><br> You try to [[defend yourself|WolfQuestDefend]] <</nobr>> </div> <<set $Int to 0>>
<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>
<<nobr>> <div id="gameContainer" style="width: 500px; height: 500px; border: 2px solid #fff; position: relative; background-color: #333; margin-bottom: 20px;"> <div id="clickableObject" style="width: 30px; height: 30px; background-color: red; position: absolute; display: none; border-radius: 50%;"></div> </div> <div id="progressContainer" style="width: 500px; display: flex; justify-content: space-between;"> <div class="progressBar" style="width: 45%; height: 20px; background-color: #ddd; border: 1px solid #fff; position: relative;"> <div id="hitProgress" style="height: 100%; background-color: green; width: 0;"></div> </div> <div class="progressBar" style="width: 45%; height: 20px; background-color: #ddd; border: 1px solid #fff; position: relative;"> <div id="missProgress" style="height: 100%; background-color: red; width: 0;"></div> </div> </div> <button id="startButton">Defend Youself</button> <div id="resultMessage" style="font-size: 20px; margin-top: 20px;"></div> <<script>> $(document).on(':passagedisplay', function (ev) { const gameContainer = document.getElementById('gameContainer'); const clickableObject = document.getElementById('clickableObject'); const startButton = document.getElementById('startButton'); const hitProgress = document.getElementById('hitProgress'); const missProgress = document.getElementById('missProgress'); const resultMessage = document.getElementById('resultMessage'); let clickCount = 0; let missCount = 0; let moveInterval; function getRandomPosition() { const x = Math.floor(Math.random() * (gameContainer.clientWidth - clickableObject.clientWidth)); const y = Math.floor(Math.random() * (gameContainer.clientHeight - clickableObject.clientHeight)); return { x, y }; } function showObject() { const { x, y } = getRandomPosition(); clickableObject.style.left = `${x}px`; clickableObject.style.top = `${y}px`; clickableObject.style.display = 'block'; } function hideObject() { clickableObject.style.display = 'none'; } function moveObject() { const { x, y } = getRandomPosition(); clickableObject.style.left = `${x}px`; clickableObject.style.top = `${y}px`; } function updateProgressBars() { hitProgress.style.width = `${(clickCount / 5) * 100}%`; missProgress.style.width = `${(missCount / 3) * 100}%`; } function endGame(message) { resultMessage.textContent = message; clearInterval(moveInterval); if (message === "Win") { $("#macroWinContent").show(); } else if (message === "Lose") { $("#macroLoseContent").show(); } } $(clickableObject).on('click', function() { clickCount++; hideObject(); if (clickCount < 5) { setTimeout(showObject, 1000); } else { endGame('Win'); clickCount = 0; missCount = 0; } updateProgressBars(); }); $(gameContainer).on('click', function(e) { if (e.target !== clickableObject) { missCount++; if (missCount >= 3) { endGame('Lose'); clickCount = 0; missCount = 0; } updateProgressBars(); } }); $(startButton).on('click', function() { clickCount = 0; missCount = 0; resultMessage.textContent = ''; updateProgressBars(); showObject(); moveInterval = setInterval(moveObject, 1000); startButton.style.display = 'none'; }); }); <</script>> <div id="macroWinContent" style="display: none;"> You successfully block the $CurrentEnemy attacks and they are only able to do $EnemyMin damage<br> <<if $PlayerHealth lt 1>>Dispite this, the hit is too much to withstand and you fall to you knees before colapsing<</if>> <<button "Continue">> <<set $PlayerHealth to $PlayerHealth - $EnemyMin>> <<set $nextPassage to "WolfQuestStab">> <<goto $nextPassage>> <</button>> </div> <div id="macroLoseContent" style="display: none;"> You fail block the $CurrentEnemy attacks they land a critical hit and do $EnemyMax damage<br> <<if $PlayerHealth lt 1>>This hit is too much to withstand and you fall to you knees before colapsing<</if>> <<button "Continue">> <<set $PlayerHealth to $PlayerHealth - $EnemyMax>> <<set $nextPassage to "WolfQuestStab">> <<goto $nextPassage>> <</button>> </div> <<button "Help">> <<script>> UI.alert("Defence Mini Game<br>Click on the incoming dots to block incoming blows during the enemys attack phase. Block 5 hits to lower the damage the enemy causes. If you miss 3 times, you fail to defend yourself)"); <</script>> <</button>><br><br> <<if $Cheats is false>> Enable cheats to skip this mini game <<else>> <<button "Skip">> <<set $PlayerHealth to $PlayerHealth - $EnemyMin>> <<set $nextPassage to "WolfQuestStab">> <<goto $nextPassage>> <</button>><br><br> <</if>> <</nobr>> <<set $Int to $Int + 1>>
<div class="text-box"> <<nobr>> <<if $PlayerHealth <= 0>> 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>> Werewolf's Health:<br> <progress @value="$EnemyHealth" max="100"></progress><br> <<if $Int is 0>> You recover from the onslaught of attacks from the beast and stab it in the chest<br><br> <<set $EnemyHealth to $EnemyHealth - 50>> The beast howels a attacks [[again|WolfQuestDefend]] <</if>> <<if $Int is 1>> 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 influance 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>> <</if>> <</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>>
<<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"> 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>>
<<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">>
<<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"> <<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"> <<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"> <<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"> <<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 satifying 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>>
<<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>>
<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>
<<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"> You open the door and step through... [[Step through the door|GhoulQuestAlterResist]] </div> <</nobr>>
<<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>>
<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>> <<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 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 $Int == 5>> <<Lucy>>Anything for a loyal customer<</Lucy>><br><br> You give him a sexy grin and lean forward so you can wisper 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"> 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"> 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"> With your remaining strenght 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 looses 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 strengh 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 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"> 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"> 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 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 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>>
<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>
<<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"> <<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"> You manage to resist her attack, pushing through the vsion and the lust<br><br> Taking all the strenght 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 strenght you take the rusted dagger and plunge it into her heart<br><br> Watching her die was not as satifying 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>>
<<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>>
<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> 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 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>> 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" 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>
<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 your's<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>
<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>
<<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>>
This is coming in a future update [[return|Chambers]]
<div class="text-box"> Text </div> <<startblizzard>>
<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 wispers 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>> 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>> 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>>
<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>> 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>
<<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>>
<<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="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>
<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>
<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>> <<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>> 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>>
<<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>>
<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>
<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... Dispite 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>>
<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>
<<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>>
<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 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 $HostelRoom is true>> [[Enter your room|HostelYourRoom]]<br><br> <</if>> [[Go downstairs|Hostel]] <</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="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>> 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>> <<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 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"> <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>>
<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>> 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"> <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"> <<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 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>>
<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="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="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"> 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>> <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>>
<<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>> <<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 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 [["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('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('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 [["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 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())>> <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>> <<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 [["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>> <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>> <<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('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>> <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>> <<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 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>> <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>> <<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>> <<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"> <<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"> <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>> <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>> <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 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"> 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>> <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>> <<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[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>> <<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>> <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>>
<<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>> <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"> <<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>> <<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"> 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 satify 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"> <<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"> <<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"> <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>>
<<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 $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"]>>
<<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"> 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 $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 strenght 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>>
<<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 wisper<br>br> </div> <</nobr>>
<<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>> <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"> <<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"> <<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"> <<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>>
<<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> <<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>>
<<nobr>> <div class="responsive-image-container"> <img src="Images/Crypt/cryptmap.png" alt="Description"> </div> <<return "Leave">> <</nobr>>
<<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"> <<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 recieved 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 recieved 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/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"> <<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 strenght 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>>
<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 studys 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 supprise at the creatures knowladge of your power... You press more for infomation<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 traped 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 your's truely 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>
<<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 theif"]>> <<set $FemaleDetectedLines to [ "Who are you!", "What do you want!", "Get out! Help!"]>> </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 "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'); })>>
<<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>> <<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> [[Retrun 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 $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 $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 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 $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 _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>> <<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 $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 $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>> <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>> <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 influance 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"> <<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 _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"> <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>> <<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>> <<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>> <div class="text-box"> <<if $VisitedDungeon is false>> <<include "DialogueStorage">> <<startdialogue "_TutorialDungeon">> <</if>> <h1>Prisoners</h1> You have space for $CellsCount prisoners<br> You currently have $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>>
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"> <<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 influance, 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 $LibraryUnlocked is true and $LibraryOccupance.length < $LibrarysMax>> <<if _prisoner.name.toLowerCase() === "villager" or _prisoner.name === _prisoner.job>> <<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 $DungonOccupance = $DungonOccupance.filter(p => (p.NPCID && p.NPCID !== _prisoner.NPCID) or (p.prisonerId && p.prisonerId !== _prisoner.prisonerId) )>> <<goto "Dungeon2">> <<script>> UI.alert("You sent the prisoner to the Library."); <</script>> <</button>> <</if>> <</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 $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>> <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>>
<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.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 expenaded on, for now there isnt too much new content in the forst 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>
<<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'); })>>
<<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>>
<<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>> 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="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>
<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>
<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>
<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 $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>
<<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>>
<<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>>
<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 tolorate 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>
<<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]]
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 _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>>
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?
<<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]); const choicesDiv = document.getElementById(`${slotType}Choices`); if (!choicesDiv) { console.error(`Could not find choices div for ${slotType}`); return; } choicesDiv.innerHTML = ''; const availableWeapons = 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 = 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 && weaponSets[equippedWeapon]) { const weaponData = 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 = 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 = 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>>
<<nobr>> <<for _prisoner range $BarraksOccupance>> <<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> <<set _combatants = []>> <<if $BarraksOccupance.length > 0 && random(1, 4) === 1>> <<set _maxFighters = Math.min(3, $BarraksOccupance.length)>> <<for _i = 0; _i < _maxFighters; _i++>> <<run _combatants.push($BarraksOccupance[_i].sex)>> <</for>> <<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>> <video autoplay loop> <source @src="_VidPath" type="video/webm" onerror="this.style.display='none'"> </video> <br> <</if>> <<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: <<print _prisoner.armor>></p> <p style="margin: 2px 0;">Weapon: <<print _prisoner.weapon>></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>> <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: <<if _villager.job and _villager.job !== "Unknown">> <<print _villager.job>> <<elseif _villager.targetJob and (!_villager.job or _villager.job === "Unknown")>> Learning: <<print _villager.targetJob>> (<<print _villager.skill>>%) <<else>> None <</if>> </p> <div style="width: 99%;"> <h4 style="margin: 0;">Job:</h4> <progress @value=" _villager.skill" max="100" style="width: 100%;"></progress> <<button "Assign a Job">> <<set $currentPrisonerId to _villager.prisonerId>> <<goto "Mercenary2">> <</button>> <<button "Send to a Settlement">> <<set $villagerForTransfer = _villager>> <<set _npcId = _villager.NPCID>> <<run $LibraryOccupance.delete(_villager)>> <<goto "SelectSettlementTransfer2">> <</button>> <<button "Send back to the Dungeon">> <<set $CurrentCaptive = _villager>> <<if !Array.isArray($DungonOccupance)>> <<set $DungonOccupance = []>> <</if>> <<run State.variables.DungonOccupance.push(_villager)>> <<run $LibraryOccupance.delete(_villager)>> <<script>> UI.alert("You sent the Villager back to the dungeon"); <</script>> <<goto "Library">> <</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>>
<<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)>> <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: <<print _prisoner.armor>></p> <p>Weapon: <<print _prisoner.weapon>></p> <p>Duty: <<print _prisoner.duty>></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 "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, 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>> <<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, 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 ($ForgedSwords gt 0)>> <<button "Give Sword">> <<set $ForgedSwords to $ForgedSwords -= 1>> <<set _prisoner.weapon to "Sword">> <<run Engine.show()>> <</button>><br><br> <</if>> <<if (_prisoner.armor is "None") and($ForgedArmor gt 0)>> <<button "Give Armor">> <<set $ForgedArmor to $ForgedArmor -= 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><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><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>> <<button "Deploy to Settlement">> <<set $currentUnitForTransfer to _prisoner>> <<goto "UnitSettlementTransfer">> <</button>><br><br> <<button "Release from duty (Delete character)">> <<run $BarraksOccupance.delete(_prisoner)>> <<goto "Barracks">> <</button>><br><br> </div> <div style="text-align: center"> <<button "Leave">> <<goto "Barracks">> <</button>> </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>> <<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>>
<<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]] </div> <</if>><</if>> <<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>> <<if $ArmoryUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Armory/1.png"> [[The Forge|Forge]] </div> <</if>> <<if $VisitedMapRoom is true>> <div class="menu-item" data-image="Images/Castle/MapRoom/1.png"> [[The Map Room|Map Room]] </div> <</if>> <<if $ArmoryUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Armory/1.png"> [[The Forge|Forge]] </div> <</if>> <<if $LibraryUnlocked is true>> <div class="menu-item" data-image="Images/Castle/Library/1.png"> [[The Library|Library]] </div> <</if>> <div class="menu-item" data-image="Images/Castle/Armory/1.png"> [[The Armory|Armory]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Go to the left wing|Left Wing]] </div> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Go upstairs|Castle Chambers]] </div> <div class="menu-item" data-image="Images/Castle/Courtyard/1.png"> [[Go outside|Base Intro]] </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: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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>>
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
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="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>> <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">>
<<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>> <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 $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() { $('.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.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>> </div> <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>> <<button "Choose Units">> <<if $Strategy is null>> <<script>> UI.alert("Select a plan before continuing"); <</script>> <<else>> <<goto "RaidTeamSelection">> <</if>> <</button>><br><br> </div> <</replace>> <</if>> <</button>><br> <div id="raidOptions"> </div> </div> <div style="text-align: center"> <<button "Cancel">> <<goto "Inside Castle">> <</button>> </div> <<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, 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, duty: "none" }>> <<run State.variables.BarraksOccupance.push($Unit)>> <</if>> <</if>> <</nobr>>
<<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 fould 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>>
<<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>>
<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>
<<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 _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>> <<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/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 "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>> <<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 $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>> <<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 $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> <p>Location: <<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> <<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>>
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>> <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>Choose your raiding party</h1> The selected strategy is $Strategy<br><br> <<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 = $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 }; $RaidingParty.push(newRaider); console.log(`Created new raider: ${newRaider.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !$RaidingParty.some(raider => raider.prisonerId === unit.prisonerId) ); console.log("New Raiding Party:", $RaidingParty); console.log("Updated Barracks:", $BarraksOccupance); >> <<goto "PillageNPCSelection">> <</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 = $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 }; $RaidingParty.push(newRaider); console.log(`Created new raider: ${newRaider.name}`); } }); $BarraksOccupance = $BarraksOccupance.filter(unit => !$RaidingParty.some(raider => raider.prisonerId === unit.prisonerId) ); console.log("New Raiding Party:", $RaidingParty); console.log("Updated Barracks:", $BarraksOccupance); >> <<goto "RaidSummary">> <</button>> <</if>> <</if>> </div> <<script>> $(document).ready(function() { $('.raider-card').click(function() { $(this).toggleClass('selected'); }); }); <</script>> <</nobr>>
<<set $ImagePath to "Images/Town/Map/Enterance/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]]
<<nobr>> <<set _prisoner to $DungonOccupance.find(p => p.prisonerId === $currentPrisonerId)>> $ImagePath <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>> <<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 _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 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>> <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 your's you think about how to satify 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 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>> <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"]>> <<set $RaidSizes to ["Small", "Medium"]>> <<set $RaidTimes to ["Day", "Night"]>> <<set _RaidLocation to $RaidLocations[0]>> <<set _RaidType to $RaidTypes[0]>> <<set _int to random(0, 1)>> <<set _RaidSize to $RaidSizes[_int]>> <<set _int to random(0, 1)>> <<set _RaidTime to $RaidTimes[_int]>> <<if _RaidType is "Settlement">> <<if _RaidSize is "Small">> <<set _NPCCount to random(8, 12)>> <<set _img to $SmallSettlementRaid>> <<set $SmallSettlementRaid to $SmallSettlementRaid + 1>> <</if>> <<if _RaidSize is "Medium">> <<set _NPCCount to random(15, 20)>> <<set _img to $MediumSettlementRaid>> <<set $MediumSettlementRaid to $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>> <<set _randomName = $names[random(0, $names.length - 1)]>> <<if !$locationIdCounter>><<set $locationIdCounter to 0>><</if>> <<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" }>> <<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> 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>> <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"> <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>> <<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>>
<<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>>
<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>
<<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"> <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 loose 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 loose 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 eachothers bodys<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 eachothers bodys<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")>> Trap could 2, second captive male <br><br> <<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 eachothers bodys<br> <<set _img to random(7, 9)>> <</if>> <<if $TrapdoorCaptives[0].gender is "Male">>The $CurrentRaider falls into the pit with the $CurrentCaptive. 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>
<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 flys accross the room.<br><br> An arrow fings 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 colapes 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 teath, the $CurrentRaider.type survies 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> The $CurrentRaider.type creaps through the empty room, unaware thay 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>
<div class="text-box"> <<nobr>> <h1>Defence Room $Room</h1> <hr> The $CurrentRaider.type Cannot resist the alure of the jewlery and gives into the temptation, reaching out and taking the jewlery.<br><br> After a few moment's, the corrupting influence of the item takes its tole<br><br> <<if $CurrentRaider.type isnot "Thief">> Visions of lust attack the $CurrentRaider.type's mind.<br> They take $CurrentRaider.corruption corruption damage.<br> <<set $CurrentRaider.corruption to $CurrentRaider.corruption + $Defences[$Room].damage>> $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"> <<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 damge.<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>
<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 knowladge of what lurkes 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 <<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 trys 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 trys 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 trys 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> <</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>> <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>> To injured to fight on, he trys 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 realases the raider and slithers back under the water to escape death<br> <<button "They continue to the next room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> Exhaused, the man can do nothing but watch as the 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 har 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>> Dispite her injruys for continues fighting and causes _Damage damage to your silent pet.<br> <<else>> To 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 realases the raider and slithers back under the water to escape death<br> <<button "They continue to the next room">> <<set $Room to $Room + 1>> <<set _NextRoom to "RaidRoom" + $Room>> <<goto _NextRoom>> <</button>> <<else>> After a few failed swings of her $CurrentRaider.weapon the black mas has engulfed her and pulls away her weapon and rips at her clothes<br><br> The womans limps 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 is pray, 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 trips over a web and stumbles into a knot of stickly rope. They arn't given a chance to cut themselves free as the enormous and silent form of the arachnid decends on them.<br> Withing moments, the helpess raider is entangled in the spiders 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>
<<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>>
<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 minuets 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 stuggle but its hopeless. Out of the shaddows near the top of the room your pet silently crawls out and lowers itself towards its pray.<br><br> The raider looks up to see the enormous from approaching and screams, but not for long as your pet makes quick work of entangerling 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 spiders skill improves<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>> <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, completly 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 trys to get out but is soon entangles 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 trys to get out but is soon entangles 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 monsters skill improves<br><br> <<else>> The black pool monsters 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>
<<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 $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 simular, but different to that of your master. Like him, if you can seduce a person and make them orgasm, they are your's either to steal there 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>> <<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 _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 _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 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 trys 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 _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>>
<<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> <<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: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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 _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>> <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">>
<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>
<<nobr>> <<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>> <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>>
<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 _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"> <<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 $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 looses 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>> <<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 looses 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 _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>> <<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 trys 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>>
<<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: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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>> <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>>
<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>
<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>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>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>
<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>
<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>> <<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>>
<<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">> <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 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>>
<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"> <<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"> 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>>
<<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>>
<<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>>
<<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 wisper 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 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>>
<<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="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 _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>> <<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="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>> <<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>> <div class="text-box"> <h1>Raiding Stratergies</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> </div> <div style="text-align: center"> <<button "Back">> <<goto "RaidPlan">> <</button>> </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 "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>> <<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 "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 "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>> <div class="text-box"> </div> <</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 theif 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>>
<<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 _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 _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 strengh, 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>> <<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"> /* 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"> <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>>
<<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>> <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; } </style> <div class="paper-background"> <div class="handwritten"> <div class="raid-title">Raid Orders</div> <div class="section"> <div class="section-title">Strategy: $Strategy</div> </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> </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>> <p>No priority targets designated, this is only for pillaging </p> <</if>> </div> </div> </div> </div> <<button "Begin Raid">> <<run console.log("Starting raid with strategy:", $Strategy)>> <<set $RaidOrderDay to $Day>> <<set $pendingRaid to true>> <<set _locationData to $RaidLocationList.find(loc => loc.locationId === $currentLocationid)>> <<goto "Base Intro">> <</button>> <</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>> <</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>> <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 _settlement.capturedVillagers.length>>/<<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>>
<<nobr>> <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; } </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>> <<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>> <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 _settlement.capturedVillagers ? _settlement.capturedVillagers.length : 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="${_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>`>> <p><span class="info-label">Export:</span> <<print _settlement.Export>></p> </div> </div> <div style="text-align: center; margin: 10px;"> <<button "Visit Settlement">> <<set $BackgroundPath to "Images/Forrest/Exploring/Path/4.png">> <<set $Position to "VisistStart">> <<set $currentLocationid to $currentSettlementId>> <<goto "SettlementVisit">> <</button>> </div> <div class="resources-section" style="margin: 20px 0; padding: 15px; background: rgba(0, 0, 0, 0.7); border-radius: 8px;"> <h2>Send Resources</h2> /* Food Resources */ <<if _settlement.foodReserves < 100>> <<if $Grain>> <div style="margin: 10px 0; display: flex; gap: 10px; align-items: center;"> <span>Grain Available: $Grain</span> <<button "Send Grain (+2 Food)">> <<set $Grain -= 1>> <<set _settlement.foodReserves += 2>> <<goto "SettlementOverview">> <</button>> <<if $Grain >= 5>> <<button "Send 5 Grain (+10 Food)">> <<set $Grain -= 5>> <<set _settlement.foodReserves += 10>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <</if>> <<if $Meat>> <div style="margin: 10px 0; display: flex; gap: 10px; align-items: center;"> <span>Meat Available: $Meat</span> <<button "Send Meat (+3 Food)">> <<set $Meat -= 1>> <<set _settlement.foodReserves += 3>> <<goto "SettlementOverview">> <</button>> <<if $Meat >= 5>> <<button "Send 5 Meat (+15 Food)">> <<set $Meat -= 5>> <<set _settlement.foodReserves += 15>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <</if>> <</if>> /* Happiness Resource */ <<if _settlement.Happiness < 100 && $Mead>> <div style="margin: 10px 0; display: flex; gap: 10px; align-items: center;"> <span>Mead Available: $Mead</span> <<button "Send Mead (+1 Happiness)">> <<set $Mead -= 1>> <<set _settlement.Happiness += 1>> <<goto "SettlementOverview">> <</button>> <<if $Mead >= 5>> <<button "Send 5 Mead (+5 Happiness)">> <<set $Mead -= 5>> <<set _settlement.Happiness += 5>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <</if>> /* Tools (only if needed) */ <<set _needs to setup.calculateLocationNeeds(_settlement)>> <<if _needs.some(n => n.type === "Maintenance") && $Tools>> <div style="margin: 10px 0; display: flex; gap: 10px; align-items: center;"> <span>Tools Available: $Tools</span> <<button "Send Tools">> <<set $Tools -= 1>> <<goto "SettlementOverview">> <</button>> <<if $Tools >= 5>> <<button "Send 5 Tools">> <<set $Tools -= 5>> <<goto "SettlementOverview">> <</button>> <</if>> </div> <</if>> </div> <<if _settlement.hasCult is true>> <div class="text-box"> <h2>You have not recieved 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> <</if>> <div class="raid-section"> <h2>Building Overview</h2> <<if Object.keys(_buildingSummary).length > 0>> <<for _type, _info range _buildingSummary>> <div class="building-section"> <h3><<print _type>>s</h3> <p>Count: <<print _info.count>></p> <p>Occupancy: <<print _info.current>>/<<print _info.capacity>> villagers</p> </div> <</for>> <<else>> <p>No buildings available in this settlement.</p> <</if>> </div> <<include "SettlementNeeds">> <<if _settlement.capturedVillagers && _settlement.capturedVillagers.length>> <div class="raid-section"> <h2>Settlement Buildings</h2> /* Group villagers by building */ <<set _buildingGroups = {}>> <<for _villager range _settlement.capturedVillagers>> <<if !_buildingGroups[_villager.building]>> <<set _buildingGroups[_villager.building] = []>> <</if>> <<run _buildingGroups[_villager.building].push(_villager)>> <</for>> /* Display each building and its residents */ <<for _buildingId, _residents range _buildingGroups>> <div class="building-section"> <h3><<print _buildingId>></h3> <p>Residents: <<print _residents.length>></p> <div class="raider-container"> <<for _villager range _residents>> <<capture _villager>> <div class="raider-card"> <img @src="_villager.ImagePath" style="width: 200px; height: 200px; object-fit: cover;"> <p><<print _villager.job || "Villager">></p> <<button "Send to New Settlement">> <<set $villagerForTransfer = _villager>> <<set $originSettlement = _settlement>> <<set _npcId = _villager.NPCID>> <<set _settlement = _settlement>> <!-- lokal sichern für saubere Referenz --> /* Entferne NPC aus capturedVillagers */ <<set _index = _settlement.capturedVillagers.findIndex(v => v.NPCID === _npcId)>> <<if _index > -1>> <<run _settlement.capturedVillagers.splice(_index, 1)>> <</if>> /* Entferne NPC aus populatedBuildings */ <<for _buildingId, _residents range _settlement.populatedBuildings>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _npcId)>> <<if _resIndex > -1>> <<run _residents.splice(_resIndex, 1)>> <</if>> <</for>> <<goto "SelectSettlementTransfer">> <</button>> <<button "Send to Dungeon">> <<set _npcId = _villager.NPCID>> <<set _settlement = _settlement>> <!-- lokal sichern für saubere Referenz --> /* Entferne NPC aus capturedVillagers */ <<set _index = _settlement.capturedVillagers.findIndex(v => v.NPCID === _npcId)>> <<if _index > -1>> <<run _settlement.capturedVillagers.splice(_index, 1)>> <</if>> /* Entferne NPC aus populatedBuildings */ <<for _buildingId, _residents range _settlement.populatedBuildings>> <<set _resIndex = _residents.findIndex(v => v.NPCID === _npcId)>> <<if _resIndex > -1>> <<run _residents.splice(_resIndex, 1)>> <</if>> <</for>> /* Erzeuge Dungeon-Eintrag */ <<if !$prisonerIdCounter>><<set $prisonerIdCounter = 0>><</if>> <<set _int = random(1, 15)>> <<set _captive = { prisonerId: $prisonerIdCounter++, NPCID: _npcId, type: "Villager", name: (_villager.name && _villager.name.trim() && _villager.name !== "Unknown") ? _villager.name : (_villager.job && _villager.job.trim()) ? _villager.job : "Villager", 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/Dungon/Men/Bandit/" + _int + ".png" : "Images/Castle/Dungon/Woman/" + (_villager.hairColor || "Brown") + "/Clothed/" + _int + ".png" }>> <<if !Array.isArray($DungonOccupance)>><<set $DungonOccupance = []>><</if>> <<run $DungonOccupance.push(_captive)>> <<script>> UI.alert("You sent the Villager to the dungeon"); <</script>> <<goto "SettlementOverview">> <</button>> </div> <</capture>> <</for>> </div> </div> <</for>> </div> <<else>> <div class="raid-section"> <h2>Population</h2> <p>No surviving villagers remain in this settlement.</p> </div> <</if>> <<if _settlement.garrison && _settlement.garrison.length>> <div class="raid-section"> <h2>Garrison Forces</h2> <!-- BUTTON: Recall All Combat Specialists --> <<button "Recall all Combat Units">> <<for _i to _settlement.garrison.length - 1; _i >= 0; _i-->> <<set _unit = _settlement.garrison[_i]>> <<if _unit.specialization is "Combat">> <<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++>> <<capture _i>> <div class="raider-card"> <img @src="_settlement.garrison[_i].ImagePath" alt="<<_settlement.garrison[_i].name>>" style="width: 200px; height: 200px; object-fit: cover;"> <h3><<print _settlement.garrison[_i].name>></h3> <p>Armor: <<print _settlement.garrison[_i].armor>></p> <p>Weapon: <<print _settlement.garrison[_i].weapon>></p> <p>Specialization: <<print _settlement.garrison[_i].specialization>></p> <p>Health: <<print _settlement.garrison[_i].health>>/100</p> <<button "Recall">> <<run $BarraksOccupance.push(_settlement.garrison[_i])>> <<run _settlement.garrison.splice(_i, 1)>> <<goto "SettlementOverview">> <</button>> </div> <</capture>> <</for>> </div> </div> <</if>> <div style="text-align: center"> <<button "Return">><<goto "CapturedLocations">><</button>> <<button "Go to Dungeon">> <<goto "Dungeon2">> <</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> <div align="center"> <img src="Images/Town/BathHouse/Mara.png" width="500" height="500"> </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>>
<<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>>
<<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>> <<button "Leave">> <<goto "Base Intro">> <</button>> </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 $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 _villager.targetJob>> <<set _villager.job = _villager.targetJob>> <<set _villager.hiddenJob = _villager.targetJob>> <<set _villager.name = _villager.targetJob>> <!-- Optional --> <</if>> <</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 = []>> <</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>>
<<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 $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… 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>> <<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>> <<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>>
<<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>> (<<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>> /* 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 */ <<if _buildingId.includes("Manor House")>> <<set _building.goldGained = random(100, 200)>> <<set _maxLoot = 5>> <<else>> <<set _building.goldGained = random(5, 50)>> <<set _maxLoot = 3>> <</if>> /* Define possible loot items */ <<set _possibleLoot = [ "Silver Candlesticks", "Copper Pot", "Fine Tablecloth", "Silver Cutlery Set", "Bronze Mirror", "Pewter Plates", "Wine Goblets", "Prayer Beads", "Decorative Tapestry", "Brass Bowl", "Gold Ring", "Silver Necklace" ]>> /* Add random loot items to $Loot array */ <<for _i = 0; _i < random(1, _maxLoot); _i++>> <<set _lootItem = _possibleLoot[random(0, _possibleLoot.length - 1)]>> <<run $Loot.push(_lootItem)>> <</for>> <</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")>> <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>> <p>Gold Found: <<print _building.goldGained>> coins</p> <p>Items looted are taken to your vault</p> <<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> /* 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> <<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>> <<set _survivors = $currentRaidParty.filter(r => r.health > 0 && r.name !== "Lucy" && r.name !== "Alice")>> <<for _survivor range _survivors>> <<run $BarraksOccupance.push(_survivor)>> <</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> <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> <</nobr>>
<<nobr>> <style> .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>> <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="needs-section"> <h2>Settlement Needs</h2> <<set _needs to setup.calculateLocationNeeds(_settlement)>> <<if _needs.length > 0>> <<for _need range _needs>> <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>> <<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>> <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 _s.capturedVillagers.length>> / <<print _totalCapacity>> Villagers</p> <<if _s.hasCult>> <p style="color: red;">Investigate this location before sending anyone</p> <<else>> <<if _s.capturedVillagers.length < _totalCapacity>> <<button "Send Here">> <<run setup.transferVillager($villagerForTransfer, $originSettlement, _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>> <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 _s.capturedVillagers.length>> / <<print _totalCapacity>> Villagers</p> <<if _s.hasCult>> <p style="color: red;">Investigate this location before sending anyone</p> <<else>> <<if _s.capturedVillagers.length < _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>> <<widget "buildingStats">> <<set _currentData to setup.buildingData.get($ImagePath)>> <<if _currentData>> <<set _buildingCounts to {}>> <<set _totalBuildings to _currentData.hotspots.length>> <div class="building-stats"> <p>Buildings: <<print _totalBuildings>></p> <p>Population: <<print _settlement.capturedVillagers.length>></p> <p>Garrison: <<print _settlement.garrison.length>></p> </div> <</if>> <</widget>> <<set $SettlementLocation to "Outside">> <<set _settlement to $CapturedLocations[$currentLocationid]>> <<set $ImagePath to _settlement.imagePath>> <<include "LoadBuildingData">> <div class="text-box"> <i>Dev note: There isn't much content here at the moment, but more is coming in the next update</i><br><br> <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>> <i>Dev note: Sorry! This is the end of this content for now... More soming soon(ish)</i> <<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>Select a location to visit</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 + 'Visit'"> <div class="tooltip"><<print _hotspot.tooltip>></div> </div> <</for>> <</if>> <</widget>> <<createHotspots>> </div> <<if _hasGuardHouse is true>> <<else>> <</if>><br> <br> <<button "Return to the castle">> <<goto "Base Intro">> <</button>> </div> <style> .image-container { position: relative; display: inline-block; } .hotspot { position: absolute; width: 20px; height: 20px; background-color: rgba(255, 255, 255, 0.5); border-radius: 50%; cursor: pointer; transition: background-color 0.3s; } .hotspot:hover { background-color: rgba(255, 255, 255, 0.8); } .tooltip { display: none; position: absolute; background-color: rgba(0, 0, 0, 0.8); color: white; padding: 5px; border-radius: 3px; white-space: nowrap; z-index: 1000; top: -25px; left: 50%; transform: translateX(-50%); } .hotspot:hover .tooltip { display: block; } </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 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>> /* Initialize reports array */ <<set _reports = []>> <<set $CapturedLocations ??= []>> <<if $CapturedLocations.length > 0>> <<for _settlement range $CapturedLocations>> <<if typeof _settlement.foodReserves === 'undefined'>> <<set _settlement.foodReserves = 50>> <</if>> /* Create report entry for this settlement */ <<set _reportEntry = { day: $Day, name: _settlement.name, startingFood: _settlement.foodReserves, startingPopulation: _settlement.capturedVillagers.length, events: [] }>> /* Process Daily Production */ <<if _settlement.capturedVillagers.length === 0>> <<run _reportEntry.events.push(`No production - settlement has no workers`)>> <<else>> <<set _productionMod = 1>> <<set _productionMod = 1>> /* Apply happiness modifiers */ <<if _settlement.Happiness < 50>> <<set _productionMod = 0.75>> <<elseif _settlement.Happiness > 70>> <<set _productionMod = 1.25>> <</if>> /* Process production based on settlement export type */ <<set _farmers = _settlement.capturedVillagers.filter(v => v.job === "Farmer")>> <<set _millers = _settlement.capturedVillagers.filter(v => v.job === "Miller")>> <<set _hunters = _settlement.capturedVillagers.filter(v => v.job === "Hunter")>> <<set _blacksmiths = _settlement.capturedVillagers.filter(v => v.job === "Blacksmith")>> <<if _settlement.Export is "Meed">> <<set _settlement.Export to "Mead">> <</if>> <<if _settlement.Export is "Meet">> <<set _settlement.Export to "Meat">> <</if>> <<switch _settlement.Export>> <<case "Grain">> <<set $Grain ??= 0>> <<set _amount = Math.ceil((_farmers.length || 0) * 3 * _productionMod)>> <<set $Grain += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Grain by ${_farmers.length} Farmers`)>> <<case "Mead">> <<set $Mead ??= 0>> <<set _amount = Math.ceil((_millers.length || 0) * 2 * _productionMod)>> <<set $Mead += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Mead by ${_millers.length} Millers`)>> <<case "Bread">> <<set $Bread ??= 0>> <<set _amount = Math.ceil((_millers.length || 0) * 2 * _productionMod)>> <<set $Bread += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Bread by ${_millers.length} Millers`)>> <<case "Meat">> <<set $Meat ??= 0>> <<set _successfulHunters = 0>> <<for _hunter range _hunters>> <<if random(1, 100) <= 100>> <<set _successfulHunters += 1>> <</if>> <</for>> <<set _amount = Math.ceil(_successfulHunters * 4 * _productionMod)>> <<set $Meat += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Meat by ${_successfulHunters}/${_hunters.length} successful Hunters`)>> <<case "Jewelry">> <<set $Jewelry ??= 0>> <<set _amount = Math.ceil((_blacksmiths.length || 0) * 1 * _productionMod)>> <<set $Jewelry += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Jewelry by ${_blacksmiths.length} Blacksmiths`)>> <<case "Tools">> <<set $Tools ??= 0>> <<set _amount = Math.ceil((_blacksmiths.length || 0) * 1 * _productionMod)>> <<set $Tools += _amount>> <<run _reportEntry.events.push(`Produced ${_amount} Tools by ${_blacksmiths.length} Blacksmiths`)>> <</switch>> <</if>> /* Process Settlement Needs Impact on Happiness */ <<set _needs to setup.calculateLocationNeeds(_settlement)>> <<if _needs.length > 0>> <<set _settlement.Happiness = Math.max(0, _settlement.Happiness - 2)>> <<run _reportEntry.events.push(`Settlement morale decreased due to unmet needs`)>> <<else>> <<set _settlement.Happiness = Math.min(100, _settlement.Happiness + 5)>> <<run _reportEntry.events.push(`Settlement morale improved - all needs met`)>> <</if>> /* Random Famine Event */ <<if random(1, 100) <= 5>> <<set _settlement.foodReserves = Math.floor(_settlement.foodReserves * 0.33)>> <<run _reportEntry.events.push(`🌾 Famine has struck ${_settlement.name}! Two-thirds of food reserves were lost`)>> <<set _settlement.Happiness -= 5>> <</if>> /* Process Food Consumption */ /* Berechne Bevölkerung */ <<set _population = _settlement.capturedVillagers.length>> /* FOOD PRODUCTION */ /* Farmer produzieren zuverlässig */ <<set _farmers = _settlement.capturedVillagers.filter(v => v.job === "Farmer")>> <<set _hunters = _settlement.capturedVillagers.filter(v => v.job === "Hunter")>> <<set _foodFromFarmers = _farmers.length * 2>> <<set _hunterSuccesses = 0>> <<for _hunter range _hunters>> <<if random(1, 100) <= 50>> <<set _hunterSuccesses += 1>> <</if>> <</for>> <<set _foodFromHunters = _hunterSuccesses * 6>> <<set _foodProduced = _foodFromFarmers + _foodFromHunters>> <<set _settlement.foodReserves += _foodProduced>> /* FOOD CONSUMPTION */ <<set _foodConsumption = _population>> <<set _settlement.foodReserves -= _foodConsumption>> /* Maximal 100, Minimal 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 produced: ${_foodProduced}% (${_farmers.length} Farmer, ${_hunterSuccesses}/${_hunters.length} Hunter succeeded)`)>> <<run _reportEntry.events.push(`Food consumed: ${_foodConsumption}%`)>> /* Handle Starvation */ <<if _settlement.foodReserves <= 0>> <<set _settlement.foodReserves = 0>> <<if _settlement.capturedVillagers.length > 0>> <<run _settlement.capturedVillagers.splice(random(0, _settlement.capturedVillagers.length - 1), 1)>> <<run _reportEntry.events.push("⚠️ Starvation: One villager has died")>> <</if>> <</if>> /* Handle Low Food Impact on Happiness */ <<if _settlement.foodReserves < 30>> <<set _settlement.Happiness -= 5>> <<run _reportEntry.events.push("⚠️ Low food causing unhappiness")>> <</if>> /* Process Corruption Spread */ <<if _settlement.corruption > 0>> <<set _corruptionSpread = 0>> <<for _villager range _settlement.capturedVillagers>> <<if random(1, 3) === 1>> <<set _settlement.corruption += 10>> <<set _corruptionSpread += 1>> <</if>> <</for>> <<if _corruptionSpread > 0>> <<run _reportEntry.events.push(`Corruption spread in the settlement`)>> <</if>> /* Cap corruption at 100% */ <<if _settlement.corruption > 100>> <<set _settlement.corruption = 100>> <</if>> <</if>> <<if random(1, 10) === 1>> <<set _targetSettlement = $CapturedLocations[random(0, $CapturedLocations.length - 1)]>> <<set _settlement = _targetSettlement>> <h2><<print _settlement.name>> was attacked!</h2> <h3>Check the report in your chamber to see what happened</h3> <hr> <<if _settlement.garrison.length === 0>> /* No defenders available */ <<set _not to $Notoriety / 10>> <<set _raidingForce = 1 + _not>> <<set _capturedCount = _raidingForce>> <<for _i = 0; _i < _capturedCount; _i++>> <<if _settlement.capturedVillagers.length > 0>> <<run _settlement.capturedVillagers.pop()>> <</if>> <</for>> <<run _reportEntry.events.push(`⚔️ ${_settlement.name} was attacked! With no garrison to defend it, ${_capturedCount} raiders freely took ${_capturedCount} villagers. (Notoriety: ${$Notoriety})`)>> <<set _settlement.Happiness -= 25>> <<else>> <<set _raiders = []>> <<set _defenders = []>> <<set _combatLog = []>> <<set _not to $Notoriety / 10>> <<set _raidingForce = 1 + _not>> /* Generate raiders */ <<for _i = 0; _i < _raidingForce; _i++>> <<run _raiders.push({ name: "Raider " + (_i + 1), health: 60, weapon: "Dagger", damage: Math.floor(Math.random() * 6) + 15 })>> <</for>> /*Setup defenders from garrison */ <<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 && _raiders.length > 0; _round++>> <<set _currentRaider = _raiders[0]>> <<set _currentDefender = _defenders[0]>> /* Raider attacks */ <<set _currentDefender.health -= _currentRaider.damage>> <<run _combatLog.push(`${_currentRaider.name} hits ${_currentDefender.originalMember.name} for ${_currentRaider.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 defending the settlement!`)>> <<run _settlement.garrison = _settlement.garrison.filter(g => g !== _currentDefender.originalMember)>> <<run _defenders.shift()>> <<else>> /*Defender counterattack */ <<set _currentRaider.health -= _currentDefender.damage>> <<run _combatLog.push(`${_currentDefender.originalMember.name} counterattacks for ${_currentDefender.damage} damage`)>> /* Check raider death */ <<if _currentRaider.health <= 0>> <<run _combatLog.push(`${_currentRaider.name} has fallen!`)>> <<run _raiders.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 raid results */ <<if _defenders.length === 0 && _raiders.length > 0>> <<for _raider range _raiders>> <<if _settlement.capturedVillagers.length > 0>> <<run _settlement.capturedVillagers.pop()>> <</if>> <</for>> <<run _reportEntry.events.push(`⚔️ ${_settlement.name}'s garrison was wiped out defending against raiders!`)>> <<run _reportEntry.events.push(`${_raiders.length} raiders survived and took ${_raiders.length} villagers. (Notoriety: ${$Notoriety})`)>> <<set _settlement.Happiness -= 20>> <<else>> <<run _reportEntry.events.push(`⚔️ ${_settlement.name} was attacked! Raiders were repelled by the garrison. (Notoriety: ${$Notoriety})`)>> <</if>> <</if>> <</if>> /* Population Growth System */ <<if _settlement.Happiness >= 60>> <<if random(1, 100) <= 15>> // 15% chance for growth <<set _totalCapacity = 0>> <<set _currentOccupancy = 0>> /* Calculate current capacity */ <<for _building range _settlement.populatedBuildings>> <<set _baseType = String(_building).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>> <<if _building.residents>> <<set _currentOccupancy += _building.residents.length>> <</if>> <</if>> <</for>> /* If space available, add new villager */ <<if _currentOccupancy < _totalCapacity>> <<set _newVillager = { NPCID: $villagerIdCounter++, job: _Jobs[random(0, _Jobs.length - 1)], hiddenJob: "none", interested: 40, found: true, met: true, sex: random(1, 2) === 1 ? "Male" : "Female", ImagePath: "Images/Raids/NPC/" + _sex + "/" + random(1, 10) + ".png", armor: "None", weapon: "Dagger", health: 100, building: _availableBuilding, buildingKnown: true, buildingType: String(_availableBuilding).split(' ')[0], attracted: false, attitude: "Neutral" }>> <<run _settlement.capturedVillagers.push(_newVillager)>> <<run _reportEntry.events.push(`A new villager (${_newVillager.job}) has joined ${_settlement.name}`)>> <</if>> <</if>> <</if>> /* Villager Fleeing System */ <<if _settlement.Happiness <= 20>> <<if random(1, 100) <= 10 && _settlement.capturedVillagers.length > 0>> <<set _fleeingIndex = random(0, _settlement.capturedVillagers.length - 1)>> <<set _fleeingVillager = _settlement.capturedVillagers[_fleeingIndex]>> <<run _settlement.capturedVillagers.splice(_fleeingIndex, 1)>> <<run _reportEntry.events.push(`A ${_fleeingVillager.job} has fled from ${_settlement.name} due to poor conditions`)>> <</if>> <</if>> <<include "RevoltSystem">> /* Coven System */ <<if !_settlement.isUnderAttack && _settlement.corruption > 70 && _settlement.Happiness < 25 && random(1, 5) === 1>> <div class="cult-warning" style="text-align: center; margin: 20px 0;"> <h2 style="color: #8b0000;">Communication lost with <<print _settlement.name>></h2> <h3 style="color: #4a4a4a;">Your messenger crows have not returned...</h3> <div style="font-style: italic; color: #666;"> No crow has come in from the settlement _settlement.name, you expect something is wrong... </div> <hr style="border-color: #8b0000;"> </div> <<run _reportEntry.events.push(`⚠️ All contact with ${_settlement.name} has mysteriously ceased`)>> /* Clear the settlement population */ <<set _settlement.capturedVillagers = []>> <<set _settlement.garrison = []>> /* Mark location as cult-controlled */ <<set _settlement.hasCult = true>> <<run _reportEntry.events.push(`The settlement appears to have been abandoned...`)>> <</if>> /* Record final settlement state */ <<set _reportEntry.endingFood = _settlement.foodReserves>> <<set _reportEntry.endingPopulation = _settlement.capturedVillagers.length>> <<run _reports.push(_reportEntry)>> <</for>> <</if>> /* Store reports in story variable */ <<if !$settlementReports>> <<set $settlementReports = {}>> <</if>> <<if $CapturedLocations.length > 0>> <<for _settlement range $CapturedLocations>> <<if _settlement.Happiness < 0>> <<set _settlement.Happiness = 0>> <</if>> <</for>> <</if>> <<set $settlementReports[$Day] = _reports>> <</nobr>>
<<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 _settlement.capturedVillagers ? _settlement.capturedVillagers.length : 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>> <div class="report-stats"> <p>Population Change: <<print _report.startingPopulation>> → <<print _report.endingPopulation>></p> <p>Food Reserves: <<print _report.startingFood>>% → <<print _report.endingFood>>%</p> </div> <div class="report-events"> <<for _event range _report.events>> <div class="event-entry"><<print _event>></div> <</for>> </div> <<else>> <p>No report available for this day yet.</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>> <<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>>
<<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, job: "Guard", specialization: $currentUnitForTransfer.specialization, skill: $currentUnitForTransfer.skill, sex: $currentUnitForTransfer.sex, 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>> <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 $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>> <<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 _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>> <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>> <<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 _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>> <<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 _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>>
<<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="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>> <<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 strenght, 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"> <<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"> 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"> 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"> <<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>>
Thomas Leighton Joe Jared Lepizzle Slimmy69Jim Rob Countrygamer94 Silvor thomas swopes Gildor Vikki Bleed1ngthunder ì˜ë¯¼ ì¡° Baciu Gabriel Yobagoya JokerSkull101 Skuuurt MATTHEW Feave Samuel David Spehirax Jeb d'shay the Gemini Dale Snuggles Veit darkreaper593 void Taylor Scotty Michael Jack Attila pepa582 Tinman18 LoneWolfWrestling Felix zlboyle90 . potato Nile Valentine Travis danasel Joe Gil Stephen Tyler Derek Mili kamakase Matt Goryn Anon James Kay dcosmic Jonny TheFallenKing25 Ashrain ornge0102 jutovo MasterWilly AlternativeInSight Patrick PsychoK9Unit Derek Lorraine Chris Hunter Michael Gray -iwnl- BWA Mychal Zopolis Rage Peachy Alezzan4800 Eric Hiro sylvio Duke AIF Sergey dennis Timurlenk jedikn2 Krol Krol Matthew Dalamazon Jamyl Alexander Kevin FairyScreech Nathan Snegosky Kevin bunrath Lex Nash1977 Vincent Kazama Darrin Rodolfo E1b3zu Dillon George Gwt34 Fallen19t Mg Gundam Oliver Kay595 Caleb G Hunter Michael heriX Boobz Chad Jonny Ricardo #HEFO Caerulius Zulxius Obener arounor Sir DArtagnant Adam someone irrelevant Booka Nate Markell TBVixen Juan Justin Chris kdjdj12 Bryce ReaperXXX Lorem DeeJee01 007zamm . M Rober MTG NOOB UNBOXES Casey Graham ThePuu Harry Roemer Andrew WaywardSquidMan Catalin Katal1n xioo Supreme Warlord Nukit Claw Shane Stephen De Ny uglibug Robert Hairy funnypickles101 A_Xtra_Omen Timothy Mister Rich robert Cody Levitaylor James Tim The Pianiolist Johnydong Saltpowered Alexis Jonah Ty Raymond Atereta certifiedbruhmomment Eric Reed Kris Stitches Enjeru kidral liloxi liloxi Sithriel Oscar Mathew Tom Revan Stéphane Titeux Ginge Nickious TheSloth MorganThe SwigSwag Dugelle Kees van Middendorp Ahsan tim James ShadowDragon Carl Lee MoreTh4nAFeelin Jac Haniko Seinsonai Drumhead chum K3ntsmok3 Aribathus Nicholas Ryan ombia joseph Rhaios Boingboingbaggie VerikoN charlie Rory Neptunes Army KT Bogdan dsync frankenstone WytchDr Mohamed michael arthur Gabriel Tebachi cpt price Ben jeffrey Adam Lewis Callum Cook SilverKnight Vince Midgie Zezy00 John Steven Andre MarvinTP SomeOne Jonathon Germundson Rami Raul Ryan Labyrinth jeffrey john bel
[email protected]
Jimmie Jose John Arumai ShadowRider Enol Ludwig HammerLegends .
<<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/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>> <<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>> <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 satifying 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>> <div class="text-box"> <div class="Random-image"> <<set _imagePath to $ImagePath>> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <<set _int to random(0, 2)>> <<if $Int is 1>> <<say 'Villager' _imagePath>>Why dont we go to the living room<</say>><br><br> <<set $Position to "1girl">> <<elseif $Int is 2>> <<if _int gt 0>> <<say 'Villager' _imagePath>>Why dont we go to the living room<</say>><br><br> <<set $Position to "1girl">> <<else>> <<say 'Villager' _imagePath>>My sister is dying to meet you, she is in the living room<</say>><br><br> <<set $Position to "2girl">> <</if>> <<else>> <<if _int is 0>> <<say 'Villager' _imagePath>>Why dont we go to the living room<</say>><br><br> <<set $Position to "1girl">> <<elseif _int is 1>> <<say 'Villager' _imagePath>>My sister is dying to meet you, she is in the living room<</say>><br><br> <<set $Position to "2girl">> <<else>> <<say 'Villager' _imagePath>>My sisters are dying to meet you, please come with me to the living room<</say>><br><br> <<set $Position to "3girl">> <</if>> <</if>> <<button "Go to the living room">> <<goto "SettlementHouseBJ">> <</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;' )>> <</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 _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>> <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 satifying 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>> <div class="text-box"> Both men use you until they are spent, not realing your corrpting influance 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>> <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 _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, wispering 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 _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 _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>> <<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>>
<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 _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 $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>> <<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>> <<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>> <<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>> <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 _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>> <<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>> <<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 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>> <<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> <<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"> <<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>>
<<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>>
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>>
<<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>>
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>> <<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 $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>>
<<if $Position is "Closer">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/9.png">> <</if>> <<goto "ManorStandingBehind">>
<<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">>
<<if $Position is "Breasts">> <<set $NPCStatus to "BreastsOut">> <<set $ImagePath to "Images/Forrest/Exploring/Mine/Castle/Woman/23.png">> <</if>> <<goto "ManorChairBreasts">>
<<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>> <<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>> <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>>
<<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>> <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 _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>> <<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>> <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>>
<<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>> <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>> <<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 "AliceQuestRetrun">> <</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 _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>> <<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>> <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>>
<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>
<<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>>
<<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>>
<<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>>
<<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> <<button "Retrun to the castle">> <<goto "Base Intro">> <</button>> </div> <<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; } } </style> <</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" }, { x: 102, y: 3, tooltip: "Back to the castle", passage: "Base Intro", position: "null" }, { x: 5, y: 274, tooltip: "North East", passage: "ForestExploreRelay", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelay", position: "South1" }, { x: 777, y: 161, tooltip: "West towards the cost", passage: "ForestExploreRelay", position: "BanditCamp" } ] })>> <<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: "East to the river", passage: "ForestExploreRelay", position: "Horizontal1" }, { x: 5, y: 274, tooltip: "North East", passage: "ForestExploreRelay", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelay", position: "South1" }, { x: 777, y: 161, tooltip: "West 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>> <<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>> <<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 West", passage: "ForestExploreRelay", position: "South2" } ] })>> <<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" } ] })>> <<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: "West", passage: "ForestExploreRelay", position: "Centre" }, { x: 9, y: 380, tooltip: "East 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: "West", 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: "East", passage: "ForestExploreRelay", position: "South2" }, { x: 764, y: 382, tooltip: "West", passage: "ForestExploreRelay", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/South2.jpg", { hotspots: [ { x: 760, y: 305, tooltip: "West", passage: "ForestExploreRelay", position: "SouthScarldale" }, { x: 427, y: 571, tooltip: "Campsite", passage: "ForestCampSite", position: "Camp4" }, { x: 13, y: 510, tooltip: "East", 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: "East", 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 West", passage: "ForestExploreRelay", 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/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: "East", 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: "East", passage: "ForestExploreRelay", position: "Tower" }, { x: 763, y: 315, tooltip: "West", 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: "West", passage: "ForestExploreRelay", position: "Market" }, { x: 768, y: 461, tooltip: "East", passage: "ForestExploreRelay", position: "AbandonedSettlement" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/AbandonedSettlement.jpg", { hotspots: [ { x: 24, y: 414, tooltip: "West", passage: "ForestExploreRelay", position: "Creak" }, { x: 763, y: 601, tooltip: "East", 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: "West", passage: "ForestExploreRelay", position: "Swamp6" }, { x: 757, y: 548, tooltip: "East", passage: "MannorQuest1", position: "null" } ] })>> <</if>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp4.jpg", { hotspots: [ { x: 10, y: 338, tooltip: "West", 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: "West", 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: "East", passage: "ForestExploreRelay", position: "Swamp4" }, { x: 760, y: 747, tooltip: "South East", passage: "ForestExploreRelay", position: "Swamp3" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Swamp6.jpg", { hotspots: [ { x: 7, y: 538, tooltip: "West", passage: "ForestExploreRelay", position: "Swamp3" }, { x: 755, y: 571, tooltip: "East", passage: "ForestExploreRelay", position: "BanditMine" } ] })>> <</nobr>>
<<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">> <<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">> <<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">> <<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">> <<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">> <<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>> <<set _encounters to ["Encounter_Bandit", "Encounter_Female Bandit", "Encounter_Wolf", "Encounter_Bear", "StalkForest"]>> <<set _encounter = either(_encounters)>> <<goto _encounter>> <<else>> <<goto "ForestExplore">> <</if>>
<<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>>
<<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 "Retrun to the castle">> <<goto "Base Intro">> <</button>> <</if>> </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);$('.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>>
<<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 East", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "West 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 East", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "West 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 East", passage: "ForestExploreRelayNight", position: "MerchantPath" }, { x: 466, y: 760, tooltip: "South towards Scarldale", passage: "ForestExploreRelayNight", position: "South1" }, { x: 777, y: 161, tooltip: "West 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" } ] })>> <<run setup.buildingData.set("Images/Forrest/Maps/Night/BanditCamp.jpg", { hotspots: [ { x: 773, y: 752, tooltip: "South West", passage: "ForestExploreRelayNight", position: "Swamp1" }, { x: 9, y: 698, tooltip: "Retrun to the forest entrance", passage: "ForestExploreRelayNight", position: "Centre" } ] })>> <<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: "Marchant", 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: "West", passage: "BanditsQuest", position: "null" }, { x: 768, y: 461, tooltip: "East", 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: "West", passage: "ForestExploreRelayNight", position: "position" }, { x: 757, y: 548, tooltip: "East", 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>>
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>>
<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 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]]
<<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>>
<<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">>
<<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>> <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>> <<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 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>> <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 _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 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>> <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 _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 _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 _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"> <<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>>
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>> <<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>> <<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 20 + $PlayerPower>> <<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"> <<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"> 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>> 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"> <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> Dispite 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 $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"> 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 strenght <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"> <<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"> 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="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>>
<<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>>
<<nobr>> <h2>Choose an unlocked location to fast travel</h2> <</nobr>>
<<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>> <<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>> <<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>> <<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>>
<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>
<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>> <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>>
<<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>>
<<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>> <<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>> <<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> <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>> <<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>> <<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>> <<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>> <<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>> <<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>> <<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 _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.png"> </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.png"); $("#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>> <<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>> <<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>> <<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>> <<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>>
<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"> 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>>
<<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>>
<<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 _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>> <<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>>
<<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>>
<<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>
<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]]
<<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 $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>> <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 _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>><<set _attackChance to 50 + $PlayerPower>> <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>> <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 acorss 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 shaddows you see a blade launch towards your heart, you dodge to one side and feel it slide into your sholder, 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>> <<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" }>> <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 class="combat-buttons"> <<button "Attack">><<goto "Combat">><</button>> </div> </div> <style> .scene-description { font-style: italic; color: #e6e6e6; margin: 20px 0; padding: 15px; border-left: 3px solid #600000; background: rgba(0, 0, 0, 0.3); } .animated img { transition: all 0.3s ease; } .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; } </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 _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>>
<<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 your's<</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 pray... 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>> <<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.png"> </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.png"); $("#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>> <<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>> <<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 $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>> <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>>
<<nobr>> <div class="text-box"> <h1>Choose Your Starting Bonus</h1> <div class="Random-image"> <<set _imagePath to "Images/Player/1.png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <div class="bonus-options"> <div class="bonus-option" id="power-option"> <h3>Power</h3> <div class="option-details"> Increases your starting power in melee combat to 10. Strength is added onto a weapon's basic damage score. </div> </div> <div class="bonus-option" id="magic-option"> <h3>Magic</h3> <div class="option-details"> Increases your starting magical strength to 30 allowing you to cast more spells before being depleted. </div> </div> <div class="bonus-option" id="resources-option"> <h3>Resources</h3> <div class="option-details"> Start the game with 500 gold, 700 wood and 600 stone. </div> </div> </div> <div style="text-align: center; margin-top: 20px;"> <button id="confirmBonusButton" style="display: none;">Confirm Selection</button> </div> </div> <</nobr>> <<widget "applyPowerBonus">> <<set $PlayerPower to 10>> <<if $VisitedDefences is true>> <<goto "Base Intro">> <<else>> <<goto "GnarlakEncounter">> <</if>> <<endwidget>> <<widget "applyMagicBonus">> <<set $PlayerMagic to 30>> <<if $VisitedDefences is true>> <<goto "Base Intro">> <<else>> <<goto "GnarlakEncounter">> <</if>> <<endwidget>> <<widget "applyResourcesBonus">> <<set $Gold to 500>> <<set $Wood to 700>> <<set $Stone to 600>> <<if $VisitedDefences is true>> <<goto "Base Intro">> <<else>> <<goto "GnarlakEncounter">> <</if>> <<endwidget>> <<script>> $(document).ready(function() { // Handle clicking on a bonus option $(document).on('click', '.bonus-option', function() { $('.bonus-option').removeClass('selected'); $(this).addClass('selected'); // Store the selected bonus State.variables.selectedBonus = $(this).find('h3').text(); // Show the confirm button $('#confirmBonusButton').show(); }); // Handle clicking the confirm button $(document).on('click', '#confirmBonusButton', function() { var selectedBonus = State.variables.selectedBonus; if (selectedBonus === "Power") { SugarCube.Wikifier.wikifyEval("<<applyPowerBonus>>"); } else if (selectedBonus === "Magic") { SugarCube.Wikifier.wikifyEval("<<applyMagicBonus>>"); } else if (selectedBonus === "Resources") { SugarCube.Wikifier.wikifyEval("<<applyResourcesBonus>>"); } }); }); <</script>> <style> .bonus-options { display: flex; justify-content: space-between; margin: 20px 0; gap: 15px; } .bonus-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; } .bonus-option:hover { background: linear-gradient(to bottom, rgba(139, 0, 0, 0.7), rgba(0, 0, 0, 0.7)); } .bonus-option.selected { background: rgba(139, 0, 0, 0.7); } .option-details { margin-top: 10px; font-size: 0.9em; } #confirmBonusButton { padding: 10px 20px; background-color: #8b0000; color: white; border: none; border-radius: 5px; font-size: 1em; cursor: pointer; transition: background-color 0.3s; } #confirmBonusButton:hover { background-color: #a00000; } </style> <<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>> <<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>> <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"> <<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>>
<<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"> <<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>> <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>>
<<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>>
<<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>> <<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 strenght 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>>
<<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>><<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>>
<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>> <<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>>
<<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>>
<<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>> <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>>
<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>> <<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 $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 pray' } ] }; // 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>> <<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 lord we can plan any defences you need"}, {speaker: 1, text: "You're expecting us to be attacked?"}, {speaker: 2, text: "As we grow, people will notice. At this time bandits are running the forest, robbing and killing anyone they can. If you start causing problems for anyone, they will know and they may come for your gold"}, {speaker: 2, text: "We will need to build defences leading to your vault, so any wood be thief will be going home in a coffin... Or staying here in the dungeon"}, {speaker: 2, text: "At this time, we only have space for one trap or monster, feel free to look over the options and I can being the work"}, {speaker: 1, text: "Can we build more rooms?"}, {speaker: 2, text: "Of course Lord, there's a planning table in your chamber for more upgrades, but be warned, as we expand, we will draw more attention to the castle."}, ] }>> <<set _TutorialVault 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 vault Lord!"}, {speaker: 1, text: "Why is it empty?"}, {speaker: 2, text: "Errr, I am sorry lord"}, {speaker: 1, text: "It's fine, what do we need to improve the castle"}, {speaker: 2, text: "Gold, Stone and Wood for now lord, with this I can continue to improve the castle in any ways you see fit"}, {speaker: 2, text: "But remeber, if we are attacked any raiders will be targeting the vault. Simple bandits don't care about you, they want your gold! We will need to defend this place"} ] }>> <<set _TutorialDungeon to { person1: { name: "You", image: "Images/Player/1.png" }, person2: { name: "Gnarlak", image: "Images/Castle/Gnarlak/1.png" }, messages: [ {speaker: 2, text: "I see you found the dungeon my lord"}, {speaker: 1, text: "I feel strange down here"}, {speaker: 2, text: "Yes, Lord there is a corruption rune here. Anyone who spends time down here will slowly become corrupted and more willing to our cause over time"}, {speaker: 1, text: "I see"}, {speaker: 2, text: "For now we have two cells and one corrupting rune. I can build more cells if you can provide the materials, but if you wish to corrupt your prisoners faster, we will need to find more runes"}, {speaker: 1, text: "And where can I find them?"}, {speaker: 2, text: "There are... Others in the land who use the same powers as you, some are even stronger... They may have these runes"} ] }>> <<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, welcome to Oakshade Farm"}, {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"}, {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 cards to us? A bribe prehapse? Eitherway we need staff and "} ] }>> <</nobr>>
<<nobr>> <div class="text-box"> <<if $ArmouryVisisted isnot true>> <<set $ArmouryBlacksmith to false>> <<set $ForgedArmour to 0>> <<set $ForgedSwords 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: $ForgedArmour</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: $ForgedSwords</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> <<button "Leave">> <<goto "Inside Castle">> <</button>> <</if>> <</nobr>>
<<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>
<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>
<<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"> <<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 pray 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 _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>> <<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>> <<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>> <<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>> <<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"> <<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 pray trys 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>> <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 pray 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>> <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>> <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>> <<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 spiders play things ahead, a woman who must have become stuck in the sticky webs and entangled when the arachness found her. Youll 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>> <<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>> <<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 _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 _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>> <<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>
Weapons: [[ScarldaleWeaponStore]] [[Spells Shop]] [[WeaponUpgrade]] Crypt: [[SpiderCryptStart]] [[CryptGeneration]] [[CryptChestSearch]] [[CryptFinalChamber]] Enemy: <<link "Succubus">> <<set $Crypt to true>> <<goto "Encounter_Succ">> <</link>> [[Encounter_Arachness]] [[Encounter_Ghoul]] [[Encounter_Undead]] [[Encounter_Skell]] [[Encounter_Female Bandit]] [[Encounter_Bandit]] [[Encounter_Bear]] [[Encounter_Wolf]] [[Encounter_Guard]] New Town: <<link "new town">> <<set $BackgroundPath to "Images/Town/5.png">> <<set _TownLocation to "Images/Town/Maps/Enterance/1.jpeg">> <<set $ForestLocation to _TownLocation>> <<goto "Town">> <</link>> [[AliceBar]] - UNFINISHED (may cut to meet deadline) [[Passage Browser]]
<<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>>
<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 looses himself to the corrupting influance of your weapon, without someone to satify him, he looses 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>
<<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 $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 _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 $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 $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> </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 $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>
<<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 "Retrun to the castle">> <<goto "Base Intro">> <</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);$('.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>> <<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" } ] })>> <<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" } ] })>> <</nobr>>
<<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">>
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 "Retrun to the castle">> <<goto "Base Intro">> <</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);$('.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>>
<<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">>
<<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>> <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]] </div> <<else>> <div class="menu-item disabled" data-image="Images/Castle/Portal/1.png"> It's too late to use the portal </div> <</if>><</if>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Visit the Vaults|Vaults]] </div> <<if $Infirmary is true>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Visit the Infirmary|Infirmary]] </div> <</if>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Back to the entrance|Inside Castle]] </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: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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="castle-menu"> <h1>Castle Chambers</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 $WolfQuestStatus is "FirstEncounter">> <div class="menu-item" data-image="Images/Castle/Gnarlak/1.png"> [[Speak to Gnarlak|GnarlakChamber]] </div> <</if>> <div class="menu-item" data-image="Images/Castle/Chambers/1.png"> [[Enter your Chambers|Chambers]] </div> <<if $LucyCorrupt is true>> <div class="menu-item" data-image="Images/Castle/Chambers/2.png"> [[Visit Lucy|Succubus1]] </div> <</if>> <<if $AliceCorrupt is true>> <div class="menu-item" data-image="Images/Castle/Chambers/3.png"> [[Visit Alice|Succubus2]] </div> <</if>> <<if $MaraAtBase is true>> <div class="menu-item" data-image="Images/Castle/Chambers/4.png"> [[Visit Mara|MaraChamber]] </div> <</if>> <div class="menu-item" data-image="Images/Castle/Vault/1.png"> [[Go Downstairs|Inside Castle]] </div> </div> <style> .castle-menu { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; background-color: rgba(0, 0, 0, 0.8); color: #FFFFFF; } .castle-menu h1 { font-size: 28px; text-align: center; 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); } </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 $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> Your drunkness level: <progress @value="$AliceDrunk" max="5"></progress> <<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> More content is coming to this area in the next update <<button "Leave">> <<goto "Town">> <</button>> </div> <<button "Change image style">> <<goto "AliceImgStyle">> <</button>> <</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>> <div class="text-box"> <<button "Someone Comes Over">> <<goto "AliceBarPersonIntro">> <</button>><br> <<button "Leave">> <<goto "Town">> <</button>> </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>> <<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 $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> <<button "Flert with him">> <<set $Position to "Flert">> <<goto "AliceBarPersonQuestion">> <</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>> <<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"> <<include "AliceBarDialogue">> <<if $Position is "Flert">> <</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">> <</if>> <<if $Position is "Name">> <</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">> <</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>> <<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>> $Position <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"> <<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 loose yourself to the pleasure of being used like the cheap whore you were pretending to be. Dispite being irresistible to most mortals, the mans 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 'Alice' $AliceTavImg>>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/tf/" + _img + ".jpg">> <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.jpg">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> He wasted no time, pressing deep into you as you both cry out in pleasure <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/behind/1.jpg">> <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>> <div class="text-box"> <<if $AliceBarMeetPersonality is "Drunk">> <</if>> <<if $AliceBarMeetPersonality is "Nervous">> <</if>> <<if $AliceBarMeetPersonality is "Confident">> <</if>> </div> <</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">> <<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"> 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>>
<<nobr>> <div class="text-box"> <<if $Position if "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 if "Tease">> <<if $AliceArtStyle is "Anime">> <<set _rand to 6>> <<else>> <<set _rand to 1>> <</if>> <div class="Random-image"> <<set _imagePath to "Images/Town/Tavern/Alice/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> <</if>> </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 satifys 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 completly 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 looses 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 trys 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 trys 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 completly 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 looses 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>>
<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>
<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>
:: Passage Browser <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>>
<<nobr>> <div class="text-box"> <<say 'Clerk' $CharImg>>What are you doing?<</say>> <<say '$AliceBarMeetName' $CharImg>>shhh<</say>> <<set _rand to random(1, 2)>> <div class="Random-image"> <<set _imagePath to "Images/Town/Office/table/" + _rand + ".png">> <img @src=_imagePath alt="Guest Image"> </div> <br><br> </div> <</nobr>>
<<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>>
<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>>
<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>>
<<goto "Resporn">>
<<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="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>>
<<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>> <<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"> <<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>>
<<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>>
<<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"> 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>>