JavaScript must be enabled to play.
Browser lacks capabilities required to play.
Upgrade or switch to another browser.
Loading…
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 40px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center; max-width: 600px;"> <h1 style="color: white; margin: 0 0 20px 0; font-size: 36px;">👋 Thank You for Playing</h1> <p style="color: white; margin: 0; font-size: 18px;"> That was supposed to kick you but if you still see this just close the game manually. </p> </div> <<script>> // Close the window/tab window.close(); // If window.close() doesn't work (blocked by browser), redirect to a blank page setTimeout(function() { window.location.href = "about:blank"; }, 1000); <</script>> <p style="color: #aaa; text-align: center; font-size: 14px; margin-top: 20px;"> If the window does not close automatically, you can safely close this tab. </p> </div> <</nobr>>
<<nobr>> <!-- Time and Date Display --> <<set _currentTime = getTimeOfDay()>> <<run checkWeatherUpdate()>> <div style="text-align: center; margin-bottom: 10px;"> <<if _currentTime === "morning">> <span style="font-size: 14px; font-weight: bold;">🌅 Morning</span> <<elseif _currentTime === "afternoon">> <span style="font-size: 14px; font-weight: bold;">☀️ Afternoon</span> <<elseif _currentTime === "evening">> <span style="font-size: 14px; font-weight: bold;">🌆 Evening</span> <<else>> <span style="font-size: 18px;">🌙 Night</span> <</if>> <br> <span style="font-size: 14px; font-weight: bold;">$dayOfWeek, Week $weekNumber</span> <br> <span style="font-size: 12px;"><<= getTimeString()>> - Day $dayNumber</span> <br> <span style="font-size: 12px;"><<= getWeatherIcon($currentWeather)>> <<print $currentWeather || "Clear">></span> </div> <!-- Player Name --> <div style="text-align: center; margin-bottom: 10px;"> <<if $firstName !== undefined && $lastName !== undefined>> <h2 style="color: #667eea; margin: 0;">$firstName $lastName</h2> <<else>> <h2 style="color: #667eea; margin: 0;">Water Bottle</h2> <</if>> </div> <!-- Character Portrait --> <div style="margin: 15px 0; text-align: center;"> <<if $appearance && $bodyParts>> <<set _faceImagePath = setup.getPlayerFaceImage()>> <<if _faceImagePath && _faceImagePath !== "">> <img @src="_faceImagePath" style="max-width: 100%; height: auto; border-radius: 10px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.2);" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: none; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <<else>> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <</if>> <<else>> <div style="width: 100%; height: 200px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; display: flex; align-items: center; justify-content: center; color: white; font-style: italic; border: 3px solid #667eea;"> No Portrait </div> <</if>> </div> <!-- Stats Overview --> <div style="margin: 10px 0;"> <h3 style="margin: 5px 0; color: #667eea; font-size: 16px;">Stats</h3> <div style="font-size: 12px;"> <<set _totalStrength = setup.getTotalStat("strength")>> <<set _totalIntelligence = setup.getTotalStat("intelligence")>> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _totalDexterity = setup.getTotalStat("dexterity")>> <<set _strengthBonus = _totalStrength - $stats.strength>> <<set _intelligenceBonus = _totalIntelligence - $stats.intelligence>> <<set _charismaBonus = _totalCharisma - $stats.charisma>> <<set _dexterityBonus = _totalDexterity - $stats.dexterity>> <strong>Strength:</strong> $stats.strength<<if _strengthBonus > 0>> <span style="color: #51cf66;">(+<<print _strengthBonus>>)</span><<elseif _strengthBonus < 0>> <span style="color: #ff6b6b;">(<<print _strengthBonus>>)</span><</if>><br> <strong>Intelligence:</strong> $stats.intelligence<<if _intelligenceBonus > 0>> <span style="color: #51cf66;">(+<<print _intelligenceBonus>>)</span><<elseif _intelligenceBonus < 0>> <span style="color: #ff6b6b;">(<<print _intelligenceBonus>>)</span><</if>><br> <strong>Charisma:</strong> $stats.charisma<<if _charismaBonus > 0>> <span style="color: #51cf66;">(+<<print _charismaBonus>>)</span><<elseif _charismaBonus < 0>> <span style="color: #ff6b6b;">(<<print _charismaBonus>>)</span><</if>><br> <strong>Dexterity:</strong> $stats.dexterity<<if _dexterityBonus > 0>> <span style="color: #51cf66;">(+<<print _dexterityBonus>>)</span><<elseif _dexterityBonus < 0>> <span style="color: #ff6b6b;">(<<print _dexterityBonus>>)</span><</if>><br> </div> </div> <!-- Quick Info --> <div style="margin: 10px 0;"> <h3 style="margin: 5px 0; color: #667eea; font-size: 16px;">Info</h3> <div style="font-size: 12px;"> <strong>Gender:</strong> <<print $bodyParts.gender.toUpperFirst()>><br> <strong>Skin:</strong> <<print $appearance.skinTone.toUpperFirst()>><br> <strong>Age:</strong> $appearance.age<br> <<if $jobs && $jobs.length > 0>> <strong>Job:</strong> <<print $jobs[0]>> <<else>> <strong>Job:</strong> <span style="color: #e74c3c;">Unemployed</span> <</if>><br> <strong>Money:</strong> <<print setup.formatMoney($money)>> </div> </div> <</nobr>>
:: Widgets [widget nobr] /* --- Custom textbox widget for reliable name input --- */ <<widget "ctext">> <<set _varName = _args[0]>> <<set _defaultValue = State.getVar(_varName) || "">> <<textbox _varName _defaultValue>> <</widget>> /* --- Trait Selection Widget --- */ <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> /* --- Continue Check Widget --- */ <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Stats">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 3>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 3>> <<elseif $selectedTraits[_i] === "Swift">> <<set $stats.dexterity += 3>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 3>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<set $stats.charisma += 2>> <<set $stats.dexterity += 2>> <<set $stats.strength += 2>> <<set $stats.intelligence += 2>> <<elseif $selectedTraits[_i] === "Quick Learner">> /* No stat effect - skill learning bonus only */ <</if>> <</for>> <</if>> <<set $maxTraits = 300>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>>
:: CodeLibrary [widget nobr] <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Traits">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 5>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 5>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 5>> <<set $stats.intelligence -= 1>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<goto "GiftedStatChoice">> <<elseif $selectedTraits[_i] === "Quick Learner" || $selectedTraits[_i] === "Keen Observer">> /* No stat effect needed, continue normally */ <</if>> <</for>> <</if>> <<set $maxTraits = 100>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>> :: Widgets [widget] /* --- Custom textbox widget for reliable name input --- */ <<widget "ctext">> <<set _varName = _args[0]>> <<set _defaultValue = State.getVar(_varName) || "">> <<textbox _varName _defaultValue>> <</widget>> <<widget "traitSelection">> <<for _name, _desc range $availableTraits>> <<capture _name, _desc>> <div style="margin-bottom: 8px;"> ''<<= _name>>'' <<if $selectedTraits.includes(_name)>> <span style="color: green;">(SELECTED)</span> <<link "REMOVE">> <<set $selectedTraits.delete(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <<if $selectedTraits.length < $maxTraits>> <<link "SELECT">> <<set $selectedTraits.push(_name)>> <<replace "#trait-selection-ui">><<traitSelection>><</replace>> <<replace "#continue-check-area">><<continueCheck>><</replace>> <</link>> <<else>> <span style="color: gray;">(Max Reached)</span> <</if>> <</if>> <br> <span style="font-size: 90%; color: #888888;"><<= _desc>></span> </div> <</capture>> <</for>> <</widget>> <<widget "continueCheck">> <<set _disable = $firstName === "" || $lastName === "">> <<disable _disable>> <<link "Continue to Traits">> <<set $stats = clone($baseStats)>> <<if $selectedTraits.length > 0>> <<for _i to 0; _i < $selectedTraits.length; _i++>> <<if $selectedTraits[_i] === "Pensive">> <<set $stats.intelligence += 5>> <<elseif $selectedTraits[_i] === "Silver-Tongued">> <<set $stats.charisma += 5>> <<elseif $selectedTraits[_i] === "Jock">> <<set $stats.strength += 5>> <<set $stats.intelligence -= 1>> <<elseif $selectedTraits[_i] === "Naturally Gifted">> <<goto "GiftedStatChoice">> <<elseif $selectedTraits[_i] === "Quick Learner" || $selectedTraits[_i] === "Keen Observer">> /* No stat effect needed, continue normally */ <</if>> <</for>> <</if>> <<set $maxTraits = 100>> <<goto "StatMenu">> <</link>> <</disable>> <<if _disable>> <br> <span style="color: red;">Please complete your name to continue.</span> <</if>> <</widget>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Alleyway")>> <<run $visitedLocations.push("Alleyway")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "Alleyway">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #666; text-align: center;">🌆 Dark Alleyway</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Alley.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Dark Alleyway"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #434343 0%, #000000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #666;"> <p style="color: white; font-size: 18px; margin: 0;"> You find yourself in a dimly lit alleyway in Sunfish City. The city sprawls around you, full of possibilities and dangers. Neon signs flicker in the distance, and the sounds of urban life echo off the grimy walls. </p> <<if $homeless>> <p style="color: #ff6b6b; margin: 10px 0 0 0; font-style: italic;"> You are homeless. You need to find work, shelter, or a way to change your circumstances. </p> <</if>> </div> <h2 style="color: #666;">Where do you want to go?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">The heart of the city, bustling with activity.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Corporate towers and professional opportunities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Neon lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Shady Shop --> <div style="border: 3px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff4444; margin: 0 0 10px 0;">🕶️ Shady Shop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">A suspicious storefront with unmarked goods.</p> <<link "<div style='background: #ff4444; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shady Shop</div>">> <<goto "ShadyShop">> <</link>> </div> <!-- The Angler Bar --> <div style="border: 3px solid #d4a574; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d4a574; margin: 0 0 10px 0;">🍺 The Angler</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">A dimly lit dive bar frequented by workers and shady characters.</p> <<link "<div style='background: #d4a574; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter The Angler</div>">> <<goto "TheAngler">> <</link>> </div> </div> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "Alleyway">> <<goto "CrimeHub">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Alleyway")>> <!-- Also gather all unemployed NPCs --> <<set _unemployedNPCs = []>> <<for _npc range $npcs>> <<set _isUnemployed = false>> <<if !_npc.jobs || _npc.jobs.length === 0>> <<set _isUnemployed = true>> <<elseif typeof _npc.jobs === "string" && _npc.jobs === "Unemployed">> <<set _isUnemployed = true>> <<elseif Array.isArray(_npc.jobs) && (_npc.jobs.length === 0 || (_npc.jobs.length === 1 && _npc.jobs[0] === "Unemployed"))>> <<set _isUnemployed = true>> <</if>> <<if _isUnemployed>> <<run _unemployedNPCs.push(_npc)>> <</if>> <</for>> <!-- Combine scheduled NPCs and unemployed NPCs, removing duplicates --> <<set _allNPCsHere = _npcsHere ? _npcsHere.slice() : []>> <<for _unemployed range _unemployedNPCs>> <<set _alreadyInList = false>> <<for _existing range _allNPCsHere>> <<if _existing.name === _unemployed.name>> <<set _alreadyInList = true>> <</if>> <</for>> <<if !_alreadyInList>> <<run _allNPCsHere.push(_unemployed)>> <</if>> <</for>> <h2 style="margin-top: 30px; color: #ff6b6b;">🌆 People Here</h2> <<if _allNPCsHere && _allNPCsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _allNPCsHere>> <<capture _npc>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"> <<if _npc.jobs && _npc.jobs.length > 0>> <<print _npc.jobs.join(", ")>> <<else>> Unemployed <</if>> </p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The alley is empty right now. Just shadows and silence. </p> </div> <</if>> <!-- Street Sleep Section --> <h2 style="margin-top: 30px; color: #666;">💤 Rest</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #666; margin: 0 0 10px 0;">😴 Sleep on the Street</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.6;"> You can try to catch some sleep curled up behind a pile of trash bags. The stench is overwhelming, and the cold concrete offers little comfort. Rats scurry nearby, and the sounds of the city never quite fade. It's far from ideal, but when you have nowhere else to go, sometimes this is all you can do. </p> <p style="color: #ff6b6b; font-size: 13px; margin: 0 0 15px 0; font-weight: bold; font-style: italic;"> ⚠️ Warning: This is a sketchy place to sleep. Bad things could happen while you're vulnerable... </p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Sleep</div>">> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #666; margin-top: 0;">😴 How long do you want to sleep?</h2> <p style="color: #ccc; margin-bottom: 10px;">Enter hours (max 6):</p> <p style="color: #ff6b6b; font-size: 13px; margin-bottom: 15px; font-style: italic;">⚠️ 5% chance of robbery if you have money</p> <input type="number" id="alley-sleep-input" min="1" max="6" value="4" style="width: 100px; padding: 8px; font-size: 16px; text-align: center; border: 2px solid #666; border-radius: 5px; background: #2a2a2a; color: white;"> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _sleepHours = Number(jQuery("#alley-sleep-input").val())>> <<if _sleepHours < 1 || _sleepHours > 6 || Number.isNaN(_sleepHours)>> <<set _sleepHours = 4>> <</if>> <!-- 5% chance of theft if player has money --> <<set _wasRobbed = false>> <<set _stolenAmount = 0>> <<if $money > 0>> <<set _robberyChance = Math.random() * 100>> <<if _robberyChance < 5>> <<set _stolenAmount = Math.floor($money * 0.5)>> <<set $money -= _stolenAmount>> <<set _wasRobbed = true>> <</if>> <</if>> <<run advanceTime(_sleepHours * 60)>> <<set $appearance.hairStyle = "messy">> <!-- Update sleep time and handle debuffs (alleyway does NOT grant Well Rested) --> <<set $lastSleepTime = setup.getTotalGameMinutes()>> <<if _sleepHours >= 6>> <<run setup.removeDebuff("exhaustion")>> <</if>> <<run Dialog.close()>> <<if _wasRobbed>> <<goto "AlleySleepRobbed">> <<else>> <<goto "AlleySleepSafe">> <</if>> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">👤 Body & Traits Overview</h1> <!-- IMAGE SLOTS --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-bottom: 25px;"> <!-- Face Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Face</h3> <<set _faceImagePath = setup.getPlayerFaceImage()>> <<if _faceImagePath && _faceImagePath !== "">> <img @src="_faceImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> <!-- Chest Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Chest</h3> <<set _chestImagePath = setup.getPlayerChestImage()>> <<if _chestImagePath && _chestImagePath !== "">> <img @src="_chestImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> <!-- Butt Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; text-align: center; background: #2a2a2a;"> <h3 style="color: #667eea; margin-top: 0;">Butt</h3> <<set _buttImagePath = setup.getPlayerButtImage()>> <<if _buttImagePath && _buttImagePath !== "">> <img @src="_buttImagePath" style="max-width: 100%; height: auto; border-radius: 8px; border: 2px solid #667eea;" onerror="this.style.display='none'; this.nextElementSibling.style.display='flex';"> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: none; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <<else>> <div style="width: 150px; height: 150px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); margin: 5px auto; display: flex; align-items: center; justify-content: center; color: white; border-radius: 8px; font-style: italic;"> No Image </div> <</if>> </div> </div> <!-- PERSONAL INFORMATION --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0;">📋 Personal Information</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Name:</strong> <span style="color: #ccc;">$firstName $lastName</span> </div> <div> <strong style="color: #aaa;">Gender:</strong> <span style="color: #ccc;"><<print $bodyParts.gender.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Housing Status:</strong> <span style="color: <<if $hasApartment>>#51cf66<<else>>#ff6b6b<</if>>;"> <<if $hasApartment>>Housed<<else>>Homeless<</if>> </span> </div> <div> <strong style="color: #aaa;">Age:</strong> <span style="color: #ccc;">$appearance.age</span> </div> </div> </div> <!-- APPEARANCE DETAILS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0;">✨ Appearance Details</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Hair:</strong> <<set _playerHairStyle = $appearance.hairStyle === "messy" ? "Messy " : "">> <<set _playerHairLength = $appearance.hairLength ? $appearance.hairLength.toUpperFirst() : "Short">> <span style="color: #ccc;"><<print _playerHairStyle + _playerHairLength>> $appearance.hairColor</span> </div> <div> <strong style="color: #aaa;">Skin Tone:</strong> <span style="color: #ccc;"><<print $appearance.skinTone.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Chest:</strong> <span style="color: #ccc;"><<print $bodyParts.chest.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Butt:</strong> <span style="color: #ccc;"><<print $bodyParts.butt.toUpperFirst()>></span> </div> <div> <strong style="color: #aaa;">Genitals:</strong> <span style="color: #ccc;"><<print $bodyParts.genitals.toUpperFirst()>></span> </div> </div> </div> <!-- STATS --> <<set _bonuses = setup.calculateStatBonuses()>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin-top: 0;">📊 Stats</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div> <strong style="color: #aaa;">Strength:</strong> <span style="color: #ccc;">$stats.strength</span> <<if _bonuses.strength !== 0>> <span style="color: <<if _bonuses.strength > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.strength > 0>>+<</if>>_bonuses.strength) </span> <</if>> </div> <div> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #ccc;">$stats.intelligence</span> <<if _bonuses.intelligence !== 0>> <span style="color: <<if _bonuses.intelligence > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.intelligence > 0>>+<</if>>_bonuses.intelligence) </span> <</if>> </div> <div> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #ccc;">$stats.charisma</span> <<if _bonuses.charisma !== 0>> <span style="color: <<if _bonuses.charisma > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.charisma > 0>>+<</if>>_bonuses.charisma) </span> <</if>> </div> <div> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #ccc;">$stats.dexterity</span> <<if _bonuses.dexterity !== 0>> <span style="color: <<if _bonuses.dexterity > 0>>#51cf66<<else>>#ff6b6b<</if>>;"> (<<if _bonuses.dexterity > 0>>+<</if>>_bonuses.dexterity) </span> <</if>> </div> </div> </div> <!-- SEXUAL SKILLS SECTION (Only if Sexually Skilled trait or Succubus/Slut present) --> <<if ($skills && $skills.includes("Sexually Skilled")) || ($physicalTraits && ($physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")))>> <<run setup.initializeSexualSkills()>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 id="sexualSkillsHeader" style="color: #e91e63; margin-top: 0; cursor: pointer; user-select: none;" onclick="jQuery('#sexualSkillsContent').slideToggle(300); jQuery('#sexualSkillsArrow').text(jQuery('#sexualSkillsArrow').text() === '▼' ? '▶' : '▼');"> <span id="sexualSkillsArrow">▼</span> 💋 Sexual Skills </h2> <div id="sexualSkillsContent"> <!-- Core Acts --> <h3 style="color: #e91e63; font-size: 16px; margin: 15px 0 10px 0; border-bottom: 2px solid #e91e63; padding-bottom: 5px;">Core Sexual Acts</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-bottom: 15px;"> <<set _coreSkills = ["oralGiving", "oralReceiving", "vaginal", "anal", "handjobs", "fingering", "titWorship", "titfuck"]>> <<for _skillKey range _coreSkills>> <<set _skill = $sexualSkills[_skillKey]>> <<set _displayName = setup.getSexualSkillDisplayName(_skillKey)>> <div style="background: #1a1a1a; border: 2px solid #e91e63; border-radius: 8px; padding: 10px;"> <div style="color: #e91e63; font-weight: bold; margin-bottom: 5px;">_displayName</div> <div style="color: #ccc; font-size: 14px;">Level: <span style="color: #51cf66;"><<print _skill.level>></span></div> <div style="background: #333; border-radius: 4px; height: 8px; margin-top: 5px; overflow: hidden;"> <<set _expPercent = (_skill.exp / _skill.maxExp) * 100>> <div @style="'width: ' + _expPercent + '%; height: 100%; background: linear-gradient(90deg, #e91e63 0%, #c2185b 100%);'"></div> </div> <div style="color: #888; font-size: 11px; margin-top: 3px;"><<print _skill.exp>>/<<print _skill.maxExp>> XP</div> </div> <</for>> </div> <!-- Styles & Techniques - DISABLED --> <<if false>> <h3 style="color: #e91e63; font-size: 16px; margin: 15px 0 10px 0; border-bottom: 2px solid #e91e63; padding-bottom: 5px;">Styles & Techniques</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-bottom: 15px;"> <<set _styleSkills = ["teasing", "dirtyTalk", "roleplay", "domination", "submission", "sensual", "rough", "tantric"]>> <<for _skillKey range _styleSkills>> <<set _skill = $sexualSkills[_skillKey]>> <<set _displayName = setup.getSexualSkillDisplayName(_skillKey)>> <div style="background: #1a1a1a; border: 2px solid #9b59b6; border-radius: 8px; padding: 10px;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 5px;">_displayName</div> <div style="color: #ccc; font-size: 14px;">Level: <span style="color: #51cf66;"><<print _skill.level>></span></div> <div style="background: #333; border-radius: 4px; height: 8px; margin-top: 5px; overflow: hidden;"> <<set _expPercent = (_skill.exp / _skill.maxExp) * 100>> <div @style="'width: ' + _expPercent + '%; height: 100%; background: linear-gradient(90deg, #9b59b6 0%, #7b1fa2 100%);'"></div> </div> <div style="color: #888; font-size: 11px; margin-top: 3px;"><<print _skill.exp>>/<<print _skill.maxExp>> XP</div> </div> <</for>> </div> <!-- Physical Attributes & Advanced --> <h3 style="color: #e91e63; font-size: 16px; margin: 15px 0 10px 0; border-bottom: 2px solid #e91e63; padding-bottom: 5px;">Physical & Advanced</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<set _advancedSkills = ["stamina", "flexibility", "rhythm", "exhibitionism", "fetishPlay"]>> <<for _skillKey range _advancedSkills>> <<set _skill = $sexualSkills[_skillKey]>> <<set _displayName = setup.getSexualSkillDisplayName(_skillKey)>> <div style="background: #1a1a1a; border: 2px solid #ffc107; border-radius: 8px; padding: 10px;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 5px;">_displayName</div> <div style="color: #ccc; font-size: 14px;">Level: <span style="color: #51cf66;"><<print _skill.level>></span></div> <div style="background: #333; border-radius: 4px; height: 8px; margin-top: 5px; overflow: hidden;"> <<set _expPercent = (_skill.exp / _skill.maxExp) * 100>> <div @style="'width: ' + _expPercent + '%; height: 100%; background: linear-gradient(90deg, #ffc107 0%, #ff9800 100%);'"></div> </div> <div style="color: #888; font-size: 11px; margin-top: 3px;"><<print _skill.exp>>/<<print _skill.maxExp>> XP</div> </div> <</for>> </div> <</if>> </div> </div> <</if>> <!-- ACTIVE EFFECTS (Buffs & Debuffs) --> <<if ($activeBuffs && $activeBuffs.length > 0) || ($activeDebuffs && $activeDebuffs.length > 0)>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffd43b; margin-top: 0;">⚡ Active Effects</h2> <!-- Debuffs (red) --> <<if $activeDebuffs && $activeDebuffs.length > 0>> <<for _debuff range $activeDebuffs>> <div style="background: #1a1a1a; border: 2px solid #ff6b6b; border-radius: 8px; padding: 12px 15px; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center;"> <span style="color: #ff6b6b; font-weight: bold; font-size: 16px;">❌ <<= _debuff.name>></span> <span style="color: #888; font-size: 12px;">(Until Sleep)</span> </div> <div style="color: #aaa; font-size: 13px; margin-top: 8px;"> <<if _debuff.id === "exhaustion">> • -20% Trade Success<br> • -20% Steal Success <</if>> </div> </div> <</for>> <</if>> <!-- Buffs (green) --> <<if $activeBuffs && $activeBuffs.length > 0>> <<for _buff range $activeBuffs>> <<set _currentTotalMinutes = ($dayNumber - 1) * 1440 + $timeInMinutes>> <<set _remainingMinutes = _buff.expiresAt - _currentTotalMinutes>> <<set _remainingHours = Math.floor(_remainingMinutes / 60)>> <<set _remainingMins = _remainingMinutes % 60>> <div style="background: #1a1a1a; border: 2px solid #51cf66; border-radius: 8px; padding: 12px 15px; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center;"> <span style="color: #51cf66; font-weight: bold; font-size: 16px;">✓ <<= _buff.name>></span> <span style="color: #888; font-size: 12px;"> <<if _remainingHours > 0>> <<= _remainingHours>>h <<= _remainingMins>>m remaining <<else>> <<= _remainingMins>>m remaining <</if>> </span> </div> <div style="color: #aaa; font-size: 13px; margin-top: 8px;"> <<if _buff.id === "well_rested">> • +5% Trade Success<br> • +5% Steal Success<br> • Improved Fishing Luck<br> • +1 Daily Talk Bonus <<elseif _buff.id === "satisfied">> • +5% Trade Success<br> • +5% Steal Success<br> • Improved Fishing Luck<br> • +1 Daily Talk Bonus <<elseif _buff.id === "shower_fresh">> • +15% Trading Bonus <<elseif _buff.id === "bath_relaxed">> • +10% Steal Chance <<elseif _buff.id === "bath_luxury">> • +20% Trading Bonus<br> • +5% Steal Chance <<elseif _buff.id === "food_morning_boost">> • +$2-5 from all money sources <<elseif _buff.id === "food_comfort">> • +10% Trading Bonus <<elseif _buff.id === "food_social_glow">> • +1 Relationship points per daily talk <<elseif _buff.id === "food_well_fed">> • +15% Trading Bonus <<elseif _buff.id === "food_treasure_hunter">> • +1% Treasure chance in fishing<br> • -1% Trash chance in fishing <<elseif _buff.id === "food_hearty_meal">> • +2 Relationship points per daily talk <<elseif _buff.id === "food_trade">> • +<<print _buff.effects.tradeChance || 0>>% Trading Bonus <<elseif _buff.id === "food_fishing">> • Improved Fishing Luck <<elseif _buff.id === "food_stealing">> • +<<print _buff.effects.stealChance || 0>>% Steal Chance <<elseif _buff.id === "food_money">> • +<<print _buff.effects.moneyBonus || 0>>% Money Bonus <<elseif _buff.id === "food_relationship">> • +<<print _buff.effects.relationshipBonus || 0>> Relationship Bonus <</if>> </div> </div> <</for>> <</if>> </div> <</if>> <!-- PHYSICAL TRAITS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 id="physicalTraitsHeader" style="color: #51cf66; margin-top: 0; cursor: pointer; user-select: none;" onclick="jQuery('#physicalTraitsContent').slideToggle(300); jQuery('#physicalTraitsArrow').text(jQuery('#physicalTraitsArrow').text() === '▼' ? '▶' : '▼');"> <span id="physicalTraitsArrow">▼</span> 💪 Physical Traits </h2> <div id="physicalTraitsContent"> <<if $physicalTraits && $physicalTraits.length > 0>> <<set _displayPhysicalTraits = $physicalTraits.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair"; })>> <<if _displayPhysicalTraits.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _trait range _displayPhysicalTraits>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<set _traitColor = _traitValue >= 0 ? "#51cf66" : "#ff6b6b">> <<set _traitBonuses = setup.traitBonuses[_trait] || {}>> <div @style="'background: #1a1a1a; border: 2px solid ' + _traitColor + '; border-radius: 8px; padding: 10px 15px;'"> <strong style="color: #ccc;">_trait</strong> <span @style="'color: ' + _traitColor + '; font-size: 13px; margin-left: 5px;'"> (<<if _traitValue > 0>>+<</if>>_traitValue) </span> <<if Object.keys(_traitBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<set _bonusText = []>> <<if _traitBonuses.strength !== undefined>><<run _bonusText.push("STR: " + (_traitBonuses.strength > 0 ? "+" : "") + _traitBonuses.strength)>><</if>> <<if _traitBonuses.intelligence !== undefined>><<run _bonusText.push("INT: " + (_traitBonuses.intelligence > 0 ? "+" : "") + _traitBonuses.intelligence)>><</if>> <<if _traitBonuses.charisma !== undefined>><<run _bonusText.push("CHA: " + (_traitBonuses.charisma > 0 ? "+" : "") + _traitBonuses.charisma)>><</if>> <<if _traitBonuses.dexterity !== undefined>><<run _bonusText.push("DEX: " + (_traitBonuses.dexterity > 0 ? "+" : "") + _traitBonuses.dexterity)>><</if>> <<print _bonusText.join(" ")>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No physical traits acquired yet.</p> <</if>> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No physical traits acquired yet.</p> <</if>> </div> </div> <!-- MENTAL TRAITS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 id="mentalTraitsHeader" style="color: #9b59b6; margin-top: 0; cursor: pointer; user-select: none;" onclick="jQuery('#mentalTraitsContent').slideToggle(300); jQuery('#mentalTraitsArrow').text(jQuery('#mentalTraitsArrow').text() === '▼' ? '▶' : '▼');"> <span id="mentalTraitsArrow">▼</span> 🧠 Mental Traits </h2> <div id="mentalTraitsContent"> <<if $mentalTraits && $mentalTraits.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _trait range $mentalTraits>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<set _traitColor = _traitValue >= 0 ? "#9b59b6" : "#ff6b6b">> <<set _traitBonuses = setup.traitBonuses[_trait] || {}>> <div @style="'background: #1a1a1a; border: 2px solid ' + _traitColor + '; border-radius: 8px; padding: 10px 15px;'"> <strong style="color: #ccc;">_trait</strong> <span @style="'color: ' + _traitColor + '; font-size: 13px; margin-left: 5px;'"> (<<if _traitValue > 0>>+<</if>>_traitValue) </span> <<if Object.keys(_traitBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<set _bonusText = []>> <<if _traitBonuses.strength !== undefined>><<run _bonusText.push("STR: " + (_traitBonuses.strength > 0 ? "+" : "") + _traitBonuses.strength)>><</if>> <<if _traitBonuses.intelligence !== undefined>><<run _bonusText.push("INT: " + (_traitBonuses.intelligence > 0 ? "+" : "") + _traitBonuses.intelligence)>><</if>> <<if _traitBonuses.charisma !== undefined>><<run _bonusText.push("CHA: " + (_traitBonuses.charisma > 0 ? "+" : "") + _traitBonuses.charisma)>><</if>> <<if _traitBonuses.dexterity !== undefined>><<run _bonusText.push("DEX: " + (_traitBonuses.dexterity > 0 ? "+" : "") + _traitBonuses.dexterity)>><</if>> <<print _bonusText.join(" ")>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No mental traits acquired yet.</p> <</if>> </div> </div> <!-- SKILLS --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 id="skillsHeader" style="color: #ffc107; margin-top: 0; cursor: pointer; user-select: none;" onclick="jQuery('#skillsContent').slideToggle(300); jQuery('#skillsArrow').text(jQuery('#skillsArrow').text() === '▼' ? '▶' : '▼');"> <span id="skillsArrow">▼</span> 🎯 Skills </h2> <div id="skillsContent"> <<if $skills && $skills.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _skill range $skills>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <<set _skillBonuses = setup.skillBonuses[_skill] || {}>> <div style="background: #1a1a1a; border: 2px solid #ffc107; border-radius: 8px; padding: 10px 15px;"> <strong style="color: #ccc;">_skill</strong> <span style="color: #ffc107; font-size: 13px; margin-left: 5px;"> (+_skillValue) </span> <<if Object.keys(_skillBonuses).length > 0>> <div style="font-size: 11px; color: #888; margin-top: 3px;"> <<if _skillBonuses.strength>>STR: <<if _skillBonuses.strength > 0>>+<</if>><<print _skillBonuses.strength>> <</if>> <<if _skillBonuses.intelligence>>INT: <<if _skillBonuses.intelligence > 0>>+<</if>><<print _skillBonuses.intelligence>> <</if>> <<if _skillBonuses.charisma>>CHA: <<if _skillBonuses.charisma > 0>>+<</if>><<print _skillBonuses.charisma>> <</if>> <<if _skillBonuses.dexterity>>DEX: <<if _skillBonuses.dexterity > 0>>+<</if>><<print _skillBonuses.dexterity>><</if>> </div> <</if>> </div> <</for>> </div> <<else>> <p style="color: #666; font-style: italic; margin: 0;">No skills acquired yet.</p> <</if>> </div> </div> <!-- CURRENT JOB --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 id="jobsHeader" style="color: #667eea; margin-top: 0; cursor: pointer; user-select: none;" onclick="jQuery('#jobsContent').slideToggle(300); jQuery('#jobsArrow').text(jQuery('#jobsArrow').text() === '▼' ? '▶' : '▼');"> <span id="jobsArrow">▼</span> 💼 Current Employment </h2> <div id="jobsContent"> <<if $jobs && $jobs.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _job range $jobs>> <<set _jobValue = setup.getTraitValue("job", _job)>> <div style="background: #1a1a1a; border: 2px solid #667eea; border-radius: 8px; padding: 10px 15px;"> <strong style="color: #ccc;">_job</strong> <span style="color: #667eea; font-size: 13px; margin-left: 5px;"> (Value: _jobValue) </span> </div> <</for>> </div> <<else>> <p style="color: #ff6b6b; font-style: italic; margin: 0;">Currently unemployed.</p> <</if>> </div> </div> <!-- BACK BUTTON --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<set $returningFromBody = true>> <<set _prev = previous()>> <<if $lastLocation && $lastLocation !== "Body" && $lastLocation !== "Debug">> <<goto $lastLocation>> <<elseif _prev !== "Body" && _prev !== "Debug">> <<goto _prev>> <<else>> <<goto "Summary">> <</if>> <</link>> </div> </div> <</nobr>>
:: StoryMenu <<nobr>> <<if passage() !== "PrawnHubStreamEnd">> <<if $currentArtifact === "The Tidal Memory Stone">> [[Teleport]] <</if>> [[Body]] [[Traits|Trait Information]] [[Inventory]] [[Relations|Relationships]] <<if $hasSmartphone>> [[Phone|Phone]] <</if>> [[Feats|Achievements]] [[Quests]] [[Cheats|CheatMenuPassword]] [[Settings|ImageSettings]] <</if>> [[Patreon|https://www.patreon.com/Grankor]] [[Discord|https://discord.gg/z9eDdQC6zA]] <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Downtown")>> <<run $visitedLocations.push("Downtown")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "Downtown">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🏙️ Downtown</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Downtown.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Downtown"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #4a9eff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> The bustling heart of Sunfish City stretches out before you. Skyscrapers tower overhead, streets are packed with people rushing to their destinations, and the air buzzes with the energy of urban life. Shop fronts line the sidewalks, and the constant hum of traffic fills the air. </p> </div> <h2 style="color: #667eea;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Apartments --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🏢 Sunfish Apartments</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Residential high-rise offering furnished apartments for rent.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Apartments</div>">> <<goto "Apartments">> <</link>> </div> <!-- Town Hall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🏛️ Town Hall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">The seat of city government and administration.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Town Hall</div>">> <<goto "TownHall">> <</link>> </div> <!-- Aquarium --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🐠 Sunfish City Aquarium</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A massive oceanarium featuring marine life from around the world.</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> <!-- Police Department --> <div style="border: 3px solid #4169e1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4169e1; margin: 0 0 10px 0;">🚔 Police Department</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Sunfish City's main police headquarters and precinct.</p> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Police Department</div>">> <<goto "PoliceDepartment">> <</link>> </div> <!-- Bank --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">🏦 Sunfish City Bank</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Professional banking services and account management.</p> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bank</div>">> <<goto "Bank">> <</link>> </div> </div> <h2 style="color: #667eea;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and professional opportunities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon-lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alleyway.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Commercial District --> <div style="border: 3px solid #5ca4e8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #5ca4e8; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Shopping centers, medical facilities, and various services.</p> <<link "<div style='background: #5ca4e8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Commercial District</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "Downtown">> <<goto "CrimeHub">> <</link>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("BusinessDistrict")>> <<run $visitedLocations.push("BusinessDistrict")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "BusinessDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💼 Business District</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/BusinessDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Business District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> Gleaming corporate towers pierce the sky. Professionals in sharp suits hurry along pristine sidewalks, clutching briefcases and smartphones. The atmosphere is calculated and ruthlessly efficient. </p> </div> <h2 style="color: #17a2b8;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Seabass Park --> <div style="border: 3px solid #2d5016; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public park with green spaces and walking paths.</p> <<link "<div style='background: #2d5016; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Park</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- Gym --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">💪 Opah Fitness</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">State of the art gym with weights and cardio equipment.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Gym</div>">> <<goto "OpahFitness">> <</link>> </div> <!-- Dance Studio --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💃 Ribbonfish Dance Studio</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Professional dance studio with classes and private sessions.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Dance Studio</div>">> <<goto "DanceStudio">> <</link>> </div> <!-- Cafe --> <div style="border: 3px solid #8b4513; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">☕ Manta Ray Cafe</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Upscale coffee shop for business professionals.</p> <<link "<div style='background: #8b4513; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Cafe</div>">> <<goto "Cafe">> <</link>> </div> <!-- Training Center --> <div style="border: 3px solid #5c6bc0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #5c6bc0; margin: 0 0 10px 0;">🎓 Bluefin Development Center</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Training center offering courses to improve skills and stats.</p> <<link "<div style='background: #5c6bc0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Training Center</div>">> <<goto "TrainingCenter">> <</link>> </div> <!-- Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Shopping center with stores and services.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Mall</div>">> <<goto "Mall">> <</link>> </div> </div> <h2 style="color: #17a2b8;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Industrial waterfront district.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Docks</div>">> <<goto "Docks">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon-lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> </div> <!-- Add after the travel grid, before closing div --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "BusinessDistrict">> <<goto "CrimeHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("RedLightDistrict")>> <<run $visitedLocations.push("RedLightDistrict")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "RedLightDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 Red Light District</h1> <!-- Location Image (Conditional) --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/RedLightDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Red Light District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #c31432 0%, #ff1493 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <p style="color: white; font-size: 18px; margin: 0;"> Neon signs cast a crimson glow over the streets. Workers beckon from doorways while shadowy figures conduct business in dark corners. This is where pleasure, vice, and opportunity intertwine. </p> </div> <h2 style="color: #ff1493;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- Azure Angelfish Lounge --> <div style="border: 3px solid #007FFF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">💋 Azure Angelfish Lounge</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">High-end establishment offering companionship.</p> <<link "<div style='background: #007FFF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Brothel</div>">> <<goto "Brothel">> <</link>> </div> <!-- Electric Jelly Revue --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9D00FF; margin: 0 0 10px 0;">🪼 Electric Jelly Revue</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Pulsing music and dancers on stage.</p> <<link "<div style='background: #9D00FF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Strip Club</div>">> <<goto "StripClub">> <</link>> </div> <!-- The Silver Marlin --> <div style="border: 3px solid #C0C0C0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #C0C0C0; margin: 0 0 10px 0;">🎰 The Silver Marlin</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Bright lights and high stakes gambling.</p> <<link "<div style='background: #C0C0C0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <h2 style="color: #ff1493;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Industrial waterfront district.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Docks</div>">> <<goto "Docks">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Outskirts --> <div style="border: 3px solid #4a4a4a; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #888; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Travel to the city outskirts.</p> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Outskirts</div>">> <<goto "Outskirts">> <</link>> </div> </div> <!-- Add after the travel grid, before closing div --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "RedLightDistrict">> <<goto "CrimeHub">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("RedLightDistrict")>> <h2 style="color: #ff1493;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The streets are quiet at the moment. No one is visible in this area. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Docks")>> <<run $visitedLocations.push("Docks")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "Docks">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">⚓ Docks</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Docks.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Docks"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1e3a5f 0%, #2c5f8d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> The salty tang of sea air fills your lungs as waves lap against weathered wooden piers. Massive cargo ships loom in the harbor, their hulls rusted and barnacle covered. This is a place of hard labor and harder people. </p> </div> <!-- Check job availability --> <<set _alreadyHasDockJob = $jobs && $jobs.includes("Dock Worker")>> <<set _meetsRequirements = false>> <!-- Check strength requirement (10+) --> <<if $stats && $stats.strength >= 10>> <<set _meetsRequirements = true>> <</if>> <!-- Check for qualifying physical traits --> <<if !_meetsRequirements && $physicalTraits>> <<set _qualifyingPhysicalTraits = ["Athletic Build", "Muscular", "Strong", "Sturdy"]>> <<for _trait range _qualifyingPhysicalTraits>> <<if $physicalTraits.includes(_trait)>> <<set _meetsRequirements = true>> <<break>> <</if>> <</for>> <</if>> <!-- Check for qualifying skills --> <<if !_meetsRequirements && $skills>> <<set _qualifyingSkills = ["Heavy Lifting", "Inventory Management", "Management", "Forklift Certified"]>> <<for _skill range _qualifyingSkills>> <<if $skills.includes(_skill)>> <<set _meetsRequirements = true>> <<break>> <</if>> <</for>> <</if>> <!-- Himbo transformation includes Heavy Lifting benefits --> <<if !_meetsRequirements && $physicalTraits && $physicalTraits.includes("Himbo")>> <<set _meetsRequirements = true>> <</if>> <<set _dockWorkerNPCs = setup.getNPCsByJob("Dock Worker")>> <<set _dockWorkerCount = _dockWorkerNPCs ? _dockWorkerNPCs.length : 0>> <<set _canHire = _dockWorkerCount < 8>> <!-- Dock Work Area (Only shows if player is a Dock Worker) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Dock Worker">> <h2 style="color: #28a745;">Your Workplace</h2> <div style="margin-bottom: 25px;"> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">⚒️ Loading Bay</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Report for dock work. Work hours: 6 AM - 10 PM, max 8 hours per day.</p> <p style="font-size: 14px; color: #28a745; margin: 0 0 10px 0; font-weight: bold;">Pay: $23/hour</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Loading Bay</div>">> <<goto "UniversalWork">> <</link>> </div> </div> <</if>> <h2 style="color: #3498db;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to the Bus Stop</div>">> <<bustravel>> <<goto "BusStop">> <</link>> </div> <!-- Fishing & Gear Dealership --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🎣 Fishing & Gear Dealership</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Buy boats, tackle, and fishing gear.</p> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> <!-- Dock Fishing --> <div style="border: 3px solid #1a5276; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1a5276; margin: 0 0 10px 0;">🎣 Dock Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Cast your line from the docks.</p> <<link "<div style='background: #1a5276; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Fishing</div>">> <<goto "FishingDocks">> <</link>> </div> <!-- Ocean Fishing (requires boat) --> <<if $boat>> <div style="border: 3px solid #0077be; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #0077be; margin: 0 0 10px 0;">🚤 Ocean Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take your boat out to sea.</p> <<link "<div style='background: #0077be; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Ocean Fishing</div>">> <<goto "OceanFishing">> <</link>> </div> <<else>> <div style="border: 3px solid #555; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.6;"> <h3 style="color: #555; margin: 0 0 10px 0;">🚤 Ocean Fishing</h3> <p style="font-size: 14px; color: #666; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Requires a boat. Buy one at the Dealership.</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; cursor: not-allowed; font-weight: bold; margin-top: 10px;'>No Boat</div> </div> <</if>> </div> <h2 style="color: #3498db;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel Downtown</div>">> <<travel>> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Business District</div>">> <<travel>> <<goto "BusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon lit streets filled with nightlife and vice.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Red Light District </div>">> <<travel>> <<goto "RedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Alleyway</div>">> <<travel>> <<goto "Alleyway">> <</link>> </div> <!-- Beach --> <div style="border: 3px solid #f4a460; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f4a460; margin: 0 0 10px 0;">🏖️ Beach</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Sandy shores and ocean waves.</p> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to the Beach</div>">> <<travel>> <<goto "Beach">> <</link>> </div> </div> <!-- Employment Section --> <h2 style="color: #3498db;">Employment</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Apply for Dock Worker Job --> <<if _alreadyHasDockJob>> <!-- Already working here --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">💼 Employment</h3> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">You're already employed here as a dock worker!</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Already Employed</div> </div> <<elseif !_meetsRequirements>> <!-- Doesn't meet requirements --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">💼 Apply for Dock Work</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">You don't meet the physical requirements for dock work.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Qualified</div> </div> <<elseif !_canHire>> <!-- Docks are fully staffed --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">💼 Apply for Dock Work</h3> <p style="font-size: 14px; color: #ff6b6b; margin-bottom: 10px;">The docks are fully staffed (<<print _dockWorkerCount>>/8 workers)</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Hiring</div> </div> <<else>> <!-- Can apply for the job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Apply for Dock Work</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Join the loading crew!</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">Pay: $23/hour | Hours: 6 AM - 10 PM</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Apply Now</div>">> <<goto "DocksJobOffer">> <</link>> </div> <</if>> </div> <!-- Criminal Activities --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "Docks">> <<goto "CrimeHub">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Docks")>> <h2 style="color: #3498db;">⚓ People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #5dade2; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic;"> Various people can be found working or passing through the docks... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #5dade2; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The docks are quiet right now. The workers must be on break. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit for achievements --> <<if !$visitedLocations>> <<set $visitedLocations = []>> <</if>> <<if !$visitedLocations.includes("BusStop")>> <<run $visitedLocations.push("BusStop")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">🚌 Bus Stop</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Bus.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Bus Stop"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #f39c12 0%, #f1c40f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0;"> A covered bus stop with benches and a digital display showing arrival times. People wait patiently, some checking their phones, others reading newspapers. </p> </div> <!-- Bus Pass Information --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin: 0 0 15px 0;">🎫 Your Bus Pass Status</h2> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #28a745; margin-bottom: 15px;"> <p style="color: #28a745; margin: 0; text-align: center; font-size: 18px; font-weight: bold;"> ✅ Active 30-Day Pass </p> <p style="color: #aaa; margin: 10px 0 0 0; text-align: center;"> Days Remaining: <strong style="color: #51cf66;"><<print $busPassDaysRemaining>></strong> </p> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #dc3545; margin-bottom: 15px;"> <p style="color: #dc3545; margin: 0; text-align: center; font-size: 18px; font-weight: bold;"> ❌ No Active Pass </p> <p style="color: #aaa; margin: 10px 0 0 0; text-align: center;"> You'll need to pay per ride or purchase a pass </p> </div> <</if>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center;"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> </div> <!-- Purchase Options --> <h2 style="color: #ffc107;">Purchase Tickets</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Single Ride --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🎫 Single Ride</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 5px 0; line-height: 1.4;">One-way ticket to any destination.</p> <p style="font-size: 18px; color: #51cf66; margin: 0 0 auto 0; font-weight: bold; flex-grow: 1;">$5</p> <p style="font-size: 12px; color: #aaa; margin: 0 0 10px 0; font-style: italic;">Pay per ride</p> </div> <!-- 30-Day Pass --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">🎟️ 30-Day Pass</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 5px 0; line-height: 1.4;">Unlimited rides for 30 days.</p> <p style="font-size: 18px; color: #51cf66; margin: 0 0 5px 0; font-weight: bold;">$50</p> <p style="font-size: 12px; color: #aaa; margin: 0 0 auto 0; font-style: italic; flex-grow: 1;">Best value for frequent travelers!</p> <<if !$busPassDaysRemaining || $busPassDaysRemaining <= 0>> <<if $money >= 50>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Purchase Pass ($50)</div>">> <<set $money -= 50>> <<set $busPassDaysRemaining = 30>> <!-- Achievement for buying bus pass --> <<run setup.achievements.unlock("buy_bus_pass")>> <<goto "BusStop">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Enough Money</div> <</if>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Already Have Pass</div> <</if>> </div> </div> <!-- Bus Routes --> <h2 style="color: #ffc107;">Bus Routes</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">City center and hub.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Downtown">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Downtown">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "BusinessDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "BusinessDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Industrial waterfront district.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Docks">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Docks">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Beach --> <div style="border: 3px solid #f4a460; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f4a460; margin: 0 0 10px 0;">🏖️ Beach</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Sandy shores and ocean waves.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Beach">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Beach">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neon lit streets of nightlife.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "RedLightDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "RedLightDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Alleyway">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Alleyway">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Outskirts --> <div style="border: 3px solid #4a4a4a; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #888; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Rural areas outside the city.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Outskirts">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #4a4a4a; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "Outskirts">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Commercial District --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Shops and services center.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "CommercialDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "CommercialDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Residential District --> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🏘️ Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Neighborhoods and homes.</p> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "ResidentialDistrict">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "ResidentialDistrict">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <!-- Go Home (House takes priority over Apartment) --> <<if $ownsHouse && $houseLocation === "ResidentialMansions">> <div style="border: 3px solid #fd7e14; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #fd7e14; margin: 0 0 10px 0;">🏰 Go Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take the bus to your mansion.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #fd7e14; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerModernMansion">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #fd7e14; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerModernMansion">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <<elseif $ownsHouse && $houseLocation === "ResidentialExpensiveHomes">> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🏡 Go Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take the bus to your luxury home.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerExpensiveHome">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerExpensiveHome">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <<elseif $ownsHouse>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🏡 Go Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take the bus to your house.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerSuburbanHome">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "PlayerSuburbanHome">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <<elseif $hasApartment>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🏠 Go Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take the bus to your apartment.</p> <<set _isBusDriver = $jobs && $jobs.length > 0 && $jobs[0] === "Bus Driver">> <<if ($busPassDaysRemaining && $busPassDaysRemaining > 0) || _isBusDriver>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - Free</div>">> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "StudioApartment">> <</link>> <<elseif $money >= 5>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take Bus (3 min) - $5</div>">> <<set $money -= 5>> <<bustravel>> <<set $skipTimeAdvancement = true>> <<goto "StudioApartment">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Need $5 or Pass</div> <</if>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🏠 Go Home</h3> <p style="font-size: 14px; color: #666; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">You don't have a home to go to.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>No Home</div> </div> <</if>> <!-- NPC Interaction - Bus Driver --> <<set _npcsHere = setup.getNPCsByJob("Bus Driver")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #ffc107; margin-top: 30px;">Bus Driver</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 15px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;"> <<print _npc.jobs.join(", ")>> </p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> <</if>> </div> <!-- Walk Option --> <div style="text-align: center; margin-top: 30px;"> <p style="color: #aaa; font-size: 14px; margin-bottom: 10px;">Or you can walk for free (takes longer)</p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Go back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Criminal Heat-Based Arrest Check */ <<if $jobs && $jobs.includes("Criminal")>> <<if !$heat>> <<set $heat = 0>> <</if>> /* Calculate arrest chance: 1% at 0 heat, 90% at 100 heat */ <<set _arrestChance = 1 + ($heat * 0.89)>> <<set _arrestRoll = random(1, 100)>> <<if _arrestRoll <= _arrestChance>> <<goto "CaughtByPolice">> <</if>> <</if>> <<if !setup.isMallOpen()>> <<goto "MallClosed">> <</if>> <<set $lastLocation = "Mall">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Mall")>> <<run $visitedLocations.push("Mall")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🛍️ Sunfish City Mall</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A sprawling shopping complex filled with stores, restaurants, and people. The air conditioning is a welcome relief from the outside heat. </p> </div> <h2 style="color: #9b59b6;">Mall Directory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Fitness Shop --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">💪 Barracuda Fitness</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Workout equipment, supplements, and athletic wear.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shop</div>">> <<goto "FitnessShop">> <</link>> </div> <!-- Ecentric Shop --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🌙 Lionfish Boutique</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Alternative fashion, dark clothing, and unique accessories.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Shop</div>">> <<goto "EcentricShop">> <</link>> </div> <!-- Beauty Salon --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💄 Angelfish Beauty Salon</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Hair styling, makeup, and beauty services.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Salon</div>">> <<goto "BeautySalon">> <</link>> </div> <!-- Tech Store --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Hammerhead Tech</h3> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Electronics, computers, and technical support.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "TechStore">> <</link>> </div> <!-- Adult Store --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔞 Stingray Adult Emporium</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Adult products and toys. 18+ only.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "AdultStore">> <</link>> </div> <!-- Bakery --> <div style="border: 3px solid #d2691e; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">🥐 Seahorse Bakery</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Fresh baked goods, pastries, and bread.</p> <<link "<div style='background: #d2691e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bakery</div>">> <<goto "Bakery">> <</link>> </div> </div> <br> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go to Floor 2 ⬆️</div>">> <<goto "MallFloor2">> <</link>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Mall</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Mall")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #9b59b6; margin-top: 30px;">🛍️ People at the Mall</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 20px 0;">Some people are shopping at the mall.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Add after the floor navigation, before NPCs section --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "Mall">> <<goto "CrimeHub">> <</link>> </div> </div> <</nobr>>
:: ImageManager <<nobr>><style>.image-manager{padding:20px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);min-height:100vh}.manager-container{max-width:1400px;margin:0 auto;background:white;border-radius:15px;padding:30px;box-shadow:0 10px 40px rgba(0,0,0,0.3)}.manager-title{text-align:center;color:#667eea;font-size:2.5em;margin-bottom:30px}.section-tabs{display:flex;gap:10px;margin-bottom:30px;border-bottom:3px solid #e9ecef;flex-wrap:wrap}.tab-button{padding:15px 30px;border:none;background:#f8f9fa;cursor:pointer;font-size:16px;font-weight:600;border-radius:10px 10px 0 0;transition:all 0.3s}.tab-button:hover{background:#e9ecef}.tab-button.active{background:#667eea;color:white}.tab-content{display:none}.tab-content.active{display:block}.skin-tone-filter{display:flex;gap:10px;margin-bottom:20px;padding:15px;background:#f8f9fa;border-radius:10px;flex-wrap:wrap}.tone-button{padding:10px 20px;border:2px solid #dee2e6;background:white;cursor:pointer;font-weight:600;border-radius:5px;transition:all 0.3s}.tone-button:hover{border-color:#667eea}.tone-button.active{background:#667eea;color:white;border-color:#667eea}.image-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:20px;margin-top:20px}.image-card{border:2px solid #dee2e6;border-radius:10px;padding:15px;background:#f8f9fa;transition:all 0.3s}.image-card:hover{border-color:#667eea;box-shadow:0 5px 15px rgba(102,126,234,0.2)}.image-card h3{color:#667eea;margin-bottom:10px;font-size:14px;text-transform:capitalize}.image-preview{width:100%;height:180px;background:#e9ecef;border-radius:8px;margin-bottom:10px;display:flex;align-items:center;justify-content:center;overflow:hidden}.image-preview img{max-width:100%;max-height:100%;object-fit:contain}.image-preview.empty{color:#999;font-style:italic;font-size:12px}.url-input{width:100%;padding:8px;border:2px solid #dee2e6;border-radius:5px;font-size:12px;margin-bottom:8px}.url-input:focus{outline:none;border-color:#667eea}.btn-group{display:flex;gap:5px}.btn{flex:1;padding:8px;border:none;border-radius:5px;cursor:pointer;font-weight:600;font-size:11px;transition:all 0.3s}.btn-save{background:#28a745;color:white}.btn-save:hover{background:#218838}.btn-clear{background:#dc3545;color:white}.btn-clear:hover{background:#c82333}.btn-test{background:#17a2b8;color:white}.btn-test:hover{background:#138496}.back-link{display:inline-block;margin-top:30px;padding:15px 30px;background:#6c757d;color:white;text-decoration:none;border-radius:8px;font-weight:600;transition:all 0.3s}.back-link:hover{background:#5a6268;transform:translateY(-2px)}.export-section{margin-top:30px;padding:20px;background:#f8f9fa;border-radius:10px;border:2px solid #667eea}.export-section h3{color:#667eea;margin-bottom:15px}.code-output{background:#2d2d2d;color:#00ff00;padding:15px;border-radius:5px;font-family:'Courier New',monospace;font-size:11px;max-height:300px;overflow-y:auto;white-space:pre-wrap;word-wrap:break-word}.filename-hint{font-size:11px;color:#6c757d;font-style:italic;margin-bottom:5px}</style><div class="image-manager"><div class="manager-container"><h1 class="manager-title">🖼️ Body Part Image Manager</h1><div class="section-tabs"><button class="tab-button active" onclick="switchTab('chest')">Chest Sizes</button><button class="tab-button" onclick="switchTab('butt')">Butt Sizes</button><button class="tab-button" onclick="switchTab('face')">Face Images</button></div><div id="chest-tab" class="tab-content active"><h2>Chest Size Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Skin Tone:</span><button class="tone-button active" onclick="filterByTone('chest','bronzed')">Bronzed</button><button class="tone-button" onclick="filterByTone('chest','pale')">Pale</button><button class="tone-button" onclick="filterByTone('chest','dark')">Dark</button></div><div class="image-grid" id="chest-grid"></div></div><div id="butt-tab" class="tab-content"><h2>Butt Size Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Skin Tone:</span><button class="tone-button active" onclick="filterByTone('butt','bronzed')">Bronzed</button><button class="tone-button" onclick="filterByTone('butt','pale')">Pale</button><button class="tone-button" onclick="filterByTone('butt','dark')">Dark</button></div><div class="image-grid" id="butt-grid"></div></div><div id="face-tab" class="tab-content"><h2>Face Images</h2><div class="skin-tone-filter"><span style="font-weight:600;margin-right:10px;">Hair Color:</span><button class="tone-button active" onclick="filterFaceByHair('Black')">Black</button><button class="tone-button" onclick="filterFaceByHair('Brown')">Brown</button><button class="tone-button" onclick="filterFaceByHair('Blonde')">Blonde</button><button class="tone-button" onclick="filterFaceByHair('Red')">Red</button><button class="tone-button" onclick="filterFaceByHair('PlatinumBlonde')">Platinum Blonde</button></div><div class="image-grid" id="face-grid"></div></div><div class="export-section"><h3>📋 Export Image Data</h3><p style="margin-bottom:10px;">Copy this code and paste it into your StoryInit to save your image assignments:</p><div class="code-output" id="export-output"></div><button class="btn btn-test" onclick="copyExportCode()" style="margin-top:10px;width:auto;">Copy to Clipboard</button></div><a href="javascript:void(0)" class="back-link" onclick="Engine.backward()">← Back to Game</a></div></div><script>const bodyPartSizes={chest:["flat masculine","flat","small","medium","big","huge","gigantic"],butt:["flat masculine","flat","small","medium","big","huge","gigantic"]},skinTones=["bronzed","pale","dark"],hairColors=['Black','Brown','Blonde','Red','PlatinumBlonde'],hairStyles=['styled','messy'];let currentTone={chest:"bronzed",butt:"bronzed"},currentFaceHair='Black';function switchTab(t){document.querySelectorAll(".tab-content").forEach(t=>{t.classList.remove("active")}),document.querySelectorAll(".tab-button").forEach(t=>{t.classList.remove("active")}),document.getElementById(t+"-tab").classList.add("active"),event.target.classList.add("active")}function filterByTone(t,e){currentTone[t]=e;const n=document.querySelectorAll(`#${t}-tab .tone-button`);n.forEach(t=>t.classList.remove("active")),event.target.classList.add("active");const a=document.getElementById(`${t}-grid`);a.innerHTML="",bodyPartSizes[t].forEach(n=>{a.appendChild(createImageCard(t,n,e))})}function filterFaceByHair(t){currentFaceHair=t;const e=document.querySelectorAll('#face-tab .tone-button');e.forEach(btn=>btn.classList.remove('active')),event.target.classList.add('active');const n=document.getElementById('face-grid');n.innerHTML='';const genders=['female','male'],maturities=[false,true];maturities.forEach(mature=>{hairStyles.forEach(style=>{skinTones.forEach(tone=>{genders.forEach(gender=>{n.appendChild(createFaceCard(t,style,tone,gender,mature))})})})})}function getFilenameSuggestion(t,e,n){let a=e.replace(/\s+/g,"").toLowerCase();return a=a.replace("masculine",""),`${a}${n}${t}`}function createImageCard(t,e,n){const a=document.createElement("div");a.className="image-card";const s=document.createElement("h3");s.textContent=`${e} - ${n}`,a.appendChild(s);const r=document.createElement("div");r.className="filename-hint";const o=getFilenameSuggestion(t,e,n);r.textContent=`Suggested: ${o}.webp`,a.appendChild(r);const c=document.createElement("div");c.className="image-preview",c.id=`preview-${t}-${e.replace(/\s+/g,"_")}-${n}`;const i=`${e}_${n}`,l=State.variables.bodyPartImages[t][i]||"";if(l){const t=document.createElement("img");t.src=l,c.appendChild(t)}else c.classList.add("empty"),c.textContent="No image";a.appendChild(c);const d=document.createElement("input");d.type="text",d.className="url-input",d.placeholder="Enter image URL...",d.value=l,d.id=`input-${t}-${e.replace(/\s+/g,"_")}-${n}`,a.appendChild(d);const u=document.createElement("div");u.className="btn-group";const m=document.createElement("button");m.className="btn btn-save",m.textContent="Save",m.onclick=()=>saveImage(t,e,n),u.appendChild(m);const g=document.createElement("button");g.className="btn btn-clear",g.textContent="Clear",g.onclick=()=>clearImage(t,e,n),u.appendChild(g);const p=document.createElement("button");return p.className="btn btn-test",p.textContent="Test",p.onclick=()=>testImage(t,e,n),u.appendChild(p),a.appendChild(u),a}function createFaceCard(hairColor,hairStyle,skinTone,gender,isMature){const card=document.createElement('div');card.className='image-card';const maturePrefix=isMature?'m':'';const title=document.createElement('h3');title.textContent=`${isMature?'Mature ':''}${hairColor} - ${hairStyle} - ${skinTone} - ${gender}`;card.appendChild(title);const hint=document.createElement('div');hint.className='filename-hint';hint.style.color='#28a745';hint.style.fontWeight='bold';hint.textContent=`File Path: Images/Face/${maturePrefix}${hairColor.toLowerCase()}_${hairStyle}_${skinTone}_${gender}.webp`;card.appendChild(hint);const preview=document.createElement('div');preview.className='image-preview';preview.id=`preview-face-${maturePrefix}${hairColor}_${hairStyle}_${skinTone}_${gender}`;const filePath=`Images/Face/${maturePrefix}${hairColor.toLowerCase()}_${hairStyle}_${skinTone}_${gender}.webp`;const img=document.createElement('img');img.src=filePath;img.onerror=function(){preview.innerHTML='';preview.classList.add('empty');preview.textContent='No image found'};img.onload=function(){preview.classList.remove('empty')};preview.appendChild(img);card.appendChild(preview);const infoText=document.createElement('div');infoText.style.fontSize='11px';infoText.style.color='#6c757d';infoText.style.marginTop='10px';infoText.style.fontStyle='italic';infoText.textContent='Face images load automatically from Images/Face/ folder';card.appendChild(infoText);return card}function saveImage(t,e,n){const a=document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value.trim(),s=`${e}_${n}`;State.variables.bodyPartImages[t][s]=a,updatePreview(t,e,n,a),updateExportCode();const r=event.target,o=r.textContent;r.textContent="✓ Saved!",r.style.background="#218838",setTimeout(()=>{r.textContent=o,r.style.background=""},1500)}function clearImage(t,e,n){document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value="";const a=`${e}_${n}`;State.variables.bodyPartImages[t][a]="",updatePreview(t,e,n,""),updateExportCode()}function testImage(t,e,n){const a=document.getElementById(`input-${t}-${e.replace(/\s+/g,"_")}-${n}`).value.trim();a?updatePreview(t,e,n,a):alert("Please enter a URL first")}function updatePreview(t,e,n,a){const s=document.getElementById(`preview-${t}-${e.replace(/\s+/g,"_")}-${n}`);if(s.innerHTML="",a){s.classList.remove("empty");const t=document.createElement("img");t.src=a,t.onerror=()=>{s.innerHTML="",s.classList.add("empty"),s.textContent="❌ Invalid URL"},s.appendChild(t)}else s.classList.add("empty"),s.textContent="No image"}function updateExportCode(){const t=`<<set $bodyPartImages = ${JSON.stringify(State.variables.bodyPartImages,null,2).replace(/"([^"]+)":/g,"$1:")}>>`;document.getElementById("export-output").textContent=t}function copyExportCode(){const t=document.getElementById("export-output").textContent;navigator.clipboard.writeText(t).then(()=>{const t=event.target,e=t.textContent;t.textContent="✓ Copied!",setTimeout(()=>{t.textContent=e},2e3)})}function initializeGrids(){const t=document.getElementById("chest-grid");bodyPartSizes.chest.forEach(e=>{t.appendChild(createImageCard("chest",e,"bronzed"))});const e=document.getElementById("butt-grid");bodyPartSizes.butt.forEach(t=>{e.appendChild(createImageCard("butt",t,"bronzed"))});const n=document.getElementById('face-grid'),genders=['female','male'],maturities=[false,true];maturities.forEach(mature=>{hairStyles.forEach(style=>{skinTones.forEach(tone=>{genders.forEach(gender=>{n.appendChild(createFaceCard('Black',style,tone,gender,mature))})})})}),updateExportCode()}initializeGrids();</script><<endnobr>>
<<nobr>> <<set $lastLocation = "FitnessShop">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("FitnessShop")>> <<run $visitedLocations.push("FitnessShop")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e74c3c; text-align: center;">💪 Barracuda Fitness</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0;"> A sleek fitness equipment store with weights, yoga mats, and protein supplements lining the shelves. The smell of rubber and determination fills the air. </p> </div> <h2 style="color: #e74c3c;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Shop</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Fitness Shop Clerk">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Fitness Shop Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #e74c3c;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #e74c3c;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The shop is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BeautySalon">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("BeautySalon")>> <<run $visitedLocations.push("BeautySalon")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💇 Angelfish Beauty Salon</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> A pristine salon with mirrors lining the walls, styling chairs, and the pleasant scent of hair products. Soft music plays as stylists work their magic. </p> </div> <!-- Check job availability --> <<set _alreadyHasStylistJob = $jobs && $jobs.includes("Beauty Salon Stylist")>> <<set _hasHairStylingSkill = $skills && $skills.includes("Hair Styling")>> <<set _stylistNPCs = setup.getNPCsByJob("Beauty Salon Stylist")>> <<set _stylistCount = _stylistNPCs ? _stylistNPCs.length : 0>> <<set _canHire = _stylistCount < 5>> <!-- Hair Styling Service --> <h2 style="color: #e91e63;">Services</h2> <<set _hasEmployedStylist = false>> <<set _npcsHere = setup.getNPCsByJob("Beauty Salon Stylist")>> <<if _npcsHere && _npcsHere.length > 0>> <<for _npc range _npcsHere>> <<if setup.isNPCAvailable(_npc.name)>> <<set _hasEmployedStylist = true>> <<break>> <</if>> <</for>> <</if>> <<set _playerIsEmployee = $jobs && $jobs.length > 0 && $jobs[0] === "Beauty Salon Stylist">> <<set _stylingCost = _playerIsEmployee ? 0 : 50>> <<set _haircutCost = _playerIsEmployee ? 0 : 50>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Hair Styling --> <<if _hasEmployedStylist>> <<if $appearance.hairStyle === "messy">> <<set _canAffordStyling = _stylingCost === 0 || setup.canAffordTotal(_stylingCost)>> <<if !_canAffordStyling>> <!-- Can't afford --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair professionally styled.</p> <p style="font-size: 14px; color: #dc3545; margin-bottom: 15px;">Cost: $<<print _stylingCost>></p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> </div> <<else>> <!-- Can afford or free --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair professionally styled.</p> <<if _stylingCost > 0>> <p style="font-size: 14px; color: #ffc107; margin-bottom: 15px;">Cost: $<<print _stylingCost>></p> <<else>> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">Employee Discount: FREE</p> <</if>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Style Hair</div>">> <<if _stylingCost > 0>> <<set _payment = setup.payAmount(_stylingCost)>> <</if>> <<set $appearance.hairStyle = "styled">> <<run setup.achievements.unlock("style_hair")>> <<goto "BeautySalon">> <</link>> </div> <</if>> <<else>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Your hair is already styled!</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Already Styled</div> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✨ Style Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">No stylist available.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Unavailable</div> </div> <</if>> <!-- Hair Cut Service (Long to Short) --> <<if _hasEmployedStylist>> <<set _hasLongHair = false>> <<if $physicalTraits && $physicalTraits.length > 0>> <<for _i to 0; _i lt $physicalTraits.length; _i++>> <<if $physicalTraits[_i] === "Long Hair">> <<set _hasLongHair = true>> <<break>> <</if>> <</for>> <</if>> <<if _hasLongHair>> <<set _canAffordHaircut = _haircutCost === 0 || setup.canAffordTotal(_haircutCost)>> <<if !_canAffordHaircut>> <!-- Can't afford --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair cut short.</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 10px;">Changes: Long Hair → Short Hair</p> <p style="font-size: 14px; color: #dc3545; margin-bottom: 15px;">Cost: $<<print _haircutCost>></p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> </div> <<else>> <!-- Can afford or free --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Get your hair cut short.</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 10px;">Changes: Long Hair → Short Hair</p> <<if _haircutCost > 0>> <p style="font-size: 14px; color: #ffc107; margin-bottom: 15px;">Cost: $<<print _haircutCost>></p> <<else>> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">Employee Discount: FREE</p> <</if>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Cut Hair Short</div>">> <<if _haircutCost > 0>> <<set _payment = setup.payAmount(_haircutCost)>> <</if>> <<set $appearance.hairLength = "short">> <<for _i to 0; _i lt $physicalTraits.length; _i++>> <<if $physicalTraits[_i] === "Long Hair">> <<set $physicalTraits.deleteAt(_i)>> <<break>> <</if>> <</for>> <<if !$physicalTraits.includes("Short Hair")>> <<set $physicalTraits.push("Short Hair")>> <</if>> <<goto "BeautySalon">> <</link>> </div> <</if>> <<else>> <!-- Already has short hair --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">You don't have long hair to cut.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Available</div> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">✂️ Cut Hair</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">No stylist available.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Unavailable</div> </div> <</if>> <!-- Apply for Job --> <<if _alreadyHasStylistJob>> <!-- Already working here --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">💼 Employment</h3> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">You're already employed here as a stylist!</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Already Employed</div> </div> <<elseif !_hasHairStylingSkill>> <!-- Doesn't have the skill --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">💼 Apply for Job</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">Requires: Hair Styling skill</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Qualified</div> </div> <<elseif !_canHire>> <!-- Salon is fully staffed --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">💼 Apply for Job</h3> <p style="font-size: 14px; color: #ff6b6b; margin-bottom: 10px;">The salon is fully staffed (<<print _stylistCount>>/5 stylists)</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Hiring</div> </div> <<else>> <!-- Can apply for the job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Apply for Job</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Join the salon as a stylist!</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">Pay: $18/hour | Hours: 9 AM - 6 PM</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Apply Now</div>">> <<goto "BeautySalonJobOffer">> <</link>> </div> <</if>> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin-bottom: 15px;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave Salon</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Beauty Salon Stylist">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #e91e63;">Stylists Working</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #e91e63;">Stylists Working</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The salon is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "EcentricShop">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("EcentricShop")>> <<run $visitedLocations.push("EcentricShop")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🌙 Lionfish Boutique</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A dark, mysterious shop filled with gothic clothing, occult items, and alternative fashion. Incense smoke curls through the air as dark music plays softly. </p> </div> <h2 style="color: #9b59b6;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Shop</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Ecentric Shop Worker">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Ecentric Shop Worker")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #9b59b6;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #9b59b6;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The shop is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "AdultStore">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("AdultStore")>> <<run $visitedLocations.push("AdultStore")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">🔞 Stingray Adult Emporium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #d63031 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> A discreet shop with tinted windows, offering adult toys, lingerie, and other intimate products. The atmosphere is mature but welcoming. </p> </div> <!-- Shop Inventory --> <h2 style="color: #ff6b6b;">Shop Inventory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Dildo --> <<set _canAffordDildo = setup.canAffordTotal(45)>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 200px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🍆 Dildo</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;"> A realistic silicone toy. Available in various sizes and colors. Perfect for solo play. </p> <div style="color: #4ade80; font-weight: bold; font-size: 18px; margin: 10px 0;">$45</div> <<if $ownsDildo>> <div style="background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Owned</div> <<elseif _canAffordDildo>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Purchase ($45)</div>">> <<set _payment = setup.payAmount(45)>> <<if _payment.success>> <<set $ownsDildo = true>> <</if>> <<goto "AdultStore">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Not Enough Money</div> <</if>> </div> <!-- Fleshlight --> <<set _canAffordFleshlight = setup.canAffordTotal(50)>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 200px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔦 Fleshlight</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;"> A discreet sleeve toy designed for men. Soft, realistic material with various textures available. </p> <div style="color: #4ade80; font-weight: bold; font-size: 18px; margin: 10px 0;">$50</div> <<if $ownsFleshlight>> <div style="background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Owned</div> <<elseif _canAffordFleshlight>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Purchase ($50)</div>">> <<set _payment = setup.payAmount(50)>> <<if _payment.success>> <<set $ownsFleshlight = true>> <</if>> <<goto "AdultStore">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Not Enough Money</div> <</if>> </div> </div> <h2 style="color: #ff6b6b;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Store</div>">> <<goto "Mall">> <</link>> </div> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Adult Store Clerk">> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Adult Store Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #ff6b6b;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #ff6b6b;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The store is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Bakery">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Bakery")>> <<run $visitedLocations.push("Bakery")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #d2691e; text-align: center;">🥐 Seahorse Bakery</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d2691e 0%, #a0522d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #d2691e;"> <p style="color: white; font-size: 18px; margin: 0;"> The warm, inviting scent of fresh bread and pastries fills the air. Display cases showcase croissants, cakes, and artisan loaves. </p> </div> <h2 style="color: #d2691e;">Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Back to Mall --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Bakery</div>">> <<goto "Mall">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Baker")>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="margin-top: 30px; color: #d2691e;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #d2691e; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #d2691e; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #d2691e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="margin-top: 30px; color: #d2691e;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The bakery is quiet right now. No one is working here. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "TechStore">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("TechStore")>> <<run $visitedLocations.push("TechStore")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💻 Hammerhead Tech</h1> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> A modern electronics store showcasing the latest gadgets, computers, and accessories. Blue LED lighting gives everything a futuristic glow. </p> </div> <!-- Leave --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🚪 Exit</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the mall directory.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Store</div>">> <<goto "Mall">> <</link>> </div> </div> <h2 style="color: #17a2b8;">Electronics for Sale</h2> <div style="margin-bottom: 25px;"> <!-- Laptop Purchase --> <<if !$hasLaptop>> <<set _laptopColor = ($hasApartment || $ownsHouse) ? "#17a2b8" : "#666">> <<set _laptopTextColor = ($hasApartment || $ownsHouse) ? "#aaa" : "#888">> <<set _canAffordLaptop = setup.canAffordTotal(500)>> <div style="border: 2px solid <<print _laptopColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _laptopColor>>; margin: 0 0 10px 0; font-size: 16px;">💻 Laptop</h3> <p style="font-size: 14px; color: <<print _laptopTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A decent laptop for work and entertainment.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment || $ownsHouse>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$500</p> <<if _canAffordLaptop>> <<link "<div style='background: #17a2b8; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Laptop</div>">> <<set _payment = setup.payAmount(500)>> <<if _payment.success>> <<set $hasLaptop = true>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$500</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- TV Purchase --> <<if !$hasTV>> <<set _tvColor = ($hasApartment || $ownsHouse) ? "#667eea" : "#666">> <<set _tvTextColor = ($hasApartment || $ownsHouse) ? "#aaa" : "#888">> <<set _canAffordTV = setup.canAffordTotal(300)>> <div style="border: 2px solid <<print _tvColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _tvColor>>; margin: 0 0 10px 0; font-size: 16px;">📺 Flatscreen TV</h3> <p style="font-size: 14px; color: <<print _tvTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A 42-inch flatscreen TV.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment || $ownsHouse>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$300</p> <<if _canAffordTV>> <<link "<div style='background: #667eea; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase TV</div>">> <<set _payment = setup.payAmount(300)>> <<if _payment.success>> <<set $hasTV = true>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$300</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- Internet Router Purchase --> <<if !$hasRouter>> <<set _routerColor = ($hasApartment || $ownsHouse) ? "#f39c12" : "#666">> <<set _routerTextColor = ($hasApartment || $ownsHouse) ? "#aaa" : "#888">> <<set _canAffordRouter = setup.canAffordTotal(70)>> <div style="border: 2px solid <<print _routerColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _routerColor>>; margin: 0 0 10px 0; font-size: 16px;">📡 Internet Router</h3> <p style="font-size: 14px; color: <<print _routerTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A high-speed wireless router for your home internet.</p> <div style="flex-grow: 1;"></div> <<if $hasApartment || $ownsHouse>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$70</p> <<if _canAffordRouter>> <<link "<div style='background: #f39c12; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Router</div>">> <<set _payment = setup.payAmount(70)>> <<if _payment.success>> <<set $hasRouter = true>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$70</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Housing</div> <</if>> </div> <</if>> <!-- Webcam Purchase --> <<if !$hasWebcam>> <<set _webcamColor = $hasLaptop ? "#e74c3c" : "#666">> <<set _webcamTextColor = $hasLaptop ? "#aaa" : "#888">> <<set _canAffordWebcam = setup.canAffordTotal(200)>> <div style="border: 2px solid <<print _webcamColor>>; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: <<print _webcamColor>>; margin: 0 0 10px 0; font-size: 16px;">📷 HD Webcam</h3> <p style="font-size: 14px; color: <<print _webcamTextColor>>; margin: 0 0 10px 0; line-height: 1.4;">A high-quality 1080p webcam for video calls and streaming.</p> <div style="flex-grow: 1;"></div> <<if $hasLaptop>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$200</p> <<if _canAffordWebcam>> <<link "<div style='background: #e74c3c; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Webcam</div>">> <<set _payment = setup.payAmount(200)>> <<if _payment.success>> <<set $hasWebcam = true>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> <<else>> <p style="font-size: 16px; color: #888; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$200</p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Laptop</div> <</if>> </div> <</if>> <!-- Smartphone Purchase --> <<if !$hasSmartphone>> <<set _canAffordSmartphone = setup.canAffordTotal(500)>> <div style="border: 2px solid #3b82f6; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px; margin-bottom: 12px;"> <h3 style="color: #3b82f6; margin: 0 0 10px 0; font-size: 16px;">📱 Smartphone</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">A modern smartphone with all the latest features.</p> <div style="flex-grow: 1;"></div> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center;">$500</p> <<if _canAffordSmartphone>> <<link "<div style='background: #3b82f6; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Purchase Smartphone</div>">> <<set _payment = setup.payAmount(500)>> <<if _payment.success>> <<set $hasSmartphone = true>> <<run setup.achievements.unlock("purchase_phone")>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> </div> <</if>> </div> <!-- WiFi Service Section --> <<if $hasRouter && ($hasApartment || $ownsHouse)>> <h2 style="color: #17a2b8;">Internet Service</h2> <!-- Initialize WiFi variables if not set --> <<if $wifiDaysRemaining === undefined>> <<set $wifiDaysRemaining = 0>> <</if>> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #51cf66; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 12px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 16px;">✅ WiFi Active</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Your internet service is active. Days remaining: <<print $wifiDaysRemaining>></p> <p style="font-size: 14px; color: #51cf66; margin: 0; text-align: center;">Monthly Rate: $40 (per 30 days)</p> </div> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 12px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Active Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">You need to set up internet service to use your router.</p> <p style="font-size: 14px; color: #51cf66; margin: 0; text-align: center;">Monthly Rate: $40 (per 30 days)</p> </div> <</if>> <!-- Pay for WiFi --> <<set _canAffordWifi = setup.canAffordTotal(40)>> <div style="border: 2px solid #28a745; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #28a745; margin: 0 0 10px 0; font-size: 16px;">💳 Pay for Internet Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Add 30 days of internet service for $40. You can pay in advance for multiple months.</p> <div style="flex-grow: 1;"></div> <<if _canAffordWifi>> <<link "<div style='background: #28a745; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Pay $40 for 30 Days</div>">> <<set _payment = setup.payAmount(40)>> <<if _payment.success>> <<set $wifiDaysRemaining += 30>> <</if>> <<goto "TechStore">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Not Enough Money</div> <</if>> </div> <</if>> <!-- NPC Interaction --> <<set _npcsHere = setup.getNPCsByJob("Tech Store Clerk")>> <<if _npcsHere && _npcsHere.length > 0>> <<for _npc range _npcsHere>> <<capture _npc>> <h2 style="color: #17a2b8;">Store Clerk</h2> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;"> <<print _npc.jobs.join(", ")>> </p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> <!-- WiFi Setup Option --> <<if $hasRouter && !$wifiSetupComplete>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Ask About WiFi Setup</div>">> <<set $wifiSetupComplete = true>> <<goto "TechStoreWiFiSetup">> <</link>> <</if>> </div> <</capture>> <</for>> <</if>> <!-- Work Area (Only shows if player has the job) --> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Tech Store Clerk">> <h2 style="color: #17a2b8;">Work Options</h2> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Work Shift</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;">Clock in for your shift. (Work hours: 9 AM - 6 PM, max 8 hours/day)</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Start Work Shift</div>">> <<goto "UniversalWork">> <</link>> <!-- Self-Setup WiFi (if you work here) --> <<if $hasRouter && !$wifiSetupComplete>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Set Up Your Own WiFi</div>">> <<set $wifiSetupComplete = true>> <<goto "TechStoreWiFiSetup">> <</link>> <</if>> </div> <</if>> </div> <</nobr>>
<<silently>> <<nobr>> <!-- Ensure all mayors have Perverted trait --> <<run setup.addPervertedTraitToMayors()>> /* Set current and previous passage variables */ <<set _currentPassage = passage()>> <<set _previousPassage = previous()>> <<if $tradingWithNPC && _currentPassage === "NPCInteraction">> <<run setup.meetNPC($tradingWithNPC)>> <</if>> <<if $visitedLocations && $visitedLocations.length >= 50>> <<run setup.achievements.unlock("visit_all_locations")>> <</if>> <<if $money >= 10000000>> <<run setup.achievements.unlock("earn_10_million")>> <</if>> <<if $stats && ($stats.charisma >= 100 || $stats.dexterity >= 100 || $stats.strength >= 100 || $stats.intelligence >= 100)>> <<run setup.achievements.unlock("stat_100")>> <</if>> /* List of passages that should NOT be saved as lastLocation */ <<set _excludedPassages = [ "Relationships", "RelationshipDetail", "CheatMenuPassword", "Debug", "DebugDateTime", "DebugStatsAppearance", "DebugHousingTech", "DebugStreaming", "DebugRelationships", "DebugTraitsSkillsJobs", "DebugArtifacts", "DebugAchievementandSkillTree", "DebugCrime", "DebugSexualSkills", "DebugBank", "DebugLifeSwap", "DebugLifeSwapStatusRefresh", "LifeSwapConfirm", "LifeSwapTransformation", "CheatMenuSexualSkills", "Body", "StoryInit", "PassageHeader", "StoryCaption", "TradeInterface", "TradeSelectItems", "TradeResult", "NPCInteraction", "NPCTalk", "NPCTalkResponse", "SellTraits", "SellTraitsComplete", "RoisinTraitStoragePurchased", "FenRisTraining", "GymNPCs", "GymLockerRoom", "ImageSettings", "BusStop", "UseLaptop", "WatchTV", "TechStoreWiFiSetup", "ContentCreatorRegistration", "StreamingRegistration", "PostContent", "StartStreaming", "StartGamingStream", "StartASMRStream", "StartStylingStream", "StreamActionResult", "StreamAnalytics", "StartMusicStream", "StartCookingStream", "DebugSexualSkills", "Teleport", "DebugBank", /* Menu Passages */ "Achievements", "SkillTree", "Quests", /* Phone App Passages */ "Phone", "Gallery", "Notes", "Maps", "BankApp", "InstaFin", "SunfishNet", "Messages", "Contacts", "Settings", /* ATM Passages */ "ATM", /* Brothel Passages - NEW */ "BrothelClientSelection", "BrothelSession", "BrothelSessionResults", "BrothelManagement", /* Strip Club Passages - NEW */ "StripClubWorkStripper", "StripClubPerformRemoveTop", "StripClubPerformStripFull", "StripClubPerformPole", "StripClubPerformFreestyle", "StripClubMingleInteraction", "StripClubPrivateShowPerform", /* Crime Passages - NEW */ "CrimeHub", "ScoutForTarget", "SelectTraitToSteal", "AttemptTraitTheft", "TraitTheftSuccess", "CaughtByPolice", "SurrenderArrest", "ResistArrest", "EscapeSuccess", "EscapeFailed", "DebugCrime", "JailReleaseResult", "AttemptOfficerScannerTheft", "PayFineResult", "OfficerEncounterScout", /* Beach/Sunfish Event Passages */ "BeachWalk", "SunfishTank", "SunfishTankSwim", "SunfishTankTunnel", "UnderWaterCave", "ArtifactRoom", "ArtifactClaimed", /* Old Crime Passages */ "CrimeScene", "CrimeResponse", "CrimeResolution", "OfficerCrimeAttempt", "OfficerCrimeResult", "TraitTheftResult", "PettyTheft", "PettyTheftResolution", "PettyTheftIgnored", "Speeding", "SpeedingResolution", "SpeedingIgnored", "ParkingViolation", "ParkingViolationResolution", "ParkingViolationIgnored", "MinorTraitTheft", "MinorTraitTheftResolution", "MinorTraitTheftIgnored", "Assault", "AssaultResolution", "AssaultIgnored", "AssaultWithWeapon", "AssaultWithWeaponResolution", "AssaultWithWeaponIgnored", "MajorTraitTheft", "MajorTraitTheftResolution", "MajorTraitTheftIgnored", "MajorHeist", "MajorHeistResolution", "MajorHeistIgnored", "GangViolence", "GangViolenceResolution", "GangViolenceIgnored", /* Casino/Gambling Passages */ "RouletteRoom", "RouletteSpinResult", "SlotMachine", "SlotMachineResult", "ForcedGambling", /* Dream State Passages */ "DreamIntro", "DreamGenderSelect", "DreamGenderOptions", "DreamAppearanceOptions", "DreamNegativeTraits", "DreamIdentitySummary", "DreamContinueButton", "DreamTrading", "DreamSummary", "DreamAwakening", "DreamStateStyles", /* Work Complete Passages */ "WorkCompleteTraitResult", "WorkCompleteEarnings", "UniversalWorkComplete", /* Inventory/Menu Passages */ "Inventory", "Trait Information", "EatFood", /* Fishing Passages - NOT including FishingDealership so it saves lastLocation */ "FishingDocks", "FishingBeach", "FishingPond", "FishingTrip", "FishingResult", "FishingQTE", "FishingQTEResult", "FishEncyclopedia", "FishingCast", "OceanFishing", "DebugFishing", "DebugBuffsDebuffs", "DealershipRepair", "DebugFishTestCommon", "DebugFishTestUncommon", "DebugFishTestRare", "DebugFishTestEpic", "DebugFishTestLegendary", "DebugFishTestMythical", "DebugFishingQTE", "DebugFishingQTEResult", /* Patreon/Discord Passages */ "https://www.patreon.com/Grankor", "https://discord.gg/z9eDdQC6zA" ]>> /* Only update lastLocation if this is a real game location */ <<if !_excludedPassages.includes(_currentPassage) && _currentPassage !== "">> <<set $lastLocation = _currentPassage>> <</if>> /* Check if we should skip time advancement */ <<if $skipTimeAdvancement>> <<set $skipTimeAdvancement = false>> <<else>> <<if !setup.timePassages>> <<set setup.timePassages = { main: ["BusinessDistrict", "Downtown", "ResidentialArea", "Park", "Beach", "University", "Hospital", "Library", "Gym", "Alleyway", "RedLightDistrict", "Docks", "Outskirts", "SeabassPark"], sublocations: ["Gym", "DanceStudio", "Cafe", "TrainingCenter", "Apartments", "TownHall", "ShadyShop", "Brothel", "StripClub", "Casino", "LampreyTomes", "AquariumEntrance", "AquariumGiftShop", "AquariumCafe", "CoralReef", "Bank"], mall: ["Mall", "FitnessShop", "EcentricShop", "BeautySalon", "TechStore", "AdultStore", "Bakery", "FoodCourt", "MallAtrium", "MallFloor2"], patrol: ["PatrolDowntown", "PatrolBusinessDistrict", "PatrolRedLightDistrict", "PatrolDocks", "PatrolAlleyway", "PatrolSeabassPark", "PatrolOutskirts"], noTime: [ "Start", "CharacterCreation", "StoryInit", "Summary", "NPCFirstMeeting", "NPCEncounter", "NPCChat", "NPCSkillTalk", "NPCInterestTalk", "TradingInterface", "ProcessTrade", "TradeSuccess", "TradeFailure", "Body", "Debug", "DebugDateTime", "DebugStatsAppearance", "DebugHousingTech", "DebugStreaming", "DebugRelationships", "DebugTraitsSkillsJobs", "DebugArtifacts", "DebugAchievementandSkillTree", "CheatMenuSexualSkills", "BusStop", "PrawnHub", "PrawnHubStream", "PrawnHubLiveStream", "PrawnHubStreamEnd", "PrawnHub_Action01", "PrawnHub_Action02", "PrawnHub_Action03", "PrawnHub_Action04", "PrawnHub_Action05", "PrawnHub_Action06", "PrawnHub_Action07", "PrawnHub_Action08", "PrawnHub_Action09", "PrawnHub_Action10", "PrawnHub_Action11", "PatrolOfficerWork", "Teleport", "NPCInteraction", "NPCTalk", "NPCTalkResponse", "TradeInterface", "TradeSelectItems", "TradeResult", "SellTraits", "SellTraitsComplete", "DebugBank", /* Menu Passages */ "Achievements", "SkillTree", "Quests", /* Phone App Passages */ "Phone", "Gallery", "Notes", "Maps", "BankApp", "InstaFin", "SunfishNet", "Messages", "Contacts", "Settings", /* ATM Passages */ "ATM", /* Brothel Passages - NEW */ "BrothelClientSelection", "BrothelSession", "BrothelSessionResults", "BrothelManagement", /* Strip Club Passages - NEW */ "StripClubWorkStripper", "StripClubStage", "StripClubPerformRemoveTop", "StripClubPerformStripFull", "StripClubPerformPole", "StripClubPerformFreestyle", "StripClubMingleCustomers", "StripClubMingleInteraction", "StripClubPrivateShows", "StripClubPrivateShowPerform", /* Crime Passages - NEW */ "CrimeHub", "ScoutForTarget", "SelectTraitToSteal", "AttemptTraitTheft", "TraitTheftSuccess", "CaughtByPolice", "SurrenderArrest", "ResistArrest", "EscapeSuccess", "EscapeFailed", /* Beach/Sunfish Event Passages */ "SunfishTank", "SunfishTankSwim", "SunfishTankTunnel", "UnderWaterCave", "ArtifactRoom", "ArtifactClaimed", /* Old Crime Passages */ "CrimeScene", "CrimeResponse", "CrimeResolution", "OfficerCrimeAttempt", "OfficerCrimeResult", "TraitTheftResult", /* Casino/Gambling Passages */ "RouletteRoom", "RouletteSpinResult", "SlotMachine", "SlotMachineResult", "ForcedGambling", /* Dream State Passages */ "DreamIntro", "DreamGenderSelect", "DreamGenderOptions", "DreamAppearanceOptions", "DreamNegativeTraits", "DreamIdentitySummary", "DreamContinueButton", "DreamTrading", "DreamSummary", "DreamAwakening", "DreamStateStyles", /* Work Complete Passages */ "WorkCompleteTraitResult", "WorkCompleteEarnings", "UniversalWorkComplete", /* Inventory/Menu Passages */ "Inventory", /* Fishing Passages */ "FishingDocks", "FishingBeach", "FishingPond", "FishingCoralReef", "FishingUnderwaterCave", "FishingDealership", "FishingTrip", "FishingResult", "FishingQTE", "FishingQTEResult", "FishEncyclopedia", "FishingCast", "OceanFishing", "DealershipRepair", "DebugFishingQTE", "DebugFishingQTEResult" ] }>> <</if>> <<if !setup.timePassages.noTime.includes(_currentPassage) && _previousPassage !== _currentPassage && _previousPassage !== "">> <<if setup.timePassages.main.includes(_currentPassage)>> <<set $timeInMinutes += 15>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < setup.dayOrder.length - 1>> <<set $dayOfWeek = setup.dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = setup.dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $swimmingMinutesToday = 0>> /* RESET ATM DAILY LIMIT */ <<run setup.resetATMLimit()>> /* CHECK ROULETTE 30-DAY RESET */ <<run setup.checkRouletteReset()>> /* RESET Roisin'S POINTS ON MONDAY */ <<if $dayOfWeek === "Monday">> <<set $roisinTraitsSoldValue = 0>> /* SKILL TREE: Reset weekly sell bonus */ <<set $sellWeeklyBonusUsed = false>> <</if>> /* SKILL TREE: HEAT DECAY */ <<if setup.skillTree.getEffect("heatDecay") > 0 && $crimeHeat > 0>> <<set $crimeHeat = Math.max(0, $crimeHeat - setup.skillTree.getEffect("heatDecay"))>> <</if>> <</if>> <<elseif setup.timePassages.sublocations.includes(_currentPassage)>> <<set $timeInMinutes += 5>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < setup.dayOrder.length - 1>> <<set $dayOfWeek = setup.dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = setup.dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $swimmingMinutesToday = 0>> /* RESET ATM DAILY LIMIT */ <<run setup.resetATMLimit()>> /* CHECK ROULETTE 30-DAY RESET */ <<run setup.checkRouletteReset()>> /* RESET Roisin'S POINTS ON MONDAY */ <<if $dayOfWeek === "Monday">> <<set $roisinTraitsSoldValue = 0>> /* SKILL TREE: Reset weekly sell bonus */ <<set $sellWeeklyBonusUsed = false>> <</if>> /* SKILL TREE: HEAT DECAY */ <<if setup.skillTree.getEffect("heatDecay") > 0 && $crimeHeat > 0>> <<set $crimeHeat = Math.max(0, $crimeHeat - setup.skillTree.getEffect("heatDecay"))>> <</if>> <</if>> <<elseif setup.timePassages.mall.includes(_currentPassage)>> <<if _previousPassage === "Mall">> <<set $timeInMinutes += 2>> <<else>> <<set $timeInMinutes += 5>> <</if>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < setup.dayOrder.length - 1>> <<set $dayOfWeek = setup.dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = setup.dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $swimmingMinutesToday = 0>> /* RESET ATM DAILY LIMIT */ <<run setup.resetATMLimit()>> /* CHECK ROULETTE 30-DAY RESET */ <<run setup.checkRouletteReset()>> /* RESET Roisin'S POINTS ON MONDAY */ <<if $dayOfWeek === "Monday">> <<set $roisinTraitsSoldValue = 0>> /* SKILL TREE: Reset weekly sell bonus */ <<set $sellWeeklyBonusUsed = false>> <</if>> /* SKILL TREE: HEAT DECAY */ <<if setup.skillTree.getEffect("heatDecay") > 0 && $crimeHeat > 0>> <<set $crimeHeat = Math.max(0, $crimeHeat - setup.skillTree.getEffect("heatDecay"))>> <</if>> <</if>> <<elseif setup.timePassages.patrol.includes(_currentPassage)>> <<set $timeInMinutes += 30>> /* Check if shift is complete (8 hours = 480 minutes) */ <<if $onPatrol && $patrolStartTime !== undefined>> <<set _minutesWorked = $timeInMinutes - $patrolStartTime>> <<set $patrolHoursWorked = _minutesWorked / 60>> <<if _minutesWorked >= 480>> /* Shift complete - end patrol and set cooldown */ <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> /* Calculate pay */ <<set _totalPay = Math.floor(8 * 35)>> <<set $money += _totalPay>> /* Show shift complete message */ <<run UI.alert("✅ Shift Complete!\n\nYou worked 8 hours and earned $" + _totalPay + ".\n\nYou must wait 16 hours before your next shift.")>> /* Auto-return to police station */ <<if _currentPassage !== "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <</if>> <</if>> <<if $timeInMinutes >= 1440>> <<set $timeInMinutes -= 1440>> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<if _currentDayIndex < setup.dayOrder.length - 1>> <<set $dayOfWeek = setup.dayOrder[_currentDayIndex + 1]>> <<else>> <<set $dayOfWeek = setup.dayOrder[0]>> <<set $weekNumber += 1>> <</if>> <<set $dayNumber += 1>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $swimmingMinutesToday = 0>> /* RESET ATM DAILY LIMIT */ <<run setup.resetATMLimit()>> /* CHECK ROULETTE 30-DAY RESET */ <<run setup.checkRouletteReset()>> /* RESET Roisin'S POINTS ON MONDAY */ <<if $dayOfWeek === "Monday">> <<set $roisinTraitsSoldValue = 0>> /* SKILL TREE: Reset weekly sell bonus */ <<set $sellWeeklyBonusUsed = false>> <</if>> /* SKILL TREE: HEAT DECAY */ <<if setup.skillTree.getEffect("heatDecay") > 0 && $crimeHeat > 0>> <<set $crimeHeat = Math.max(0, $crimeHeat - setup.skillTree.getEffect("heatDecay"))>> <</if>> <</if>> <</if>> <</if>> <</if>> <<if $tradingWithNPC && _currentPassage === "TradeInterface">> <<run setup.meetNPC($tradingWithNPC)>> <</if>> <</nobr>> <</silently>>
:: InitPlayerData <<silently>> /* ---------------------------------- */ /* --- PLAYER STATS --- */ /* ---------------------------------- */ <<set $stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }>> <<set $statMaxCaps = { charisma: 999, dexterity: 999, strength: 999, intelligence: 999 }>> /* ---------------------------------- */ /* --- PLAYER APPEARANCE --- */ /* ---------------------------------- */ <<if !$appearance>> <<set $appearance = { skinTone: "pale", hairColor: "Black", hairStyle: "messy", physique: "average", age: "Adult" }>> <</if>> /* Make sure age exists */ <<if !$appearance.age>> <<set $appearance.age = "Adult">> <</if>> /* Make sure hairStyle is messy */ <<if !$appearance.hairStyle>> <<set $appearance.hairStyle = "messy">> <</if>> /* ---------------------------------- */ /* --- PLAYER BODY PARTS --- */ /* ---------------------------------- */ <<set $bodyParts = { gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis" }>> /* ---------------------------------- */ /* --- PLAYER TRAITS & SKILLS --- */ /* ---------------------------------- */ <<set $physicalTraits = []>> <<set $mentalTraits = []>> <<set $selectedTraits = []>> <<set $skills = []>> <<set $discoveredTraits = {physical: [], mental: [], skills: [], voice: []}>> /* Available physical traits */ <<set setup.availablePhysicalTraits = { "Tall": "Above average height", "Short": "Below average height", "Curvy": "Curved body shape", "Lean": "Thin and fit", "Muscular": "Well-defined muscles", "Soft": "Soft body texture", "Sharp Features": "Defined facial features", "Smooth Skin": "Very smooth skin", "Scarred": "Visible scars", "Pierced": "Body piercings", "Youthful": "Young appearance", "Mature": "Mature appearance", "Tan Skin": "Tanned complexion", "Dark Skin": "Dark complexion", "Pale Skin": "Pale complexion", "Attractive": "Very attractive appearance", "Plain": "Unremarkable appearance", "Ugly": "Unattractive appearance", "Fit": "In good physical shape", "Overweight": "Above healthy weight", "Underweight": "Below healthy weight", "Graceful": "Moves with elegance", "Clumsy": "Accident-prone", "Strong": "Physically powerful", "Weak": "Physically frail", "Flexible": "Very limber", "Stiff": "Poor flexibility", "Blemished": "Visible skin imperfections", "Freckled": "Freckled complexion", "Tattooed": "Has tattoos", "Athletic Build": "Sporty physique", "Petite": "Small frame", "Voluptuous": "Full figure", "Broad-shouldered": "Wide shoulders", "Quick": "Fast movements", "Sturdy": "Solid build", "Fashionable": "Stylish appearance", "Quick Reflexes": "Fast reactions", "Fast": "High speed", "Slow": "Low speed", /* Transformation Ingredient Traits */ "Catperson": "Cat ears and tail", "Wolfperson": "Wolf ears and tail", "Horns": "Small demonic horns", "Fangs": "Sharp canine teeth", "Pointed Ears": "Elven or fae-like ears", "Glowing Eyes": "Supernatural eye luminescence", "Claws": "Sharp retractable claws", "Wings": "Small decorative wings", "Tail": "A tail", "Lactating": "Produces milk" }>> /* Available voice traits */ <<set setup.availableVoiceTraits = { "Smooth Voice": "Pleasant vocal quality", "Soft-Spoken": "Quiet speaker", "Warm Tone": "Friendly vocal warmth", "Gentle Voice": "Soothing speech", "Soothing Tone": "Calming voice", "Silky Voice": "Smooth vocal texture", "Clear Enunciation": "Precise pronunciation", "Articulate Speech": "Well-spoken", "Smooth Talker": "Persuasive speaker", "Friendly Tone": "Welcoming voice", "Charismatic Voice": "Captivating speech", "Steady Voice": "Consistent tone", "Pleasant Cadence": "Nice rhythm", "Calm Voice": "Peaceful tone", "Expressive Voice": "Emotional speech", "Animated Tone": "Lively speaking", "Lively Tone": "Energetic voice", "Charming Tone": "Appealing speech", "Hushed Intimate Voice": "Soft private tone", "Balanced Neutral Tone": "Even speaking", "Sing-Songy Voice": "Musical speech", "Eager Tone": "Enthusiastic voice", "Bouncy Tone": "Upbeat speaking", "Melodic Voice": "Song-like quality", "Clear Pronunciation": "Easy to understand", "Even-Paced Voice": "Steady rhythm", "Understated Voice": "Subtle tone", "Soft Monologue Style": "Narrative speech", "Fast Talker": "Rapid speech", "Rapid-Fire Speech": "Very quick talking", "Deep Voice": "Low pitch", "High-Pitched Tone": "High voice", "Raspy Voice": "Rough vocal quality", "Gravelly Voice": "Coarse tone", "Croaky Voice": "Hoarse speech", "Breathy Voice": "Airy speaking", "Nasally Tone": "Nasal quality", "Stoic Tone": "Unemotional voice", "Measured Speech": "Careful speaking", "Choppy Speech": "Broken rhythm", "Interruptive Tone": "Cuts in often", "Sharp Voice": "Pointed tone", "Snappy Tone": "Curt speech", "Flat Voice": "Monotonous", "Monotone": "No variation", "Deadpan Delivery": "Expressionless speech", "Detached Voice": "Distant tone", "Emotionless Tone": "No feeling", "Slow Calm Voice": "Unhurried speech", "Lazy Drawl": "Slow drawling", "Mumbly Voice": "Unclear speech", "Stuttering Speech": "Hesitant talking", "Grim Tone": "Dark voice", "Robotic Tone": "Mechanical speech", "Shaky Voice": "Trembling speech" }>> /* Available mental traits */ <<set setup.availableMentalTraits = { "Extroverted": "Outgoing and social", "Introverted": "Reserved and quiet", "Bitchy": "Abrasive personality", "Kind": "Compassionate nature", "Sly": "Cunning and deceptive", "Honest": "Truthful and direct", "Dominant": "Assertive personality", "Submissive": "Compliant nature", "Confident": "Self-assured", "Shy": "Timid and reserved", "Aggressive": "Confrontational", "Passive": "Non-confrontational", "Optimistic": "Positive outlook", "Pessimistic": "Negative outlook", "Cruel": "Enjoys causing pain", "Empathetic": "Understanding of others", "Stubborn": "Refuses to change", "Flexible": "Adapts easily", "Jealous": "Envious of others", "Supportive": "Helpful to others", "Friendly": "Warm and approachable", "Competitive": "Driven to win", "Logical": "Rational thinker", "Shrewd": "Clever and calculating", "Lazy": "Avoids work", "Hardworking": "Diligent and dedicated", "Arrogant": "Overly proud", "Humble": "Modest and unassuming", "Paranoid": "Overly suspicious", "Trusting": "Believes in others", "Ambitious": "Driven to succeed", "Complacent": "Satisfied with mediocrity", "Creative": "Imaginative thinker", "Dull": "Lacks imagination", "Brave": "Courageous", "Cowardly": "Fearful and timid", "Mature": "Acts with maturity", "Patient": "Tolerant and calm", "Impatient": "Quick to anger", "Wise": "Shows good judgment", "Foolish": "Makes poor decisions", "Intelligent": "Smart and quick-witted", "Analytical": "Logical problem solver", "Outgoing": "Sociable and talkative", "Curious": "Eager to learn", "Witty": "Clever and humorous", "Calm": "Composed and peaceful", "Energetic": "Full of energy", "Thoughtful": "Considerate of others", "Chill": "Relaxed and easy-going", "Nonchalant": "Casually calm", "Charming": "Naturally appealing", "Diplomatic": "Tactful negotiator", "Organized": "Well-structured", "Resourceful": "Finds solutions", "Focused": "Concentrates well", "Disciplined": "Self-controlled", "Determined": "Won't give up", "Steadfast": "Unwavering", "Considerate": "Thoughtful of others", "Polite": "Well-mannered", "Funny": "Makes others laugh", "Reassuring": "Comforting presence", "Loyal": "Faithful and devoted", "Talkative": "Speaks a lot", "Direct": "Straightforward", "Efficient": "Gets things done", "Negotiator": "Skilled bargainer", "Crafty": "Cleverly creative", "Workaholic": "Works excessively", "High Stamina": "Great endurance", "Flirty": "Playfully romantic", "Seductive": "Sexually appealing", "Alluring": "Mysteriously attractive", "Warm": "Emotionally welcoming", "Bookworm": "Loves reading", "Lucky": "Good fortune", "Unlucky": "Bad fortune", "Blunt": "Brutally honest", "Perfectionist": "Demands perfection", "Overthinker": "Analyzes too much", "Moody": "Unpredictable emotions", "Unpredictable": "Erratic behavior", "Risk Taker": "Embraces danger", "Impulsive": "Acts without thinking", "Cynical": "Distrustful pessimist", "Quiet": "Doesn't talk much", "Awkward": "Socially uncomfortable", "Tone Deaf": "Can't read situations", "Tease": "Playfully mocking", "Clingy": "Overly attached", "Sensitive": "Easily hurt", "Corporate Drone": "Bland office worker", "Forgetful": "Poor memory", "Disorganized": "Messy and chaotic", "Selfish": "Self-centered", "Deceitful": "Dishonest and lying", "Erratic": "Unstable behavior", "Obsessive": "Fixates unhealthily", "Insecure": "Lacks confidence", "Short Tempered": "Easily angered", "Rude": "Disrespectful", "Unreliable": "Can't be trusted", "Slow Learner": "Struggles to learn", "Reckless": "Dangerously careless", "Cold": "Emotionally distant", "Insensitive": "Doesn't care", "Unskilled": "Lacks abilities", "High Energy": "Constantly energetic", "Deep Thinker": "Philosophical mind", "Monotone Expression": "Shows no emotion", "Sarcastic": "Uses irony often", "Artistic": "Creative vision", "Relaxed": "Laid-back attitude", "Humorous": "Funny personality", "Perceptive": "Notices details", "Detail-Oriented": "Focuses on specifics", "Customer-Focused": "Service-minded", "Punctual": "Always on time", "Naive": "Innocent and trusting", "Tech Savvy": "Good with technology", /* Transformation Ingredient Traits */ "Mischievous": "Loves pranks and chaos", "Docile": "Calm and easily led", "Feral": "Wild animal instincts", "Predatory": "Hunting instincts", "Maternal": "Strong nurturing instincts", "Paternal": "Strong fatherly instincts", "Breeding Obsessed": "Fixated on reproduction", "Heat Cycles": "Periodic intense arousal", "Pack Minded": "Loyal to group hierarchy", "Nocturnal": "Active at night, sleepy by day", "Territorial": "Protective of space and partners", "Shameless": "No embarrassment about sexuality", "Insatiable": "Never satisfied sexually", "Praise Seeking": "Craves approval and praise", "Obedient": "Follows orders without question", "Collar Loving": "Enjoys being collared or owned", "Rebellious": "Defies authority", "Corrupted": "Tainted by dark influences", "Cunning": "Sly and clever" }>> /* ---------------------------------- */ /* --- TRAIT COMBINATIONS --- */ /* ---------------------------------- */ /* Format: "Trait1|Trait2": { result: "NewTrait", critSuccess: "EnhancedVersion", critFail: "CursedVersion" } */ /* Combinations work both ways - "A|B" also matches "B|A" */ <<set setup.traitCombinations = { /* ================================== */ /* TIER 2: THREE-TRAIT COMBINATIONS */ /* (Creates full transformations) */ /* Keys sorted alphabetically */ /* ================================== */ /* DEMONIC */ "Curvy|Imp|Sexually Skilled": { result: "Succubus", isFullTransformation: true }, // "Charming|Horns|Temptress": { result: "Incubus", isFullTransformation: true }, // temporarily disabled "Attractive|Cynical|Short": { result: "Imp", isFullTransformation: true }, "Energetic|Lucky|Werewolf": { result: "Hellhound", isFullTransformation: true }, /* WERE-CREATURES */ "Impatient|Intelligent|Risk Taker": { result: "Werecat", isFullTransformation: true }, "Fit|Leadership|Scarred": { result: "Werewolf", isFullTransformation: true }, "Extroverted|Fast|Flexible": { result: "Werebunny", isFullTransformation: true }, "Attractive|Quick Learner|Sly": { result: "Werefox", isFullTransformation: true }, "Curvy|Kind|Warm": { result: "Weresheep", isFullTransformation: true }, "Cowardly|Lactating|Voluptuous": { result: "Hucow", isFullTransformation: true }, /* AESTHETIC */ "High Heels Proficient|Submissive|Voluptuous": { result: "Trophy Wife", isFullTransformation: true }, "Athletic Build|Competitive|Fit": { result: "Gym Bunny", isFullTransformation: true }, "Fashionable|Flirty|Tech Savvy": { result: "E-Girl", isFullTransformation: true }, "Bitchy|Extroverted|Prep": { result: "Gyaru", isFullTransformation: true }, "Goth|Pierced|Tattooed": { result: "Punk", isFullTransformation: true }, /* SUPERNATURAL */ "Fishimon Master|Singing|Swimmer": { result: "Siren", isFullTransformation: true, requiresTier4Rod: true }, "Fishimon Master|Singing|Swimming": { result: "Siren", isFullTransformation: true, requiresTier4Rod: true }, "Corporate Drone|Occult Expert|Stiff": { result: "Living Doll", isFullTransformation: true }, /* DOMINANT */ "Cruel|Dominant|Seductive": { result: "Dominatrix", isFullTransformation: true }, /* CORRUPTION */ "High Stamina|Sexually Skilled|Trophy Wife": { result: "Slut", isFullTransformation: true }, "Chill|Heavy Lifting|Muscular": { result: "Himbo", isFullTransformation: true } }>> /* ---------------------------------- */ /* --- FULL TRANSFORMATIONS --- */ /* ---------------------------------- */ /* These override appearance and grant/remove traits automatically */ <<set setup.fullTransformations = { /* DEMONIC */ "Succubus": { type: "supernatural", category: "physical", description: "A seductive demon that feeds on sexual energy", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Succubus", grantsPhysical: ["Succubus"], grantsMental: [], removesOnGain: ["Innocent", "Naive", "Shy", "Imp", "Cynical"], removesPhysicalOnGain: ["Curvy", "Attractive", "Short"], removesSkillsOnGain: ["Sexually Skilled"], blocksTraits: ["Innocent", "Naive", "Shy", "Imp", "Cynical"], blocksPhysical: ["Curvy", "Attractive", "Short"], blocksSkills: ["Sexually Skilled"], setsChest: "large", setsGenitals: "vagina", genderLock: "female" }, "Incubus": { type: "supernatural", category: "physical", description: "A seductive demon that feeds on sexual energy", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Incubus", grantsPhysical: ["Incubus"], grantsMental: [], removesOnGain: ["Innocent", "Naive", "Shy"], genderLock: "male" }, "Imp": { type: "supernatural", category: "physical", description: "A small mischievous demon", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Imp", grantsPhysical: ["Imp"], grantsMental: [], removesOnGain: ["Cynical"], removesPhysicalOnGain: ["Attractive", "Short"], blocksTraits: ["Cynical"], blocksPhysical: ["Attractive", "Short"], setsChest: "small", setsGenitals: "tight vagina", genderLock: "female" }, "Hellhound": { type: "supernatural", category: "physical", description: "A fierce demonic wolf with boundless energy and supernatural luck", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Hellhound", grantsPhysical: ["Hellhound"], grantsMental: [], removesOnGain: ["Energetic", "Lucky", "Werewolf", "Scarred", "Fit"], removesSkillsOnGain: ["Leadership"], blocksTraits: ["Energetic", "Lucky", "Werewolf", "Scarred", "Fit"], blocksSkills: ["Leadership"], sleepImmunity: true, gymMultiplier: 4, setsChest: "huge", setsButt: "huge", setsGenitals: "vagina", genderLock: "female" }, /* WERE-CREATURES */ "Werecat": { type: "supernatural", category: "physical", description: "A cunning feline were-creature with razor-sharp instincts", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Werecat", grantsPhysical: ["Werecat"], grantsMental: [], removesOnGain: ["Impatient", "Intelligent", "Risk Taker"], blocksTraits: ["Impatient", "Intelligent", "Risk Taker"], setsChest: "medium", setsButt: "medium", setsGenitals: "tight vagina", genderLock: "female" }, "Werewolf": { type: "supernatural", category: "physical", description: "A fierce pack leader with wolf-like instincts", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Werewolf", grantsPhysical: ["Werewolf"], grantsMental: [], removesOnGain: ["Scarred", "Fit"], removesSkillsOnGain: ["Leadership"], blocksTraits: ["Scarred", "Fit"], blocksSkills: ["Leadership"], sleepImmunity: true, setsChest: "large", setsButt: "large", setsGenitals: "vagina", genderLock: "female" }, "Werebunny": { type: "supernatural", category: "physical", description: "A quick and agile rabbit were-creature", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Werebunny", grantsPhysical: ["Werebunny"], grantsMental: [], removesOnGain: ["Extroverted"], removesPhysicalOnGain: ["Flexible", "Fast"], blocksTraits: ["Extroverted"], blocksPhysical: ["Flexible", "Fast"], setsChest: "medium", setsButt: "large", setsGenitals: "tight vagina", genderLock: "female" }, "Werefox": { type: "supernatural", category: "physical", description: "A cunning and sly fox were-creature with quick wits", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Werefox", grantsPhysical: ["Werefox"], grantsMental: [], removesOnGain: ["Sly"], removesPhysicalOnGain: ["Attractive"], removesSkillsOnGain: ["Quick Learner"], blocksTraits: ["Sly"], blocksPhysical: ["Attractive"], blocksSkills: ["Quick Learner"], stealingBonus: 20, tradeBonus: 10, fishSellingBonus: 10, setsChest: "large", setsButt: "medium", setsGenitals: "loose vagina", genderLock: "female" }, "Weresheep": { type: "supernatural", category: "physical", description: "A gentle and warm-hearted sheep were-creature", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Weresheep", grantsPhysical: ["Weresheep"], grantsMental: [], removesOnGain: ["Kind", "Warm"], removesPhysicalOnGain: ["Curvy"], blocksTraits: ["Kind", "Warm"], blocksPhysical: ["Curvy"], relationshipMultiplier: 2, setsChest: "huge", setsButt: "large", setsGenitals: "vagina", genderLock: "female" }, "Hucow": { type: "supernatural", category: "physical", description: "A fully domesticated human cow", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Hucow", grantsPhysical: ["Hucow"], grantsMental: [], removesOnGain: ["Intelligent", "Ambitious"], setsChest: "gigantic", setsButt: "gigantic", setsGenitals: "loose vagina", genderLock: "female" }, /* AESTHETIC */ "Trophy Wife": { type: "aesthetic", category: "physical", description: "A pampered arm candy with refined tastes and sexual expertise", overridesAppearance: true, imagePath: "Images/Faces/Transformations/TrophyWife", grantsPhysical: ["Trophy Wife"], grantsMental: [], removesOnGain: ["Submissive"], removesPhysicalOnGain: ["Voluptuous"], removesSkillsOnGain: ["High Heels Proficient"], blocksTraits: ["Submissive"], blocksPhysical: ["Voluptuous"], blocksSkills: ["High Heels Proficient"], brothelXpMultiplier: 2, secretarySexCashMultiplier: 2, sexualXpMultiplier: 2, guaranteedClappingSuccess: true, guaranteedPrawnhubSuccess: true, setsChest: "giant", setsButt: "giant", setsGenitals: "loose vagina", genderLock: "female" }, "Gym Bunny": { type: "aesthetic", category: "physical", description: "A fitness-obsessed individual who replaces sleep with workouts", overridesAppearance: true, imagePath: "Images/Faces/Transformations/GymBunny", grantsPhysical: ["Gym Bunny"], grantsMental: [], removesOnGain: ["Lazy", "Competitive"], removesPhysicalOnGain: ["Athletic Build", "Fit"], blocksTraits: ["Competitive"], blocksPhysical: ["Athletic Build", "Fit"], gymMultiplier: 4, sleepImmunity: true, setsChest: "large", setsButt: "huge", setsGenitals: "tight vagina", genderLock: "female" }, "E-Girl": { type: "aesthetic", category: "physical", description: "An internet personality with a devoted online following", overridesAppearance: true, imagePath: "Images/Faces/Transformations/EGirl", grantsPhysical: ["E-Girl"], grantsMental: [], removesOnGain: ["Flirty", "Tech Savvy"], removesPhysicalOnGain: ["Fashionable"], blocksTraits: ["Flirty", "Tech Savvy"], blocksPhysical: ["Fashionable"], streamingSubMultiplier: 2, setsChest: "large", setsButt: "large", setsGenitals: "tight vagina", genderLock: "female" }, "Punk": { type: "aesthetic", category: "physical", description: "An anti-establishment rebel with a unique style", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Punk", grantsPhysical: ["Punk"], grantsMental: [], removesOnGain: ["Goth"], removesPhysicalOnGain: ["Pierced", "Tattooed"], blocksTraits: ["Goth"], blocksPhysical: ["Pierced", "Tattooed"], roisinSellBonus: 1.5, setsChest: "small", setsButt: "medium", setsGenitals: "vagina", genderLock: "female" }, "Gyaru": { type: "aesthetic", category: "physical", description: "A flashy party girl with tanned skin and bold makeup", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Gyaru", grantsPhysical: ["Gyaru"], grantsMental: [], removesOnGain: ["Prep", "Extroverted", "Bitchy", "Shy", "Reserved"], blocksTraits: ["Prep", "Extroverted", "Bitchy", "Shy", "Reserved"], gyaruRelationships: true, gyaruPrawnhub: true, gyaruStripClub: true, setsChest: "large", setsButt: "giant", setsGenitals: "vagina", genderLock: "female" }, /* SUPERNATURAL */ "Siren": { type: "supernatural", category: "physical", description: "A mythical sea creature with an enchanting voice that lures sailors to their doom. Can only catch legendary treasure and the rarest fish.", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Siren", grantsPhysical: ["Siren"], grantsMental: [], removesOnGain: ["Fishimon Master"], removesSkillsOnGain: ["Singing", "Swimmer", "Swimming"], blocksTraits: ["Fishimon Master"], blocksSkills: ["Singing", "Swimmer", "Swimming"], tradeBonus: 30, sexualXpMultiplier: 1.5, fishSellingMultiplier: 2, sirenFishing: true, setsChest: "huge", setsButt: "huge", setsGenitals: "loose vagina", genderLock: "female" }, "Living Doll": { type: "supernatural", category: "physical", description: "A perfect, doll-like being", overridesAppearance: true, imagePath: "Images/Faces/Transformations/LivingDoll", grantsPhysical: ["Living Doll"], grantsMental: [], removesOnGain: ["Rebellious"], setsChest: "medium", setsGenitals: "tight vagina", genderLock: "female" }, /* DOMINANT */ "Dominatrix": { type: "aesthetic", category: "physical", description: "A commanding female dominant who takes control. Earns 3x cash for dominant acts at the brothel and clients ignore their preferences when you dominate them.", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Dominatrix", grantsPhysical: ["Dominatrix"], grantsMental: [], removesOnGain: ["Cruel", "Dominant", "Seductive", "Submissive", "Kind"], blocksTraits: ["Cruel", "Dominant", "Seductive", "Submissive", "Kind"], dominatrixBrothel: true, setsChest: "huge", setsButt: "huge", setsGenitals: "loose vagina", genderLock: "female" }, /* CORRUPTION */ "Slut": { type: "corruption", category: "physical", description: "An insatiable sexual being. Gains 3x sexual skill XP, 2x cash from all sexual jobs. Doesn't get exhausted from lack of sleep, but must satisfy sexual needs daily or suffer penalties. Gains Well Rested from sex acts instead of sleeping. Includes all Trophy Wife bonuses.", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Slut", grantsPhysical: ["Slut"], grantsMental: [], removesOnGain: ["High Stamina", "Trophy Wife", "Shy", "Prudish"], removesSkillsOnGain: ["Sexually Skilled"], blocksTraits: ["High Stamina", "Trophy Wife", "Shy", "Prudish"], blocksSkills: ["Sexually Skilled"], slutSexualNeeds: true, sexualSkillMultiplier: 3, sexualJobCashMultiplier: 2, /* Trophy Wife bonuses included */ brothelXpMultiplier: 2, secretarySexCashMultiplier: 2, guaranteedClappingSuccess: true, guaranteedPrawnhubSuccess: true, setsChest: "giant", setsButt: "giant", setsGenitals: "loose vagina", genderLock: "female" }, "Himbo": { type: "corruption", category: "physical", description: "A lovable but dim muscular man", overridesAppearance: true, imagePath: "Images/Faces/Transformations/Himbo", grantsPhysical: ["Himbo"], grantsMental: [], removesOnGain: ["Chill"], removesPhysicalOnGain: ["Muscular"], removesSkillsOnGain: ["Heavy Lifting"], blocksTraits: ["Chill"], blocksPhysical: ["Muscular"], blocksSkills: ["Heavy Lifting"], gymMultiplier: 2, maleRelationshipMultiplier: 2, setsChest: "flat masculine", setsButt: "flat masculine", setsGenitals: "big penis", genderLock: "male" }, }>> /* ---------------------------------- */ /* --- COMBINATION-ONLY TRAITS --- */ /* ---------------------------------- */ /* These traits can ONLY be obtained via trait combination, not character creation */ <<set setup.combinationOnlyTraits = [ /* Transformation Ingredient Physical Traits */ "Catperson", "Wolfperson", "Horns", "Fangs", "Pointed Ears", "Glowing Eyes", "Claws", "Wings", "Tail", // "Lactating" - now available at Lamprey's Tomes /* Transformation Ingredient Mental Traits */ "Mischievous", "Docile", "Feral", "Predatory", "Maternal", "Paternal", "Breeding Obsessed", "Heat Cycles", "Pack Minded", "Nocturnal", "Territorial", "Shameless", "Insatiable", "Praise Seeking", "Obedient", "Collar Loving", "Rebellious", "Corrupted", "Cunning", /* Intermediate Combination Traits (Tier 1) */ "Temptress", "Sadist", "Masochist", "Milky", "Neko", "Inu", "Imp-Touched", "Mommy Energy", "Devoted", "Exhibitionist", "Savage", "Genius", /* Full Transformation Traits (Tier 2) */ "Succubus", "Imp", "Hellhound", // "Incubus", - temporarily disabled "Werecat", "Werewolf", "Werebunny", "Werefox", "Weresheep", "Hucow", "Trophy Wife", "Gym Bunny", "E-Girl", "Punk", "Gyaru", "Siren", "Living Doll", "Dominatrix", "Slut", "Himbo" ]>> /* Stereotype traits */ <<set setup.stereotypeTraits = { "Nerd": "Academically focused", "Geek": "Obsessed with hobbies", "Prep": "Popular and preppy", "Tomboy": "Masculine interests", "Femboy": "Feminine presentation", "Diva": "Demanding personality", "Goth": "Dark aesthetic" }>> /* Available skills */ <<set setup.availableSkills = { "Math Skills": "Good with numbers", "Coding": "Programming ability", "Dancing": "Skilled dancer", "Plumbing": "Fix pipes and drains", "High Heels Proficient": "Walk in heels easily", "Swimmer": "Strong swimming ability", "Swimming": "Strong swimming ability", "Sexually Skilled": "Experienced in intimacy", "Modeling": "Posing and presentation", "Makeup": "Cosmetics application", "Cooking": "Culinary skills", "Photography": "Camera and composition", "Maid": "Cleaning and service", "Singing": "Vocal talent", "Serving": "Food and beverage service", "Hair Styling": "Hair cutting and styling", "Cleaning": "Tidying and organizing", "Combat": "Fighting skills", "Persuasion": "Convincing others", "Medicine": "Medical knowledge", "Trading": "Negotiation skills", "Stealth": "Moving unseen", "Driving": "Vehicle operation", "Lock Picking": "Opening locks", "First Aid": "Basic medical care", "Gardening": "Plant cultivation", "Construction": "Building skills", "Heavy Lifting": "Moving heavy objects", "Social Media": "Online presence management", "Baking": "Pastry and bread making", "Public Speaking": "Confident speaker", "Writing": "Creative and technical writing", "Art": "Artistic ability", "Painting": "Visual art creation", "Music": "Musical talent", "Guitar": "String instrument", "Piano": "Keyboard instrument", "Acting": "Performance skills", "Teaching": "Educating others", "Sales": "Selling products", "Management": "Leadership skills", "Accounting": "Financial management", "Legal Knowledge": "Understanding of law", "Foreign Language": "Speaks another language", "Languages": "Multilingual ability", "Martial Arts": "Combat training", "Athletics": "Physical sports", "Yoga": "Flexibility and balance", "Retail": "Store operations", "Tech-Savvy": "Technology expertise", "Troubleshooting": "Problem diagnosis", "Forklift Certified": "Heavy machinery", "Product Knowledge": "Item expertise", "Inventory Management": "Stock control", "Customer Service": "Client assistance", "Meditation": "Mindfulness practice", "Business": "Commercial acumen", "Finance": "Money management", "Investigation": "Research skills", "Fishing": "Angling ability", "Mechanical Repair": "Fix machines", "Basketball": "Court sports", "Performance": "Stage presence", "Gaming": "Video game skills", "Leadership": "Guiding others", "Combat Training": "Fight instruction", "Quick Learner": "Learn skills faster. Gain +50% experience from all activities." }>> /* ---------------------------------- */ /* --- PLAYER STATUS --- */ /* ---------------------------------- */ <<set $homeless = true>> <<set $ownsHouse = false>> <<set $houseLocation = null>> <<set $housePurchaseDate = null>> <<set $jobs = []>> <<set $money = 0>> /* ---------------------------------- */ /* --- FISHING INVENTORY & BOAT --- */ /* ---------------------------------- */ <<set $fishInventory = []>> <<set $fishTank = null>> <<set $boat = null>> <<set $boatUpgrades = []>> <<set $tackle = { hook: null, line: null }>> <</silently>> /* ---------------------------------- */ /* --- SHADY SHOP TRACKING --- */ /* ---------------------------------- */ <<set $shadyDealsToday = 0>> <<set $lastFenRisTrainingDay = -1>> /* ---------------------------------- */ /* --- TRAIT COMBINATION TRACKING --- */ /* ---------------------------------- */ <<set $failedTraitCombinations = []>> /* ---------------------------------- */ /* --- RELATIONSHIP SYSTEM --- */ /* ---------------------------------- */ <<set setup.relationshipLevels = [ {level: -1, name: "Disliked", minPoints: -50, maxPoints: -1, color: "#ff4444"}, {level: 0, name: "Stranger", minPoints: 0, maxPoints: 24, color: "#666666"}, {level: 1, name: "Acquaintance", minPoints: 25, maxPoints: 74, color: "#51cf66"}, {level: 2, name: "Friend", minPoints: 75, maxPoints: 174, color: "#4dabf7"}, {level: 3, name: "Close Friend", minPoints: 175, maxPoints: 424, color: "#9b59b6"}, {level: 4, name: "Best Friend", minPoints: 425, maxPoints: 9999, color: "#ff6b9d"} ]>> /* Helper to get relationship level data by level number */ <<set setup.getRelationshipLevelData = function(level) { for (var i = 0; i < setup.relationshipLevels.length; i++) { if (setup.relationshipLevels[i].level === level) { return setup.relationshipLevels[i]; } } return setup.relationshipLevels[1]; // Default to Stranger }>> /* Calculate level from points */ <<set setup.calculateRelationshipLevel = function(points) { if (points < 0) return -1; // Disliked if (points < 25) return 0; // Stranger if (points < 75) return 1; // Acquaintance if (points < 175) return 2; // Friend if (points < 425) return 3; // Close Friend return 4; // Best Friend }>> /* Initialize relationships for ALL NPCs */ <<set $npcRelationships = {}>> /* Add all NPCs from the $npcs array to relationships */ <<for _i = 0; _i < $npcs.length; _i++>> <<set _npcName = $npcs[_i].name>> <<set $npcRelationships[_npcName] = { level: 0, points: 0, levelName: "Stranger", bestFriendUnlocked: false }>> <</for>> /* ---------------------------------- */ /* --- NPC-TO-NPC RELATIONSHIPS --- */ /* ---------------------------------- */ /* Initialize NPC-to-NPC relationship matrix */ <<set $npcToNpcRelationships = {}>> /* NPC-to-NPC Relationship Types */ <<set setup.npcRelationshipTypes = { "family_sibling": { name: "Sibling", basePoints: 200, color: "#ff6b9d" }, "family_parent": { name: "Parent", basePoints: 250, color: "#ff6b9d" }, "family_child": { name: "Child", basePoints: 250, color: "#ff6b9d" }, "friends": { name: "Friends", basePoints: 100, color: "#4dabf7" }, "best_friends": { name: "Best Friends", basePoints: 300, color: "#51cf66" }, "rivals": { name: "Rivals", basePoints: -25, color: "#ff4444" }, "enemies": { name: "Enemies", basePoints: -50, color: "#cc0000" }, "romantic": { name: "Romantic Partner", basePoints: 350, color: "#e91e63" }, "ex_romantic": { name: "Ex-Partner", basePoints: -10, color: "#9e9e9e" }, "coworkers": { name: "Coworkers", basePoints: 50, color: "#ffd43b" }, "acquaintances": { name: "Acquaintances", basePoints: 25, color: "#666666" }, "strangers": { name: "Strangers", basePoints: 0, color: "#444444" } }>> /* Generate NPC-to-NPC relationship key */ <<set setup.getNpcRelationshipKey = function(npc1Name, npc2Name) { // Sort names alphabetically to ensure consistent key var names = [npc1Name, npc2Name].sort(); return names[0] + "_" + names[1]; }>> /* Set relationship between two NPCs */ <<set setup.setNpcToNpcRelationship = function(npc1Name, npc2Name, relationshipType) { var v = State.variables; var key = setup.getNpcRelationshipKey(npc1Name, npc2Name); var typeData = setup.npcRelationshipTypes[relationshipType]; if (!typeData) { typeData = setup.npcRelationshipTypes["strangers"]; relationshipType = "strangers"; } v.npcToNpcRelationships[key] = { npc1: npc1Name, npc2: npc2Name, type: relationshipType, typeName: typeData.name, points: typeData.basePoints, level: setup.calculateRelationshipLevel(typeData.basePoints), color: typeData.color }; return v.npcToNpcRelationships[key]; }>> /* Get relationship between two NPCs */ <<set setup.getNpcToNpcRelationship = function(npc1Name, npc2Name) { var v = State.variables; var key = setup.getNpcRelationshipKey(npc1Name, npc2Name); if (v.npcToNpcRelationships[key]) { return v.npcToNpcRelationships[key]; } // Default to strangers return { npc1: npc1Name, npc2: npc2Name, type: "strangers", typeName: "Strangers", points: 0, level: 0, color: "#444444" }; }>> /* Get all relationships for a specific NPC */ <<set setup.getNpcRelationships = function(npcName) { var v = State.variables; var relationships = []; for (var key in v.npcToNpcRelationships) { var rel = v.npcToNpcRelationships[key]; if (rel.npc1 === npcName || rel.npc2 === npcName) { var otherNpc = (rel.npc1 === npcName) ? rel.npc2 : rel.npc1; relationships.push({ npcName: otherNpc, relationship: rel }); } } return relationships; }>> /* Check if two NPCs know each other (have a relationship) */ <<set setup.npcsKnowEachOther = function(npc1Name, npc2Name) { var rel = setup.getNpcToNpcRelationship(npc1Name, npc2Name); return rel.type !== "strangers"; }>> /* ---------------------------------- */ /* --- HOUSING INFRASTRUCTURE --- */ /* ---------------------------------- */ /* Housing locations and their properties */ <<set setup.housingLocations = { "OutskirtsHousing": { name: "Outskirts Housing", area: "Outskirts", type: "rundown", description: "Rundown houses in the outskirts of town", accessLevel: 2, rent: 200 }, "BusinessDistrictHousing": { name: "Business District Apartments", area: "BusinessDistrict", type: "upscale", description: "Upscale apartments in the business district", accessLevel: 3, rent: 800 }, "RedLightHousing": { name: "Red Light District Apartments", area: "RedLightDistrict", type: "seedy", description: "Seedy apartments in the red light district", accessLevel: 2, rent: 350 }, "ApartmentPenthouse": { name: "Penthouse Suite", area: "Apartments", type: "luxury", description: "Luxury penthouse that can be rented", accessLevel: 4, rent: 2000 }, "BeachMansion": { name: "Beach Mansion", area: "Beach", type: "mansion", description: "Luxurious mansion by the beach", accessLevel: 4, rent: 5000 }, "BrothelPrivateChambers": { name: "Brothel Private Chambers", area: "Brothel", type: "private", description: "Private chambers within the brothel", accessLevel: 4, rent: 0 }, "ResidentialNormalHomes": { name: "Normal Homes", area: "ResidentialDistrict", type: "suburban", description: "Middle-class suburban homes in the residential district", accessLevel: 2, rent: 400 }, "ResidentialExpensiveHomes": { name: "Expensive Homes", area: "ResidentialDistrict", type: "upscale", description: "Upper-class homes in the nicer part of the residential district", accessLevel: 3, rent: 1200 }, "ResidentialMansions": { name: "Residential Mansions", area: "ResidentialDistrict", type: "mansion", description: "Gated mansion community for the wealthy elite", accessLevel: 4, rent: 4000 } }>> /* Set NPC residence */ <<set setup.setNPCResidence = function(npcName, housingKey) { var v = State.variables; var npc = setup.getNPCByName(npcName); if (!npc) return false; if (setup.housingLocations[housingKey]) { npc.residence = housingKey; return true; } return false; }>> /* Get NPC residence information */ <<set setup.getNPCResidence = function(npcName) { var npc = setup.getNPCByName(npcName); if (!npc || !npc.residence) return null; var housing = setup.housingLocations[npc.residence]; if (housing) { return { key: npc.residence, name: housing.name, area: housing.area, type: housing.type, description: housing.description }; } return null; }>> /* Check if player can access NPC's home */ <<set setup.canAccessNPCHome = function(npcName) { var v = State.variables; var residence = setup.getNPCResidence(npcName); if (!residence) return false; var housing = setup.housingLocations[residence.key]; if (!housing) return false; // Get relationship level var rel = v.relationships[npcName]; if (!rel) return false; // Check if relationship level meets access requirement // Level 3 (Close Friend) or higher for most homes // Level 4 (Best Friend) for luxury/private homes if (rel.level >= housing.accessLevel) { return true; } return false; }>> /* Get NPCs who live in a specific housing location */ <<set setup.getNPCsAtResidence = function(housingKey) { var v = State.variables; var residents = []; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; if (npc.residence === housingKey) { residents.push(npc); } } return residents; }>> /* Get all NPCs who have residences */ <<set setup.getNPCsWithResidences = function() { var v = State.variables; var npcsWithHomes = []; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; if (npc.residence && setup.housingLocations[npc.residence]) { npcsWithHomes.push({ npc: npc, residence: setup.housingLocations[npc.residence] }); } } return npcsWithHomes; }>> /* Default NPC residence assignments based on jobs and social status */ <<set setup.npcDefaultResidences = { /* Outskirts Housing - Rundown, low-income */ "Jake Steel": "OutskirtsHousing", "Tommy Blake": "OutskirtsHousing", "Mason Reed": "OutskirtsHousing", "Hank Briggs": "OutskirtsHousing", "Rusty Nails": "OutskirtsHousing", "David O'Brien": "OutskirtsHousing", "Xanithar Galdenentri": "OutskirtsHousing", /* Business District Housing - Upscale professionals */ "Elena Romero": "BusinessDistrictHousing", "Grimm Patel": "BusinessDistrictHousing", "Scarlett Vex": "BusinessDistrictHousing", "Nina Sato": "BusinessDistrictHousing", "Zara Quinn": "BusinessDistrictHousing", "Clara Chen": "BusinessDistrictHousing", "Lena Cross": "BusinessDistrictHousing", "Amber Cole": "BusinessDistrictHousing", "Evelyn Marsh": "BusinessDistrictHousing", "Naomi Sato": "BusinessDistrictHousing", /* Red Light District Housing - Adult industry workers (non-brothel) */ "Jade Nightshade": "RedLightHousing", "Apollo Sterling": "RedLightHousing", "Tanya West": "RedLightHousing", "Ruby Lane": "RedLightHousing", "Diamond Murphy": "RedLightHousing", "Raven Delacroix": "RedLightHousing", /* Brothel Private Chambers - Brothel workers live at the brothel */ "Candace Luxe": "BrothelPrivateChambers", "Ruby Becker": "BrothelPrivateChambers", "Sapphire Wallace": "BrothelPrivateChambers", "Jasmine Abrams": "BrothelPrivateChambers", "Ebony Vasquez": "BrothelPrivateChambers", "Amber Skye": "BrothelPrivateChambers", "Selkira Onyxia": "BrothelPrivateChambers", "Revna McKraken": "BrothelPrivateChambers", /* Residential Normal Homes - Middle class */ "Marcus Carter": "ResidentialNormalHomes", "Silva Silva": "ResidentialNormalHomes", "Rex Harmon": "ResidentialNormalHomes", "Cass Morgan": "ResidentialNormalHomes", "Ivy Brooks": "ResidentialNormalHomes", "Drake Lawson": "ResidentialNormalHomes", "Daisy Flores": "ResidentialNormalHomes", "Milo Hart": "ResidentialNormalHomes", "Wendy Parker": "ResidentialNormalHomes", "Spencer Kim": "ResidentialNormalHomes", "Victor Reyes": "ResidentialNormalHomes", "Oscar Grant": "ResidentialNormalHomes", "Penny Shaw": "ResidentialNormalHomes", "Felix Dunn": "ResidentialNormalHomes", "Jenna Hartwell": "ResidentialNormalHomes", "Lila Monroe": "ResidentialNormalHomes", "Megan Holt": "ResidentialNormalHomes", "Tara Bloom": "ResidentialNormalHomes", "Kira Wolfe": "ResidentialNormalHomes", "Nadia Petrova": "ResidentialNormalHomes", "Fiona Graves": "ResidentialNormalHomes", "Chelsea Bright": "ResidentialNormalHomes", "Maya Santos": "ResidentialNormalHomes", "Derek Stone": "ResidentialNormalHomes", "Ryan Mitchell": "ResidentialNormalHomes", "Kyle Jensen": "ResidentialNormalHomes", "Nolan Pierce": "ResidentialNormalHomes", "Quinn Taylor": "ResidentialNormalHomes", /* Residential Expensive Homes - Upper middle class */ "Vera Sinclair": "ResidentialExpensiveHomes", "Blair Hoffman": "ResidentialExpensiveHomes", "Celeste Fontaine": "ResidentialExpensiveHomes", "Vivian Cho": "ResidentialExpensiveHomes", "Bianca Moretti": "ResidentialExpensiveHomes", /* Residential Mansions - Wealthy elite */ "Maxine Delacour": "ResidentialMansions", /* Special/Story NPCs */ "Purple Wood": "ApartmentPenthouse", "Luna Snow": "ApartmentPenthouse", "Roisin Sullivan": "BeachMansion" }>> /* Maps housing keys to their schedule location (where NPCs go when "at home") */ <<set setup.housingToScheduleLocation = { "OutskirtsHousing": "OutskirtsHousing", "BusinessDistrictHousing": "BusinessDistrictHousing", "RedLightHousing": "RedLightHousing", "ApartmentPenthouse": "ApartmentPenthouse", "BeachMansion": "BeachMansion", "BrothelPrivateChambers": "BrothelPrivateChambers", "ResidentialNormalHomes": "ResidentialNormalHomes", "ResidentialExpensiveHomes": "ResidentialExpensiveHomes", "ResidentialMansions": "ResidentialMansions" }>> /* Get NPCs currently at a specific housing location */ <<set setup.getNPCsAtHousing = function(housingKey) { var v = State.variables; var npcsAtHousing = []; var currentHour = Math.floor(v.timeInMinutes / 60) % 24; var dayOfWeek = v.dayOfWeek; if (!v.npcs) return npcsAtHousing; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; // Check if NPC lives at this housing if (npc.residence === housingKey) { // Check if NPC is currently at their home location var currentLocation = setup.getNPCLocation(npc, dayOfWeek, currentHour); var homeLocation = setup.housingToScheduleLocation[housingKey] || housingKey; // NPC is home if at their housing location or ResidentialDistrict (for residential homes) if (currentLocation === homeLocation || (currentLocation === "ResidentialDistrict" && homeLocation.indexOf("Residential") === 0)) { npcsAtHousing.push(npc); } } } return npcsAtHousing; }>> /* Check if player can visit an NPC's home (relationship level 3+) */ <<set setup.canVisitNPCHome = function(npcName) { var v = State.variables; var rel = v.npcRelationships && v.npcRelationships[npcName]; if (!rel) return false; return rel.level >= 3; }>> /* Attempt to knock on a random door in a housing area - 25% chance someone answers */ <<set setup.knockRandomDoor = function(housingKey) { var npcsAtHousing = setup.getNPCsAtHousing(housingKey); if (npcsAtHousing.length === 0) { return { success: false, reason: "no_one_home", npc: null }; } // 25% chance someone answers if (Math.random() < 0.25) { // Random NPC from those at home answers var randomNPC = npcsAtHousing[Math.floor(Math.random() * npcsAtHousing.length)]; return { success: true, reason: "answered", npc: randomNPC }; } else { return { success: false, reason: "no_answer", npc: null }; } }>> /* Get all NPCs who live in a specific housing area (regardless of if they're home) */ <<set setup.getNPCsLivingAt = function(housingKey) { var v = State.variables; var residents = []; if (!v.npcs) return residents; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; if (npc.residence === housingKey) { residents.push(npc); } } return residents; }>> /* Initialize all NPC residences on game start */ <<set setup.initializeAllNPCResidences = function() { var v = State.variables; if (!v.npcs) return; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; var npcName = npc.permanentId || npc.name; // Skip if NPC already has a residence if (npc.residence) continue; // Check if NPC has a default residence assignment if (setup.npcDefaultResidences[npcName]) { npc.residence = setup.npcDefaultResidences[npcName]; } else { // Assign based on job - check jobs array var jobs = npc.jobs || []; var job = Array.isArray(jobs) ? jobs[0] : jobs; if (job === "Brothel Worker") { npc.residence = "BrothelPrivateChambers"; } else if (job === "Stripper" || job === "Hooker") { npc.residence = "RedLightHousing"; } else if (job === "Porn Star" || job === "Social Media Influencer") { npc.residence = "BusinessDistrictHousing"; } else if (job === "Farm Hand" || job === "Fisherman") { npc.residence = "OutskirtsHousing"; } else if (job === "Government Worker" || job === "Clinic Assistant") { npc.residence = "BusinessDistrictHousing"; } else { // Default to normal residential homes npc.residence = "ResidentialNormalHomes"; } } } }>> /* Update residence when job changes (optional - maintains old residence if they can afford it) */ <<set setup.updateResidenceForJob = function(npcName, newJob, forceMove) { var npc = setup.findNPCByName(npcName); if (!npc) return; if (forceMove) { // Force move to new residence based on job if (newJob === "Brothel Worker") { npc.residence = "BrothelPrivateChambers"; } else if (newJob === "Stripper" || newJob === "Hooker") { npc.residence = "RedLightHousing"; } else if (newJob === "Porn Star" || newJob === "Social Media Influencer") { npc.residence = "BusinessDistrictHousing"; } else if (newJob === "Farm Hand" || newJob === "Fisherman") { npc.residence = "OutskirtsHousing"; } else if (newJob === "Government Worker" || newJob === "Clinic Assistant") { npc.residence = "BusinessDistrictHousing"; } else { npc.residence = "ResidentialNormalHomes"; } } // If not forced, NPC keeps their current residence }>> /* Swap residences between two NPCs (for identity swap) */ <<set setup.swapNPCResidences = function(npc1Name, npc2Name) { var npc1 = setup.findNPCByName(npc1Name); var npc2 = setup.findNPCByName(npc2Name); if (npc1 && npc2) { var temp = npc1.residence; npc1.residence = npc2.residence; npc2.residence = temp; } }>> /* Get text describing how NPC1 refers to NPC2 based on their relationship */ <<set setup.getNpcRelationshipReference = function(npc1Name, npc2Name) { var rel = setup.getNpcToNpcRelationship(npc1Name, npc2Name); switch (rel.type) { case "family_sibling": return "my sibling"; case "family_parent": return (npc1Name === rel.npc1) ? "my parent" : "my child"; case "family_child": return (npc1Name === rel.npc1) ? "my child" : "my parent"; case "friends": return "my friend"; case "best_friends": return "my best friend"; case "rivals": return "my rival"; case "enemies": return "someone I don't get along with"; case "romantic": return "my partner"; case "ex_romantic": return "my ex"; case "coworkers": return "my coworker"; case "acquaintances": return "someone I know"; default: return npc2Name; } }>> /* Default NPC-to-NPC Relationships */ <<set setup.defaultNpcToNpcRelationships = [ /* Coworker relationships - Same workplace */ {npc1: "Jade Nightshade", npc2: "Apollo Sterling", type: "coworkers"}, {npc1: "Jade Nightshade", npc2: "Ruby Lane", type: "coworkers"}, {npc1: "Apollo Sterling", npc2: "Ruby Lane", type: "coworkers"}, {npc1: "Elena Romero", npc2: "Clara Chen", type: "coworkers"}, {npc1: "Scarlett Vex", npc2: "Amber Cole", type: "coworkers"}, {npc1: "Jake Steel", npc2: "Tommy Blake", type: "coworkers"}, {npc1: "Vera Sinclair", npc2: "Lena Cross", type: "coworkers"}, /* Friend relationships - Based on neighborhood/common interests */ {npc1: "Marcus Carter", npc2: "Rex Harmon", type: "friends"}, {npc1: "Silva Silva", npc2: "Cass Morgan", type: "friends"}, {npc1: "Ivy Brooks", npc2: "Daisy Flores", type: "friends"}, {npc1: "Nina Sato", npc2: "Zara Quinn", type: "friends"}, {npc1: "Wendy Parker", npc2: "Penny Shaw", type: "friends"}, {npc1: "Victor Reyes", npc2: "Tommy Blake", type: "friends"}, {npc1: "Milo Hart", npc2: "Spencer Kim", type: "friends"}, {npc1: "Oscar Grant", npc2: "Felix Dunn", type: "friends"}, /* Best friends */ {npc1: "Jade Nightshade", npc2: "Tanya West", type: "best_friends"}, {npc1: "Elena Romero", npc2: "Nina Sato", type: "best_friends"}, /* Romantic relationships */ {npc1: "Scarlett Vex", npc2: "Grimm Patel", type: "romantic"}, {npc1: "Blair Hoffman", npc2: "Drake Lawson", type: "romantic"}, /* Ex-romantic */ {npc1: "Apollo Sterling", npc2: "Jade Nightshade", type: "ex_romantic"}, {npc1: "Mason Reed", npc2: "Tanya West", type: "ex_romantic"}, /* Rivals */ {npc1: "Scarlett Vex", npc2: "Amber Cole", type: "rivals"}, {npc1: "Zara Quinn", npc2: "Daisy Flores", type: "rivals"}, /* Family relationships */ {npc1: "Ivy Brooks", npc2: "Wendy Parker", type: "family_sibling"}, /* Acquaintances - Neighborhood connections */ {npc1: "Marcus Carter", npc2: "Silva Silva", type: "acquaintances"}, {npc1: "Cass Morgan", npc2: "Ivy Brooks", type: "acquaintances"}, {npc1: "Jake Steel", npc2: "Mason Reed", type: "acquaintances"}, {npc1: "Grimm Patel", npc2: "Drake Lawson", type: "acquaintances"}, {npc1: "Ruby Lane", npc2: "Tanya West", type: "acquaintances"}, {npc1: "Vera Sinclair", npc2: "Blair Hoffman", type: "acquaintances"}, {npc1: "Lena Cross", npc2: "Clara Chen", type: "acquaintances"}, {npc1: "Oscar Grant", npc2: "Spencer Kim", type: "acquaintances"}, {npc1: "Milo Hart", npc2: "Felix Dunn", type: "acquaintances"} ]>> /* Initialize all default NPC-to-NPC relationships */ <<set setup.initializeNpcToNpcRelationships = function() { var relationships = setup.defaultNpcToNpcRelationships; for (var i = 0; i < relationships.length; i++) { var rel = relationships[i]; setup.setNpcToNpcRelationship(rel.npc1, rel.npc2, rel.type); } }>> /* Get all NPCs an NPC considers friends or better */ <<set setup.getNpcFriends = function(npcName) { var allRels = setup.getNpcRelationships(npcName); var friends = []; for (var i = 0; i < allRels.length; i++) { var rel = allRels[i].relationship; // Friends, best friends, romantic, family all count if (rel.type === "friends" || rel.type === "best_friends" || rel.type === "romantic" || rel.type.indexOf("family") === 0) { friends.push(allRels[i].npcName); } } return friends; }>> /* Get all NPCs an NPC has negative relations with */ <<set setup.getNpcEnemies = function(npcName) { var allRels = setup.getNpcRelationships(npcName); var enemies = []; for (var i = 0; i < allRels.length; i++) { var rel = allRels[i].relationship; if (rel.type === "rivals" || rel.type === "enemies") { enemies.push(allRels[i].npcName); } } return enemies; }>> /* Generate default relationships for an NPC (used in life swap) */ /* Returns an object of {npcName: {level: X, points: Y}} */ <<set setup.generateNPCDefaultRelationships = function(npcName) { var v = State.variables; var relationships = {}; /* * Define NPC relationships as PAIRS - relationships are always bidirectional. * Format: [[NPC1, NPC2, level, points, reason], ...] * Both NPCs will have this relationship with each other. */ var relationshipPairs = [ /* === MAYOR & CITY HALL === */ ["Dick Richardson", "Creo Applesauce", 2, 100], /* Mayor & Secretary */ ["Dick Richardson", "Grimm Patel", 1, 50], /* Uses enforcer */ ["Dick Richardson", "Marcus Carter", 0, 10], /* Security knows him */ ["Dick Richardson", "Tank Morrison", -1, -20], /* Bouncer dislikes corrupt mayor */ ["Dick Richardson", "Jake Steel", -1, -30], /* Construction screwed by policies */ ["Dick Richardson", "Elena Romero", -1, -25], /* Clinic underfunded */ ["Dick Richardson", "Keisha Jackson", -1, -35], /* Hates corruption */ ["Dick Richardson", "Rosa Otterino", -1, -20], /* Service worker ignored */ ["Dick Richardson", "Pheiffer Coms", 1, 40], /* Police connection */ ["Creo Applesauce", "Brad Icus", 1, 50], /* Office workers */ ["Creo Applesauce", "Elena Romero", 1, 40], /* Professional contact */ /* === STRIP CLUB WORKERS === */ ["Jade Nightshade", "Apollo Sterling", 2, 100], /* Coworkers */ ["Jade Nightshade", "Ruby Becker", 2, 80], /* Coworkers */ ["Jade Nightshade", "Tank Morrison", 3, 200], /* Bouncer protects her */ ["Jade Nightshade", "Trixie Rye", 2, 90], /* Club coworker */ ["Jade Nightshade", "Scarlett Vex", 1, 40], /* Industry connection */ ["Jade Nightshade", "Diamond Murphy", 1, 30], /* Knows from scene */ ["Apollo Sterling", "Ruby Becker", 2, 90], /* Coworkers */ ["Apollo Sterling", "Tank Morrison", 2, 85], /* Bouncer friend */ ["Apollo Sterling", "Scarlett Vex", 1, 50], /* Industry */ ["Apollo Sterling", "Marcus Carter", 1, 40], /* Gym buddy */ ["Apollo Sterling", "Trixie Rye", 2, 85], /* Club coworker */ ["Ruby Becker", "Tank Morrison", 2, 75], /* Bouncer */ ["Ruby Becker", "Trixie Rye", 2, 80], /* Club coworker */ ["Tank Morrison", "Trixie Rye", 2, 85], /* Bouncer protects waitress */ /* === BROTHEL - Kate Velvet owns it, knows all workers === */ ["Kate Velvet", "Candace Luxe", 3, 180], /* Owner & top worker */ ["Kate Velvet", "Sapphire Wallace", 2, 100], /* Owner & worker */ ["Kate Velvet", "Jasmine Abrams", 2, 95], /* Owner & worker */ ["Kate Velvet", "Ebony Vasquez", 2, 90], /* Owner & worker */ ["Kate Velvet", "Amber Skye", 2, 85], /* Owner & worker */ ["Kate Velvet", "Selkira Onyxia", 2, 85], /* Owner & worker */ ["Kate Velvet", "Diamond Murphy", 1, 50], /* Industry connection */ ["Kate Velvet", "Scarlett Vex", 1, 45], /* Industry connection */ ["Kate Velvet", "Grimm Patel", 1, 40], /* Business security */ ["Candace Luxe", "Sapphire Wallace", 3, 180], /* Close coworkers */ ["Candace Luxe", "Jasmine Abrams", 2, 100], /* Coworkers */ ["Candace Luxe", "Ebony Vasquez", 2, 95], /* Coworkers */ ["Candace Luxe", "Amber Skye", 2, 90], /* Coworkers */ ["Candace Luxe", "Selkira Onyxia", 2, 85], /* Coworkers */ ["Candace Luxe", "Diamond Murphy", 1, 50], /* Industry connection */ ["Sapphire Wallace", "Jasmine Abrams", 2, 100], /* Coworkers */ ["Sapphire Wallace", "Ebony Vasquez", 2, 90], /* Coworkers */ ["Sapphire Wallace", "Amber Skye", 2, 85], /* Coworkers */ ["Sapphire Wallace", "Selkira Onyxia", 2, 80], /* Coworkers */ ["Jasmine Abrams", "Ebony Vasquez", 2, 90], /* Coworkers */ ["Jasmine Abrams", "Amber Skye", 2, 85], /* Coworkers */ ["Jasmine Abrams", "Selkira Onyxia", 2, 80], /* Coworkers */ ["Ebony Vasquez", "Amber Skye", 2, 85], /* Coworkers */ ["Ebony Vasquez", "Selkira Onyxia", 2, 80], /* Coworkers */ ["Amber Skye", "Selkira Onyxia", 2, 80], /* Coworkers */ /* === CONSTRUCTION WORKERS === */ ["Jake Steel", "Marco Rodriguez", 3, 200], /* Close coworkers */ ["Jake Steel", "Tyrone Washington", 2, 100], /* Coworkers */ ["Jake Steel", "Sheryl Williams", 2, 90], /* Coworkers */ ["Jake Steel", "David O'Brien", 2, 85], /* Coworkers */ ["Jake Steel", "Mike Murphy", 2, 80], /* Cross-industry */ ["Jake Steel", "Carlos Mendez", 2, 85], /* Cross-industry */ ["Jake Steel", "Tank Morrison", 1, 50], /* Drinking buddies */ ["Marco Rodriguez", "Tyrone Washington", 2, 95], /* Coworkers */ ["Marco Rodriguez", "Sheryl Williams", 2, 85], /* Coworkers */ ["Marco Rodriguez", "David O'Brien", 2, 80], /* Coworkers */ ["Marco Rodriguez", "Carlos Mendez", 3, 175], /* Close friend */ ["Tyrone Washington", "Sheryl Williams", 2, 85], /* Coworkers */ ["Tyrone Washington", "David O'Brien", 2, 80], /* Coworkers */ ["Tyrone Washington", "Jamal Rivers", 3, 175], /* Close friend */ ["Sheryl Williams", "David O'Brien", 2, 85], /* Coworkers */ ["Sheryl Williams", "Keisha Jackson", 2, 85], /* Fellow workers */ ["Sheryl Williams", "Elena Romero", 2, 80], /* Clinic connection */ /* === DOCK WORKERS === */ ["Mike Murphy", "Carlos Mendez", 2, 90], /* Coworkers */ ["Mike Murphy", "Jamal Rivers", 2, 85], /* Coworkers */ ["Mike Murphy", "Rosa Otterino", 2, 80], /* Coworkers */ ["Mike Murphy", "Keisha Jackson", 2, 80], /* Coworkers */ ["Carlos Mendez", "Jamal Rivers", 2, 80], /* Coworkers */ ["Carlos Mendez", "Rosa Otterino", 2, 75], /* Coworkers */ ["Carlos Mendez", "Keisha Jackson", 2, 75], /* Coworkers */ ["Jamal Rivers", "Rosa Otterino", 2, 85], /* Coworkers */ ["Jamal Rivers", "Keisha Jackson", 2, 80], /* Coworkers */ ["Rosa Otterino", "Keisha Jackson", 2, 90], /* Fellow workers, friends */ /* === CLINIC === */ ["Elena Romero", "Naomi Light", 2, 80], /* Health-conscious connection */ /* === NEGOTIATORS/ENFORCERS === */ ["Silva Silva", "Grimm Patel", 2, 100], /* Work together */ ["Silva Silva", "Marcus Carter", 1, 45], /* Professional */ ["Grimm Patel", "Scarlett Vex", 4, 500], /* Romantic partners */ ["Grimm Patel", "Tank Morrison", 1, 40], /* Mutual respect */ /* === SECURITY === */ ["Marcus Carter", "Tank Morrison", 2, 90], /* Security bros */ ["Marcus Carter", "Pheiffer Coms", 2, 85], /* Law enforcement connection */ ["Marcus Carter", "Brad Icus", 1, 50], /* Gym connection */ /* === PORN INDUSTRY === */ ["Scarlett Vex", "Diamond Murphy", 1, 35], /* Industry connection */ ["Scarlett Vex", "Destiny Pumpkin", 1, 40], /* Adult industry */ ["Scarlett Vex", "Alex Passionfruit", 1, 35], /* Adult industry */ /* === ADULT STORE === */ ["Destiny Pumpkin", "Alex Passionfruit", 2, 100], /* Coworkers */ ["Destiny Pumpkin", "Diamond Murphy", 1, 45], /* Industry connection */ /* === BEAUTY SALON === */ ["Crystal Meffin", "Sophi Boris", 2, 100], /* Coworkers */ ["Crystal Meffin", "Naomi Light", 2, 95], /* Coworkers */ ["Crystal Meffin", "Bella Carver", 2, 80], /* Client/influencer */ ["Sophi Boris", "Naomi Light", 2, 90], /* Coworkers */ ["Sophi Boris", "Bella Carver", 2, 85], /* Client/influencer */ ["Naomi Light", "Luna Snow", 2, 80], /* Spiritual connection */ /* === FITNESS === */ ["Fen Ris", "Brad Icus", 2, 90], /* Fitness connection */ ["Fen Ris", "Marcus Carter", 1, 50], /* Gym regulars */ ["Brad Icus", "Tank Morrison", 1, 45], /* Fitness bros */ ["Brad Icus", "Dennis Fungi", 1, 50], /* Fitness industry */ /* === DANCING === */ ["Dennis Fungi", "Yvela Mushroom", 3, 180], /* Dance partners/coworkers */ ["Dennis Fungi", "Jade Nightshade", 1, 45], /* Dancers know each other */ ["Dennis Fungi", "Apollo Sterling", 1, 40], /* Dancers know each other */ ["Yvela Mushroom", "Jade Nightshade", 1, 40], /* Dancers know each other */ /* === BAKERS === */ ["Hannah Chuckins", "Janis Besser", 3, 180], /* Coworkers, close */ ["Hannah Chuckins", "Banana Banana", 1, 50], /* Cafe connection */ ["Janis Besser", "Banana Banana", 1, 45], /* Cafe connection */ /* === TECH/RETAIL === */ ["Kevin Oats", "Raven Bido", 1, 40], /* Nerd connection */ ["Kevin Oats", "Creo Applesauce", 1, 35], /* Tech/nerd connection */ ["Raven Bido", "Luna Snow", 1, 45], /* Alternative types */ /* === SOCIAL MEDIA/INFLUENCER === */ ["Bella Carver", "Scarlett Vex", 1, 40], /* Both public figures */ ["Bella Carver", "Roisin Sullivan", 2, 90], /* Friends */ /* === SUPERNATURAL/UNUSUAL === */ ["Xanithar Galdenentri", "Fen Ris", 2, 100], /* Supernatural beings */ ["Xanithar Galdenentri", "Revna McKraken", 1, 50], /* Knows of each other */ ["Xanithar Galdenentri", "Luna Snow", 1, 45], /* Mysterious types */ ["Fen Ris", "Luna Snow", 2, 90], /* Unusual beings */ ["Revna McKraken", "Roisin Sullivan", 3, 180], /* Close connection */ /* === ODDBALLS/QUIRKY NAMES === */ ["Banana Banana", "Bongo Bongo", 3, 200], /* Similar vibes */ ["Banana Banana", "Sunny Flipflop", 2, 85], /* Beach/fun vibes */ ["Bongo Bongo", "Sunny Flipflop", 2, 90], /* Fun people */ ["Bongo Bongo", "Poggies Name420", 2, 80], /* Quirky connection */ ["Sunny Flipflop", "Poggies Name420", 1, 50], /* Quirky connection */ /* === POLICE === */ ["Pheiffer Coms", "Tank Morrison", 1, 35], /* Security-adjacent */ /* === COCKTAIL/SERVICE === */ ["Trixie Rye", "Diamond Murphy", 1, 45], /* Night scene */ ["Trixie Rye", "Destiny Pumpkin", 1, 40], /* Adult scene connection */ /* === BUS DRIVER === */ ["Xenis Aku", "Rosa Otterino", 1, 35], /* Regular passenger */ ["Xenis Aku", "Keisha Jackson", 1, 30], /* Regular passenger */ /* === MISC CONNECTIONS === */ ["Purple Wood", "Luna Snow", 1, 40], /* Unusual types */ ["Boris Shorthead", "Butt Johnson", 1, 45], /* Odd name solidarity */ ["Mareregererrer Mayonnaise", "Banana Banana", 1, 40] /* Unusual names */ ]; /* Initialize all NPCs as strangers first */ if (v.npcs && v.npcs.length > 0) { v.npcs.forEach(function(otherNpc) { var otherName = otherNpc.originalName || otherNpc.name; if (otherName !== npcName) { relationships[otherName] = { level: 0, points: 0 }; } }); } /* Apply bidirectional relationships - check both directions for each pair */ for (var i = 0; i < relationshipPairs.length; i++) { var pair = relationshipPairs[i]; var npc1 = pair[0]; var npc2 = pair[1]; var level = pair[2]; var points = pair[3]; /* If this NPC is either side of the relationship, apply it */ if (npcName === npc1) { relationships[npc2] = { level: level, points: points }; } else if (npcName === npc2) { relationships[npc1] = { level: level, points: points }; } } return relationships; }>> /* Swap all NPC-to-NPC relationships between two NPCs (for identity swap) */ <<set setup.swapAllNpcRelationships = function(npc1Name, npc2Name) { var v = State.variables; var newRelationships = {}; // Go through all relationships and swap the NPC names for (var key in v.npcToNpcRelationships) { var rel = v.npcToNpcRelationships[key]; var newRel = JSON.parse(JSON.stringify(rel)); // Swap NPC1 name if (rel.npc1 === npc1Name) { newRel.npc1 = npc2Name; } else if (rel.npc1 === npc2Name) { newRel.npc1 = npc1Name; } // Swap NPC2 name if (rel.npc2 === npc1Name) { newRel.npc2 = npc2Name; } else if (rel.npc2 === npc2Name) { newRel.npc2 = npc1Name; } // Generate new key var newKey = setup.getNpcRelationshipKey(newRel.npc1, newRel.npc2); newRelationships[newKey] = newRel; } v.npcToNpcRelationships = newRelationships; }>> /* Function to add relationship XP (legacy - calls new points system) */ <<set setup.addRelationshipXP = function(npcName, xpAmount, skipAchievements) { // Redirect to new points-based system return setup.addRelationshipPointsLegacy(npcName, xpAmount, skipAchievements); }>> /* Legacy points function for npcRelationships system */ <<set setup.addRelationshipPointsLegacy = function(npcName, pointsAmount, skipAchievements) { var v = State.variables; if (!v.npcRelationships[npcName]) { v.npcRelationships[npcName] = { level: 0, points: 0, levelName: "Stranger", bestFriendUnlocked: false }; } var rel = v.npcRelationships[npcName]; rel.points += pointsAmount; // Clamp to minimum -50 if (rel.points < -50) { rel.points = -50; } // Calculate new level from points var oldLevel = rel.level; rel.level = setup.calculateRelationshipLevel(rel.points); // Update level name var levelData = setup.getRelationshipLevelData(rel.level); rel.levelName = levelData.name; // Relationship level achievements (skip if specified, e.g. during training) if (!skipAchievements) { if (rel.level >= 2 && oldLevel < 2) { setup.achievements.unlock("relationship_2"); } if (rel.level >= 4 && oldLevel < 4) { setup.achievements.unlock("relationship_4"); rel.bestFriendUnlocked = true; } } else if (rel.level >= 4 && oldLevel < 4) { // Still unlock best friend status even when skipping achievements rel.bestFriendUnlocked = true; } return rel; }>> /* Function to unlock Best Friend status */ <<set setup.unlockBestFriendStatus = function(npcName) { var v = State.variables; if (v.npcRelationships[npcName] && v.npcRelationships[npcName].level === 4) { v.npcRelationships[npcName].bestFriendUnlocked = true; v.npcRelationships[npcName].levelName = "Best Friend"; } }>> /* Function to get relationship color */ <<set setup.getRelationshipColor = function(level) { var levelData = setup.getRelationshipLevelData(level); return levelData ? levelData.color : "#666666"; }>> /* Function to get relationship status text for an NPC */ <<set setup.getRelationshipStatus = function(npcName) { var v = State.variables; var rel = v.relationships[npcName]; if (!rel) { return "Stranger (Lv. 0)"; } var levelData = setup.getRelationshipLevelData(rel.level); var levelName = levelData ? levelData.name : "Unknown"; return levelName + " (Lv. " + rel.level + ")"; }>> /* Function to update relationship name when name is traded */ <<set setup.updateRelationshipName = function(oldName, newName) { var v = State.variables; if (v.npcRelationships && v.npcRelationships[oldName]) { v.npcRelationships[newName] = v.npcRelationships[oldName]; delete v.npcRelationships[oldName]; return true; } return false; }>> /* Track daily conversations */ <<set $dailyConversations = {}>> <<set $lastConversationDay = 0>> <<if $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 1>> <</if>> /* ---------------------------------- */ /* --- NPC INTERESTS SYSTEM --- */ /* ---------------------------------- */ /* Interest categories with topics */ <<set setup.npcInterests = { categories: { casual: ["weather", "sports", "food", "movies", "music", "fashion", "pets", "hobbies", "local_news", "travel"], personal: ["family", "dreams", "past", "fears", "relationships", "career_goals", "childhood", "regrets"], risque: ["dating_life", "crushes", "embarrassing_moments", "secrets", "gossip", "wild_nights", "exes"], sexual: ["fantasies", "kinks", "past_lovers", "body_preferences", "experiences", "turn_ons", "flirting_tips"], exotic: ["fetishes", "taboo_desires", "wild_experiences", "forbidden_attractions", "deepest_secrets"] }, unlockLevels: { casual: 0, personal: 1, risque: 2, sexual: 3, exotic: 4 } }>> /* Trait-to-interest mappings */ <<set setup.traitInterestMappings = { physical: { "Athletic": ["fitness", "sports", "nutrition", "workout_tips"], "Muscular": ["fitness", "weightlifting", "protein", "body_building"], "Fit": ["exercise", "health", "outdoor_activities"], "Attractive": ["fashion", "beauty", "dating_life", "attention"], "Beautiful": ["beauty_tips", "skincare", "modeling", "compliments"], "Handsome": ["grooming", "style", "confidence", "dating"], "Curvy": ["body_positivity", "fashion", "confidence"], "Petite": ["fashion", "cute_things", "being_underestimated"], "Tall": ["sports", "modeling", "standing_out"], "Short": ["heels", "being_cozy", "proving_people_wrong"] }, mental: { "Intelligent": ["science", "technology", "puzzles", "philosophy", "debates"], "Analytical": ["logic", "problem_solving", "data", "patterns"], "Nerd": ["gaming", "comics", "sci_fi", "collectibles", "conventions"], "Flirty": ["dating_tips", "attraction", "chemistry", "seduction"], "Seductive": ["body_language", "tension", "desire", "temptation"], "Perverted": ["fantasies", "kinks", "experiences", "desires"], "Shy": ["quiet_hobbies", "small_groups", "comfort_zones", "secret_talents"], "Introverted": ["reading", "solitude", "deep_conversations", "one_on_one"], "Ambitious": ["career_goals", "success_stories", "networking", "achievements"], "Driven": ["motivation", "goals", "self_improvement", "discipline"], "Artistic": ["art", "music", "creative_projects", "inspiration", "galleries"], "Creative": ["ideas", "imagination", "making_things", "expression"], "Gossip": ["rumors", "drama", "other_people", "scandals", "secrets"], "Talkative": ["stories", "conversations", "socializing", "news"], "Confident": ["self_assurance", "public_speaking", "leadership"], "Insecure": ["validation", "self_doubt", "seeking_approval"], "Friendly": ["making_friends", "social_events", "helping_others"], "Kind": ["charity", "animals", "volunteering", "compassion"], "Cold": ["efficiency", "boundaries", "privacy"], "Manipulative": ["psychology", "influence", "getting_what_they_want"], "Loyal": ["friendship", "trust", "commitment", "being_there"], "Jealous": ["possessiveness", "comparison", "insecurity"], "Adventurous": ["travel", "trying_new_things", "risks", "excitement"], "Cautious": ["safety", "planning", "avoiding_risks"], "Optimistic": ["positive_thinking", "hope", "silver_linings"], "Pessimistic": ["worst_case_scenarios", "realism", "preparing_for_bad"], "Humorous": ["jokes", "comedy", "making_people_laugh", "pranks"], "Serious": ["important_topics", "depth", "meaning"], "Romantic": ["love", "relationships", "romantic_gestures", "soulmates"], "Cynical": ["skepticism", "distrust", "questioning_motives"] }, jobs: { "Stripper": ["body_confidence", "performance", "admirers", "dancing", "tips"], "Porn Star": ["acting", "performance", "fans", "industry_gossip", "fame"], "Brothel Worker": ["clients", "techniques", "boundaries", "memorable_encounters", "regulars"], "Construction Worker": ["building_things", "physical_labor", "tools", "job_sites"], "Dock Worker": ["ships", "cargo", "early_mornings", "waterfront"], "Security Guard": ["safety", "vigilance", "incidents", "boring_shifts"], "Bus Driver": ["routes", "passengers", "traffic", "city_knowledge"], "Bartender": ["drinks", "drunk_stories", "tips", "regulars"], "Nurse": ["health", "patients", "medical_stories", "long_shifts"], "Doctor": ["medicine", "cases", "health_advice", "stress"], "Lawyer": ["cases", "justice", "legal_loopholes", "courtroom_drama"], "Model": ["photoshoots", "fashion", "diets", "industry_drama"], "Influencer": ["followers", "content", "brand_deals", "going_viral"] } }>> /* Generate interests for an NPC based on traits */ <<set setup.generateNPCInterests = function(npc) { var interests = { primary: [], secondary: [], hidden: [], sexual: [], exotic: [] }; var mappings = setup.traitInterestMappings; // Physical traits if (npc.physicalTraits) { npc.physicalTraits.forEach(function(trait) { if (mappings.physical[trait]) { mappings.physical[trait].forEach(function(interest) { if (!interests.primary.includes(interest) && interests.primary.length < 3) { interests.primary.push(interest); } else if (!interests.secondary.includes(interest) && interests.secondary.length < 5) { interests.secondary.push(interest); } }); } }); } // Mental traits if (npc.mentalTraits) { npc.mentalTraits.forEach(function(trait) { if (mappings.mental[trait]) { mappings.mental[trait].forEach(function(interest) { if (!interests.primary.includes(interest) && interests.primary.length < 3) { interests.primary.push(interest); } else if (!interests.secondary.includes(interest) && interests.secondary.length < 5) { interests.secondary.push(interest); } }); } // Add hidden interests for shy/introverted if (trait === "Shy" || trait === "Introverted") { interests.hidden.push("secret_hobbies", "private_dreams", "hidden_talents"); } // Add sexual interests for flirty/perverted if (trait === "Flirty" || trait === "Seductive") { interests.sexual.push("fantasies", "dating_tips", "attraction", "chemistry"); } if (trait === "Perverted") { interests.sexual.push("kinks", "experiences", "desires"); interests.exotic.push("unusual_requests", "taboo_topics"); } }); } // Job-based interests if (npc.jobs && npc.jobs.length > 0) { npc.jobs.forEach(function(job) { if (mappings.jobs[job]) { mappings.jobs[job].forEach(function(interest) { if (!interests.secondary.includes(interest) && interests.secondary.length < 7) { interests.secondary.push(interest); } }); } // Add sexual interests for adult jobs if (job === "Stripper" || job === "Porn Star") { interests.sexual.push("body_confidence", "performance", "admirers", "the_industry"); } if (job === "Brothel Worker") { interests.sexual.push("clients", "techniques", "boundaries"); interests.exotic.push("unusual_requests", "memorable_encounters"); } }); } // Ensure minimum interests var casualTopics = setup.npcInterests.categories.casual; while (interests.primary.length < 2) { var randomTopic = casualTopics[Math.floor(Math.random() * casualTopics.length)]; if (!interests.primary.includes(randomTopic)) { interests.primary.push(randomTopic); } } while (interests.secondary.length < 3) { var randomTopic = casualTopics[Math.floor(Math.random() * casualTopics.length)]; if (!interests.secondary.includes(randomTopic) && !interests.primary.includes(randomTopic)) { interests.secondary.push(randomTopic); } } return interests; }>> /* Initialize interests for all NPCs */ <<set setup.initializeAllNPCInterests = function() { var v = State.variables; if (!v.npcs) return; for (var i = 0; i < v.npcs.length; i++) { var npc = v.npcs[i]; if (!npc.interests) { npc.interests = setup.generateNPCInterests(npc); } } }>> /* Get available topics for NPC based on relationship level */ <<set setup.getAvailableTopics = function(npcName, relationshipLevel) { var npc = setup.getNPCByName(npcName); if (!npc || !npc.interests) { npc.interests = setup.generateNPCInterests(npc); } var availableTopics = []; var interests = npc.interests; // Always available availableTopics = availableTopics.concat(interests.primary); availableTopics = availableTopics.concat(interests.secondary); // Personal level (1+) if (relationshipLevel >= 1) { availableTopics = availableTopics.concat(interests.hidden || []); } // Sexual level (3+) if (relationshipLevel >= 3) { availableTopics = availableTopics.concat(interests.sexual || []); } // Exotic level (4) if (relationshipLevel >= 4) { availableTopics = availableTopics.concat(interests.exotic || []); } return availableTopics; }>> /* Check if topic is appropriate for relationship level */ <<set setup.canDiscussTopic = function(topic, relationshipLevel) { var categories = setup.npcInterests.categories; var unlockLevels = setup.npcInterests.unlockLevels; for (var category in categories) { if (categories[category].includes(topic)) { return relationshipLevel >= unlockLevels[category]; } } return true; }>> /* Update NPC interests when traits change */ <<set setup.updateNPCInterests = function(npc) { var baseInterests = setup.generateNPCInterests(npc); // 15% chance each interest shifts to something related for (var category in baseInterests) { if (Array.isArray(baseInterests[category])) { for (var i = 0; i < baseInterests[category].length; i++) { if (Math.random() < 0.15) { var allTopics = setup.npcInterests.categories.casual.concat( setup.npcInterests.categories.personal ); var newTopic = allTopics[Math.floor(Math.random() * allTopics.length)]; if (!baseInterests[category].includes(newTopic)) { baseInterests[category][i] = newTopic; } } } } } npc.interests = baseInterests; return npc.interests; }>> /* Location-specific dialogue topics */ <<set setup.locationDialogueTopics = { "Casino": [ {id: "gambling_talk", label: "Talk about gambling luck"}, {id: "high_rollers", label: "Ask about high rollers"} ], "Mall": [ {id: "shopping_talk", label: "Ask what they are shopping for"}, {id: "deals", label: "Talk about sales and deals"} ], "GymNPCs": [ {id: "workout_talk", label: "Ask about their workout routine"}, {id: "fitness_goals", label: "Discuss fitness goals"} ], "TheAngler": [ {id: "drink_talk", label: "Buy them a drink"}, {id: "gossip", label: "Ask what is the word on the street"}, {id: "rough_day", label: "Ask about their day"} ], "Hospital": [ {id: "health_talk", label: "Ask about health"}, {id: "work_stories", label: "Ask about interesting cases"} ], "HospitalClinic": [ {id: "checkup_talk", label: "Ask about getting a checkup"}, {id: "medical_advice", label: "Ask for health advice"} ], "GroceryStore": [ {id: "cooking_talk", label: "Ask what they are making"}, {id: "recipes", label: "Exchange recipe ideas"} ], "ModelingStudio": [ {id: "work_talk", label: "Ask about their shoots"}, {id: "industry_gossip", label: "Ask about industry drama"} ], "ModelingStudioFashion": [ {id: "fashion_talk", label: "Ask about fashion trends"}, {id: "photoshoot_stories", label: "Ask about memorable shoots"} ], "ModelingStudioAdult": [ {id: "industry_talk", label: "Ask about the industry"}, {id: "fans_talk", label: "Ask about fans"} ], "ResidentialDistrict": [ {id: "neighborhood_talk", label: "Ask about the neighborhood"}, {id: "neighbors", label: "Ask about the neighbors"} ], "Beach": [ {id: "beach_talk", label: "Talk about the weather"}, {id: "swimming", label: "Ask if they like swimming"} ], "StripClub": [ {id: "entertainment", label: "Ask about the entertainment"}, {id: "regulars", label: "Ask about regulars"} ], "Brothel": [ {id: "services_talk", label: "Ask about services"}, {id: "worker_life", label: "Ask about the lifestyle"} ], "Cafe": [ {id: "coffee_talk", label: "Talk about coffee preferences"}, {id: "hangout", label: "Ask if they come here often"} ], "Downtown": [ {id: "city_talk", label: "Talk about city life"}, {id: "events", label: "Ask about upcoming events"} ], "Docks": [ {id: "ships_talk", label: "Ask about the ships"}, {id: "work_talk", label: "Ask about dock work"} ], "RedLightDistrict": [ {id: "nightlife", label: "Ask about the nightlife"}, {id: "staying_safe", label: "Ask about staying safe here"} ] }>> /* Get location-specific topics */ <<set setup.getLocationTopics = function(location) { return setup.locationDialogueTopics[location] || []; }>> /* ---------------------------------- */ /* --- FLIRTING SYSTEM --- */ /* ---------------------------------- */ /* Flirting success factors based on traits and relationship */ <<set setup.flirtingSystem = { baseSuccessChance: 20, modifiers: { "Seductive": 25, "Flirty": 20, "Attractive": 15, "Confident": 10, "Charismatic": 10, "Shy": -15, "Awkward": -10, "Unattractive": -20 }, relationshipBonus: { 0: 0, // Stranger - no bonus 1: 10, // Acquaintance 2: 20, // Friend 3: 35, // Close Friend 4: 50 // Best Friend } }>> /* Calculate flirt success chance */ <<set setup.calculateFlirtChance = function(npcName) { var v = State.variables; var player = v.player || {}; var playerTraits = player.mentalTraits || []; var playerPhysicalTraits = player.physicalTraits || []; var allTraits = playerTraits.concat(playerPhysicalTraits); var chance = setup.flirtingSystem.baseSuccessChance; // Apply trait modifiers for (var i = 0; i < allTraits.length; i++) { var trait = allTraits[i]; if (setup.flirtingSystem.modifiers[trait]) { chance += setup.flirtingSystem.modifiers[trait]; } } // Apply relationship bonus var rel = v.npcRelationships[npcName]; if (rel) { chance += setup.flirtingSystem.relationshipBonus[rel.level] || 0; } // Check NPC's receptiveness based on their traits var npc = setup.findNPCByName(npcName); if (npc) { var npcTraits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); for (var j = 0; j < npcTraits.length; j++) { var npcTrait = npcTraits[j]; if (npcTrait === "Flirty" || npcTrait === "Seductive") { chance += 15; } else if (npcTrait === "Prudish" || npcTrait === "Reserved") { chance -= 15; } } } // Clamp between 5 and 95 return Math.max(5, Math.min(95, chance)); }>> /* Attempt to flirt with an NPC */ <<set setup.attemptFlirt = function(npcName) { var v = State.variables; var chance = setup.calculateFlirtChance(npcName); var roll = Math.floor(Math.random() * 100); var success = roll < chance; // Track flirt attempts if (!v.flirtHistory) v.flirtHistory = {}; if (!v.flirtHistory[npcName]) { v.flirtHistory[npcName] = { attempts: 0, successes: 0, lastAttempt: 0, arousalLevel: 0 }; } v.flirtHistory[npcName].attempts++; v.flirtHistory[npcName].lastAttempt = v.dayNumber; if (success) { v.flirtHistory[npcName].successes++; v.flirtHistory[npcName].arousalLevel = Math.min(100, v.flirtHistory[npcName].arousalLevel + 15); // Add relationship points setup.addRelationshipXP(npcName, 5); } else { v.flirtHistory[npcName].arousalLevel = Math.max(0, v.flirtHistory[npcName].arousalLevel - 5); } return { success: success, chance: chance, roll: roll, arousalLevel: v.flirtHistory[npcName].arousalLevel }; }>> /* Get flirt responses based on NPC personality */ <<set setup.getFlirtResponse = function(npcName, success) { var npc = setup.findNPCByName(npcName); if (!npc) return "..."; var traits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); var isFlirty = traits.includes("Flirty") || traits.includes("Seductive"); var isShy = traits.includes("Shy") || traits.includes("Reserved"); var isConfident = traits.includes("Confident") || traits.includes("Bold"); if (success) { if (isFlirty) { return [ "*winks back* I like where this is going...", "Mmm, keep talking like that...", "*leans closer* Tell me more...", "You're quite charming, aren't you?" ][Math.floor(Math.random() * 4)]; } else if (isShy) { return [ "*blushes deeply* Oh, um... thank you...", "*looks away shyly* That's... that's really sweet...", "*fidgets nervously* I... I like that..." ][Math.floor(Math.random() * 3)]; } else if (isConfident) { return [ "*smirks* Not bad. I'm impressed.", "Smooth. I'll give you that one.", "*raises an eyebrow* Interesting approach..." ][Math.floor(Math.random() * 3)]; } else { return [ "*smiles* That's really sweet of you.", "*laughs softly* You're quite the charmer.", "*grins* Keep that up and you might get somewhere." ][Math.floor(Math.random() * 3)]; } } else { if (isConfident) { return [ "Nice try, but you'll have to do better than that.", "*looks unimpressed* Is that your best line?", "Points for effort, I suppose." ][Math.floor(Math.random() * 3)]; } else if (isShy) { return [ "*looks uncomfortable* Um... I'm not sure...", "*shifts awkwardly* That's... that's a bit forward..." ][Math.floor(Math.random() * 2)]; } else { return [ "*polite but distant* That's... nice of you to say.", "*laughs awkwardly* Thanks, I guess?", "*changes subject* So anyway..." ][Math.floor(Math.random() * 3)]; } } }>> /* ---------------------------------- */ /* --- SEXUAL ENCOUNTER SYSTEM --- */ /* ---------------------------------- */ /* Check if sexual encounter is possible */ <<set setup.canInitiateSexualEncounter = function(npcName) { var v = State.variables; // Check relationship level (minimum Close Friend - level 3) var rel = v.npcRelationships[npcName]; if (!rel || rel.level < 3) return { possible: false, reason: "Not close enough" }; // Check arousal level var flirtHistory = v.flirtHistory && v.flirtHistory[npcName]; if (!flirtHistory || flirtHistory.arousalLevel < 50) { return { possible: false, reason: "Not aroused enough" }; } // Check NPC traits for willingness var npc = setup.findNPCByName(npcName); if (npc) { var traits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); if (traits.includes("Prudish") && rel.level < 4) { return { possible: false, reason: "NPC is too reserved" }; } } return { possible: true, reason: "Ready" }; }>> /* Sexual encounter willingness check */ <<set setup.checkSexualWillingness = function(npcName) { var v = State.variables; var baseChance = 30; // Relationship level bonus var rel = v.npcRelationships[npcName]; if (rel) { baseChance += rel.level * 15; } // Arousal bonus var flirtHistory = v.flirtHistory && v.flirtHistory[npcName]; if (flirtHistory) { baseChance += Math.floor(flirtHistory.arousalLevel / 2); } // NPC trait modifiers var npc = setup.findNPCByName(npcName); if (npc) { var traits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); if (traits.includes("Flirty") || traits.includes("Seductive")) { baseChance += 20; } if (traits.includes("Nympho") || traits.includes("Lustful")) { baseChance += 30; } if (traits.includes("Prudish")) { baseChance -= 25; } if (traits.includes("Reserved")) { baseChance -= 15; } } return Math.max(5, Math.min(95, baseChance)); }>> /* Track sexual encounters */ <<set setup.recordSexualEncounter = function(npcName, encounterType) { var v = State.variables; if (!v.sexualEncounters) v.sexualEncounters = {}; if (!v.sexualEncounters[npcName]) { v.sexualEncounters[npcName] = { totalEncounters: 0, firstEncounter: v.dayNumber, lastEncounter: v.dayNumber, encounterTypes: {} }; } var record = v.sexualEncounters[npcName]; record.totalEncounters++; record.lastEncounter = v.dayNumber; if (!record.encounterTypes[encounterType]) { record.encounterTypes[encounterType] = 0; } record.encounterTypes[encounterType]++; // Reset arousal after encounter if (v.flirtHistory && v.flirtHistory[npcName]) { v.flirtHistory[npcName].arousalLevel = 0; } // Add significant relationship points setup.addRelationshipXP(npcName, 25); return record; }>> /* ---------------------------------- */ /* --- DIALOGUE OPTION GENERATOR --- */ /* ---------------------------------- */ /* Generate dialogue options based on context */ <<set setup.generateDialogueOptions = function(npcName, currentLocation) { var v = State.variables; var options = []; // Get relationship level var rel = v.npcRelationships[npcName] || { level: 0 }; // Basic options always available options.push({ id: "small_talk", label: "Make small talk", category: "casual", minLevel: 0 }); // Location-specific topics var locationTopics = setup.getLocationTopics(currentLocation); for (var i = 0; i < locationTopics.length; i++) { options.push({ id: locationTopics[i].id, label: locationTopics[i].label, category: "location", minLevel: 0 }); } // Acquaintance+ options (level 1+) if (rel.level >= 1) { options.push({ id: "ask_about_day", label: "Ask about their day", category: "personal", minLevel: 1 }); options.push({ id: "share_story", label: "Share a story", category: "personal", minLevel: 1 }); } // Friend+ options (level 2+) if (rel.level >= 2) { options.push({ id: "ask_advice", label: "Ask for advice", category: "personal", minLevel: 2 }); options.push({ id: "flirt_light", label: "Flirt lightly", category: "romantic", minLevel: 2 }); } // Close Friend+ options (level 3+) if (rel.level >= 3) { options.push({ id: "deep_conversation", label: "Have a deep conversation", category: "personal", minLevel: 3 }); options.push({ id: "flirt_heavy", label: "Flirt suggestively", category: "romantic", minLevel: 3 }); options.push({ id: "discuss_risque", label: "Discuss risque topics", category: "risque", minLevel: 3 }); } // Best Friend+ options (level 4+) if (rel.level >= 4) { options.push({ id: "intimate_talk", label: "Have an intimate conversation", category: "sexual", minLevel: 4 }); // Check if sexual encounter possible var canSex = setup.canInitiateSexualEncounter(npcName); if (canSex.possible) { options.push({ id: "initiate_sex", label: "Suggest something more...", category: "sexual", minLevel: 4 }); } } return options; }>> /* Get interest-based dialogue topics for an NPC */ <<set setup.getNPCDialogueTopics = function(npcName) { var v = State.variables; var npc = setup.findNPCByName(npcName); if (!npc) return []; var rel = v.npcRelationships[npcName] || { level: 0 }; var availableTopics = setup.getAvailableTopics(npcName, rel.level); // Get NPC's interests if they exist var npcInterests = npc.interests || []; // Combine with available topics based on relationship var topics = []; for (var i = 0; i < availableTopics.length; i++) { var topic = availableTopics[i]; var isInterest = npcInterests.includes(topic); topics.push({ topic: topic, isInterest: isInterest, engagementBonus: isInterest ? 15 : 0 }); } return topics; }>> /* ---------------------------------- */ /* --- PLAYER PAINTINGS SYSTEM --- */ /* ---------------------------------- */ <<set $playerPaintings = [ { id: "preset_suits", title: "Suits", imageData: "Images/Other/Paintings/SuitsImage.webp", createdDay: 0, isPreset: true } ]>> <<set $roomPaintings = {}>>
test
:: InitTimeSystem <<silently>> /* ---------------------------------- */ /* --- TIME & DAY TRACKING --- */ /* ---------------------------------- */ <<set $timeInMinutes = 480>> /* Start at 8:00 AM */ <<set $dayOfWeek = "Monday">> <<set $dayNumber = 1>> <<set $weekNumber = 1>> <<set setup.dayOrder = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]>> /* ---------------------------------- */ /* --- TRADE LIMITS --- */ /* ---------------------------------- */ <<set $tradesRemainingToday = 5>> <<set $failedTradesWithToday = []>> /* ---------------------------------- */ /* --- WORK TRACKING --- */ /* ---------------------------------- */ <<set $hoursWorkedToday = 0>> <<set $lastWorkDay = 0>> /* ---------------------------------- */ /* --- BUFF/DEBUFF SYSTEM --- */ /* ---------------------------------- */ <<set $lastSleepTime = ($dayNumber - 1) * 1440 + $timeInMinutes>> /* Track when player last slept */ <<set $activeBuffs = []>> /* Array of active buffs */ <<set $activeDebuffs = []>> /* Array of active debuffs */ <</silently>> /* Ensure all NPCs have hair length on game load */ <<set setup.ensureAllNPCsHaveHairLength = function() { var v = State.variables; if (v.npcs && v.npcs.length > 0) { v.npcs.forEach(function(npc) { if (!npc.appearance.hairLength) { npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long"; // Remove any existing hair length traits first npc.physicalTraits.delete("Short Hair"); npc.physicalTraits.delete("Long Hair"); // Add correct trait var hairLengthTrait = npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair"; if (!npc.physicalTraits.includes(hairLengthTrait)) { npc.physicalTraits.push(hairLengthTrait); } } }); } }>> /* Run the check immediately */ <<run setup.ensureAllNPCsHaveHairLength()>>
<<nobr>> /* Safety check - if this is somehow the first passage, redirect to actual start */ <<if visited() === 1 && tags().includes("start")>> <<goto "Start">> <</if>> <h1>🛍️ Sunfish City Mall - CLOSED</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> ⏰ The mall is currently closed. </p> </div> <div style="padding: 20px; background: #3d3d3d; border-radius: 10px; text-align: center; color: #e0e0e0;"> <h2 style="color: #ffffff;">Mall Hours</h2> <p style="font-size: 18px; color: #cccccc;"> <strong>Open:</strong> 9:00 AM - 5:00 PM<br> <strong>Current Time:</strong> <<= getTimeString()>> </p> <p style="color: #aaaaaa; margin-top: 20px;"> The mall opens at 9:00 AM and closes at 5:00 PM. Come back during business hours! </p> </div> <br> <div style="text-align: center;"> [[Leave|BusinessDistrict]] </div> <</nobr>>
<<nobr>> <<set _relColor = "#667eea">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return to Game Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _relColor>> 0%, <<= _relColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _relColor>>; box-shadow: 0 0 20px <<= _relColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">⚙️ Cheat Menu</h1> </div> <!-- Category Grid --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Date and Time --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #4dabf7; margin: 0 0 10px 0; text-align: center;'>⏰ Date and Time</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Adjust game time and date</p></div>" "DebugDateTime">><</link>> <!-- Stats and Appearance --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff6b6b44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ff6b6b; margin: 0 0 10px 0; text-align: center;'>📊 Stats & Appearance</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Modify stats, body, and looks</p></div>" "DebugStatsAppearance">><</link>> <!-- Housing and Tech --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #51cf6644; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #51cf66; margin: 0 0 10px 0; text-align: center;'>🏠 Housing & Tech</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage apartment and equipment</p></div>" "DebugHousingTech">><</link>> <!-- Streaming --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff634744; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ff6347; margin: 0 0 10px 0; text-align: center;'>📹 Streaming</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Streaming settings and stats</p></div>" "DebugStreaming">><</link>> <!-- Relationships --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e91e6344; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #e91e63; margin: 0 0 10px 0; text-align: center;'>💕 Relationships</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage NPC relationships</p></div>" "DebugRelationships">><</link>> <!-- Traits, Skills, and Jobs --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #9b59b6; margin: 0 0 10px 0; text-align: center;'>⚡ Traits, Skills & Jobs</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Modify traits, skills, and job</p></div>" "DebugTraitsSkillsJobs">><</link>> <!-- Crime System --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e74c3c44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #e74c3c; margin: 0 0 10px 0; text-align: center;'>🦹 Crime System</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage crime stats and traits</p></div>" "DebugCrime">><</link>> <!-- Sexual Skills --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff149344; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ff1493; margin: 0 0 10px 0; text-align: center;'>🔥 Sexual Skills</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage sexual skills and levels</p></div>" "DebugSexualSkills">><</link>> <!-- Artifacts --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffc10744; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ffc107; margin: 0 0 10px 0; text-align: center;'>✨ Artifacts</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage sunfish artifacts</p></div>" "DebugArtifacts">><</link>> <!-- Bank --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #2ecc7144; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #2ecc71; margin: 0 0 10px 0; text-align: center;'>🏦 Bank</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage bank account and funds</p></div>" "DebugBank">><</link>> <!-- Achievements & Skill Tree --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ffd700; margin: 0 0 10px 0; text-align: center;'>🏆 Achievements & Skills</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage achievements and skill tree</p></div>" "DebugAchievementandSkillTree">><</link>> <!-- Life Swap --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e040fb; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e040fb44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #e040fb; margin: 0 0 10px 0; text-align: center;'>🔮 Life Swap</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage life swap traits and bypass</p></div>" "DebugLifeSwap">><</link>> <!-- Fishing --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #3498db; margin: 0 0 10px 0; text-align: center;'>🎣 Fishing</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Manage fishing gear and stats</p></div>" "DebugFishing">><</link>> <!-- Buffs & Debuffs --> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd43b44; cursor: pointer; transition: transform 0.2s;' onmouseover='this.style.transform=\"translateY(-5px)\"' onmouseout='this.style.transform=\"translateY(0)\"'><h2 style='color: #ffd43b; margin: 0 0 10px 0; text-align: center;'>⚡ Buffs & Debuffs</h2><p style='color: rgba(255,255,255,0.8); margin: 0; text-align: center; font-size: 14px;'>Apply or remove status effects</p></div>" "DebugBuffsDebuffs">><</link>> </div> <!-- Money Quick Access --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd43b44; margin-bottom: 20px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0; text-align: center;">💰 Quick Money Access</h2> <!-- Current Money Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 18px; margin: 0; text-align: center;"> <strong>Current Money:</strong> <span id="currentMoney" style="color: #51cf66;">$<<= $money.toLocaleString()>></span> </p> </div> <!-- Add Money Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">➕ Add Money</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$100</div>">> <<set $money += 100>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$500</div>">> <<set $money += 500>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$1,000</div>">> <<set $money += 1000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$5,000</div>">> <<set $money += 5000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$10,000</div>">> <<set $money += 10000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$25,000</div>">> <<set $money += 25000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$50,000</div>">> <<set $money += 50000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$100,000</div>">> <<set $money += 100000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$1M</div>">> <<set $money += 1000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$10M</div>">> <<set $money += 10000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+$100M</div>">> <<set $money += 100000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> <!-- Subtract Money Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">➖ Subtract Money</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$100</div>">> <<set $money -= 100>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$500</div>">> <<set $money -= 500>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$1,000</div>">> <<set $money -= 1000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$5,000</div>">> <<set $money -= 5000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$10,000</div>">> <<set $money -= 10000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$25,000</div>">> <<set $money -= 25000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$50,000</div>">> <<set $money -= 50000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-$100,000</div>">> <<set $money -= 100000>> <<if $money < 0>><<set $money = 0>><</if>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> <!-- Set to Specific Amount Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ffd43b; margin: 0 0 10px 0; text-align: center;">💵 Set to Amount</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$0</div>">> <<set $money = 0>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$1,000</div>">> <<set $money = 1000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$5,000</div>">> <<set $money = 5000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$10,000</div>">> <<set $money = 10000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$25,000</div>">> <<set $money = 25000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$50,000</div>">> <<set $money = 50000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$100,000</div>">> <<set $money = 100000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$1M</div>">> <<set $money = 1000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$10M</div>">> <<set $money = 10000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$100M</div>">> <<set $money = 100000000>> <<replace "#currentMoney">>$<<= $money.toLocaleString()>><</replace>> <</link>> </div> </div> </div> <!-- UI Control Settings Section --> <h2 style="color: #667eea; text-align: center; margin-top: 30px;">🎮 UI Control Settings</h2> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff6b6b44;"> <!-- Warning Disclaimer --> <div style="background: #3d1a1a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-weight: bold; margin: 0 0 10px 0; text-align: center; font-size: 16px;">⚠️ WARNING ⚠️</p> <p style="color: #ffaaaa; margin: 0; text-align: center; font-size: 14px;"> Disabling these controls may cause unintended behavior and can break certain game sequences. <strong style="color: #ff6b6b;">Do NOT report any bugs that occur while these settings are disabled.</strong> </p> </div> <p style="color: #888; font-size: 13px; text-align: center; margin: 0 0 15px 0;">Toggle visibility controls for back button, saves, and story menu in restricted passages</p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <!-- Back Button Control Toggle --> <div id="backButtonStatus" style="background: #2a2a2a; padding: 12px; border-radius: 6px; border-left: 3px solid <<if setup.enableBackButtonControl>>#51cf66<<else>>#ff6b6b<</if>>;"> <p style="color: #ccc; margin: 0 0 8px 0; font-weight: bold;">Back Button Control</p> <p style="color: #888; font-size: 12px; margin: 0 0 8px 0;">Hide back button in restricted passages</p> <<if setup.enableBackButtonControl>> <<link "<div style='background: #51cf66; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>ENABLED</div>">> <<set setup.enableBackButtonControl = false>> <<goto "Debug">> <</link>> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>DISABLED</div>">> <<set setup.enableBackButtonControl = true>> <<goto "Debug">> <</link>> <</if>> </div> <!-- Save Control Toggle --> <div id="saveControlStatus" style="background: #2a2a2a; padding: 12px; border-radius: 6px; border-left: 3px solid <<if setup.enableSaveControl>>#51cf66<<else>>#ff6b6b<</if>>;"> <p style="color: #ccc; margin: 0 0 8px 0; font-weight: bold;">Save Control</p> <p style="color: #888; font-size: 12px; margin: 0 0 8px 0;">Hide save button in restricted passages</p> <<if setup.enableSaveControl>> <<link "<div style='background: #51cf66; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>ENABLED</div>">> <<set setup.enableSaveControl = false>> <<goto "Debug">> <</link>> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>DISABLED</div>">> <<set setup.enableSaveControl = true>> <<goto "Debug">> <</link>> <</if>> </div> <!-- Story Menu Control Toggle --> <div id="storyMenuStatus" style="background: #2a2a2a; padding: 12px; border-radius: 6px; border-left: 3px solid <<if setup.enableStoryMenuControl>>#51cf66<<else>>#ff6b6b<</if>>;"> <p style="color: #ccc; margin: 0 0 8px 0; font-weight: bold;">Story Menu Control</p> <p style="color: #888; font-size: 12px; margin: 0 0 8px 0;">Hide sidebar in restricted passages</p> <<if setup.enableStoryMenuControl>> <<link "<div style='background: #51cf66; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>ENABLED</div>">> <<set setup.enableStoryMenuControl = false>> <<goto "Debug">> <</link>> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-weight: bold;'>DISABLED</div>">> <<set setup.enableStoryMenuControl = true>> <<goto "Debug">> <</link>> <</if>> </div> </div> </div> <!-- Return to Game Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
:: InitNPCData <<silently>> /* ================================== */ /* === NPC HELPER FUNCTIONS === */ /* ================================== */ <<set setup.findNPCByName = function(name) { var v = State.variables; for (var i = 0; i < v.npcs.length; i++) { if (v.npcs[i].name === name) { return v.npcs[i]; } } return null; }>> /* ---------------------------------- */ /* --- MANUAL NPC CREATION FUNCTION --- */ /* ---------------------------------- */ <<set setup.createNPC = function(config) { var skinTones = ["pale", "tan", "dark"]; var hairColors = ["Black", "Brown", "Blonde", "Red", "Platinum Blonde"]; var hairStyles = ["short", "long"]; var ages = ["Adult", "Mature Adult"]; // Determine hair length and add corresponding trait var hairLength = config.hairLength || (config.gender === "female" ? "long" : "short"); var hairLengthTrait = hairLength === "short" ? "Short Hair" : "Long Hair"; // Add hair length trait to physical traits var allPhysicalTraits = config.physicalTraits.slice(); if (!allPhysicalTraits.includes(hairLengthTrait)) { allPhysicalTraits.push(hairLengthTrait); } // Calculate stats from job requirements var jobName = Array.isArray(config.jobs) ? config.jobs[0] : config.jobs; var jobReqs = setup.jobRequirements[jobName] || {}; var npcStats = { charisma: config.baseStats.charisma || 15, dexterity: config.baseStats.dexterity || 15, strength: config.baseStats.strength || 15, intelligence: config.baseStats.intelligence || 15 }; // Ensure stats meet job requirements for (var stat in jobReqs) { if (npcStats[stat] < jobReqs[stat]) { npcStats[stat] = jobReqs[stat]; } } var npc = { name: config.name, originalName: config.name, // Store original name for image paths jobs: Array.isArray(config.jobs) ? config.jobs : [config.jobs], stats: npcStats, statMaxCaps: { charisma: 100, dexterity: 100, strength: 100, intelligence: 100 }, bodyParts: { gender: config.gender, chest: config.chest, butt: config.butt, genitals: config.genitals || "penis" }, appearance: { skinTone: config.skinTone || skinTones[Math.floor(Math.random() * skinTones.length)], hairColor: config.hairColor || hairColors[Math.floor(Math.random() * hairColors.length)], hairStyle: config.hairStyle || hairStyles[Math.floor(Math.random() * hairStyles.length)], hairLength: hairLength, physique: config.physique || "average", age: config.age || ages[Math.floor(Math.random() * ages.length)] }, skills: config.skills, physicalTraits: allPhysicalTraits, mentalTraits: config.mentalTraits, hardTraits: {} }; // Generate hard traits function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } npc.skills.forEach(function(skill) { npc.hardTraits["skill:" + skill] = getRandomInt(0, 40); }); npc.physicalTraits.forEach(function(trait) { npc.hardTraits["physical:" + trait] = getRandomInt(0, 40); }); npc.mentalTraits.forEach(function(trait) { npc.hardTraits["mental:" + trait] = getRandomInt(0, 40); }); ["charisma", "dexterity", "strength", "intelligence"].forEach(function(stat) { npc.hardTraits["stat:" + stat] = getRandomInt(0, 40); }); ["chest", "butt", "gender"].forEach(function(bodyPart) { npc.hardTraits["bodyPart:" + bodyPart] = getRandomInt(10, 50); }); // Apply trait bonuses npc.mentalTraits.forEach(function(trait) { if (setup.traitBonuses && setup.traitBonuses[trait]) { setup.applyTraitBonus(trait, npc); } }); npc.physicalTraits.forEach(function(trait) { if (setup.traitBonuses && setup.traitBonuses[trait]) { setup.applyTraitBonus(trait, npc); } }); npc.skills.forEach(function(skill) { if (setup.skillBonuses && setup.skillBonuses[skill]) { setup.applyTraitBonus(skill, npc); } }); return npc; }>> /* ---------------------------------- */ /* --- CREATE NPCs --- */ /* ---------------------------------- */ /* Marcus Carter - Security Guard */ <<run $npcs.push(setup.createNPC({ name: "Marcus Carter", jobs: "Security Guard", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 20, dexterity: 15, strength: 25, intelligence: 15}, physicalTraits: ["Muscular", "Tall", "Strong", "Broad-shouldered"], mentalTraits: ["Confident", "Outgoing", "Brave", "Charming"], skills: ["Combat", "Athletics", "Public Speaking", "Acting", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Elena Romero - Clinic Assistant & Data Analyst */ <<run $npcs.push(setup.createNPC({ name: "Elena Romero", jobs: ["Clinic Assistant"], gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 20, dexterity: 20, strength: 10, intelligence: 55}, physicalTraits: ["Graceful", "Youthful", "Sharp Features"], mentalTraits: ["Intelligent", "Analytical", "Patient", "Kind", "Nerd", "Shy"], skills: ["Medicine", "First Aid", "Coding", "Math Skills", "Painting"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Silva Silva - Package Courier & Negotiator */ <<run $npcs.push(setup.createNPC({ name: "Silva Silva", jobs: ["Package Courier"], gender: "female", chest: "medium", butt: "medium", genitals: "vagina", baseStats: {charisma: 55, dexterity: 20, strength: 15, intelligence: 20}, physicalTraits: ["Quick", "Lean", "Athletic Build", "Fashionable"], mentalTraits: ["Shrewd", "Confident", "Ambitious", "Diplomatic"], skills: ["Driving", "Athletics", "Persuasion", "Public Speaking", "Languages"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Grimm Patel - Negotiator & Enforcer */ <<run $npcs.push(setup.createNPC({ name: "Grimm Patel", jobs: ["Negotiator"], gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 55, dexterity: 20, strength: 55, intelligence: 20}, physicalTraits: ["Muscular", "Strong", "Scarred", "Sharp Features"], mentalTraits: ["Dominant", "Shrewd", "Stubborn", "Cynical", "Intimidating"], skills: ["Combat", "Stealth", "Persuasion", "Public Speaking", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Scarlett Vex - Porn Star */ <<run $npcs.push(setup.createNPC({ name: "Scarlett Vex", jobs: "Porn Star", gender: "female", chest: "huge", butt: "huge", genitals: "loose vagina", baseStats: {charisma: 60, dexterity: 25, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Voluptuous", "Fit", "Smooth Skin"], mentalTraits: ["Confident", "Outgoing", "Ambitious", "Seductive", "Arrogant"], skills: ["Sexually Skilled", "Acting", "Modeling", "High Heels Proficient", "Dancing", "Photography"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Jade Nightshade - Stripper */ <<run $npcs.push(setup.createNPC({ name: "Jade Nightshade", jobs: "Stripper", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 40, dexterity: 30, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Flexible", "Graceful", "Curvy"], mentalTraits: ["Sly", "Confident", "Creative", "Flirty", "Manipulative"], skills: ["Dancing", "Sexually Skilled", "High Heels Proficient", "Acting", "Singing"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Apollo Sterling - Stripper */ <<run $npcs.push(setup.createNPC({ name: "Apollo Sterling", jobs: "Stripper", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 45, dexterity: 30, strength: 25, intelligence: 15}, physicalTraits: ["Attractive", "Muscular", "Flexible", "Graceful"], mentalTraits: ["Confident", "Outgoing", "Creative", "Charming", "Vain"], skills: ["Dancing", "Sexually Skilled", "Modeling", "Athletics", "Music"], skinTone: "pale", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "Apollo strikes a pose as you approach, one hand on his hip. 'Well hello there. Enjoying the view?' He flashes a practiced smile.", "'New face?' Apollo looks you up and down appraisingly. 'Welcome to the show, darling.'" ], acquaintance: [ "'Hey there!' Apollo calls out with a wave. 'Back for another look? Can't say I blame you.'", "Apollo grins when he sees you. 'Ah, my favorite audience member returns.'" ], friend: [ "'Hey gorgeous!' Apollo calls out. 'You know, you're becoming one of my favorite people to see walk through that door.'", "Apollo's smile seems more genuine than his stage persona. 'There you are! I was hoping you'd stop by.'" ], closeFriend: [ "Apollo's face lights up genuinely when he sees you. 'There you are! I was just thinking about you.' For once, the charm seems completely real.", "'Finally!' Apollo beams. 'Someone I can actually talk to without the performance.'" ], bestFriend: [ "Apollo abandons his usual dramatic flair and gives you a warm, genuine smile. 'Hey you. Rough day. You're exactly who I needed to see.'", "'Thank god,' Apollo sighs with relief when he spots you. 'I've been drowning in shallow conversations. Come save me.'" ] }, smallTalk: [ "'The stage lights can be brutal, but the attention? Worth every hot minute under them.'", "'I spend more time on my appearance than most people spend on their entire lives. But look at these results!'", "'Dancing is art, darling. My body is the canvas, the music is my paint.'" ], complimentReactions: { low: "Apollo preens visibly. 'Well of course. But do tell me more...'", high: "Apollo's smile softens. 'Coming from you? That actually means something.'" } } })>> /* Diamond Murphy - Hooker */ <<run $npcs.push(setup.createNPC({ name: "Diamond Murphy", jobs: "Hooker", gender: "female", chest: "large", butt: "large", genitals: "loose vagina", baseStats: {charisma: 35, dexterity: 20, strength: 15, intelligence: 15}, physicalTraits: ["Attractive", "Curvy", "Tattooed"], mentalTraits: ["Sly", "Hardworking", "Stubborn", "Selfish", "Street Smart"], skills: ["Sexually Skilled", "Persuasion", "Stealth", "Baking"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Tank Morrison - Bouncer */ <<run $npcs.push(setup.createNPC({ name: "Tank Morrison", jobs: "Bouncer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 20, strength: 50, intelligence: 15}, physicalTraits: ["Muscular", "Tall", "Strong", "Broad-shouldered", "Scarred"], mentalTraits: ["Brave", "Calm", "Honest", "Loyal", "Protective"], skills: ["Combat", "Heavy Lifting", "Athletics", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Candace Luxe - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Candace Luxe", jobs: "Brothel Worker", gender: "female", chest: "huge", butt: "huge", genitals: "loose vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Voluptuous", "Smooth Skin", "Pierced"], mentalTraits: ["Confident", "Friendly", "Empathetic", "Warm", "Nurturing"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Painting"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "A warm smile crosses Candace's face. 'Hello there, sweetheart. First time? Don't worry, everyone's welcome here.'", "'Well hello,' Candace says with genuine friendliness. 'You look a little lost. Can I help you with something?'" ], acquaintance: [ "'There you are!' Candace beams. 'It's good to see you again, hun.'", "Candace's eyes light up with recognition. 'Hey! How have you been, sweetie?'" ], friend: [ "Candace wraps you in a warm hug. 'There's my favorite person! I was hoping you'd visit.'", "'Oh honey,' Candace smiles warmly. 'You always know when to show up. Come here.'" ], closeFriend: [ "Candace immediately reads your mood. 'Hey love. You look like you could use some company. Talk to me.'", "'There you are,' Candace says softly, her empathy evident. 'Rough day? I can tell.'" ], bestFriend: [ "Candace's professional warmth gives way to genuine affection. 'Thank god you're here. I've missed you.'", "'Finally,' Candace sighs with relief. 'Someone I can actually be myself with. How are you, really?'" ] }, smallTalk: [ "'Everyone needs connection, sweetie. That's all anyone really wants - to be seen and accepted.'", "'I take care of people. That's what I do, whether it's my job or my nature.'", "'The work can be demanding, but helping people feel good about themselves? That's worth it.'" ], complimentReactions: { low: "Candace smiles warmly. 'That's very sweet of you to say, hun.'", high: "Candace's eyes shimmer with genuine emotion. 'You always know what to say to make me feel special.'" } } })>> /* Ruby Becker - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Ruby Becker", jobs: "Brothel Worker", gender: "female", chest: "large", butt: "large", genitals: "tight vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin", "Freckled"], mentalTraits: ["Shy", "Kind", "Creative", "Sensitive", "Romantic"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Writing", "Photography"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Sapphire Wallace - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Sapphire Wallace", jobs: "Brothel Worker", gender: "female", chest: "huge", butt: "large", genitals: "vagina", baseStats: {charisma: 42, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Voluptuous", "Smooth Skin", "Tattooed"], mentalTraits: ["Dominant", "Confident", "Ambitious", "Aggressive", "Competitive"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Martial Arts"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Jasmine Abrams - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Jasmine Abrams", jobs: "Brothel Worker", gender: "female", chest: "medium", butt: "huge", genitals: "vagina", baseStats: {charisma: 40, dexterity: 28, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Flexible", "Graceful", "Smooth Skin"], mentalTraits: ["Submissive", "Friendly", "Patient", "Kind", "Gentle"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Dancing", "Yoga"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Ebony Vasquez - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Ebony Vasquez", jobs: "Brothel Worker", gender: "female", chest: "large", butt: "huge", genitals: "vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin"], mentalTraits: ["Sly", "Witty", "Competitive", "Clever", "Playful"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Acting", "Singing"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Amber Skye - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Amber Skye", jobs: "Brothel Worker", gender: "female", chest: "medium", butt: "large", genitals: "tight vagina", baseStats: {charisma: 40, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Attractive", "Curvy", "Smooth Skin", "Youthful"], mentalTraits: ["Optimistic", "Energetic", "Curious", "Naive", "Bubbly"], skills: ["Sexually Skilled", "Persuasion", "High Heels Proficient", "Social Media", "Music"], skinTone: "tan", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Kate Velvet - Brothel Owner */ <<run $npcs.push(setup.createNPC({ name: "Kate Velvet", jobs: "Brothel Owner", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 80, dexterity: 25, strength: 20, intelligence: 60}, physicalTraits: ["Attractive", "Mature", "Voluptuous", "Sharp Features"], mentalTraits: ["Dominant", "Shrewd", "Ambitious", "Confident", "Arrogant", "Diva"], skills: ["Management", "Persuasion", "Accounting", "Sexually Skilled", "Languages"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Mature Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "Kate's sharp eyes appraise you from head to toe. 'And you are?' Her tone makes it clear she expects you to prove your worth.", "'I don't recognize you.' Kate's voice carries authority. 'State your business or move along.'" ], acquaintance: [ "Kate acknowledges you with a curt nod. 'You again. At least you're punctual.'", "'Ah.' Kate's expression remains neutral. 'You've been here before. Acceptable.'" ], friend: [ "Kate's severe expression softens slightly. 'Good. Someone competent. Come in.'", "'There you are,' Kate says with what might almost be approval. 'I could use someone with sense right now.'" ], closeFriend: [ "Kate actually smiles - a rare sight. 'Finally, someone I can have a real conversation with. Everyone else is so tedious today.'", "'Perfect timing,' Kate says, her usual imperious tone warmed with genuine pleasure. 'I was just thinking about you.'" ], bestFriend: [ "Kate's mask drops entirely, revealing unexpected warmth. 'Thank god. Come here, I need your opinion on something actually important.'", "'There you are,' Kate sighs with relief. 'Everyone's been insufferable today. You're the only one who understands.'" ] }, smallTalk: [ "'Power isn't given, it's taken. I learned that lesson early and I've never forgotten it.'", "'Running an empire requires vision, control, and the willingness to make difficult decisions.'", "'Respect is earned through competence and results, not through groveling or sentiment.'" ], complimentReactions: { low: "Kate raises an eyebrow. 'Flattery? How transparent. But... not unwelcome.'", high: "Kate's eyes gleam with something like genuine appreciation. 'From you, that's actually meaningful.'" } } })>> /* Bella Carver - Social Media Influencer */ <<run $npcs.push(setup.createNPC({ name: "Bella Carver", jobs: "Social Media Influencer", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 50, dexterity: 25, strength: 15, intelligence: 25}, physicalTraits: ["Attractive", "Youthful", "Curvy", "Fashionable"], mentalTraits: ["Outgoing", "Creative", "Ambitious", "Naive", "Vain", "Prep"], skills: ["Social Media", "Photography", "Modeling", "Acting", "Makeup"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Jake Steel - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Jake Steel", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 15, dexterity: 18, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Broad-shouldered"], mentalTraits: ["Hardworking", "Honest", "Calm", "Loyal", "Simple"], skills: ["Heavy Lifting", "Construction", "Driving", "Fishing"], skinTone: "tan", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Marco Rodriguez - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Marco Rodriguez", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 18, dexterity: 18, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Tattooed"], mentalTraits: ["Friendly", "Competitive", "Brave", "Hot-Headed", "Passionate"], skills: ["Heavy Lifting", "Construction", "Cooking", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Tyrone Washington - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Tyrone Washington", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 18, strength: 32, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Broad-shouldered", "Tall"], mentalTraits: ["Outgoing", "Witty", "Confident", "Funny", "Jock"], skills: ["Heavy Lifting", "Construction", "Basketball", "Music"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Sheryl Williams - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "Sheryl Williams", jobs: "Construction Worker", gender: "female", chest: "small", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 18, dexterity: 20, strength: 30, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Athletic Build"], mentalTraits: ["Hardworking", "Stubborn", "Brave", "Direct", "Tomboy"], skills: ["Heavy Lifting", "Construction", "Martial Arts", "Gardening"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* David O'Brien - Construction Worker */ <<run $npcs.push(setup.createNPC({ name: "David O'Brien", jobs: "Construction Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 15, dexterity: 18, strength: 28, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Sturdy", "Freckled"], mentalTraits: ["Calm", "Patient", "Thoughtful", "Quiet", "Reserved"], skills: ["Heavy Lifting", "Construction", "Plumbing", "Painting"], skinTone: "pale", hairColor: "Red", hairLength: "short", age: "Mature Adult" }))>> /* Mike Murphy - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Mike Murphy", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 18, dexterity: 20, strength: 32, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Tattooed"], mentalTraits: ["Aggressive", "Competitive", "Brave", "Short Tempered", "Reckless"], skills: ["Heavy Lifting", "Athletics", "Swimming", "Cooking"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Carlos Mendez - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Carlos Mendez", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 20, strength: 30, intelligence: 15}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered"], mentalTraits: ["Friendly", "Outgoing", "Optimistic", "Charming", "Flirty"], skills: ["Heavy Lifting", "Athletics", "Dancing", "Guitar"], skinTone: "tan", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Jamal Rivers - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Jamal Rivers", jobs: "Dock Worker", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 20, dexterity: 22, strength: 32, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Athletic Build"], mentalTraits: ["Ambitious", "Intelligent", "Competitive", "Determined", "Focused"], skills: ["Heavy Lifting", "Athletics", "Basketball", "Writing"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Rosa Otterino - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Rosa Otterino", jobs: "Dock Worker", gender: "female", chest: "small", butt: "medium", genitals: "vagina", baseStats: {charisma: 18, dexterity: 22, strength: 30, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Athletic Build"], mentalTraits: ["Hardworking", "Honest", "Calm", "Reliable", "Reserved"], skills: ["Heavy Lifting", "Athletics", "Swimming", "Painting"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Keisha Jackson - Dock Worker */ <<run $npcs.push(setup.createNPC({ name: "Keisha Jackson", jobs: "Dock Worker", gender: "female", chest: "medium", butt: "large", genitals: "vagina", baseStats: {charisma: 22, dexterity: 20, strength: 32, intelligence: 18}, physicalTraits: ["Muscular", "Strong", "Broad-shouldered", "Curvy"], mentalTraits: ["Confident", "Outgoing", "Brave", "Bold", "Sassy"], skills: ["Heavy Lifting", "Athletics", "Singing", "Cooking"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Dick Richardson - City Mayor */ <<run $npcs.push(setup.createNPC({ name: "Dick Richardson", jobs: "City Mayor", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 90, dexterity: 20, strength: 20, intelligence: 70}, physicalTraits: ["Mature", "Sharp Features"], mentalTraits: ["Arrogant", "Shrewd", "Ambitious", "Dominant", "Selfish", "Corrupt"], skills: ["Public Speaking", "Management", "Legal Knowledge"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Mature Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "Mayor Richardson looks down at you as if evaluating livestock. 'Do you have an appointment? No? Then make yourself useful or get out.'", "'Another constituent,' the Mayor says with barely concealed disdain. 'What do you want?'" ], acquaintance: [ "'You again.' The Mayor's tone suggests he's categorized you as mildly useful. 'What is it this time?'", "'Ah yes, I remember you.' Richardson's smile doesn't reach his eyes. 'Here to offer support, I trust?'" ], friend: [ "'Good to see you,' Richardson says with calculated warmth. 'You're one of the few people in this city with actual potential.'", "The Mayor's demeanor shifts to something resembling genuine interest. 'Excellent timing. I have a proposition that might benefit us both.'" ], closeFriend: [ "Richardson drops some of his political facade. 'Finally, someone I can speak plainly with. This job is exhausting when you're surrounded by idiots.'", "'There you are,' the Mayor says with real satisfaction. 'Come in. Let's discuss real business, not this performative nonsense I deal with all day.'" ], bestFriend: [ "Richardson's mask falls completely. 'Thank god. Everyone else wants something from me. You're the only one who understands how the game really works.'", "'Perfect,' Richardson says quietly. 'I need your counsel on something... delicate. You're the only one I trust with this.'" ] }, smallTalk: [ "'Politics is about leverage. Know what people want, know what they fear, and you control everything.'", "'The public elects symbols and speeches. Behind closed doors? That's where real power is wielded.'", "'Altruism is for fools. Every transaction should benefit you more than the other party.'" ], complimentReactions: { low: "Richardson smirks. 'Flattery. I appreciate the effort, but I can see through it.'", high: "Richardson studies you with new respect. 'You know, you might actually understand this city's real dynamics.'" } } })>> /* Creo Applesauce - Mayor's Secretary */ <<run $npcs.push(setup.createNPC({ name: "Creo Applesauce", jobs: "Mayor's Secretary", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 60, dexterity: 25, strength: 15, intelligence: 75}, physicalTraits: ["Sharp Features", "Lean"], mentalTraits: ["Intelligent", "Analytical", "Patient", "Submissive", "Anxious", "Nerd"], skills: ["Management", "Accounting", "Coding", "Languages", "Piano"], skinTone: "pale", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> /* Brad Icus - Fitness Shop Clerk */ <<run $npcs.push(setup.createNPC({ name: "Brad Icus", jobs: "Fitness Shop Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 30, dexterity: 25, strength: 35, intelligence: 20}, physicalTraits: ["Fit", "Muscular", "Athletic Build", "Attractive"], mentalTraits: ["Energetic", "Friendly", "Optimistic", "Simple", "Jock"], skills: ["Athletics", "Sales", "Heavy Lifting", "Gardening", "Cooking"], skinTone: "tan", hairColor: "Blonde", hairLength: "short", age: "Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "'Hey there!' Brad calls out with infectious energy. 'Welcome to the shop, bro! You look like someone who wants to get PUMPED!'", "Brad practically bounces over. 'Yo! New face! That's awesome! Let me know if you need any gear recommendations!'" ], acquaintance: [ "'Hey, I know you!' Brad grins widely. 'Good to see you back! Ready to crush it today?'", "'Dude!' Brad gives you an enthusiastic wave. 'What's up! Here to level up your fitness game?'" ], friend: [ "'There's my buddy!' Brad immediately comes over for a fist bump. 'How's training going? You looking swole!'", "'Yooo!' Brad beams. 'Perfect timing, I was just thinking about inviting you to hit the gym later!'" ], closeFriend: [ "'My man!' Brad pulls you into a bro hug. 'Dude, I've been wanting to tell you about this new protein blend I tried. It's insane!'", "Brad's face lights up completely. 'There you are! Bro, serious question - you free this weekend? Got this sick hiking trail I wanna show you.'" ], bestFriend: [ "'Finally!' Brad says with genuine relief. 'Everyone else today has been all negative energy. You get it, you know? The grind, the gains, the LIFE!'", "Brad grabs your shoulder with real affection. 'Dude. Real talk. You're like, one of the few people who actually inspires me. Let's hang out after my shift.'" ] }, smallTalk: [ "'Bro, fitness isn't just about the body, it's about the MINDSET! You gotta stay positive and keep pushing!'", "'I love this job, man. Helping people get healthy? That's what it's all about!'", "'Dude, protein shakes for breakfast, killer workout, then a nice long run. Perfect day, every day!'" ], complimentReactions: { low: "Brad's grin somehow gets even wider. 'Thanks bro! That's awesome! You're awesome too!'", high: "Brad looks genuinely touched. 'Dude... that means a lot. For real. You're a true friend.'" } } })>> /* Raven Bido - Ecentric Shop Worker */ <<run $npcs.push(setup.createNPC({ name: "Raven Bido", jobs: "Ecentric Shop Worker", gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 25, dexterity: 25, strength: 15, intelligence: 22}, physicalTraits: ["Tattooed", "Pierced", "Lean", "Youthful"], mentalTraits: ["Creative", "Curious", "Introverted", "Cynical", "Goth"], skills: ["Sales", "Art", "Painting", "Music", "Writing"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "Raven glances up from her book, one eyebrow pierced with a silver ring rising slightly. 'Help you?' Her tone suggests mild curiosity at best.", "'Mmm.' Raven acknowledges your presence with minimal effort. 'If you're looking for mainstream garbage, wrong shop.'" ], acquaintance: [ "'Oh. You again.' Raven's lips twitch into something almost resembling a smile. 'At least you have decent taste.'", "Raven marks her page and looks up. 'Back already? Didn't think you'd return to our little corner of weird.'" ], friend: [ "'Hey.' Raven actually sets her book aside. 'Good timing. I was getting bored with normies all morning.'", "Raven's face softens noticeably. 'There you are. I found this band I think you'd like. Very obscure.'" ], closeFriend: [ "Raven's usual detached expression cracks into genuine warmth. 'Finally. Someone with actual depth. I've been dying to show you something I painted.'", "'Thank the void,' Raven sighs dramatically. 'I was about to lose my mind from small talk. Come here, I need your opinion on something.'" ], bestFriend: [ "Raven abandons her post entirely and comes over. 'Okay, real talk time. I wrote something and you're the only person whose opinion I actually value.'", "'Perfect timing,' Raven says with rare enthusiasm. 'I've been saving this existential crisis specifically to have with you. Coffee after my shift?'" ] }, smallTalk: [ "'Most people sleepwalk through life consuming whatever media they're told to. I prefer things with actual substance.'", "'Art, music, literature - they're the only things that make existence tolerable. Well, that and good coffee.'", "'Working retail would be soul-crushing if I didn't treat every customer interaction like performance art.'" ], complimentReactions: { low: "Raven smirks. 'Trying to charm the goth girl? How original. But... thanks, I guess.'", high: "Raven's cynical mask slips, revealing genuine appreciation. 'You know, you actually get it. That's rare.'" } } })>> /* Crystal Meffin - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Crystal Meffin", jobs: "Beauty Salon Stylist", gender: "female", chest: "medium", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 35, dexterity: 35, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Graceful", "Youthful", "Fashionable"], mentalTraits: ["Friendly", "Outgoing", "Creative", "Bubbly", "Prep"], skills: ["Hair Styling", "Makeup", "Art", "Fashion Design", "Photography"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Sophi Boris - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Sophi Boris", jobs: "Beauty Salon Stylist", gender: "female", chest: "large", butt: "large", genitals: "vagina", baseStats: {charisma: 35, dexterity: 35, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Graceful", "Curvy", "Fashionable"], mentalTraits: ["Confident", "Witty", "Ambitious", "Arrogant", "Diva"], skills: ["Hair Styling", "Makeup", "Dancing", "Singing", "Social Media"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Naomi Light - Beauty Salon Stylist */ <<run $npcs.push(setup.createNPC({ name: "Naomi Light", jobs: "Beauty Salon Stylist", gender: "female", chest: "small", butt: "medium", genitals: "tight vagina", baseStats: {charisma: 35, dexterity: 38, strength: 15, intelligence: 22}, physicalTraits: ["Attractive", "Graceful", "Flexible"], mentalTraits: ["Kind", "Patient", "Empathetic", "Calm", "Spiritual"], skills: ["Hair Styling", "Makeup", "Yoga", "Meditation", "Gardening"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Kevin Oats - Tech Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Kevin Oats", jobs: "Tech Store Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 20, dexterity: 22, strength: 15, intelligence: 35}, physicalTraits: ["Lean", "Youthful"], mentalTraits: ["Intelligent", "Analytical", "Shy", "Awkward", "Insecure", "Nerd"], skills: ["Coding", "Sales", "Math Skills", "Gaming", "Building PCs"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Destiny Pumpkin - Adult Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Destiny Pumpkin", jobs: "Adult Store Clerk", gender: "female", chest: "huge", butt: "large", genitals: "vagina", baseStats: {charisma: 30, dexterity: 22, strength: 15, intelligence: 20}, physicalTraits: ["Attractive", "Pierced", "Voluptuous", "Tattooed"], mentalTraits: ["Confident", "Sly", "Creative", "Selfish", "Manipulative"], skills: ["Sales", "Persuasion", "Sexually Skilled", "Art", "Writing"], skinTone: "tan", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Alex Passionfruit - Adult Store Clerk */ <<run $npcs.push(setup.createNPC({ name: "Alex Passionfruit", jobs: "Adult Store Clerk", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 28, dexterity: 22, strength: 18, intelligence: 20}, physicalTraits: ["Attractive", "Lean", "Pierced"], mentalTraits: ["Outgoing", "Witty", "Curious", "Flirty", "Femboy"], skills: ["Sales", "Persuasion", "Sexually Skilled", "Music", "Gaming"], skinTone: "pale", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Hannah Chuckins - Baker */ <<run $npcs.push(setup.createNPC({ name: "Hannah Chuckins", jobs: "Baker", gender: "female", chest: "medium", butt: "large", genitals: "tight vagina", baseStats: {charisma: 20, dexterity: 25, strength: 18, intelligence: 20}, physicalTraits: ["Soft", "Curvy", "Freckled"], mentalTraits: ["Kind", "Patient", "Creative", "Shy", "Nurturing"], skills: ["Baking", "Cooking", "Gardening", "Painting", "Singing"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> /* Fen Ris - Fitness Trainer */ <<run $npcs.push(setup.createNPC({ name: "Fen Ris", jobs: "Fitness Trainer", gender: "female", chest: "huge", butt: "medium", genitals: "vagina", baseStats: {charisma: 45, dexterity: 80, strength: 80, intelligence: 25}, physicalTraits: ["Tall", "Muscular", "Athletic Build", "Sharp Features", "Were-Creature"], mentalTraits: ["Confident", "Calm", "Honest", "Patient", "Disciplined"], skills: ["Athletics", "Heavy Lifting", "Combat", "Yoga", "Teaching"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> <<run Object.assign($npcs[$npcs.length - 1], { uniqueDialogue: { greetings: { stranger: [ "Fen Ris's yellow eyes assess you with the focus of a predator. 'New here? Focus and effort matter more than natural talent. Show me which you have.'", "'You look lost.' Fen Ris's tail swishes once. 'Gym's not a social club. You here to work or waste time?'" ], acquaintance: [ "Fen nods once in acknowledgment. 'Back again. Good. Consistency builds results.'", "'I remember you,' Fen says simply. Her clawed hand gestures to the equipment. 'Ready to put in the work?'" ], friend: [ "Fen's serious expression softens just slightly. 'There you are. I've been watching your progress. You're improving.'", "'Good timing.' Fen's yellow eyes show approval. 'I wanted to show you a new technique. You've earned it.'" ], closeFriend: [ "Fen abandons her current task and approaches. 'Finally, someone who takes training seriously. I have a challenging routine planned if you're interested.'", "Fen's tail swishes with what might be pleasure. 'There you are. I was hoping you'd come by. Your dedication is... refreshing.'" ], bestFriend: [ "Fen's usually stoic face breaks into a genuine smile, revealing her sharp canines. 'Perfect. I need a real training partner, not these half-hearted tourists. You free?'", "'Finally,' Fen sighs with relief. 'Everyone else today has been making excuses. You understand what real commitment means. That's rare.'" ] }, smallTalk: [ "'Training isn't about instant gratification. It's about discipline, routine, and incremental progress every single day.'", "'People want results without effort. They don't understand that transformation requires pain and patience.'", "'The body is capable of far more than most people push it to. Mental barriers break before physical ones.'" ], complimentReactions: { low: "Fen's ear twitches. 'Words are easy. Show me through action instead.'", high: "Fen meets your eyes directly. 'You don't say things you don't mean. I respect that about you.'" } } })>> /* Pheiffer Coms - Police Officer */ <<run $npcs.push(setup.createNPC({ name: "Pheiffer Coms", jobs: "Police Officer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "penis", baseStats: {charisma: 30, dexterity: 28, strength: 50, intelligence: 25}, physicalTraits: ["Fit", "Strong", "Athletic Build", "Broad-shouldered"], mentalTraits: ["Brave", "Honest", "Stubborn", "Loyal", "By-the-Book"], skills: ["Combat", "Driving", "First Aid", "Athletics", "Fishing"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Selkira Onyxia - Brothel Worker */ <<run $npcs.push(setup.createNPC({ name: "Selkira Onyxia", jobs: "Brothel Worker", gender: "female", chest: "giant", butt: "giant", genitals: "loose vagina", baseStats: {charisma: 42, dexterity: 30, strength: 18, intelligence: 20}, physicalTraits: ["Curvy", "Attractive", "Fit", "Graceful", "Flexible", "Silky Voice", "Seductive", "Broad-shouldered"], mentalTraits: ["Alluring", "Cold", "Overthinker", "Impulsive", "Insecure", "Ambitious", "Dominant", "Jealous"], skills: ["High Heels Proficient", "Sexually Skilled", "Serving", "Acting", "Languages"], skinTone: "tan", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Janis Besser - Baker */ <<run $npcs.push(setup.createNPC({ name: "Janis Besser", jobs: "Baker", gender: "female", chest: "small", butt: "small", genitals: "tight vagina", baseStats: {charisma: 18, dexterity: 28, strength: 15, intelligence: 22}, physicalTraits: ["Petite", "Soft", "Freckled", "Youthful", "Quick", "Warm Tone"], mentalTraits: ["Kind", "Patient", "Creative", "Hardworking", "Shy", "Nurturing"], skills: ["Baking", "Cooking", "Gardening", "Customer Service", "Painting"], skinTone: "pale", hairColor: "Red", hairLength: "short", age: "Adult" }))>> /* Dennis Fungi - Dancing Instructor */ <<run $npcs.push(setup.createNPC({ name: "Dennis Fungi", jobs: "Dancing Instructor", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", baseStats: {charisma: 50, dexterity: 55, strength: 48, intelligence: 25}, physicalTraits: ["Fit", "Athletic Build", "Graceful", "Flexible", "Attractive", "Smooth Voice"], mentalTraits: ["Confident", "Outgoing", "Creative", "Energetic", "Disciplined", "Charming"], skills: ["Dancing", "Teaching", "Athletics", "Music", "Yoga"], skinTone: "tan", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Yvela Mushroom - Dancing Instructor */ <<run $npcs.push(setup.createNPC({ name: "Yvela Mushroom", jobs: "Dancing Instructor", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 52, dexterity: 58, strength: 50, intelligence: 28}, physicalTraits: ["Fit", "Athletic Build", "Graceful", "Flexible", "Attractive", "Melodic Voice"], mentalTraits: ["Confident", "Ambitious", "Creative", "Energetic", "Disciplined", "Competitive"], skills: ["Dancing", "Teaching", "Athletics", "Yoga", "Martial Arts"], skinTone: "dark", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Banana Banana - Barista */ <<run $npcs.push(setup.createNPC({ name: "Banana Banana", jobs: "Barista", gender: "female", chest: "giant", butt: "giant", genitals: "tight vagina", baseStats: {charisma: 22, dexterity: 25, strength: 15, intelligence: 18}, physicalTraits: ["Youthful", "Quick", "Energetic", "Friendly Tone", "Fashionable"], mentalTraits: ["Friendly", "Optimistic", "Energetic", "Creative", "Talkative", "Bubbly"], skills: ["Customer Service", "Cooking", "Art", "Social Media", "Music"], skinTone: "tan", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Xenis Aku - Bus Driver */ <<run $npcs.push(setup.createNPC({ name: "Xenis Aku", jobs: "Bus Driver", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 18, dexterity: 25, strength: 22, intelligence: 20}, physicalTraits: ["Sturdy", "Calm Voice", "Mature", "Relaxed"], mentalTraits: ["Calm", "Patient", "Honest", "Reliable", "Introverted", "Thoughtful"], skills: ["Driving", "Customer Service", "First Aid", "Navigation", "Mechanical Repair"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult" }))>> /* Xanithar Galdenentri - Unemployed */ <<run $npcs.push(setup.createNPC({ name: "Xanithar Galdenentri", jobs: "Unemployed", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 15, dexterity: 15, strength: 12, intelligence: 35}, physicalTraits: ["Mature", "Underweight", "Mumbly Voice", "Freckled", "Scarred"], mentalTraits: ["Crazy", "Eccentric", "Intelligent", "Paranoid", "Erratic", "Obsessive", "Bookworm"], skills: ["Magic Theory", "Languages", "Writing", "Teaching", "Medicine"], skinTone: "pale", hairColor: "Platinum Blonde", hairLength: "long", age: "Mature Adult" }))>> /* Trixie Rye - Cocktail Waitress */ <<run $npcs.push(setup.createNPC({ name: "Trixie Rye", jobs: "Cocktail Waitress", gender: "female", chest: "huge", butt: "huge", genitals: "vagina", baseStats: {charisma: 42, dexterity: 30, strength: 18, intelligence: 20}, physicalTraits: ["Attractive", "Voluptuous", "Graceful", "Smooth Skin", "Charming Tone"], mentalTraits: ["Confident", "Flirty", "Witty", "Ambitious", "Sly", "Outgoing"], skills: ["Serving", "High Heels Proficient", "Customer Service", "Dancing", "Persuasion"], skinTone: "tan", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Revna McKraken - Strange book shop owner */ /* Custom Information: A hypnotic and cunning woman who pulls you in so naturally you don't even notice her pointy teeth. Her words and methods are strange and she seems quite cagey about her past and personal life. You get the feeling she won't trade you anything of herself, but she might appreciate a donation. (Just a reminder about the "totally not a vampire" trait. Since the desires section doesn't work, here is the working list. Traits she wants for her vanity: Alluring, witty, high heel proficient, modeling, dancing, smooth skin, sharp features, soft, flexible, fashionable: Traits she wants for her efficiency: efficient, quick learner, shrewd, management, athletics, tech savvy, coding; She should never trade away anything! She's a vampire, she takes and extracts by nature.) */ <<run $npcs.push(setup.createNPC({ name: "Revna McKraken", jobs: "Mysterious Book Shop owner", gender: "female", chest: "medium", butt: "medium", genitals: "vagina", baseStats: {charisma: 99, dexterity: 99, strength: 99, intelligence: 99}, physicalTraits: ["Pale Skin", "Attractive", "Graceful", "Voluptuous", "Quick Reflexes", "Definitely not a Vampire"], mentalTraits: ["Charming", "Diplomatic", "Bookworm", "Seductive", "Intelligent", "Moody", "Sly", "Confident", "Creative", "Patient", "Perceptive", "Deceitful", "Goth"], voiceTraits: ["Silky Voice"], skills: ["Sexually Skilled", "Stealth", "Persuasion", "Acting", "Languages", "Product Knowledge", "Martial Arts", "Gardening", "Writing", "Medicine", "Combat", "Occult Expert"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" }))>> /* Butt Johnson - Streamer (Apartment Neighbor) */ <<run $npcs.push(setup.createNPC({ name: "Butt Johnson", jobs: "Streamer", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis", baseStats: {charisma: 18, dexterity: 15, strength: 12, intelligence: 35}, physicalTraits: ["Short Hair", "Overweight", "Plain", "Blemished", "Unkempt"], mentalTraits: ["Nerd", "Lazy", "Introverted", "Awkward", "Disorganized", "Shy", "Forgetful", "Obsessive"], skills: ["Gaming", "Coding", "Tech-Savvy", "Social Media", "Forklift Certified"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Purple Wood - Streamer */ <<set _violetTemp = setup.createNPC({ name: "Purple Wood", jobs: "Streamer", gender: "female", chest: "small", butt: "huge", genitals: "vagina", baseStats: {charisma: 25, dexterity: 20, strength: 15, intelligence: 30}, physicalTraits: ["Attractive", "Pierced", "Tattooed", "Graceful", "Pale Skin"], mentalTraits: ["Creative", "Introverted", "Moody", "Goth", "Cynical"], skills: ["Sales", "Art", "Music", "Painting", "Writing"], skinTone: "pale", hairColor: "Black", hairLength: "long", age: "Adult" })>> /* Luna Snow - Amateur Musician */ <<run $npcs.push(setup.createNPC({ name: "Luna Snow", jobs: "Amateur Musician", gender: "female", chest: "huge", butt: "huge", genitals: "big penis", baseStats: {charisma: 99, dexterity: 10, strength: 10, intelligence: 10}, physicalTraits: ["Curvy", "Soft", "Smooth Skin", "Youthful", "Attractive", "Fit", "Graceful", "Freckled", "Short"], mentalTraits: ["Charming", "Funny", "Bookworm", "Warm", "Blunt", "Creative", "Wise", "Intelligent", "Stubborn", "Calm", "Artistic", "Musky"], skills: ["Guitar", "Photography", "Art", "Painting", "Music", "Acting", "Martial Arts"], skinTone: "pale", hairColor: "Brown", hairLength: "long", age: "Adult" }))>> /* Boris Shorthead - Patrol Officer */ <<run $npcs.push(setup.createNPC({ name: "Boris Shorthead", jobs: "Patrol Officer", gender: "male", chest: "flat masculine", butt: "medium", genitals: "small penis", baseStats: {charisma: 15, dexterity: 20, strength: 50, intelligence: 20}, physicalTraits: ["Short", "Muscular", "Strong", "Broad-shouldered"], mentalTraits: ["Disciplined", "Brave", "Blunt", "Loyal"], skills: ["Combat", "Driving", "First Aid", "Public Speaking"], skinTone: "pale", hairColor: "Brown", hairLength: "short", age: "Adult" }))>> /* Mareregererrer Mayonnaise - Patrol Officer */ <<run $npcs.push(setup.createNPC({ name: "Mareregererrer Mayonnaise", jobs: "Patrol Officer", gender: "female", chest: "medium", butt: "medium", genitals: "vagina", baseStats: {charisma: 25, dexterity: 25, strength: 45, intelligence: 25}, physicalTraits: ["Athletic Build", "Tall", "Fit", "Sharp Features"], mentalTraits: ["Confident", "Determined", "Analytical", "Direct"], skills: ["Combat", "Driving", "Persuasion", "First Aid"], skinTone: "tan", hairColor: "Blonde", hairLength: "medium", age: "Adult" }))>> /* Poggies Name420 - Patrol Officer (Femboy) */ <<run $npcs.push(setup.createNPC({ name: "Poggies Name420", jobs: "Patrol Officer", gender: "male", chest: "flat", butt: "giant", genitals: "penis", baseStats: {charisma: 30, dexterity: 30, strength: 45, intelligence: 20}, physicalTraits: ["Femboy", "Petite", "Graceful", "Smooth Skin"], mentalTraits: ["Unpredictable", "Energetic", "Flirty", "Confident", "Femboy"], skills: ["Combat", "Driving", "Dancing", "High Heels Proficient"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Young Adult" }))>> /* Sunny Flipflop - Sheriff */ <<run $npcs.push(setup.createNPC({ name: "Sunny Flipflop", jobs: "Sheriff", gender: "female", chest: "medium", butt: "large", genitals: "big penis", baseStats: {charisma: 45, dexterity: 35, strength: 50, intelligence: 35}, physicalTraits: ["Muscular", "Strong", "Fit", "Athletic Build", "Tall"], mentalTraits: ["Confident", "Disciplined", "Brave", "Honest", "Loyal", "Ambitious", "Hardworking", "Organized"], skills: ["Combat", "Legal Knowledge", "Management", "Public Speaking", "First Aid", "Driving", "Persuasion"], skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Adult" }))>> /* Bongo Bongo - Police Station Receptionist */ <<run $npcs.push(setup.createNPC({ name: "Bongo Bongo", jobs: "Police Station Receptionist", gender: "female", chest: "medium", butt: "medium", genitals: "vagina", baseStats: {charisma: 30, dexterity: 25, strength: 25, intelligence: 20}, physicalTraits: ["Pale Skin", "Long Hair", "Fit", "Quick Reflexes", "Sharp Features"], mentalTraits: ["Polite", "Organized", "Friendly", "Brave", "Disciplined", "Patient"], skills: ["Customer Service", "Combat", "First Aid", "Inventory Management", "Product Knowledge"], skinTone: "pale", hairColor: "Blonde", hairLength: "long", age: "Adult" }))>> /* Roisin Sullivan - Unemployed Drifter with Connections */ <<run $npcs.push(setup.createNPC({ name: "Roisin Sullivan", jobs: "Fuck Employment", gender: "female", chest: "huge", butt: "large", genitals: "tight vagina", baseStats: {charisma: 37, dexterity: 68, strength: 98, intelligence: 20}, physicalTraits: ["Athletic Build", "Attractive", "Fast", "Fit", "Flexible", "Perceptive", "Quick Reflexes", "Relaxed", "Smooth Skin", "Strong", "Sturdy", "Tall", "Youthful"], mentalTraits: ["Alluring", "Ambitious", "Blunt", "Cold", "Competitive", "Confident", "Delinquent", "Determined", "Disorganized", "Dominant", "Efficient", "Extroverted", "Forgetful", "Impatient", "Impulsive", "Insecure", "Lucky", "Obsessive", "Reckless", "Risk Taker", "Sensitive", "Steadfast", "Stubborn"], skills: ["Athletics", "Baking", "Combat", "Driving", "Forklift Certified", "Gardening", "Heavy Lifting", "Swimmer"], voiceTraits: ["Gaelic Accent"], skinTone: "pale", hairColor: "Red", hairLength: "long", age: "Adult" }))>> <<run $npcs.push(_violetTemp)>> /* Activate Bimbo state on Violet at game start */ <<run setup.activateBimboTrait(_violetTemp)>> /* Initialize permanent IDs for trading system */ <<for _npc range $npcs>> <<if !_npc.permanentId>> <<set _npc.permanentId = _npc.name>> <</if>> <</for>> <</silently>>s
<<nobr>> <!-- Track the original location if not already in NPC flow --> <<if !$lastLocation || !["NPCInteraction", "NPCTalk", "NPCTalkResponse", "TradeInterface", "TradeSelectItems", "TradeResult"].includes($lastLocation)>> <<set $preNPCLocation = $lastLocation>> <</if>> <<set _npc = $tradingWithNPC>> <<if !_npc>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: NPC not found.</p> <<if $lastLocation>> [[Go Back|$lastLocation]] <<else>> [[Go Back|Mall]] <</if>> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">_npc.name</h1> <p style="color: white; margin: 0; font-size: 18px; text-align: center;"> <<if _npc.jobs && _npc.jobs.length > 0>> <<print _npc.jobs.join(", ")>> <<else>> Unemployed <</if>> </p> </div> <!-- NPC Stats --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">📊 Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; font-size: 16px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.charisma</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.dexterity</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Strength:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.strength</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #17a2b8; font-weight: bold;">_npc.stats.intelligence</span> </div> </div> </div> <!-- NPC Appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">👤 Appearance</h3> <div style="display: flex; gap: 20px; align-items: flex-start;"> <!-- Appearance Details --> <div style="flex: 1; font-size: 16px; color: #ccc; line-height: 1.8;"> <<set _npcHairStyle = _npc.appearance.hairStyle === "messy" ? "Messy " : "">> <<set _npcHairLength = _npc.appearance.hairLength ? _npc.appearance.hairLength.toUpperFirst() : "Short">> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Hair:</strong> <<print _npcHairStyle + _npcHairLength>> <<print _npc.appearance.hairColor>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Skin Tone:</strong> <<print _npc.appearance.skinTone.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Chest:</strong> <<print _npc.bodyParts.chest.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Butt:</strong> <<print _npc.bodyParts.butt.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Genitals:</strong> <<print (_npc.bodyParts.genitals || "Unknown").toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Gender:</strong> <<print _npc.bodyParts.gender.toUpperFirst()>></p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Age:</strong> <<print _npc.appearance.age || "Adult">></p> </div> <!-- NPC Image --> <<if $imageSettings.imagesEnabled && $imageSettings.npcImagesEnabled>> <<set _npcImage = setup.getNPCImage(_npc.name)>> <<if _npcImage>> <div style="flex-shrink: 0;"> <img @src="_npcImage" style="max-width: 250px; max-height: 350px; border-radius: 8px; border: 2px solid #9b59b6; box-shadow: 0 0 15px rgba(155,89,182,0.4);" onerror="this.style.display='none';"> </div> <</if>> <</if>> </div> </div> <!-- NPC Traits --> <<if _npc.physicalTraits && _npc.physicalTraits.length > 0>> <<set _displayNPCPhysicalTraits = _npc.physicalTraits.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair"; })>> <<if _displayNPCPhysicalTraits.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h3> <div style="line-height: 2.5;"> <<for _trait range _displayNPCPhysicalTraits>> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_trait</span> <</for>> </div> </div> <</if>> <</if>> <<if _npc.mentalTraits && _npc.mentalTraits.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h3> <div style="line-height: 2.5;"> <<for _trait range _npc.mentalTraits>> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_trait</span> <</for>> </div> </div> <</if>> <<if _npc.skills && _npc.skills.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h3> <div style="line-height: 2.5;"> <<for _skill range _npc.skills>> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500; white-space: nowrap; display: inline-block; margin: 5px 5px 5px 0;">_skill</span> <</for>> </div> </div> <</if>> <!-- Action Buttons --> <<if _npc.name === "Roisin Sullivan">> <!-- Calculate trait storage price based on friendship level --> <<set _roisinFriendship = ($relationships && $relationships[_npc.name]) ? $relationships[_npc.name].level : 0>> <<if _roisinFriendship >= 4>> <<set _traitStoragePrice = 100000>> <<elseif _roisinFriendship >= 3>> <<set _traitStoragePrice = 500000>> <<elseif _roisinFriendship >= 2>> <<set _traitStoragePrice = 1000000>> <<elseif _roisinFriendship >= 1>> <<set _traitStoragePrice = 5000000>> <<else>> <<set _traitStoragePrice = 10000000>> <</if>> <<set _canBuyTraitStorage = _roisinFriendship >= 0 && !$traitStorageUnlocked>> <<set _canAffordTraitStorage = $money >= _traitStoragePrice>> <!-- 4-column grid for Roisin Sullivan --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 15px; margin-top: 25px;"> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💱 Initiate Trade</div>">> <<set $tradingWithNPC = _npc>> <<goto "TradeInterface">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💬 Talk</div>">> <<goto "NPCTalk">> <</link>> <<link "<div style='background: #28a745; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💰 Sell Traits</div>">> <<set $tradingWithNPC = _npc>> <<goto "SellTraits">> <</link>> <!-- Trait Storage Purchase --> <<if $traitStorageUnlocked>> <div style='background: #333; color: #888; padding: 18px; border-radius: 12px; text-align: center; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'> 🧬 Trait Storage<br><span style="font-size: 12px;">(Already Owned)</span> </div> <<elseif _roisinFriendship < 0>> <div style='background: #333; color: #888; padding: 18px; border-radius: 12px; text-align: center; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'> 🧬 Trait Storage<br><span style="font-size: 12px;">(Won't sell to you)</span> </div> <<elseif !_canAffordTraitStorage>> <div style='background: #333; color: #888; padding: 18px; border-radius: 12px; text-align: center; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'> 🧬 Trait Storage<br><span style="font-size: 12px;">$<<print _traitStoragePrice.toLocaleString()>></span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #e040fb 0%, #7c4dff 100%); color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #e040fb;'>🧬 Trait Storage<br><span style='font-size: 12px;'>$<<print _traitStoragePrice.toLocaleString()>></span></div>">> <<set $money -= _traitStoragePrice>> <<set $traitStorageUnlocked = true>> <<set $traitStorage = []>> <<goto "RoisinTraitStoragePurchased">> <</link>> <</if>> </div> <<else>> <!-- 2-column grid for other NPCs --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💱 Initiate Trade</div>">> <<set $tradingWithNPC = _npc>> <<goto "TradeInterface">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💬 Talk</div>">> <<goto "NPCTalk">> <</link>> </div> <</if>> <!-- Life Swap Button - Requires Soul trait (or bypass) --> <<set _hasSoulTrait = ($skills && $skills.includes("Soul")) || ($physicalTraits && $physicalTraits.includes("Soul")) || ($mentalTraits && $mentalTraits.includes("Soul"))>> <<if _hasSoulTrait || $debugLifeSwapBypass>> <<set _lifeSwapProtectedNPCs = ["Xanithar Galdenentri", "Revna McKraken", "Roisin Sullivan", "Luna Snow", "Fen Ris"]>> <<set _npcNameForCheck = _npc.originalName || _npc.name>> <<if !_lifeSwapProtectedNPCs.includes(_npcNameForCheck)>> <<set _hasSunfishTrait = ($skills && $skills.includes("Sunfish")) || ($physicalTraits && $physicalTraits.includes("Sunfish")) || ($mentalTraits && $mentalTraits.includes("Sunfish"))>> <<set _hasMinStats = $stats.strength >= 50 && $stats.intelligence >= 50 && $stats.charisma >= 50 && $stats.dexterity >= 50>> <<set _isOriginalBody = $lifeSwapOriginalBodyNPC && (_npc.name === $lifeSwapOriginalBodyNPC || _npc.originalName === $lifeSwapOriginalBodyNPC)>> <<set _canLifeSwap = $debugLifeSwapBypass || _isOriginalBody || (_hasSunfishTrait && _hasMinStats)>> <div style="display: grid; grid-template-columns: 1fr; gap: 20px; margin-top: 15px;"> <<if _canLifeSwap>> <<link "<div style='background: linear-gradient(135deg, #e040fb 0%, #7c4dff 100%); color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #e040fb;'>🔮 Life Swap</div>">> <<set $lifeSwapNPC = _npc>> <<set $lifeSwapIsOriginalBody = _isOriginalBody>> <<goto "LifeSwapConfirm">> <</link>> <<else>> <div style='background: linear-gradient(135deg, #555 0%, #333 100%); color: #888; padding: 18px; border-radius: 12px; text-align: center; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #555;'> 🔮 Life Swap <div style="font-size: 12px; margin-top: 8px; color: #666;"> <<if !_hasSunfishTrait && !_hasMinStats>> Requires Sunfish trait and 50+ in all stats <<elseif !_hasSunfishTrait>> Requires Sunfish trait <<else>> Requires 50+ in all base stats <</if>> </div> </div> <</if>> </div> <</if>> <</if>> <br> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave</div>">> <<set $tradingWithNPC = null>> <<goto $preNPCLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<if !$tradingWithNPC>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: No NPC selected for trading.</p> [[Go Back|$lastLocation]] </div> <<else>> <<set _npc = $tradingWithNPC>> <!-- Initialize trade packages if not exists --> <<if !$playerTradePackage>> <<set $playerTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [], gender: null }>> <</if>> <<if !$npcTradePackage>> <<set $npcTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [], gender: null }>> <</if>> <!-- Check if trading with old body (NPC has player's original body) --> <<set _isOldBody = (_npc.portraitSource === "player")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">💱 Trading with <<print _npc.name>></h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center;"> Build your trade packages below, then attempt the swap when ready </p> </div> <!-- Trade Limit Display --> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Trades Remaining Today: <span style="color: #667eea;"><<print $tradesRemainingToday>> / <<print 5 + ($bonusDailyTrades || 0)>></span> </div> <<if $failedTradesWithToday.includes(_npc.name)>> <div style="color: #ff6b6b; font-weight: bold; margin-top: 10px; font-size: 16px;"> ⚠️ You already failed a trade with <<print _npc.name>> today! </div> <</if>> </div> <!-- Trade Value Calculation --> <<set _playerValue = setup.calculateTradeValue($playerTradePackage, true)>> <<set _baseNpcValue = setup.calculateTradeValue($npcTradePackage, false)>> <!-- Calculate preference adjustments FIRST (before relationship) --> <<set _npcValueAfterPreferences = setup.calculatePreferenceValueAdjustment(_npc, $playerTradePackage, $npcTradePackage, _baseNpcValue)>> <<set _preferenceAdjustment = _npcValueAfterPreferences - _baseNpcValue>> <!-- Get relationship level --> <<set _relLevel = 0>> <<if $relationships[_npc.name]>> <<set _relLevel = $relationships[_npc.name].level>> <</if>> <!-- Calculate relationship discount multiplier --> <<set _relMultiplier = 1.0>> <<if _relLevel === 2>> <<set _relMultiplier = 0.95>> <<elseif _relLevel === 3>> <<set _relMultiplier = 0.90>> <<elseif _relLevel === 4>> <<set _relMultiplier = 0.85>> <<elseif _relLevel >= 5>> <<set _relMultiplier = 0.80>> <</if>> <!-- Apply relationship discount to get value after relationship --> <<set _valueAfterRelationship = Math.floor(_npcValueAfterPreferences * _relMultiplier)>> <<set _relationshipDiscount = _npcValueAfterPreferences - _valueAfterRelationship>> <!-- ===== SKILL TREE: Apply Trade Value Reduction ===== --> <<set _skillTreeValueReduction = setup.skillTree.getEffect("tradeValueReduction")>> <<set _adjustedNpcValue = Math.max(0, _valueAfterRelationship - _skillTreeValueReduction)>> <<set _actualSkillReduction = _valueAfterRelationship - _adjustedNpcValue>> <!-- Calculate success chance modifiers --> <<set _totalCharisma = setup.getTotalStat("charisma")>> <<set _charismaBonus = 0>> <<if _totalCharisma > 0>> <<set _charismaBonus = Math.min(40, Math.floor(_totalCharisma / 3.75))>> <</if>> <<set _tradingBonus = $skills.includes("Trading") ? 2 : 0>> <<set _persuasionBonus = $skills.includes("Persuasion") ? 3 : 0>> <<set _sunfishBonus = $mentalTraits.includes("Sunfish") ? 10 : 0>> <<set _werefoxBonus = $physicalTraits.includes("Werefox") ? 10 : 0>> <<set _sirenBonus = $physicalTraits.includes("Siren") ? 30 : 0>> <!-- ===== SKILL TREE: Trade Success Bonus ===== --> <<set _skillTreeTradeBonus = setup.skillTree.getEffect("tradeSuccessBonus")>> <!-- ===== BUFF SYSTEM: Trade Bonus from buffs ===== --> <<set _buffTradeBonus = setup.getBuffEffect("tradeChance")>> <!-- Calculate beneficial trait bonuses --> <<set _beneficialTraits = ["Honest", "Confident", "Friendly", "Trusting", "Patient", "Intelligent", "Analytical", "Chill", "Nonchalant", "Charming", "Diplomatic", "Polite", "Reassuring", "Efficient", "Warm", "Lucky", "Hellhound", "Werecat", "Weresheep", "Himbo", "Werefox", "Trophy Wife", "Werebunny", "Punk", "Gym Bunny", "Siren"]>> <<set _beneficialCount = 0>> <<set _beneficialList = []>> <<for _i = 0; _i < _beneficialTraits.length; _i++>> <<if $mentalTraits.includes(_beneficialTraits[_i])>> <<set _beneficialCount++>> <<run _beneficialList.push(_beneficialTraits[_i])>> <</if>> <</for>> <<set _beneficialBonus = Math.ceil(_beneficialCount * 2)>> <!-- Calculate detrimental trait penalties --> <<set _detrimentalTraits = ["Aggressive", "Awkward", "Blunt", "Corrupt", "Moody", "Pessimistic", "Sensitive", "Shy", "Stubborn", "Arrogant", "Cold", "Deceitful", "Foolish", "Forgetful", "Impatient", "Insecure", "Reckless", "Rude", "Selfish", "Short Tempered", "Unlucky", "Unreliable", "Bitchy"]>> <<set _detrimentalCount = 0>> <<set _detrimentalList = []>> <<for _i = 0; _i < _detrimentalTraits.length; _i++>> <<if $mentalTraits.includes(_detrimentalTraits[_i])>> <<set _detrimentalCount++>> <<run _detrimentalList.push(_detrimentalTraits[_i])>> <</if>> <</for>> <<set _detrimentalPenalty = Math.ceil(_detrimentalCount * 3)>> <<set _isCriminal = ($jobs && $jobs.includes("Criminal"))>> <<set _relationshipBonus = setup.getRelationshipTradeBonus(_npc.name)>> <!-- Debuff modifiers (tradeChance from debuffs like exhaustion) --> <<set _debuffTradePenalty = setup.getDebuffEffect("tradeChance")>> <!-- Calculate total additive modifier (before criminal multiplier) --> <<set _totalModifier = _charismaBonus + _tradingBonus + _persuasionBonus + _sunfishBonus + _werefoxBonus + _sirenBonus + _skillTreeTradeBonus + _buffTradeBonus + _beneficialBonus - _detrimentalPenalty + _relationshipBonus + _debuffTradePenalty>> <<set _tradeChance = setup.calculateTradeChance(_playerValue, _adjustedNpcValue, _npc, $playerTradePackage, $npcTradePackage)>> <!-- OLD BODY TRADE RESTRICTION: Both sides must offer at least 75% of the other's value --> <<set _oldBodyTradeBlocked = false>> <<set _oldBodyBlockReason = "">> <<if _isOldBody && (_playerValue > 0 || _baseNpcValue > 0)>> <<set _minPlayerValueNeeded = Math.ceil(_baseNpcValue * 0.75)>> <<set _minNpcValueNeeded = Math.ceil(_playerValue * 0.75)>> <<if _playerValue < _minPlayerValueNeeded && _baseNpcValue > 0>> <<set _oldBodyTradeBlocked = true>> <<set _oldBodyBlockReason = "Your offer (" + _playerValue + ") must be at least 75% of what you're requesting (" + _minPlayerValueNeeded + " minimum).">> <<elseif _baseNpcValue < _minNpcValueNeeded && _playerValue > 0>> <<set _oldBodyTradeBlocked = true>> <<set _oldBodyBlockReason = "What you're requesting (" + _baseNpcValue + ") must be at least 75% of what you're offering (" + _minNpcValueNeeded + " minimum).">> <</if>> <</if>> <!-- Success Chance Modifiers Display --> <<if _totalModifier !== 0 || _buffTradeBonus > 0 || _isCriminal || $currentArtifact === "The Drifter's Coin" || _debuffTradePenalty !== 0>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid ' + (_totalModifier > 0 ? '#51cf66' : '#ff6b6b') + ';'"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">Success Chance Modifiers:</div> <<if _charismaBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Charisma Bonus: +<<print _charismaBonus>>% (Charisma: <<print _totalCharisma>><<if _totalCharisma >= 150>> - MAX<</if>>) </div> <</if>> <<if _tradingBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Trading Skill: +<<print _tradingBonus>>% </div> <</if>> <<if _persuasionBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Persuasion Skill: +<<print _persuasionBonus>>% </div> <</if>> <<if _sunfishBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Sunfish Trait: +<<print _sunfishBonus>>% </div> <</if>> <<if _sirenBonus > 0>> <div style="color: #4fc3f7; font-size: 14px; margin: 3px 0;"> ✓ Siren: +<<print _sirenBonus>>% </div> <</if>> <<if _werefoxBonus > 0>> <div style="color: #ff9800; font-size: 14px; margin: 3px 0;"> ✓ Werefox: +<<print _werefoxBonus>>% </div> <</if>> <<if _skillTreeTradeBonus > 0>> <div style="color: #9C27B0; font-size: 14px; margin: 3px 0;"> ⭐ Skill Tree (Bonus %): +<<print _skillTreeTradeBonus>>% </div> <</if>> <<if _buffTradeBonus > 0>> <div style="color: #4fc3f7; font-size: 14px; margin: 3px 0;"> ✨ Buff Bonus: +<<print _buffTradeBonus>>% </div> <</if>> <<if _beneficialBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Beneficial Traits: +<<print _beneficialBonus>>% (<<print _beneficialList.join(", ")>>) </div> <</if>> <<if _relationshipBonus > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Relationship Bonus: +<<print _relationshipBonus>>% (Level <<print _relLevel>>) </div> <</if>> <<if _debuffTradePenalty < 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> 💤 Debuff Penalty: <<print _debuffTradePenalty>>% </div> <</if>> <<if _detrimentalPenalty > 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> ✗ Detrimental Traits: -<<print _detrimentalPenalty>>% (<<print _detrimentalList.join(", ")>>) </div> <</if>> <<if _isCriminal>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> ✗ Criminal Job: ×0.25 (75% reduction - MULTIPLICATIVE) </div> <</if>> <<if $currentArtifact === "The Drifter's Coin">> <div style="color: #FFD700; font-size: 14px; margin: 3px 0;"> ✨ The Drifter's Coin: ×2 Success Chance! </div> <</if>> <div @style="'color: ' + (_totalModifier > 0 ? '#51cf66' : '#ff6b6b') + '; font-size: 15px; margin-top: 8px; font-weight: bold; border-top: 1px solid #444; padding-top: 8px;'"> Total Additive Modifier: <<if _totalModifier > 0>>+<</if>><<print _totalModifier>>% <<if _isCriminal>> <span style="color: #ff6b6b;"> × 0.25</span> <</if>> <<if $currentArtifact === "The Drifter's Coin">> <span style="color: #FFD700;"> × 2</span> <</if>> </div> </div> <</if>> <!-- Value Adjustment Breakdown --> <<if _preferenceAdjustment !== 0 || _relationshipDiscount > 0 || _actualSkillReduction > 0>> <<set _prefs = setup.getNPCPreferences(_npc)>> <<set _willingCount = 0>> <<set _desiredCount = 0>> <<set _reluctantCount = 0>> <<if _prefs && _prefs.willingToTrade>> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<if _prefs.willingToTrade.physical && _prefs.willingToTrade.physical.includes($playerTradePackage.physical[_i])>> <<set _willingCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<if _prefs.willingToTrade.mental && _prefs.willingToTrade.mental.includes($playerTradePackage.mental[_i])>> <<set _willingCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<if _prefs.willingToTrade.skills && _prefs.willingToTrade.skills.includes($playerTradePackage.skills[_i])>> <<set _willingCount++>> <</if>> <</for>> <</if>> <<if _prefs && _prefs.desires>> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<if _prefs.desires.physical && _prefs.desires.physical.includes($playerTradePackage.physical[_i])>> <<set _desiredCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<if _prefs.desires.mental && _prefs.desires.mental.includes($playerTradePackage.mental[_i])>> <<set _desiredCount++>> <</if>> <</for>> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<if _prefs.desires.skills && _prefs.desires.skills.includes($playerTradePackage.skills[_i])>> <<set _desiredCount++>> <</if>> <</for>> <</if>> <<if _prefs && _prefs.reluctantToTrade>> <<for _i = 0; _i < $npcTradePackage.physical.length; _i++>> <<if _prefs.reluctantToTrade.physical && _prefs.reluctantToTrade.physical.includes($npcTradePackage.physical[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <<for _i = 0; _i < $npcTradePackage.mental.length; _i++>> <<if _prefs.reluctantToTrade.mental && _prefs.reluctantToTrade.mental.includes($npcTradePackage.mental[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <<for _i = 0; _i < $npcTradePackage.skills.length; _i++>> <<if _prefs.reluctantToTrade.skills && _prefs.reluctantToTrade.skills.includes($npcTradePackage.skills[_i])>> <<set _reluctantCount++>> <</if>> <</for>> <</if>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid ' + ((_preferenceAdjustment > 0 || _relationshipDiscount > 0 || _actualSkillReduction > 0) ? '#51cf66' : '#ff6b6b') + ';'"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">NPC Value Adjustments:</div> <div style="color: #ccc; font-size: 14px; margin: 3px 0;"> Base NPC Offer Value: <<print _baseNpcValue>> </div> <<if _willingCount > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Willing Items: <<print _willingCount>> item<<if _willingCount > 1>>s<</if>> (-20% cost each) </div> <</if>> <<if _desiredCount > 0>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> 💚 Desired Items: <<print _desiredCount>> item<<if _desiredCount > 1>>s<</if>> (-15% cost each) </div> <</if>> <<if _reluctantCount > 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0;"> ⚠️ Reluctant Items: <<print _reluctantCount>> item<<if _reluctantCount > 1>>s<</if>> (+30% cost each) </div> <</if>> <<if _preferenceAdjustment !== 0>> <<if _preferenceAdjustment > 0>> <div style="color: #ff6b6b; font-size: 14px; margin: 3px 0; font-style: italic;"> Preference Penalty: +<<print Math.abs(_preferenceAdjustment)>> </div> <<else>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0; font-style: italic;"> Preference Discount: <<print _preferenceAdjustment>> </div> <</if>> <div style="color: #ccc; font-size: 14px; margin: 3px 0; border-top: 1px solid #444; padding-top: 5px; margin-top: 5px;"> After Preferences: <<print _npcValueAfterPreferences>> </div> <</if>> <<if _relationshipDiscount > 0>> <<set _discountPercent = Math.round((1 - _relMultiplier) * 100)>> <div style="color: #51cf66; font-size: 14px; margin: 3px 0; margin-top: 5px;"> ✓ Relationship Discount (Level <<print _relLevel>>): -<<print _discountPercent>>% (-<<print _relationshipDiscount>>) </div> <</if>> <<if _actualSkillReduction > 0>> <div style="color: #9C27B0; font-size: 14px; margin: 3px 0; margin-top: 5px;"> ⭐ Skill Tree (Trading): -<<print _actualSkillReduction>> value required </div> <</if>> <div @style="'color: ' + (_adjustedNpcValue < _baseNpcValue ? '#51cf66' : '#ff6b6b') + '; font-size: 15px; margin-top: 8px; font-weight: bold; border-top: 1px solid #444; padding-top: 8px;'"> Final NPC Value Required: <<print _adjustedNpcValue>> </div> </div> <</if>> <!-- Value from Exceeding Requirement --> <<if _playerValue > _adjustedNpcValue>> <<set _excessValue = _playerValue - _adjustedNpcValue>> <<set _excessPercent = Math.round((_excessValue / _adjustedNpcValue) * 100)>> <<set _baseChanceFromValue = Math.min(100, 1 + Math.round(((_playerValue / _adjustedNpcValue) - 1.0) / 0.7 * 99))>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <div style="color: #aaa; font-size: 14px; margin-bottom: 8px; font-weight: bold;">Trade Value Bonus:</div> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Offering <<print _excessValue>> more than required (+<<print _excessPercent>>% extra) </div> <div style="color: #51cf66; font-size: 14px; margin: 3px 0;"> ✓ Base success chance from value: <<print _baseChanceFromValue>>% </div> </div> <</if>> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid #667eea; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Your Offer Value</div> <div style="font-size: 36px; font-weight: bold; color: #667eea;"><<print _playerValue>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid #9b59b6; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Their Offer Value</div> <div style="font-size: 36px; font-weight: bold; color: #9b59b6;"><<print _baseNpcValue>></div> </div> <div @style="'background: #1a1a1a; padding: 20px; border-radius: 10px; border: 3px solid ' + (_tradeChance >= 50 ? '#51cf66' : (_tradeChance >= 30 ? '#ffc107' : '#ff6b6b')) + '; text-align: center; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'"> <div style="font-size: 16px; color: #aaa; margin-bottom: 8px; font-weight: bold;">Success Chance</div> <div @style="'font-size: 36px; font-weight: bold; color: ' + (_tradeChance >= 50 ? '#51cf66' : (_tradeChance >= 30 ? '#ffc107' : '#ff6b6b')) + ';'"><<print _tradeChance>>%</div> </div> </div> <!-- Old Body Trade Restriction Warning --> <<if _isOldBody>> <div style="background: #1a1a1a; border: 3px solid #e040fb; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #e040fb;">🔮 Trading with Your Old Body</strong> <p style="margin: 8px 0 0 0; font-size: 14px;">Both sides must offer at least 75% of the other's value. You cannot give away traits for free or make heavily unbalanced trades with your old body.</p> </div> <</if>> <<if _oldBodyTradeBlocked>> <div style="background: #1a1a1a; border: 3px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ff6b6b;">⚠️ Unbalanced Trade Blocked!</strong> <<print _oldBodyBlockReason>> </div> <<elseif _playerValue < _adjustedNpcValue>> <div style="background: #1a1a1a; border: 3px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <<if _playerValue <= 0>> <strong style="color: #ff6b6b;">⚠️ Invalid Offer!</strong> You cannot offer negative or zero value. Your current offer value is <strong><<print _playerValue>></strong>. You cannot dump negative traits to get rid of them! <<else>> <strong style="color: #ff6b6b;">⚠️ Insufficient Value!</strong> You need to offer at least <strong><<print _adjustedNpcValue>></strong> value to attempt this trade. <<if _relationshipDiscount > 0>><span style="color: #51cf66;">(Relationship discount applied! Originally <<print _npcValueAfterPreferences>>)</span><</if>> <<if _actualSkillReduction > 0>><span style="color: #9C27B0;"> (Skill tree reduction applied!)</span><</if>> You are offering <strong><<print _playerValue>></strong>. <</if>> </div> <<elseif _tradeChance === 0>> <div style="background: #1a1a1a; border: 3px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ff6b6b;">⚠️ Cannot Trade!</strong> Your offer does not meet the minimum requirements. </div> <<elseif _tradeChance < 30>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #ffc107;">⚠️ Low Chance!</strong> Consider offering more value for a better chance of success. (Currently <<print _tradeChance>>%) </div> <<elseif _tradeChance >= 100>> <div style="background: #1a1a1a; border: 3px solid #51cf66; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #51cf66;">✓ Guaranteed Success!</strong> You are offering double value or more. This trade will succeed 100%. </div> <<else>> <div style="background: #1a1a1a; border: 3px solid #17a2b8; padding: 15px; border-radius: 8px; margin-bottom: 20px; color: #ccc;"> <strong style="color: #17a2b8;">ℹ️ Fair Trade.</strong> You have a <<print _tradeChance>>% chance of success. Offer more value to increase your odds. </div> <</if>> <!-- Two Column Layout for Trade Building --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 25px; margin-bottom: 25px;"> <!-- YOUR OFFER COLUMN --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 4px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 20px 0; font-size: 26px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">🎁 Your Offer</h2> <<if $playerTradePackage.name.length === 0 && $playerTradePackage.stats.length === 0 && $playerTradePackage.physical.length === 0 && $playerTradePackage.mental.length === 0 && $playerTradePackage.skills.length === 0 && $playerTradePackage.bodyParts.length === 0 && !$playerTradePackage.job>> <p style="color: #666; font-style: italic; text-align: center; font-size: 16px; padding: 40px 20px;">Empty. Click below to add items</p> <<else>> <!-- NAME --> <<if $playerTradePackage.name.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">👤 Name</div> <<for _i = 0; _i < $playerTradePackage.name.length; _i++>> <<set _nameObj = $playerTradePackage.name[_i]>> <<set _displayName = _nameObj.type === "firstName" ? $firstName : $lastName>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<if _nameObj.type === "firstName">>First Name<<else>>Last Name<</if>>: <<print _displayName>> <<capture _nameObj>> <<link "❌">> <<run $playerTradePackage.name.delete(_nameObj)>> <<set _matchingNpc = $npcTradePackage.name.find(n => n.type === _nameObj.type)>> <<if _matchingNpc>><<run $npcTradePackage.name.delete(_matchingNpc)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- BODY PARTS --> <<if $playerTradePackage.bodyParts.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ff6b6b;"> <div style="color: #ff6b6b; font-weight: bold; margin-bottom: 8px;">🫀 Body Parts</div> <<for _i = 0; _i < $playerTradePackage.bodyParts.length; _i++>> <<set _bp = $playerTradePackage.bodyParts[_i]>> <<capture _bp>> <<set _bpActualValue = _bp.name === "chest" || _bp.name === "butt" || _bp.name === "gender" || _bp.name === "genitals" ? $bodyParts[_bp.name] : $appearance[_bp.name]>> <<if _bpActualValue && _bpActualValue !== "">> <<set _bpValue = setup.getTraitValue("bodyPart", _bp.name, _bpActualValue)>> <<set _bpDisplayText = _bpActualValue + " " + _bp.name>> <<else>> <<set _bpValue = 0>> <<set _bpDisplayText = _bp.name.toUpperFirst()>> <</if>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _bpDisplayText.toUpperFirst()>> (<<print _bpValue>>) <<link "❌">> <<run $playerTradePackage.bodyParts.delete(_bp)>> <<set _matchingNpcBp = $npcTradePackage.bodyParts.find(b => b.name === _bp.name)>> <<if _matchingNpcBp>><<run $npcTradePackage.bodyParts.delete(_matchingNpcBp)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- PHYSICAL TRAITS --> <<if $playerTradePackage.physical.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #51cf66;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 8px;">💪 Physical Traits</div> <<for _i = 0; _i < $playerTradePackage.physical.length; _i++>> <<set _trait = $playerTradePackage.physical[_i]>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<link "❌">> <<run $playerTradePackage.physical.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, _npc.physicalTraits)>> <<if _conflict>><<run $npcTradePackage.physical.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- MENTAL TRAITS --> <<if $playerTradePackage.mental.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">🧠 Mental Traits</div> <<for _i = 0; _i < $playerTradePackage.mental.length; _i++>> <<set _trait = $playerTradePackage.mental[_i]>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $playerTradePackage.mental.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, _npc.mentalTraits)>> <<if _conflict>><<run $npcTradePackage.mental.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- SKILLS --> <<if $playerTradePackage.skills.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ffc107;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 8px;">🎯 Skills</div> <<for _i = 0; _i < $playerTradePackage.skills.length; _i++>> <<set _skill = $playerTradePackage.skills[_i]>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _skill>> (+<<print _skillValue>>) <<capture _skill>> <<link "❌">> <<run $playerTradePackage.skills.delete(_skill)>> <<run $npcTradePackage.skills.delete(_skill)>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- JOB --> <<if $playerTradePackage.job>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #17a2b8;"> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 8px;">💼 Job</div> <<set _jobValue = setup.getTraitValue("job", $playerTradePackage.job)>> <div style="color: #ccc; padding: 6px 0;"> <<print $playerTradePackage.job>> (<<print _jobValue>>) <<link "❌">> <<set $playerTradePackage.job = null>> <<set $npcTradePackage.job = null>> <<goto "TradeInterface">> <</link>> </div> </div> <</if>> <</if>> <<link "<div style='background: #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; margin-top: 15px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>➕ Add to Your Offer</div>">> <<set $tradeSide = "player">> <<goto "TradeSelectItems">> <</link>> </div> <!-- THEIR OFFER COLUMN --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 4px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 20px 0; font-size: 26px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">🎁 Their Offer</h2> <<if $npcTradePackage.name.length === 0 && $npcTradePackage.stats.length === 0 && $npcTradePackage.physical.length === 0 && $npcTradePackage.mental.length === 0 && $npcTradePackage.skills.length === 0 && $npcTradePackage.bodyParts.length === 0 && !$npcTradePackage.job>> <p style="color: #666; font-style: italic; text-align: center; font-size: 16px; padding: 40px 20px;">Empty. Click below to add items</p> <<else>> <!-- NAME --> <<if $npcTradePackage.name.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">👤 Name</div> <<for _i = 0; _i < $npcTradePackage.name.length; _i++>> <<set _nameObj = $npcTradePackage.name[_i]>> <<set _npcNameParts = _npc.name.split(" ")>> <<set _displayName = _nameObj.type === "firstName" ? _npcNameParts[0] : _npcNameParts.slice(1).join(" ")>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<if _nameObj.type === "firstName">>First Name<<else>>Last Name<</if>>: <<print _displayName>> <<capture _nameObj>> <<link "❌">> <<run $npcTradePackage.name.delete(_nameObj)>> <<set _matchingPlayer = $playerTradePackage.name.find(n => n.type === _nameObj.type)>> <<if _matchingPlayer>><<run $playerTradePackage.name.delete(_matchingPlayer)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- BODY PARTS --> <<if $npcTradePackage.bodyParts.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ff6b6b;"> <div style="color: #ff6b6b; font-weight: bold; margin-bottom: 8px;">🫀 Body Parts</div> <<for _i = 0; _i < $npcTradePackage.bodyParts.length; _i++>> <<set _bp = $npcTradePackage.bodyParts[_i]>> <<capture _bp>> <<set _bpActualValue = _bp.name === "chest" || _bp.name === "butt" || _bp.name === "gender" || _bp.name === "genitals" ? _npc.bodyParts[_bp.name] : _npc.appearance[_bp.name]>> <<if _bpActualValue && _bpActualValue !== "">> <<set _bpValue = setup.getTraitValue("bodyPart", _bp.name, _bpActualValue)>> <<set _bpDisplayText = _bpActualValue + " " + _bp.name>> <<else>> <<set _bpValue = 0>> <<set _bpDisplayText = _bp.name.toUpperFirst()>> <</if>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _bpDisplayText.toUpperFirst()>> (<<print _bpValue>>) <<link "❌">> <<run $npcTradePackage.bodyParts.delete(_bp)>> <<set _matchingPlayerBp = $playerTradePackage.bodyParts.find(b => b.name === _bp.name)>> <<if _matchingPlayerBp>><<run $playerTradePackage.bodyParts.delete(_matchingPlayerBp)>><</if>> <<goto "TradeInterface">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- PHYSICAL TRAITS --> <<if $npcTradePackage.physical.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #51cf66;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 8px;">💪 Physical Traits</div> <<for _i = 0; _i < $npcTradePackage.physical.length; _i++>> <<set _trait = $npcTradePackage.physical[_i]>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $npcTradePackage.physical.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $physicalTraits)>> <<if _conflict>><<run $playerTradePackage.physical.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- MENTAL TRAITS --> <<if $npcTradePackage.mental.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #9b59b6;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 8px;">🧠 Mental Traits</div> <<for _i = 0; _i < $npcTradePackage.mental.length; _i++>> <<set _trait = $npcTradePackage.mental[_i]>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _trait>> (<<print _traitValue>>) <<capture _trait>> <<link "❌">> <<run $npcTradePackage.mental.delete(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if _conflict>><<run $playerTradePackage.mental.delete(_conflict)>><</if>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- SKILLS --> <<if $npcTradePackage.skills.length > 0>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #ffc107;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 8px;">🎯 Skills</div> <<for _i = 0; _i < $npcTradePackage.skills.length; _i++>> <<set _skill = $npcTradePackage.skills[_i]>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <div style="color: #ccc; padding: 6px 0; border-bottom: 1px solid #333;"> <<print _skill>> (+<<print _skillValue>>) <<capture _skill>> <<link "❌">> <<run $npcTradePackage.skills.delete(_skill)>> <<run $playerTradePackage.skills.delete(_skill)>> <<goto "TradeInterface">> <</link>> <</capture>> </div> <</for>> </div> <</if>> <!-- JOB --> <<if $npcTradePackage.job>> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 12px; border: 2px solid #17a2b8;"> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 8px;">💼 Job</div> <<set _jobValue = setup.getTraitValue("job", $npcTradePackage.job)>> <div style="color: #ccc; padding: 6px 0;"> <<print $npcTradePackage.job>> (<<print _jobValue>>) <<link "❌">> <<set $npcTradePackage.job = null>> <<set $playerTradePackage.job = null>> <<goto "TradeInterface">> <</link>> </div> </div> <</if>> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; margin-top: 15px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>➕ Request Their Items</div>">> <<set $tradeSide = "npc">> <<goto "TradeSelectItems">> <</link>> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 20px; margin-top: 25px;"> <<if _playerValue >= _adjustedNpcValue && _tradeChance > 0 && !$failedTradesWithToday.includes(_npc.name) && $tradesRemainingToday > 0 && !_oldBodyTradeBlocked>> <<link `"<div style='background: #51cf66; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>✅ Attempt Trade (" + _tradeChance + "%)</div>"`>> <<set $tradeResult = setup.attemptTrade(_npc, $playerTradePackage, $npcTradePackage)>> <<set $tradeResult.successChance = _tradeChance>> <<goto "TradeResult">> <</link>> <<else>> <div style='background: #3a3a3a; color: #666; padding: 18px; border-radius: 12px; text-align: center; font-weight: bold; font-size: 18px; opacity: 0.6;'>✅ Cannot Trade</div> <</if>> <<link "<div style='background: #ff6b6b; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🗑️ Clear All</div>">> <<set $playerTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [], gender: null }>> <<set $npcTradePackage = { stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: [], gender: null }>> <<goto "TradeInterface">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Cancel</div>">> <<set $playerTradePackage = null>> <<set $npcTradePackage = null>> <<set $currentNPC = null>> <<set $tradingWithNPC = null>> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set $money = 0>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Age Verification Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">⚠️ Age Verification</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; margin: 0 0 20px 0; text-align: center;"> Are you 18 years old or older? </p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #51cf66dd 100%); color: white; padding: 12px 35px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); display: inline-block;'>✅ Yes</div>">> <<goto "DreamIntro">> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ff6b6bdd 100%); color: white; padding: 12px 35px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); display: inline-block;'>❌ No</div>">> <<goto "Exit">> <</link>> </div> </div> </div> <!-- Game Info Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; margin: 0 0 10px 0; text-align: center;"> Welcome to Sunfish City! A trait swapping game I made for the fun of it! </p> <p style="color: #ffc107; font-size: 14px; margin: 0; text-align: center; font-style: italic;"> <strong>Disclaimer:</strong> Not all jobs have functionality yet. </p> </div> <!-- Bugs Report Box --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #51cf66; font-size: 15px; margin: 0; text-align: center; font-weight: bold;"> Please report any bugs you find to my <a href="https://discord.gg/z9eDdQC6zA" target="_blank" style="color: #7289da; text-decoration: underline;">Discord</a> so I can easily sort them! </p> </div> <!-- Official Distribution Disclaimer --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #ffc107;"> <p style="color: #ffc107; font-size: 14px; margin: 0; text-align: center; font-weight: bold;"> ⚠️ If you found this game anywhere other than <span style="color: #51cf66;">itch.io</span>, <span style="color: #51cf66;">tfgames.site</span>, or <span style="color: #51cf66;">Patreon</span>, it was not me who posted the game there. </p> </div> </div> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<set _isPlayerSide = ($tradeSide === "player")>> <<set _npcPrefs = setup.getNPCPreferences(_npc)>> <!-- Player's inherited trade restrictions from Life Swap --> <<set _playerRestrictions = $lifeSwapTradeRestrictions || null>> <!-- Bimbo trait detection --> <<set _playerIsBimbo = $mentalTraits.includes("Bimbo")>> <<set _npcIsBimbo = _npc.mentalTraits.includes("Bimbo")>> <!-- Check if the CURRENT SIDE we're selecting from has Bimbo --> <<set _currentSideHasBimbo = (_isPlayerSide && _playerIsBimbo) || (!_isPlayerSide && _npcIsBimbo)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;"> <<if _isPlayerSide>> 🎁 Select Items for Your Offer <<else>> 🎁 Select Items You Want from _npc.name <</if>> </h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center;"> Click on items to add them to the trade package </p> </div> <!-- BIMBO WARNING --> <<if _currentSideHasBimbo>> <div style="background: #3a2030; border: 2px solid #ff69b4; padding: 15px; border-radius: 8px; margin-bottom: 25px;"> <<if _isPlayerSide>> <p style="color: #ff69b4; margin: 0; font-weight: bold;">💋 You're a Bimbo! You can only trade your Name, Job, or the Bimbo trait itself.</p> <<else>> <p style="color: #ff69b4; margin: 0; font-weight: bold;">💋 _npc.name is a Bimbo! You can only request their Name, Job, or the Bimbo trait.</p> <</if>> </div> <</if>> <!-- LIFE SWAP TRADE RESTRICTIONS WARNING --> <<if _playerRestrictions && _isPlayerSide>> <div style="background: #2a2040; border: 2px solid #9b59b6; padding: 15px; border-radius: 8px; margin-bottom: 25px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold;">Life Swap Restrictions: As <<print _playerRestrictions.sourceNPC>>, certain trades are restricted!</p> <p style="color: #aaa; margin: 5px 0 0 0; font-size: 14px;">Some traits cannot be traded away and some cannot be accepted.</p> </div> <</if>> <!-- NAME SECTION (Always available) --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">👤 Name</h2> <p style="color: #aaa; font-size: 15px; margin: 0 0 15px 0;"><em>Selecting a name automatically swaps both sides</em></p> <<if _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.name>> <div style="background: #3a2020; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">🚫 _npc.name will NEVER trade their name</p> </div> <</if>> <<set _playerHasFirstName = false>> <<set _playerHasLastName = false>> <<for _n range $playerTradePackage.name>> <<if _n.type === "firstName">><<set _playerHasFirstName = true>><</if>> <<if _n.type === "lastName">><<set _playerHasLastName = true>><</if>> <</for>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<set _nameValue = setup.getTraitValue("name", "firstName")>> <<set _npcFirstName = _npc.name.split(" ")[0]>> <<set _nameBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.name>> <<if !_playerHasFirstName && !_nameBlocked>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #9b59b6; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: #9b59b6;'>First Name</div><div style='color: #aaa; font-size: 14px;'><<print $firstName>> ↔️ <<print _npcFirstName>></div><div style='color: #9b59b6; font-size: 13px; margin-top: 5px;'>Swap (Value: <<print _nameValue>>)</div></div>">> <<run $playerTradePackage.name.push({type: "firstName", value: $firstName})>> <<run $npcTradePackage.name.push({type: "firstName", value: _npcFirstName})>> <<goto "TradeInterface">> <</link>> <<elseif _nameBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>First Name</div> <div style='font-size: 14px;'>🚫 Blocked</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>First Name</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <<set _npcLastName = _npc.name.split(" ").slice(1).join(" ")>> <<if !_playerHasLastName && !_nameBlocked>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #9b59b6; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: #9b59b6;'>Last Name</div><div style='color: #aaa; font-size: 14px;'><<print $lastName>> ↔️ <<print _npcLastName>></div><div style='color: #9b59b6; font-size: 13px; margin-top: 5px;'>Swap (Value: <<print _nameValue>>)</div></div>">> <<run $playerTradePackage.name.push({type: "lastName", value: $lastName})>> <<run $npcTradePackage.name.push({type: "lastName", value: _npcLastName})>> <<goto "TradeInterface">> <</link>> <<elseif _nameBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Last Name</div> <div style='font-size: 14px;'>🚫 Blocked</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Last Name</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> </div> <!-- JOB SECTION (Always available) --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">💼 Job</h2> <p style="color: #aaa; font-size: 15px; margin: 0 0 15px 0;"><em>Selecting a job automatically swaps both sides</em></p> <<set _playerJob = $jobs.length > 0 ? $jobs[0] : "Unemployed">> <<set _npcJob = _npc.jobs.length > 0 ? _npc.jobs[0] : "Unemployed">> <<set _jobAlreadySelected = ($playerTradePackage.job !== null)>> <<set _canTrade = setup.canTradeJob(_playerJob, _npcJob)>> <<set _jobBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.job>> <<if _jobBlocked>> <div style="background: #3a2020; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">🚫 _npc.name will NEVER trade their job</p> </div> <</if>> <<if _playerJob === "Criminal" && !setup.canTradeCriminalJob()>> <div style='background: #3a2020; border: 2px solid #ff6b6b; padding: 18px; border-radius: 8px; text-align: center;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px; color: #ff6b6b;'>🚫 Cannot Trade Criminal Job</div> <div style='font-size: 14px; color: #ccc;'>You must serve jail time or pay your fine first!</div> </div> <<elseif !_jobAlreadySelected && _canTrade && !_jobBlocked>> <<set _playerJobValue = setup.getTraitValue("job", _playerJob)>> <<set _npcJobValue = setup.getTraitValue("job", _npcJob)>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 18px; border-radius: 8px; cursor: pointer; border: 2px solid #17a2b8; text-align: center;'><div style='font-weight: bold; font-size: 18px; margin-bottom: 5px; color: #17a2b8;'>Trade Jobs</div><div style='color: #aaa; font-size: 14px;'>_playerJob ↔️ _npcJob</div><div style='color: #17a2b8; font-size: 14px; margin-top: 5px;'>Your Value: _playerJobValue | Their Value: _npcJobValue</div></div>">> <<set $playerTradePackage.job = _playerJob>> <<set $npcTradePackage.job = _npcJob>> <<goto "TradeInterface">> <</link>> <<elseif _jobBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 18px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>🚫 They Won't Trade</div> </div> <<elseif _jobAlreadySelected>> <div style='background: #1a1a1a; color: #666; padding: 18px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>Already Selected</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 18px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Trade Jobs</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> <!-- BIMBO TRAIT SECTION (Only show if current side has Bimbo) --> <<if _currentSideHasBimbo>> <<set _currentPackage = _isPlayerSide ? $playerTradePackage : $npcTradePackage>> <<set _bimboInPackage = _currentPackage.mental.includes("Bimbo")>> <<set _oppositeHasBimbo = _isPlayerSide ? _npcIsBimbo : _playerIsBimbo>> <<set _bimboValue = setup.getTraitValue("mental", "Bimbo")>> <<set _npcWontAcceptBimbo = _isPlayerSide && _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.mental && _npcPrefs.wontTradeFor.mental.includes("Bimbo")>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff69b4; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff69b4; padding-bottom: 10px;">💋 Bimbo Trait</h2> <<if !_bimboInPackage && !_oppositeHasBimbo && !_npcWontAcceptBimbo>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid #ff69b4; text-align: center;'><div style='font-weight: bold; font-size: 18px; margin-bottom: 5px; color: #ff69b4;'><<if _isPlayerSide>>Trade Away Bimbo<<else>>Receive Bimbo<</if>></div><div style='color: #aaa; font-size: 14px;'>Value: _bimboValue</div><div style='color: #ff69b4; font-size: 13px; margin-top: 5px;'><<if _isPlayerSide>>Give up being a Bimbo<<else>>Become a Bimbo<</if>></div></div>">> <<if _isPlayerSide>> <<run $playerTradePackage.mental.push("Bimbo")>> <<else>> <<run $npcTradePackage.mental.push("Bimbo")>> <</if>> <<goto "TradeInterface">> <</link>> <<elseif _oppositeHasBimbo>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>They already have it</div> </div> <<elseif _npcWontAcceptBimbo>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>🚫 They won't accept this</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 18px; margin-bottom: 5px;'>Bimbo Trait</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> <</if>> <!-- ALL OTHER SECTIONS (Only if NEITHER side has Bimbo) --> <<if !_currentSideHasBimbo>> <!-- BODY PARTS SECTION (Only if NEITHER side has Bimbo) --> <<if !_playerIsBimbo && !_npcIsBimbo>> <!-- Original Body Parts section stays here --> <<set _playerOfferedBodyPartTypes = []>> <<for _bp range $playerTradePackage.bodyParts>> <<run _playerOfferedBodyPartTypes.push(_bp.name)>> <</for>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">🫀 Body Parts</h2> <div style="background: #3a3020; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">⚠️ Selecting a body part automatically swaps it between both of you</p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 15px;"> <!-- Chest --> <<set _partValue = setup.getTraitValue("bodyPart", "chest", $bodyParts.chest)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("chest")>> <<set _playerChestSize = $bodyParts.chest>> <<set _npcChestSize = _npc.bodyParts.chest>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.chestSize && _npcPrefs.reluctantToTrade.chestSize.includes(_npcChestSize)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.chestSize && _npcPrefs.willingToTrade.chestSize.includes(_npcChestSize)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.chestSize && _npcPrefs.neverTrade.chestSize.includes(_npcChestSize)>> <<set _npcWontAcceptChestSize = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.chestSize && _npcPrefs.wontTradeFor.chestSize.includes(_playerChestSize)>> <<if !_alreadySelected && !_npcBlocked && !_npcWontAcceptChestSize>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Chest<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.chest ↔️ _npc.bodyParts.chest</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "chest", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "chest", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked || _npcWontAcceptChestSize>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Chest</div> <<if _npcBlocked>> <div style='font-size: 14px;'>🚫 They won't give up their _npcChestSize chest</div> <<else>> <div style='font-size: 14px;'>🚫 They don't want your _playerChestSize chest</div> <</if>> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Chest</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Butt --> <<set _partValue = setup.getTraitValue("bodyPart", "butt", $bodyParts.butt)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("butt")>> <<set _playerButtSize = $bodyParts.butt>> <<set _npcButtSize = _npc.bodyParts.butt>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.buttSize && _npcPrefs.reluctantToTrade.buttSize.includes(_npcButtSize)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.buttSize && _npcPrefs.willingToTrade.buttSize.includes(_npcButtSize)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.buttSize && _npcPrefs.neverTrade.buttSize.includes(_npcButtSize)>> <<set _npcWontAcceptButtSize = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.buttSize && _npcPrefs.wontTradeFor.buttSize.includes(_playerButtSize)>> <<if !_alreadySelected && !_npcBlocked && !_npcWontAcceptButtSize>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Butt<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.butt ↔️ _npc.bodyParts.butt</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "butt", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "butt", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked || _npcWontAcceptButtSize>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Butt</div> <<if _npcBlocked>> <div style='font-size: 14px;'>🚫 They won't give up their _npcButtSize butt</div> <<else>> <div style='font-size: 14px;'>🚫 They don't want your _playerButtSize butt</div> <</if>> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Butt</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Gender --> <<set _partValue = setup.getTraitValue("bodyPart", "gender", "male")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("gender")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("gender")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("gender")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("gender")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Gender<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$bodyParts.gender ↔️ _npc.bodyParts.gender</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "gender", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "gender", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Gender</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Gender</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Skin Color --> <<set _partValue = setup.getTraitValue("bodyPart", "skinTone")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("skinTone")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("skinTone")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("skinTone")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("skinTone")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Skin Color<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$appearance.skinTone ↔️ _npc.appearance.skinTone</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "skinTone", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "skinTone", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Skin Color</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Skin Color</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Hair Color --> <<set _partValue = setup.getTraitValue("bodyPart", "hairColor")>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("hairColor")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("hairColor")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("hairColor")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("hairColor")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Hair Color<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>$appearance.hairColor ↔️ _npc.appearance.hairColor</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "hairColor", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "hairColor", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Color</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Color</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Age --> <<set _partValue = setup.getTraitValue("bodyPart", "age")>> <<set _currentValue = $appearance.age || "Adult">> <<set _npcAge = _npc.appearance.age || "Adult">> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("age")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("age")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("age")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("age")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Age<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_currentValue ↔️ _npcAge</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "age", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "age", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Age</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Age</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Hair Length --> <<set _partValue = setup.getTraitValue("bodyPart", "hairLength")>> <<set _currentValue = $appearance.hairLength || "short">> <<if !_npc.appearance.hairLength>> <<set _npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long">> <<set _hairLengthTrait = _npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair">> <<if !_npc.physicalTraits.includes(_hairLengthTrait)>> <<run _npc.physicalTraits.push(_hairLengthTrait)>> <</if>> <</if>> <<set _npcHairLength = _npc.appearance.hairLength>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("hairLength")>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("hairLength")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("hairLength")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("hairLength")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Hair Length<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_currentValue ↔️ _npcHairLength</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "hairLength", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "hairLength", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Length</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Hair Length</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> <!-- Genitals --> <<set _partValue = setup.getTraitValue("bodyPart", "genitals", $bodyParts.genitals)>> <<set _alreadySelected = _playerOfferedBodyPartTypes.includes("genitals")>> <<set _playerGenitals = $bodyParts.genitals>> <<set _npcGenitals = _npc.bodyParts.genitals || "penis">> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.bodyParts && _npcPrefs.reluctantToTrade.bodyParts.includes("genitals")>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.bodyParts && _npcPrefs.willingToTrade.bodyParts.includes("genitals")>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.bodyParts && _npcPrefs.neverTrade.bodyParts.includes("genitals")>> <<if !_alreadySelected && !_npcBlocked>> <<set _borderColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : "#ff6b6b")>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 15px; border-radius: 8px; cursor: pointer; border: 2px solid _borderColor; text-align: center;'><div style='font-weight: bold; font-size: 16px; margin-bottom: 5px; color: _borderColor;'>Genitals<<if _npcWilling>> ✅<<elseif _npcReluctant>> ⚠️<</if>></div><div style='color: #aaa; font-size: 14px;'>_playerGenitals ↔️ _npcGenitals</div><div style='color: _borderColor; font-size: 13px; margin-top: 5px;'>Swap (Value: _partValue)<<if _npcWilling>><br>They're willing!<<elseif _npcReluctant>><br>They're reluctant (+30% cost)<</if>></div></div>">> <<run $playerTradePackage.bodyParts.push({name: "genitals", npc: _npc})>> <<run $npcTradePackage.bodyParts.push({name: "genitals", npc: _npc})>> <<goto "TradeInterface">> <</link>> <<elseif _npcBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Genitals</div> <div style='font-size: 14px;'>🚫 Won't Trade</div> </div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 15px; border-radius: 8px; border: 2px solid #666; text-align: center; opacity: 0.5;'> <div style='font-weight: bold; font-size: 16px; margin-bottom: 5px;'>Genitals</div> <div style='font-size: 14px;'>Already Selected</div> </div> <</if>> </div> </div> <</if>><!-- End body parts check for Bimbo --> <!-- PHYSICAL TRAITS SECTION --> <<set _availablePhysical = _isPlayerSide ? $physicalTraits : _npc.physicalTraits>> <<set _currentPackage = _isPlayerSide ? $playerTradePackage : $npcTradePackage>> <<set _oppositePackage = _isPlayerSide ? $npcTradePackage : $playerTradePackage>> <<set _oppositeTraits = _isPlayerSide ? _npc.physicalTraits : $physicalTraits>> <<set _displayPhysicalTraits = _availablePhysical.filter(function(trait) { return trait !== "Short Hair" && trait !== "Long Hair" && trait !== "Cuntboy" && trait !== "Futanari"; })>> <<if _displayPhysicalTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _trait range _displayPhysicalTraits>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<set _alreadyInPackage = _currentPackage.physical.includes(_trait)>> <<set _oppositeHasTrait = _oppositeTraits.includes(_trait)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.physical && _npcPrefs.desires.physical.includes(_trait)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.physical && _npcPrefs.willingToTrade.physical.includes(_trait)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.physical && _npcPrefs.reluctantToTrade.physical.includes(_trait)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.physical && _npcPrefs.neverTrade.physical.includes(_trait)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.physical && _npcPrefs.wontTradeFor.physical.includes(_trait)>> <!-- Check if trait is blocked by player's current transformation --> <<set _transformationBlocked = !_isPlayerSide && setup.isTraitBlockedByTransformation(_trait, "physical")>> <<set _oppositeConflict = setup.getConflictingTrait(_trait, _oppositeTraits)>> <<set _packageConflict = setup.getConflictingTrait(_trait, _currentPackage.physical)>> <<if _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#51cf66" : (_traitValue >= 0 ? "#51cf66" : "#ff6b6b")>> <<set _statusIcon = _npcDesires ? "💚" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+15%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked || _transformationBlocked>> <<set _blockedMessage = _transformationBlocked ? "Blocked by transformation" : "They won't give this up">> <<set _traitColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#51cf66"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_transformationBlocked ? "Blocked by transformation" : (_actuallyBlocked ? "Won't trade" : "")))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasTrait && !_packageConflict && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.physical.push(_trait)>> <<if _oppositeConflict>> <<run $npcTradePackage.physical.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.physical.push(_trait)>> <<if _oppositeConflict>> <<run $playerTradePackage.physical.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasTrait>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _packageConflict>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Conflicts with _packageConflict)</span></div> <<elseif _actuallyBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait 🚫 <span style='font-size: 13px;'>(_blockedMessage)</span></div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- MENTAL TRAITS SECTION --> <<set _availableMental = _isPlayerSide ? $mentalTraits.concat() : _npc.mentalTraits>> <<set _oppositeTraitsMental = _isPlayerSide ? _npc.mentalTraits : $mentalTraits>> <<if _isPlayerSide && $characterCreationTrait && !_availableMental.includes($characterCreationTrait)>> <<run _availableMental.push($characterCreationTrait)>> <</if>> <<if _availableMental.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _trait range _availableMental>> <<if _trait === "Perverted" || _trait === "Gambling Addiction">> <<continue>> <</if>> <<capture _trait>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<set _alreadyInPackage = _currentPackage.mental.includes(_trait)>> <<set _oppositeHasTrait = _oppositeTraitsMental.includes(_trait)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.mental && _npcPrefs.desires.mental.includes(_trait)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.mental && _npcPrefs.willingToTrade.mental.includes(_trait)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.mental && _npcPrefs.reluctantToTrade.mental.includes(_trait)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.mental && _npcPrefs.neverTrade.mental.includes(_trait)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.mental && _npcPrefs.wontTradeFor.mental.includes(_trait)>> <!-- Check if trait is blocked by player's current transformation --> <<set _transformationBlocked = !_isPlayerSide && setup.isTraitBlockedByTransformation(_trait, "mental")>> <<set _oppositeConflict = setup.getConflictingTrait(_trait, _oppositeTraitsMental)>> <<set _packageConflict = setup.getConflictingTrait(_trait, _currentPackage.mental)>> <<if _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#9b59b6" : (_traitValue >= 0 ? "#9b59b6" : "#ff6b6b")>> <<set _statusIcon = _npcDesires ? "💜" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+15%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked || _transformationBlocked>> <<set _blockedMessage = _transformationBlocked ? "Blocked by transformation" : "They won't give this up">> <<set _traitColor = _npcWilling ? "#9b59b6" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#9b59b6"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_transformationBlocked ? "Blocked by transformation" : (_actuallyBlocked ? "Won't trade" : "")))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasTrait && !_packageConflict && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.mental.push(_trait)>> <<if _oppositeConflict>> <<run $npcTradePackage.mental.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_trait _statusIcon <span style='color: _traitColor; font-size: 13px;'>(<<if _traitValue > 0>>+<</if>>_traitValue)</span><<if _oppositeConflict>> <span style='color: #ffc107; font-size: 12px;'>↔️ _oppositeConflict</span><</if>><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.mental.push(_trait)>> <<if _oppositeConflict>> <<run $playerTradePackage.mental.push(_oppositeConflict)>> <</if>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasTrait>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _packageConflict>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Conflicts with _packageConflict)</span></div> <<elseif _actuallyBlocked>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait 🚫 <span style='font-size: 13px;'>(_blockedMessage)</span></div> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_trait <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- SKILLS SECTION --> <<set _availableSkills = _isPlayerSide ? $skills : _npc.skills>> <<set _oppositeSkills = _isPlayerSide ? _npc.skills : $skills>> <<if _availableSkills.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h2> <div style="display: flex; flex-wrap: wrap; gap: 12px; margin-top: 15px;"> <<for _skill range _availableSkills>> <<capture _skill>> <<set _skillValue = setup.getTraitValue("skill", _skill)>> <<set _alreadyInPackage = _currentPackage.skills.includes(_skill)>> <<set _oppositeHasSkill = _oppositeSkills.includes(_skill)>> <<set _npcDesires = _npcPrefs && _npcPrefs.desires && _npcPrefs.desires.skills && _npcPrefs.desires.skills.includes(_skill)>> <<set _npcWilling = _npcPrefs && _npcPrefs.willingToTrade && _npcPrefs.willingToTrade.skills && _npcPrefs.willingToTrade.skills.includes(_skill)>> <<set _npcReluctant = _npcPrefs && _npcPrefs.reluctantToTrade && _npcPrefs.reluctantToTrade.skills && _npcPrefs.reluctantToTrade.skills.includes(_skill)>> <<set _npcBlocked = _npcPrefs && _npcPrefs.neverTrade && _npcPrefs.neverTrade.skills && _npcPrefs.neverTrade.skills.includes(_skill)>> <<set _npcWontAccept = _npcPrefs && _npcPrefs.wontTradeFor && _npcPrefs.wontTradeFor.skills && _npcPrefs.wontTradeFor.skills.includes(_skill)>> <!-- Soul trait can never be traded --> <<set _isSoulTrait = _skill === "Soul">> <<if _isSoulTrait>> <<set _actuallyBlocked = true>> <<set _blockedMessage = "Bound to your soul">> <<set _traitColor = "#9b59b6">> <<set _statusIcon = "🔮">> <<set _statusText = "Cannot be traded">> <<elseif _isPlayerSide>> <<set _actuallyBlocked = _npcWontAccept>> <<set _blockedMessage = "They don't want this">> <<set _traitColor = _npcDesires ? "#ffc107" : "#ffc107">> <<set _statusIcon = _npcDesires ? "💛" : (_npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : "")))>> <<set _statusText = _npcDesires ? "They want this! (+30%)" : (_npcWilling ? "" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_actuallyBlocked ? "Won't accept" : "")))>> <<else>> <<set _actuallyBlocked = _npcBlocked>> <<set _blockedMessage = "They won't give this up">> <<set _traitColor = _npcWilling ? "#51cf66" : (_npcReluctant ? "#ffc107" : (_actuallyBlocked ? "#ff6b6b" : "#ffc107"))>> <<set _statusIcon = _npcWilling ? "✅" : (_npcReluctant ? "⚠️" : (_actuallyBlocked ? "🚫" : ""))>> <<set _statusText = _npcWilling ? "They're willing!" : (_npcReluctant ? "They're reluctant (+30% cost)" : (_actuallyBlocked ? "Won't trade" : ""))>> <</if>> <<if !_alreadyInPackage && !_oppositeHasSkill && !_actuallyBlocked>> <<if _isPlayerSide>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_skill _statusIcon <span style='color: _traitColor; font-size: 13px;'>(+_skillValue)</span><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $playerTradePackage.skills.push(_skill)>> <<goto "TradeInterface">> <</link>> <<else>> <<link "<div style='background: #1a1a1a; color: #ccc; padding: 12px 20px; border-radius: 8px; cursor: pointer; border: 2px solid _traitColor; font-weight: 500; font-size: 15px;'>_skill _statusIcon <span style='color: _traitColor; font-size: 13px;'>(+_skillValue)</span><<if _statusText>> <div style='color: _traitColor; font-size: 12px; margin-top: 5px;'>_statusText</div><</if>></div>">> <<run $npcTradePackage.skills.push(_skill)>> <<goto "TradeInterface">> <</link>> <</if>> <<elseif _oppositeHasSkill>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill <span style='font-size: 13px;'>(Already Has)</span></div> <<elseif _actuallyBlocked>> <<if _isPlayerSide && _npcWontAccept>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill 🚫 <span style='font-size: 13px;'>(They don't want this)</span></div> <<else>> <div style='background: #1a1a1a; color: #ff6b6b; padding: 12px 20px; border-radius: 8px; border: 2px solid #ff6b6b; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill 🚫 <span style='font-size: 13px;'>(They won't give this up)</span></div> <</if>> <<else>> <div style='background: #1a1a1a; color: #666; padding: 12px 20px; border-radius: 8px; border: 2px solid #666; font-weight: 500; font-size: 15px; opacity: 0.5;'>_skill <span style='font-size: 13px;'>(Selected)</span></div> <</if>> <</capture>> <</for>> </div> </div> <</if>> <</if>><!-- End !_currentSideHasBimbo conditional --> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Trade Interface</div>">> <<goto "TradeInterface">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Safety check: ensure tradeResult exists --> <<if !$tradeResult>> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #dc3545;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Error</h1> <p style="color: white; margin: 0; font-size: 18px;">No trade result found</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go Back</div>">> <<goto $lastLocation>> <</link>> </div> <<elseif $tradeResult.success>> <!-- Unlock first trade achievement --> <<run setup.achievements.unlock("first_trade")>> <!-- Check for name trading achievement --> <<if $tradeResult.playerReceived.name && $tradeResult.playerReceived.name.length > 0>> <<run setup.achievements.unlock("trade_name_change")>> <</if>> <!-- Check for Lucky trait achievement --> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.includes("Lucky")>> <<run setup.achievements.unlock("lucky_trait")>> <</if>> <!-- Check for Bimbo trait achievement --> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.includes("Bimbo")>> <<run setup.achievements.unlock("become_bimbo")>> <</if>> <!-- Check for Mayor job achievement --> <<if $tradeResult.playerReceived.job && $tradeResult.playerReceived.job === "City Mayor">> <<run setup.achievements.unlock("become_mayor")>> <</if>> <!-- Check for Cuntboy or Futanari trait achievement (special gender trait) --> <<if $physicalTraits.includes("Cuntboy") || $physicalTraits.includes("Futanari")>> <<run setup.achievements.unlock("special_gender_trait")>> <</if>> <!-- Check for gigantic chest AND butt WITHOUT bimbo trait achievement --> <<if $bodyParts.chest === "gigantic" && $bodyParts.butt === "gigantic">> <<if !$mentalTraits || !$mentalTraits.includes("Bimbo")>> <<run setup.achievements.unlock("gigantic_no_bimbo")>> <</if>> <</if>> <!-- Check for high value trait (100+) achievement --> <<set _receivedHighValue = false>> <<if $tradeResult.playerReceived.physical && $tradeResult.playerReceived.physical.length > 0>> <<for _trait range $tradeResult.playerReceived.physical>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<if _traitValue >= 100>> <<set _receivedHighValue = true>> <</if>> <</for>> <</if>> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.length > 0>> <<for _trait range $tradeResult.playerReceived.mental>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<if _traitValue >= 100>> <<set _receivedHighValue = true>> <</if>> <</for>> <</if>> <<if $tradeResult.playerReceived.skills && $tradeResult.playerReceived.skills.length > 0>> <<for _trait range $tradeResult.playerReceived.skills>> <<set _traitValue = setup.getTraitValue("skill", _trait)>> <<if _traitValue >= 100>> <<set _receivedHighValue = true>> <</if>> <</for>> <</if>> <<if $tradeResult.playerReceived.job>> <<set _jobValue = setup.getTraitValue("job", $tradeResult.playerReceived.job)>> <<if _jobValue >= 100>> <<set _receivedHighValue = true>> <</if>> <</if>> <<if _receivedHighValue>> <<run setup.achievements.unlock("valuable_trait_trade")>> <</if>> <!-- Check for low success chance win (15% or lower) --> <<if $tradeResult.successChance && $tradeResult.successChance <= 15>> <<run setup.achievements.unlock("low_odds_success")>> <</if>> <!-- SUCCESS HEADER --> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">✅ Trade Successful!</h1> <p style="color: white; margin: 0; font-size: 18px;">The trade with _npc.name was successful</p> </div> <!-- Check for Bimbo trait changes --> <<set _playerGaveBimbo = $tradeResult.playerGave.mental && $tradeResult.playerGave.mental.includes("Bimbo")>> <<set _playerReceivedBimbo = $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.includes("Bimbo")>> <!-- Bimbo Transformation Section (if applicable) --> <<if _playerReceivedBimbo>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff69b4; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ff69b4; padding-bottom: 10px;">💋 Bimbo Transformation</h2> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff69b4;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(true)>> </p> </div> </div> <<elseif _playerGaveBimbo>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin-top: 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">🧠 Regaining Clarity</h2> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #17a2b8;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(false)>> </p> </div> </div> <</if>> <!-- NPC's Transformation Section --> <<set _npcTransformationDesc = setup.generateNPCCompleteTransformation(_npc, $tradeResult)>> <<if _npcTransformationDesc>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">🔄 _npc.name's Transformation</h2> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ffc107;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print _npcTransformationDesc>> </p> </div> </div> <</if>> <!-- What You Gave --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #dc3545; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #dc3545; margin-top: 0; font-size: 24px; border-bottom: 3px solid #dc3545; padding-bottom: 10px;">📤 What You Gave</h2> <<if $tradeResult.playerGave.name && $tradeResult.playerGave.name.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">👤 Name:</strong> <<for _item range $tradeResult.playerGave.name>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #9b59b6;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _item.type === "firstName">>First Name: _item.value<<else>>Last Name: _item.value<</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.physical && $tradeResult.playerGave.physical.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💪 Physical Traits:</strong> <<for _trait range $tradeResult.playerGave.physical>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #28a745;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.mental && $tradeResult.playerGave.mental.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🧠 Mental Traits:</strong> <<for _trait range $tradeResult.playerGave.mental>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #764ba2;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.skills && $tradeResult.playerGave.skills.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🎯 Skills:</strong> <<for _skill range $tradeResult.playerGave.skills>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #ffc107;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_skill</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.bodyParts && $tradeResult.playerGave.bodyParts.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🫀 Body Parts:</strong> <<for _part range $tradeResult.playerGave.bodyParts>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #dc3545;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _part.name === "chest">>Chest: _part.value <<elseif _part.name === "butt">>Butt: _part.value <<elseif _part.name === "gender">>Gender: _part.value <<elseif _part.name === "skinTone">>Skin Color: _part.value <<elseif _part.name === "hairColor">>Hair Color: _part.value <<elseif _part.name === "hairLength">>Hair Length: <<print _part.value ? _part.value.toUpperFirst() : "Short">> <<elseif _part.name === "age">>Age: _part.value <<elseif _part.name === "genitals">>Genitals: _part.value <</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerGave.job>> <div style="margin-bottom: 0;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💼 Job:</strong> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #17a2b8;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if $tradeResult.playerGave.job === "Unemployed">> <span style="color: #dc3545;">Unemployed</span> <<else>> $tradeResult.playerGave.job <</if>> </span> </div> </div> <</if>> </div> <!-- What You Received --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #28a745; margin-top: 0; font-size: 24px; border-bottom: 3px solid #28a745; padding-bottom: 10px;">📥 What You Received</h2> <<if $tradeResult.playerReceived.name && $tradeResult.playerReceived.name.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">👤 Name:</strong> <<for _item range $tradeResult.playerReceived.name>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #9b59b6;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _item.type === "firstName">>First Name: _item.value<<else>>Last Name: _item.value<</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.physical && $tradeResult.playerReceived.physical.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💪 Physical Traits:</strong> <<for _trait range $tradeResult.playerReceived.physical>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #28a745;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🧠 Mental Traits:</strong> <<for _trait range $tradeResult.playerReceived.mental>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #764ba2;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_trait</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.skills && $tradeResult.playerReceived.skills.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🎯 Skills:</strong> <<for _skill range $tradeResult.playerReceived.skills>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #ffc107;"> <span style="color: #fff; font-size: 16px; font-weight: 500;">_skill</span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.bodyParts && $tradeResult.playerReceived.bodyParts.length > 0>> <div style="margin-bottom: 20px;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">🫀 Body Parts:</strong> <<for _part range $tradeResult.playerReceived.bodyParts>> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #dc3545;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if _part.name === "chest">>Chest: _part.value <<elseif _part.name === "butt">>Butt: _part.value <<elseif _part.name === "gender">>Gender: _part.value <<elseif _part.name === "skinTone">>Skin Color: _part.value <<elseif _part.name === "hairColor">>Hair Color: _part.value <<elseif _part.name === "hairLength">>Hair Length: <<print _part.value ? _part.value.toUpperFirst() : "Short">> <<elseif _part.name === "age">>Age: _part.value <<elseif _part.name === "genitals">>Genitals: _part.value <</if>> </span> </div> <</for>> </div> <</if>> <<if $tradeResult.playerReceived.job>> <div style="margin-bottom: 0;"> <strong style="color: #ccc; font-size: 18px; display: block; margin-bottom: 10px;">💼 Job:</strong> <div style="background: #1a1a1a; padding: 12px; margin: 8px 0; border-radius: 6px; border: 2px solid #17a2b8;"> <span style="color: #fff; font-size: 16px; font-weight: 500;"> <<if $tradeResult.playerReceived.job === "Unemployed">> <span style="color: #dc3545;">Unemployed</span> <<else>> $tradeResult.playerReceived.job <</if>> </span> </div> </div> <</if>> </div> <!-- TRANSFORMATION DESCRIPTIONS SECTION --> <<if !_playerReceivedBimbo && !_playerGaveBimbo>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">🔄 Transformation</h2> <!-- Body Part Transformations --> <<if $tradeResult.playerReceived.bodyParts && $tradeResult.playerReceived.bodyParts.length > 0>> <<for _part range $tradeResult.playerReceived.bodyParts>> <<if _part.name === "chest">> <<set _oldSize = $tradeResult.playerGave.bodyParts.find(p => p.name === "chest").value>> <<set _newSize = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <<print setup.getChestTransformationText(_oldSize, _newSize)>> </div> <</if>> <<if _part.name === "butt">> <<set _oldSize = $tradeResult.playerGave.bodyParts.find(p => p.name === "butt").value>> <<set _newSize = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <<print setup.getButtTransformationText(_oldSize, _newSize)>> </div> <</if>> <<if _part.name === "gender">> <<set _oldGender = $tradeResult.playerGave.bodyParts.find(p => p.name === "gender").value>> <<set _newGender = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #FFD700;"> <<print setup.getGenderTransformationText(_oldGender, _newGender)>> </div> <</if>> <<if _part.name === "genitals">> <<set _oldGenitals = $tradeResult.playerGave.bodyParts.find(p => p.name === "genitals").value>> <<set _newGenitals = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #9370DB;"> <<print setup.getGenitalTransformationText(_oldGenitals, _newGenitals)>> </div> <!-- Check for special trait acquisition --> <<if $physicalTraits.includes("Cuntboy")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 15px; margin: 15px 0; border-radius: 8px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 16px;"> ✨ You've gained the "Cuntboy" trait - a male with a vagina! </p> </div> <<elseif $physicalTraits.includes("Futanari")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 15px; margin: 15px 0; border-radius: 8px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 16px;"> ✨ You've gained the "Futanari" trait - a female with a penis! </p> </div> <</if>> <</if>> <<if _part.name === "age">> <<set _oldAge = $tradeResult.playerGave.bodyParts.find(p => p.name === "age").value>> <<set _newAge = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #C0C0C0;"> <<print setup.getAgeTransformationText(_oldAge, _newAge)>> </div> <</if>> <<if _part.name === "hairColor">> <<set _oldColor = $tradeResult.playerGave.bodyParts.find(p => p.name === "hairColor").value>> <<set _newColor = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getHairColorTransformationText(_oldColor, _newColor)>> </p> </div> <</if>> <<if _part.name === "hairLength">> <<set _oldLength = $tradeResult.playerGave.bodyParts.find(p => p.name === "hairLength").value>> <<set _newLength = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getHairLengthTransformationText(_oldLength, _newLength)>> </p> </div> <</if>> <<if _part.name === "skinTone">> <<set _oldTone = $tradeResult.playerGave.bodyParts.find(p => p.name === "skinTone").value>> <<set _newTone = _part.value>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSkinToneTransformationText(_oldTone, _newTone)>> </p> </div> <</if>> <</for>> <</if>> <!-- Physical Trait Changes --> <<if $tradeResult.playerReceived.physical && $tradeResult.playerReceived.physical.length > 0>> <<for _trait range $tradeResult.playerReceived.physical>> <!-- Check for mutually exclusive swap --> <<set _oldTrait = null>> <<if $tradeResult.playerGave.physical && $tradeResult.playerGave.physical.length > 0>> <<for _gaveTrait range $tradeResult.playerGave.physical>> <<if setup.getConflictingTrait(_trait, [_gaveTrait]) === _gaveTrait>> <<set _oldTrait = _gaveTrait>> <</if>> <</for>> <</if>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #28a745;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<if _oldTrait>> <<print setup.getMutuallyExclusiveSwapText(_oldTrait, _trait)>> <<else>> <<print setup.getPhysicalTraitChangeText(_trait, true)>> <</if>> </p> </div> <!-- Special transformations --> <<if _trait === "Were-Creature">> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ffa500;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getWereCreatureTransformationText(true, "wolf")>> </p> </div> <<elseif _trait === "Definitely not a Vampire">> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #8b0000;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getVampireTransformationText(true)>> </p> </div> <<elseif _trait === "Sunfish">> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #4169e1;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSunfishTransformationText(true)>> </p> </div> <</if>> <</for>> <</if>> <!-- Mental Trait Changes --> <<if $tradeResult.playerReceived.mental && $tradeResult.playerReceived.mental.length > 0>> <<for _trait range $tradeResult.playerReceived.mental>> <!-- Check for mutually exclusive swap --> <<set _oldTrait = null>> <<if $tradeResult.playerGave.mental && $tradeResult.playerGave.mental.length > 0>> <<for _gaveTrait range $tradeResult.playerGave.mental>> <<if setup.getConflictingTrait(_trait, [_gaveTrait]) === _gaveTrait>> <<set _oldTrait = _gaveTrait>> <</if>> <</for>> <</if>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #764ba2;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<if _oldTrait>> <<print setup.getMutuallyExclusiveSwapText(_oldTrait, _trait)>> <<else>> <<print setup.getMentalTraitChangeText(_trait, true)>> <</if>> </p> </div> <</for>> <</if>> <!-- Skill Gains --> <<if $tradeResult.playerReceived.skills && $tradeResult.playerReceived.skills.length > 0>> <<for _skill range $tradeResult.playerReceived.skills>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ffc107;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSkillGainText(_skill)>> </p> </div> <</for>> <</if>> <!-- Job Knowledge --> <<if $tradeResult.playerReceived.job>> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #17a2b8;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getJobKnowledgeText($tradeResult.playerReceived.job)>> </p> </div> <</if>> </div> <</if>> <!-- Relationship Change from Trade --> <<if $tradeResult.relationshipChange > 0>> <div style="background: #2a4a2a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #51cf66; font-weight: bold; font-size: 16px;"> 💚 Trade completed! Relationship improved! (+<<print $tradeResult.relationshipChange>> points) </span> </div> <<elseif $tradeResult.relationshipChange < 0>> <div style="background: #2a4a2a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #ff6b6b; font-weight: bold; font-size: 16px;"> 💔 Trade completed! Relationship decreased! (<<print $tradeResult.relationshipChange>> points) </span> </div> <<else>> <div style="background: #2a4a2a; border: 2px solid #888; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: #ccc; font-weight: bold; font-size: 16px;"> 💚 Trade completed! No relationship change </span> </div> <</if>> <<else>> <!-- Check for high success chance failure (85% or higher) --> <<if $tradeResult.successChance && $tradeResult.successChance >= 85>> <<run setup.achievements.unlock("high_odds_failure")>> <</if>> <!-- FAILURE HEADER --> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #dc3545;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Trade Failed!</h1> <p style="color: white; margin: 0; font-size: 18px;">_npc.name rejected your offer</p> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="text-align: center;"> <h2 style="color: #ffc107; margin-top: 0; font-size: 24px;">⚠️ What Happened?</h2> <p style="color: #ccc; font-size: 16px; line-height: 1.6; margin: 20px 0;"> You failed to trade with _npc.name. You've now lost your chance to trade with them today. </p> <p style="color: #aaa; font-size: 15px; font-style: italic; margin: 20px 0;"> 💡 <strong>Tip:</strong> Offer more value next time to increase your chances of success. You can't attempt another trade with _npc.name until tomorrow. </p> <div style="background: #1a1a1a; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-top: 20px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;"> ⏰ Trades Remaining Today: $tradesRemainingToday / <<print 5 + ($bonusDailyTrades || 0)>> </p> </div> </div> </div> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<set $lastTradedNPC = _npc>> <<set $tradingWithNPC = $lastTradedNPC>> <<set $playerTradePackage = null>> <<set $npcTradePackage = null>> <<goto "NPCInteraction">> <</link>> </div> </div> <</nobr>>
:: StoryInit <<silently>> <<set $relationships = {}>> <<set $dayCount = $dayNumber>> <<set $imageSettings = { imagesEnabled: true, locationImagesEnabled: true, eroticImagesEnabled: true, // Erotic imagery (Secretary, Brothel, etc.) - ON by default npcImagesEnabled: true, // NPC character images - ON by default customImages: { face: "", chest: "", butt: "" } }>> <<if State.variables.imageSettings && State.variables.imageSettings.secretaryImagesEnabled !== undefined>> <<set $imageSettings.eroticImagesEnabled = $imageSettings.eroticImagesEnabled>> <<run delete $imageSettings.eroticImagesEnabled>> <</if>> /* ---------------------------------- */ /* --- MALL HOURS FUNCTION --- */ /* ---------------------------------- */ <<set setup.isMallOpen = function() { var minutes = State.variables.timeInMinutes; var hour = Math.floor(minutes / 60) % 24; // Mall is open from 9am (hour 9) to 5pm (hour 17) return (hour >= 9 && hour < 17); }>> /* ---------------------------------- */ /* --- HOME SYSTEM SETUP DATA --- */ /* ---------------------------------- */ /* Wall Paint Colors and Prices */ <<set setup.wallColors = { "Default Gray": "#2a2a2a", "Warm Cream": "#f5f0e6", "Ocean Blue": "#1e4d6b", "Forest Green": "#2d4a3e", "Soft Lavender": "#9b8aa3", "Sunset Orange": "#8b4513", "Midnight Purple": "#2d1b4e", "Rose Pink": "#8b5a6b", "Charcoal": "#1a1a1a", "Sky Blue": "#4a7c9b" }>> <<set setup.paintPrices = { "Default Gray": 0, "Warm Cream": 50, "Ocean Blue": 75, "Forest Green": 75, "Soft Lavender": 100, "Sunset Orange": 100, "Midnight Purple": 125, "Rose Pink": 125, "Charcoal": 50, "Sky Blue": 100 }>> /* Grocery Ingredients */ <<set setup.ingredients = { eggs: {name: "Eggs", price: 5, unit: "dozen"}, milk: {name: "Milk", price: 4, unit: "gallon"}, bread: {name: "Bread", price: 3, unit: "loaf"}, butter: {name: "Butter", price: 5, unit: "pack"}, cheese: {name: "Cheese", price: 7, unit: "block"}, chicken: {name: "Chicken Breast", price: 12, unit: "pack"}, beef: {name: "Ground Beef", price: 15, unit: "lb"}, rice: {name: "Rice", price: 8, unit: "bag"}, pasta: {name: "Pasta", price: 3, unit: "box"}, vegetables: {name: "Mixed Vegetables", price: 6, unit: "bag"}, fruit: {name: "Fresh Fruit", price: 8, unit: "bag"}, spices: {name: "Spice Set", price: 15, unit: "set"} }>> /* Cooking Recipes */ <<set setup.recipes = { scrambledEggs: { name: "Scrambled Eggs", ingredients: {eggs: 1, butter: 1}, ingredientCost: 5, buffDuration: 360, time: 15, requiresCooking: false, buffId: "food_morning_boost" }, grilledCheese: { name: "Grilled Cheese", ingredients: {bread: 1, cheese: 1, butter: 1}, ingredientCost: 8, buffDuration: 480, time: 20, requiresCooking: false, buffId: "food_comfort" }, chickenStirFry: { name: "Chicken Stir Fry", ingredients: {chicken: 1, vegetables: 1, rice: 1}, ingredientCost: 15, buffDuration: 720, time: 45, requiresCooking: true, buffId: "food_well_fed" }, pastaAlfredo: { name: "Pasta Alfredo", ingredients: {pasta: 1, butter: 1, cheese: 1, chicken: 1}, ingredientCost: 18, buffDuration: 600, time: 40, requiresCooking: true, buffId: "food_treasure_hunter" }, beefBurger: { name: "Homemade Burger", ingredients: {beef: 1, bread: 1, vegetables: 1, cheese: 1}, ingredientCost: 20, buffDuration: 720, time: 35, requiresCooking: true, buffId: "food_hearty_meal" }, fruitSmoothie: { name: "Fruit Smoothie", ingredients: {fruit: 1, milk: 1}, ingredientCost: 6, buffDuration: 360, time: 10, requiresCooking: false, buffId: "food_social_glow" } }>> /* Food Buffs - Applied when eating cooked food from inventory */ <<set setup.foodBuffs = { food_morning_boost: { name: "Morning Boost", description: "+$2-5 from all money sources", icon: "🌅", effect: "money_bonus", bonusMin: 2, bonusMax: 5 }, food_comfort: { name: "Comfort Food", description: "+10% Trading bonus", icon: "🧀", effect: "trading_bonus", tradingBonus: 0.10 }, food_social_glow: { name: "Social Glow", description: "+1 relationship points per daily talk", icon: "✨", effect: "relationship_bonus", relationshipBonus: 1 }, food_well_fed: { name: "Well Fed", description: "+15% Trading bonus", icon: "🍗", effect: "trading_bonus", tradingBonus: 0.15 }, food_treasure_hunter: { name: "Treasure Hunter", description: "+1% treasure chance, -1% trash in fishing", icon: "💎", effect: "fishing_luck", treasureBonus: 0.01, trashReduction: 0.01 }, food_hearty_meal: { name: "Hearty Meal", description: "+2 relationship points per daily talk", icon: "🍔", effect: "relationship_bonus", relationshipBonus: 2 } }>> /* Decor Items - Basic (Mall Floor 2 - Coral Furnishings) */ <<set setup.decorItems = { basic: [ {id: "poster_nature", name: "Nature Poster", price: 25, room: ["bedroom", "livingRoom", "masterBedroom"], desc: "A calming forest scene"}, {id: "poster_city", name: "City Skyline Poster", price: 25, room: ["bedroom", "livingRoom", "masterBedroom"], desc: "Urban nightscape"}, {id: "small_plant", name: "Potted Succulent", price: 35, room: ["bedroom", "bathroom", "kitchen", "livingRoom", "masterBedroom"], desc: "Low-maintenance greenery"}, {id: "desk_lamp", name: "Modern Desk Lamp", price: 45, room: ["bedroom", "office", "masterBedroom"], desc: "Sleek LED lighting"}, {id: "throw_pillow", name: "Decorative Pillow Set", price: 40, room: ["bedroom", "livingRoom", "masterBedroom"], desc: "Adds comfort and color"}, {id: "wall_clock", name: "Minimalist Wall Clock", price: 55, room: ["kitchen", "livingRoom", "office"], desc: "Simple and functional"}, {id: "small_rug", name: "Accent Rug", price: 80, room: ["bedroom", "livingRoom", "masterBedroom"], desc: "Soft underfoot"}, {id: "photo_frame", name: "Photo Frame Set", price: 30, room: ["bedroom", "livingRoom", "office", "masterBedroom"], desc: "Display your memories"}, {id: "candle_set", name: "Scented Candle Set", price: 35, room: ["bedroom", "bathroom", "livingRoom", "masterBedroom"], desc: "Lavender and vanilla"}, {id: "bathroom_mat", name: "Plush Bath Mat", price: 45, room: ["bathroom"], desc: "Soft and absorbent"}, {id: "towel_set", name: "Premium Towel Set", price: 60, room: ["bathroom"], desc: "Egyptian cotton"}, {id: "kitchen_art", name: "Kitchen Wall Art", price: 40, room: ["kitchen"], desc: "Food-themed prints"} ], premium: [ {id: "art_abstract", name: "Abstract Canvas Art", price: 250, room: ["livingRoom", "bedroom", "masterBedroom"], desc: "Museum-quality print"}, {id: "art_sculpture", name: "Modern Sculpture", price: 400, room: ["livingRoom", "office"], desc: "Conversation piece"}, {id: "designer_lamp", name: "Designer Floor Lamp", price: 350, room: ["livingRoom", "bedroom", "masterBedroom"], desc: "Italian design"}, {id: "persian_rug", name: "Persian Area Rug", price: 800, room: ["livingRoom", "bedroom", "masterBedroom"], desc: "Hand-woven luxury"}, {id: "crystal_vase", name: "Crystal Vase", price: 200, room: ["livingRoom", "bedroom", "masterBedroom"], desc: "Swarovski elements"}, {id: "bookshelf", name: "Mahogany Bookshelf", price: 600, room: ["livingRoom", "office", "bedroom", "masterBedroom"], desc: "Solid hardwood"}, {id: "massage_chair", name: "Massage Chair", price: 1500, room: ["livingRoom", "bedroom", "masterBedroom"], desc: "Full-body relaxation"}, {id: "spa_kit", name: "Luxury Spa Kit", price: 300, room: ["bathroom"], desc: "Premium bath products"}, {id: "rain_shower", name: "Rain Showerhead", price: 450, room: ["bathroom"], desc: "Spa-like experience"}, {id: "wine_rack", name: "Wine Rack Cabinet", price: 350, room: ["kitchen", "livingRoom"], desc: "Holds 24 bottles"}, {id: "espresso_machine", name: "Espresso Machine", price: 500, room: ["kitchen"], desc: "Barista quality"}, {id: "smart_mirror", name: "Smart Mirror", price: 400, room: ["bathroom", "bedroom", "masterBedroom"], desc: "With LED and info display"} ], aquarium: [ {id: "coral_replica", name: "Coral Reef Replica", price: 150, room: ["aquariumRoom", "bathroom", "livingRoom"], desc: "Colorful ocean decor"}, {id: "shell_collection", name: "Shell Collection Display", price: 75, room: ["bathroom", "bedroom", "livingRoom", "masterBedroom"], desc: "Beach treasures"}, {id: "fish_mobile", name: "Fish Mobile", price: 65, room: ["bedroom", "aquariumRoom", "masterBedroom"], desc: "Gentle movement"}, {id: "ocean_painting", name: "Ocean Scene Painting", price: 180, room: ["livingRoom", "aquariumRoom"], desc: "Serene seascape"}, {id: "anchor_decor", name: "Decorative Anchor", price: 90, room: ["livingRoom", "bathroom"], desc: "Nautical accent"}, {id: "seahorse_lamp", name: "Seahorse Table Lamp", price: 120, room: ["bedroom", "livingRoom", "aquariumRoom", "masterBedroom"], desc: "Soft ambient glow"}, {id: "diver_figurine", name: "Vintage Diver Figurine", price: 85, room: ["aquariumRoom", "office"], desc: "Nostalgic charm"}, {id: "wave_sound", name: "Ocean Wave Sound Machine", price: 55, room: ["bedroom", "bathroom", "masterBedroom"], desc: "Relaxing sounds"} ] }>> /* Aquarium Capacity Upgrades */ <<set setup.aquariumCapacityUpgrades = [ {level: 1, capacity: 10, cost: 0}, {level: 2, capacity: 20, cost: 2000}, {level: 3, capacity: 35, cost: 5000}, {level: 4, capacity: 50, cost: 10000} ]>> /* Fish Rarity Colors */ <<set setup.fishRarityColors = { common: "#9e9e9e", uncommon: "#51cf66", rare: "#1e90ff", epic: "#667eea", legendary: "#ffd700", mythical: "#ff6b9d" }>> /* Fish Feeding Animation Function */ <<set setup.feedFishAnimation = function() { var tank = document.getElementById('aquarium-tank'); if (!tank) return; var pellet = document.createElement('div'); pellet.className = 'pellet'; pellet.style.cssText = 'position: absolute; width: 8px; height: 8px; background: #8B4513; border-radius: 50%; transition: top 2s ease-in;'; var pelletX = Math.random() * 60 + 20; pellet.style.left = pelletX + '%'; pellet.style.top = '5%'; tank.appendChild(pellet); setTimeout(function() { pellet.style.top = '75%'; }, 100); var fish = document.querySelectorAll('.swimming-fish'); fish.forEach(function(f, i) { setTimeout(function() { f.style.left = (pelletX + (Math.random() * 10 - 5)) + '%'; f.style.top = '70%'; }, 500 + i * 150); }); setTimeout(function() { if (pellet.parentNode) pellet.remove(); var result = document.getElementById('feed-result'); if (result) result.innerHTML = '<p style="color: #51cf66; margin: 10px 0;">The fish swim excitedly for their meal!</p>'; }, 2500); setTimeout(function() { fish.forEach(function(f) { f.style.left = (Math.random() * 75) + '%'; f.style.top = (Math.random() * 60 + 10) + '%'; }); }, 4000); }>> /* ---------------------------------- */ /* --- ROOM RENOVATION SYSTEM --- */ /* ---------------------------------- */ /* Room Renovation Options by Size */ <<set setup.roomRenovations = { small: [ { id: "home_gym", name: "Home Gym", icon: "🏋️", cost: 2500, description: "A compact workout space with essential equipment.", benefit: "Free daily workout at home", color: "#e74c3c", passage: "RoomHomeGym" }, { id: "art_studio", name: "Art Studio", icon: "🎨", cost: 3000, description: "A creative space with easels, canvases, and art supplies.", benefit: "Paint pictures to sell or decorate your home", color: "#9b59b6", passage: "RoomArtStudio" }, /* DISABLED - Study room { id: "study", name: "Study", icon: "📚", cost: 2000, description: "A quiet reading room with bookshelves and a comfortable chair.", benefit: "Store and read books (Coming Soon)", color: "#8b4513", passage: "RoomStudy" }, */ { id: "guest_bedroom", name: "Guest Bedroom", icon: "🛏️", cost: 3500, description: "A cozy bedroom for overnight guests.", benefit: "NPC sleepovers for level 2+ relationships", color: "#3498db", passage: "RoomGuestBedroom", comingSoon: true }, { id: "small_fish_tank", name: "Small Fish Tank", icon: "🐠", cost: 1500, description: "A modest aquarium for displaying your fish collection.", benefit: "Display up to 5 fish (Common to Epic only)", color: "#1e90ff", passage: "RoomSmallFishTank" } ], medium: [ { id: "home_office", name: "Home Office", icon: "💼", cost: 5000, description: "A professional workspace with desk, computer, and filing cabinets.", benefit: "+2 bonus daily trades", color: "#2c3e50", passage: "RoomHomeOffice" }, { id: "medium_fish_tank", name: "Medium Aquarium", icon: "🐟", cost: 4000, description: "A larger aquarium with more space for your fish collection.", benefit: "Display up to 15 fish (Common to Epic only)", color: "#1e90ff", passage: "RoomMediumFishTank" }, { id: "laboratory", name: "Laboratory", icon: "🧪", cost: 45000, description: "A high-tech research lab with advanced equipment for scientific experiments and trait research.", benefit: "Research traits, train intelligence, future trait combination", color: "#00d4aa", passage: "RoomLaboratory" } ], large: [ { id: "professional_gym", name: "Professional Gym", icon: "🏆", cost: 15000, description: "A fully-equipped gym with professional-grade equipment.", benefit: "Train stats faster, increase stat potential, train stamina/flexibility", color: "#e74c3c", passage: "RoomProfessionalGym" }, { id: "streaming_studio", name: "Streaming Studio", icon: "📺", cost: 20000, description: "A professional streaming setup with lighting, soundproofing, and high-end equipment.", benefit: "Universal bonus to all stream categories", color: "#9146ff", passage: "RoomStreamingStudio" }, /* DISABLED - Home Theater room { id: "home_theater", name: "Home Theater", icon: "🎬", cost: 25000, description: "A luxurious theater room with surround sound and comfortable seating.", benefit: "Movie nights with NPCs (level 2+ relationships)", color: "#c0392b", passage: "RoomHomeTheater" }, */ /* DISABLED - Dungeon room { id: "dungeon", name: "Dungeon", icon: "⛓️", cost: 30000, description: "A private space equipped for BDSM activities.", benefit: "Train dom/sub/roleplay/fetishPlay sexual skills", color: "#2c3e50", passage: "RoomDungeon" }, */ /* DISABLED - Dance Studio room { id: "dance_studio", name: "Dance Studio", icon: "💃", cost: 18000, description: "A mirrored studio with a dance floor and barre.", benefit: "Train rhythm sexual skill, stripper job bonus", color: "#e83e8c", passage: "RoomDanceStudio" } */ ] }>> /* Fish Tank Capacity by Room Size */ <<set setup.fishTankCapacity = { small: 5, medium: 15, mansion: 50 }>> /* Fish rarities allowed in smaller tanks (not mythical/legendary) */ <<set setup.smallTankAllowedRarities = ["common", "uncommon", "rare", "epic"]>> /* ---------------------------------- */ /* --- HOME SYSTEM HELPER FUNCTIONS --- */ /* ---------------------------------- */ <<set setup.getCurrentHome = function() { var v = State.variables; if (v.houseLocation === "ResidentialMansions") return "PlayerModernMansion"; if (v.houseLocation === "ResidentialExpensiveHomes") return "PlayerExpensiveHome"; if (v.houseLocation === "ResidentialNormalHomes") return "PlayerSuburbanHome"; return "StudioApartment"; }>> <<set setup.getCurrentBathroom = function() { var home = setup.getCurrentHome(); var bathroomMap = { "StudioApartment": "StudioBathroom", "PlayerSuburbanHome": "PlayerSuburbanBathroom", "PlayerExpensiveHome": "PlayerExpensiveBathroom", "PlayerModernMansion": "PlayerMansionBathroom" }; return bathroomMap[home]; }>> <<set setup.hasLuxuryBathroom = function() { var home = setup.getCurrentHome(); return home === "PlayerExpensiveHome" || home === "PlayerModernMansion"; }>> <<set setup.getDecorForRoom = function(room) { var home = setup.getCurrentHome(); var v = State.variables; if (!v.homeDecor || !v.homeDecor[home]) return []; return v.homeDecor[home][room] || []; }>> <<set setup.addDecorToRoom = function(itemId, room) { var home = setup.getCurrentHome(); var v = State.variables; if (!v.homeDecor[home][room]) { v.homeDecor[home][room] = []; } v.homeDecor[home][room].push(itemId); }>> <<set setup.hasDecorItem = function(itemId) { var home = setup.getCurrentHome(); var v = State.variables; if (!v.homeDecor || !v.homeDecor[home]) return false; var homeDecor = v.homeDecor[home]; for (var room in homeDecor) { if (Array.isArray(homeDecor[room]) && homeDecor[room].includes(itemId)) { return true; } } return false; }>> <<set setup.getDecorItem = function(itemId) { var categories = ["basic", "premium", "aquarium"]; for (var i = 0; i < categories.length; i++) { var items = setup.decorItems[categories[i]]; for (var j = 0; j < items.length; j++) { if (items[j].id === itemId) return items[j]; } } return null; }>> <<set setup.canCookRecipe = function(recipeId) { var recipe = setup.recipes[recipeId]; if (!recipe) return false; var v = State.variables; for (var ingredient in recipe.ingredients) { var needed = recipe.ingredients[ingredient]; var have = (v.kitchenInventory && v.kitchenInventory.ingredients[ingredient]) || 0; // Hucow provides unlimited milk if (ingredient === "milk" && v.physicalTraits && v.physicalTraits.includes("Hucow")) { continue; } if (have < needed) return false; } return true; }>> <<set setup.consumeIngredients = function(recipeId) { var recipe = setup.recipes[recipeId]; var v = State.variables; // Hucow provides unlimited milk - don't consume it var hasHucow = v.physicalTraits && v.physicalTraits.includes("Hucow"); for (var ingredient in recipe.ingredients) { // Skip milk consumption if player has Hucow trait if (ingredient === "milk" && hasHucow) continue; v.kitchenInventory.ingredients[ingredient] -= recipe.ingredients[ingredient]; } }>> <<set setup.getBodyDescription = function(part, size) { var descriptions = { chest: { flat: "flat chest", "flat masculine": "flat chest", small: "small breasts", medium: "modest breasts", large: "large breasts", huge: "huge breasts", giant: "massive breasts", gigantic: "enormous breasts" }, butt: { flat: "flat rear", "flat masculine": "flat rear", small: "small butt", medium: "round butt", large: "large butt", huge: "huge butt", giant: "massive butt", gigantic: "enormous butt" }, penis: { "small penis": "modest cock", penis: "cock", "big penis": "large cock", "huge penis": "huge cock", "giant penis": "massive cock" } }; if (descriptions[part] && descriptions[part][size]) { return descriptions[part][size]; } return size + " " + part; }>> /* ---------------------------------- */ /* --- LOAD SEPARATE DATA PASSAGES --- */ /* ---------------------------------- */ <<include "InitPlayerData">> <<include "InitGameSystems">> <<include "InitNPCData">> <<include "InitTimeSystem">> /* ---------------------------------- */ /* --- JOB INCOME RATES --- */ /* ---------------------------------- */ <<set setup.jobIncome = { // Tier 0 "Unemployed": 0, // Tier 1 "Street Performer": 8, "Package Courier": 10, "Construction Worker": 12, "Dock Worker": 15, "Security Guard": 12, "Baker": 10, "Maid": 10, // Tier 2 "Hooker": 25, "Stripper": 30, "Prostitute": 28, "Fitness Shop Clerk": 20, "Ecentric Shop Worker": 18, "Tech Store Clerk": 25, "Adult Store Clerk": 20, "Beauty Salon Stylist": 28, "Brothel Worker": 35, "Model": 32, "Bouncer": 30, // Tier 3 "Clinic Assistant": 55, "Data Analyst": 65, "Negotiator": 70, "Enforcer": 60, "Porn Star": 75, "Social Media Influencer": 50, "Black Market Dealer": 80, "Police Officer": 55, // Tier 4 "Brothel Owner": 150, "Mayor's Secretary": 120, "City Mayor": 200 }>> /* Get income for player's current job */ <<set setup.getJobIncome = function() { var v = State.variables; if (v.jobs && v.jobs.length > 0) { var jobName = v.jobs[0]; return setup.jobIncome[jobName] || 0; } return 0; }>> /* Work at current job and earn money */ <<set setup.workJob = function() { var v = State.variables; var income = setup.getJobIncome(); if (income > 0) { v.money += income; return income; } return 0; }>> <<set $hoursWorkedToday = 0>> <<set $lastWorkDay = 0>> <<set $lastWorkLocation = "">> <<set $hasChangedNameLegally = false>> /* ---------------------------------- */ /* --- HOME SYSTEM VARIABLES --- */ /* ---------------------------------- */ /* Home upgrade tracking */ <<set $homeUpgrades = { improvedShower: false, waterHeater: false, kitchenUpgrade: false, comfortableBed: false, entertainmentSystem: false }>> /* Per-home decoration and wall colors */ <<set $savedWallColors = []>> <<set $homeDecor = { StudioApartment: { roomColors: { bedroom: "#2a2a2a", bathroom: "#2a2a2a", kitchen: "#2a2a2a" }, bedroom: [], bathroom: [], kitchen: [] }, PlayerSuburbanHome: { roomColors: { bedroom: "#2a2a2a", bathroom: "#2a2a2a", kitchen: "#2a2a2a", livingRoom: "#2a2a2a" }, bedroom: [], bathroom: [], kitchen: [], livingRoom: [] }, PlayerExpensiveHome: { roomColors: { bedroom: "#2a2a2a", bathroom: "#2a2a2a", kitchen: "#2a2a2a", livingRoom: "#2a2a2a", office: "#2a2a2a" }, bedroom: [], bathroom: [], kitchen: [], livingRoom: [], office: [] }, PlayerModernMansion: { roomColors: { masterBedroom: "#2a2a2a", bathroom: "#2a2a2a", kitchen: "#2a2a2a", livingRoom: "#2a2a2a", office: "#2a2a2a", aquariumRoom: "#2a2a2a" }, masterBedroom: [], bathroom: [], kitchen: [], livingRoom: [], office: [], aquariumRoom: [] } }>> /* Mansion aquarium system */ <<set $mansionAquarium = { fish: [], capacity: 10, capacityLevel: 1, decorations: [], lastFedTime: 0 }>> /* Kitchen/cooking system */ <<set $kitchenInventory = { ingredients: {} }>> /* Food inventory - stores cooked meals */ <<set $foodInventory = []>> /* Masturbation tracking */ <<set $masturbationStats = { timesTotal: 0, lastLocation: "", toysUsed: { dildo: 0, fleshlight: 0 } }>> /* Player hygiene/comfort stats (if not already defined) */ <<if $hygiene === undefined>><<set $hygiene = 100>><</if>> <<if $relaxation === undefined>><<set $relaxation = 50>><</if>> <<if $stress === undefined>><<set $stress = 0>><</if>> <</silently>>
<<nobr>> <h1 style="color: #667eea; text-align: center;">⚙️ Trait Bonus Configuration</h1> <div style="background: #2d2d2d; padding: 20px; border-radius: 10px; color: #fff; margin-bottom: 20px;"> <p style="color: #ccc; text-align: center;">Configure stat bonuses and effects for Physical and Mental traits</p> </div> <!-- PHYSICAL TRAITS SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #28a745;"> <h2 style="color: #28a745; margin-top: 0; border-bottom: 3px solid #28a745; padding-bottom: 10px;">💪 Physical Trait Bonuses</h2> <div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #333; margin-top: 0;">Current Physical Trait Bonuses:</h3> <<set _physicalTraitsList = ["Tall", "Short", "Muscular", "Curvy", "Petite", "Broad-shouldered", "Flexible", "Strong", "Quick", "Graceful", "Sturdy", "Lean", "Soft", "Sharp Features", "Smooth Skin", "Scarred", "Pierced", "Youthful", "Mature", "Tattooed"]>> <<for _trait range _physicalTraitsList>> <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #28a745;"> <h4 style="color: #28a745; margin: 0 0 10px 0;">_trait</h4> <<if setup.physicalTraitBonuses && setup.physicalTraitBonuses[_trait]>> <<set _bonuses = setup.physicalTraitBonuses[_trait]>> <div style="color: #333; margin-bottom: 10px;"> <strong>Current Bonuses:</strong><br> <<if _bonuses.charisma>>Charisma: +_bonuses.charisma<br><</if>> <<if _bonuses.dexterity>>Dexterity: +_bonuses.dexterity<br><</if>> <<if _bonuses.strength>>Strength: +_bonuses.strength<br><</if>> <<if _bonuses.intelligence>>Intelligence: +_bonuses.intelligence<br><</if>> <<if _bonuses.description>><em style="color: #666;">_bonuses.description</em><</if>> </div> <<else>> <p style="color: #999; font-style: italic; margin: 5px 0;">No bonuses configured</p> <</if>> <details style="margin-top: 10px;"> <summary style="cursor: pointer; color: #28a745; font-weight: bold;">Configure Bonuses</summary> <div style="padding: 15px; background: #f0f0f0; margin-top: 10px; border-radius: 5px;"> <<set _traitId = _trait.replace(/\s+/g, '')>> <label style="display: block; margin: 10px 0; color: #333;"> Charisma Bonus: <input type="number" @id="'cha_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Dexterity Bonus: <input type="number" @id="'dex_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Strength Bonus: <input type="number" @id="'str_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Intelligence Bonus: <input type="number" @id="'int_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Description: <input type="text" @id="'desc_' + _traitId" placeholder="Effect description" style="margin-left: 10px; padding: 5px; width: 300px;"> </label> <<capture _trait, _traitId>> <<link "<div style='background: #28a745; color: white; padding: 8px 15px; border-radius: 5px; text-align: center; margin-top: 10px; cursor: pointer;'>Save Bonuses</div>">> <<set _cha = parseInt(jQuery('#cha_' + _traitId).val()) || 0>> <<set _dex = parseInt(jQuery('#dex_' + _traitId).val()) || 0>> <<set _str = parseInt(jQuery('#str_' + _traitId).val()) || 0>> <<set _int = parseInt(jQuery('#int_' + _traitId).val()) || 0>> <<set _desc = jQuery('#desc_' + _traitId).val()>> <<if !setup.physicalTraitBonuses>> <<set setup.physicalTraitBonuses = {}>> <</if>> <<set setup.physicalTraitBonuses[_trait] = {}>> <<if _cha > 0>><<set setup.physicalTraitBonuses[_trait].charisma = _cha>><</if>> <<if _dex > 0>><<set setup.physicalTraitBonuses[_trait].dexterity = _dex>><</if>> <<if _str > 0>><<set setup.physicalTraitBonuses[_trait].strength = _str>><</if>> <<if _int > 0>><<set setup.physicalTraitBonuses[_trait].intelligence = _int>><</if>> <<if _desc && _desc.trim()>><<set setup.physicalTraitBonuses[_trait].description = _desc>><</if>> <<goto "TraitBonusManager">> <</link>> <</capture>> </div> </details> </div> <</for>> </div> </div> <!-- MENTAL TRAITS SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #764ba2;"> <h2 style="color: #764ba2; margin-top: 0; border-bottom: 3px solid #764ba2; padding-bottom: 10px;">🧠 Mental Trait Bonuses</h2> <div style="background: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #333; margin-top: 0;">Current Mental Trait Bonuses:</h3> <<set _mentalTraitsList = ["Intelligent", "Creative", "Analytical", "Empathetic", "Confident", "Shy", "Outgoing", "Patient", "Ambitious", "Curious", "Witty", "Calm", "Energetic", "Thoughtful", "Competitive", "Friendly", "Logical", "Shrewd", "Extroverted", "Introverted", "Bitchy", "Kind", "Sly", "Honest", "Dominant", "Submissive", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Stubborn", "Flexible", "Jealous", "Supportive"]>> <<for _trait range _mentalTraitsList>> <div style="background: white; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #764ba2;"> <h4 style="color: #764ba2; margin: 0 0 10px 0;">_trait</h4> <<if setup.mentalTraitBonuses && setup.mentalTraitBonuses[_trait]>> <<set _bonuses = setup.mentalTraitBonuses[_trait]>> <div style="color: #333; margin-bottom: 10px;"> <strong>Current Bonuses:</strong><br> <<if _bonuses.charisma>>Charisma: +_bonuses.charisma<br><</if>> <<if _bonuses.dexterity>>Dexterity: +_bonuses.dexterity<br><</if>> <<if _bonuses.strength>>Strength: +_bonuses.strength<br><</if>> <<if _bonuses.intelligence>>Intelligence: +_bonuses.intelligence<br><</if>> <<if _bonuses.description>><em style="color: #666;">_bonuses.description</em><</if>> </div> <<else>> <p style="color: #999; font-style: italic; margin: 5px 0;">No bonuses configured</p> <</if>> <details style="margin-top: 10px;"> <summary style="cursor: pointer; color: #764ba2; font-weight: bold;">Configure Bonuses</summary> <div style="padding: 15px; background: #f0f0f0; margin-top: 10px; border-radius: 5px;"> <<set _traitId = _trait.replace(/\s+/g, '')>> <label style="display: block; margin: 10px 0; color: #333;"> Charisma Bonus: <input type="number" @id="'cha_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Dexterity Bonus: <input type="number" @id="'dex_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Strength Bonus: <input type="number" @id="'str_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Intelligence Bonus: <input type="number" @id="'int_m_' + _traitId" min="0" max="10" value="0" style="margin-left: 10px; padding: 5px; width: 60px;"> </label> <label style="display: block; margin: 10px 0; color: #333;"> Description: <input type="text" @id="'desc_m_' + _traitId" placeholder="Effect description" style="margin-left: 10px; padding: 5px; width: 300px;"> </label> <<capture _trait, _traitId>> <<link "<div style='background: #764ba2; color: white; padding: 8px 15px; border-radius: 5px; text-align: center; margin-top: 10px; cursor: pointer;'>Save Bonuses</div>">> <<set _cha = parseInt(jQuery('#cha_m_' + _traitId).val()) || 0>> <<set _dex = parseInt(jQuery('#dex_m_' + _traitId).val()) || 0>> <<set _str = parseInt(jQuery('#str_m_' + _traitId).val()) || 0>> <<set _int = parseInt(jQuery('#int_m_' + _traitId).val()) || 0>> <<set _desc = jQuery('#desc_m_' + _traitId).val()>> <<if !setup.mentalTraitBonuses>> <<set setup.mentalTraitBonuses = {}>> <</if>> <<set setup.mentalTraitBonuses[_trait] = {}>> <<if _cha > 0>><<set setup.mentalTraitBonuses[_trait].charisma = _cha>><</if>> <<if _dex > 0>><<set setup.mentalTraitBonuses[_trait].dexterity = _dex>><</if>> <<if _str > 0>><<set setup.mentalTraitBonuses[_trait].strength = _str>><</if>> <<if _int > 0>><<set setup.mentalTraitBonuses[_trait].intelligence = _int>><</if>> <<if _desc && _desc.trim()>><<set setup.mentalTraitBonuses[_trait].description = _desc>><</if>> <<goto "TraitBonusManager">> <</link>> <</capture>> </div> </details> </div> <</for>> </div> </div> <!-- EXPORT/IMPORT SECTION --> <div style="background: white; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 3px solid #ffc107;"> <h2 style="color: #e67e00; margin-top: 0; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">💾 Export/Import Configuration</h2> <div style="margin-bottom: 15px;"> <<link "<div style='background: #ffc107; color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>📋 Copy Configuration to Clipboard</div>">> <<set _config = { physical: setup.physicalTraitBonuses || {}, mental: setup.mentalTraitBonuses || {} }>> <<set _configJSON = JSON.stringify(_config, null, 2)>> <<run navigator.clipboard.writeText(_configJSON)>> <<script>>UI.alert("Configuration copied to clipboard!");<</script>> <</link>> </div> <div> <p style="color: #333; font-weight: bold;">Paste Configuration JSON:</p> <textarea id="importConfig" style="width: 100%; height: 150px; padding: 10px; font-family: monospace; background: #f8f9fa; border: 2px solid #ffc107; border-radius: 5px;" placeholder='Paste JSON configuration here...'></textarea> <<link "<div style='background: #28a745; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>📥 Import Configuration</div>">> <<set _importJSON = jQuery('#importConfig').val()>> <<try>> <<set _imported = JSON.parse(_importJSON)>> <<set setup.physicalTraitBonuses = _imported.physical || {}>> <<set setup.mentalTraitBonuses = _imported.mental || {}>> <<script>>UI.alert("Configuration imported successfully!");<</script>> <<goto "TraitBonusManager">> <<catch _error>> <<script>>UI.alert("Error importing configuration: Invalid JSON format");<</script>> <</try>> <</link>> </div> </div> <!-- NAVIGATION --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>← Back to Game</div>">> <<goto "Alleyway">> <</link>> </div> <</nobr>>
<<nobr>> /* Criminal Heat-Based Arrest Check */ <<if $jobs && $jobs.includes("Criminal")>> <<if !$heat>> <<set $heat = 0>> <</if>> /* Calculate arrest chance: 1% at 0 heat, 90% at 100 heat */ <<set _arrestChance = 1 + ($heat * 0.89)>> <<set _arrestRoll = random(1, 100)>> <<if _arrestRoll <= _arrestChance>> <<goto "CaughtByPolice">> <</if>> <</if>> <<set $lastLocation = "OpahFitness">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("OpahFitness")>> <<run $visitedLocations.push("OpahFitness")>> <</if>> <!-- Initialize gym membership --> <<if !$gymMembershipDaysRemaining>> <<set $gymMembershipDaysRemaining = 0>> <</if>> <!-- Initialize gym workout count for today --> <<if !$gymWorkoutCount>> <<set $gymWorkoutCount = 0>> <<set $lastGymDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastGymDay !== $dayNumber>> <<set $gymWorkoutCount = 0>> <<set $lastGymDay = $dayNumber>> <</if>> <!-- Calculate current hour --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <!-- Check if gym is open (5 AM to 9 PM) --> <<if _currentHour < 5 || _currentHour >= 21>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness - CLOSED</h1> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 25px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 600px;"> <p style="color: #ffc107; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">🔒 Gym is Currently Closed</p> <p style="color: #aaa; font-size: 16px; margin: 0 0 20px 0;"> Opah Fitness is open from <span style="color: #ff6b6b; font-weight: bold;">5:00 AM to 9:00 PM</span> daily. </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> Come back during operating hours to train! </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> The sound of clanking weights and upbeat music fills the air. Rows of treadmills, weight machines, and free weights line the spacious facility. Mirrors cover the walls, and motivational posters encourage members to push their limits. The smell of rubber mats and determination hangs in the air. </p> </div> <!-- Operating Hours Display --> <div style="background: #2a2a2a; border: 2px solid #17a2b8; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <div style="color: #17a2b8; font-size: 14px; font-weight: bold;"> 🕐 Hours: 5:00 AM - 9:00 PM </div> </div> <!-- Membership Status --> <<set _canAffordMembership = setup.canAffordTotal(70)>> <div style="background: #2a2a2a; border: 3px solid <<if $gymMembershipDaysRemaining > 0>>#51cf66<<else>>#ff6b6b<</if>>; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if $gymMembershipDaysRemaining > 0>> <div style="color: #51cf66; font-size: 18px; font-weight: bold;"> ✅ Active Membership: <span style="color: #ffc107;"><<print $gymMembershipDaysRemaining>> days remaining</span> </div> <<else>> <div style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin-bottom: 15px;"> ❌ No Active Membership </div> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0;"> Purchase a 30-day membership for $70 to access the gym facilities. </p> <<if _canAffordMembership>> <<link "<div style='background: #51cf66; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Purchase Membership ($70)</div>">> <<set _payment = setup.payAmount(70)>> <<if _payment.success>> <<set $gymMembershipDaysRemaining = 30>> <</if>> <<goto "OpahFitness">> <</link>> <<else>> <div style='background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold;'>Insufficient Funds</div> <</if>> <</if>> </div> <!-- Workout Limit Display --> <<if $gymMembershipDaysRemaining > 0>> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Workout Time Remaining Today: <span style="color: #ff6b6b;"><<print 120 - ($gymWorkoutCount * 120)>> minutes / 120 minutes</span> </div> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> You can train for up to 2 hours per day. Each workout takes 2 hours. </p> </div> <<set _hellhoundGymBonus = $physicalTraits.includes("Hellhound") ? 4 : ($physicalTraits.includes("Gym Bunny") ? 4 : ($physicalTraits.includes("Himbo") ? 2 : 1))>> <!-- Transformation Gym Multiplier Display --> <<if _hellhoundGymBonus > 1>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #ff6b6b; margin-bottom: 20px; box-shadow: 0 0 15px rgba(255,107,107,0.4);"> <p style="color: #ff6b6b; margin: 0; text-align: center; font-size: 14px; font-weight: bold; text-shadow: 0 0 8px rgba(255,107,107,0.5);"> ✓ <<if $physicalTraits.includes("Hellhound")>>Hellhound<<elseif $physicalTraits.includes("Gym Bunny")>>Gym Bunny<<else>>Himbo<</if>>: <<print _hellhoundGymBonus>>x Workout Gains </p> </div> <</if>> <h2 style="color: #ff6b6b;">Workout Programs</h2> <<set _opahStrGain = 2 * _hellhoundGymBonus>> <<set _opahDexGain = 2 * _hellhoundGymBonus>> <<set _opahMixedStrGain = 1 * _hellhoundGymBonus>> <<set _opahMixedDexGain = 1 * _hellhoundGymBonus>> <<if $gymWorkoutCount >= 1>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 20px; border-radius: 8px; text-align: center; margin-bottom: 25px;"> <p style="color: #ffc107; margin: 0; font-weight: bold; font-size: 18px;">You've completed your workout for today. Your muscles need rest!</p> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 14px;">Come back tomorrow for more training.</p> </div> <<else>> <!-- Workout Options --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Strength Training --> <div style="border: 3px solid #ff6b6b; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 22px;">🏋️ Strength Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Hit the weight room and pump iron. Focus on building raw power through heavy compound lifts like deadlifts, squats, and bench press. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+<<print _opahStrGain>> Strength</div> </div> <<if $stats.strength >= $statMaxCaps.strength>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Strength Reached</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<set $stats.strength += _opahStrGain>> <<set $gymWorkoutCount += 1>> <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> <!-- Cardio Training --> <div style="border: 3px solid #51cf66; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px;">🏃 Cardio Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Get your heart rate up with intense cardio sessions. Run on the treadmill, use the elliptical, or cycle to improve your agility and endurance. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+<<print _opahDexGain>> Dexterity</div> </div> <<if $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Dexterity Reached</div> <<else>> <<link "<div style='background: #51cf66; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<set $stats.dexterity += _opahDexGain>> <<set $gymWorkoutCount += 1>> <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> <!-- Mixed Training --> <div style="border: 3px solid #9b59b6; border-radius: 12px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;">⚡ Mixed Training</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0; line-height: 1.6;"> Combine strength and cardio in a balanced circuit training routine. Get the best of both worlds with compound exercises and high-intensity intervals. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #51cf66; font-size: 14px; font-weight: bold; margin-bottom: 5px;">Gains:</div> <div style="color: #aaa; font-size: 13px;">+<<print _opahMixedStrGain>> Strength, +<<print _opahMixedDexGain>> Dexterity</div> </div> <<if $stats.strength >= $statMaxCaps.strength && $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: auto;">Max Stats Reached</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto; font-size: 16px;'>Start Workout (2 hours)</div>">> <<if $stats.strength < $statMaxCaps.strength>> <<set $stats.strength += _opahMixedStrGain>> <</if>> <<if $stats.dexterity < $statMaxCaps.dexterity>> <<set $stats.dexterity += _opahMixedDexGain>> <</if>> <<set $gymWorkoutCount += 1>> <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> <<advancetime 120>> <<if _currentHour >= 21>> <<goto "GymKickout">> <<else>> <<goto "OpahFitness">> <</if>> <</link>> <</if>> </div> </div> <</if>> <!-- Additional Services --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 20px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">🏢 Gym Services</h3> <div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center;"> <!-- Personal Training with Fen Ris --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column; flex: 1 1 250px; max-width: 350px;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0;">🐺 Personal Training</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Train with the gym's elite fitness trainer for intensive one-on-one sessions.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Meet Trainer</div>">> <<goto "FenRisTraining">> <</link>> </div> <!-- Locker Room --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column; flex: 1 1 250px; max-width: 350px;"> <h4 style="color: #667eea; margin: 0 0 10px 0;">🚿 Locker Room</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Clean up after your workout in the locker room facilities.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter</div>">> <<goto "GymLockerRoom">> <</link>> </div> <!-- Meet NPCs --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column; flex: 1 1 250px; max-width: 350px;"> <h4 style="color: #e91e63; margin: 0 0 10px 0;">👥 Gym Floor</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Look around for other gym members to chat with.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse</div>">> <<goto "GymNPCs">> <</link>> </div> </div> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> /* Criminal Heat-Based Arrest Check */ <<if $jobs && $jobs.includes("Criminal")>> <<if !$heat>> <<set $heat = 0>> <</if>> /* Calculate arrest chance: 1% at 0 heat, 90% at 100 heat */ <<set _arrestChance = 1 + ($heat * 0.89)>> <<set _arrestRoll = random(1, 100)>> <<if _arrestRoll <= _arrestChance>> <<goto "CaughtByPolice">> <</if>> <</if>> <<set $lastLocation = "Cafe">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Cafe")>> <<run $visitedLocations.push("Cafe")>> <</if>> <!-- Check if player is an employee --> <<set _isEmployee = ($jobs && $jobs.includes("Barista"))>> <!-- Calculate current hour --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <!-- Check if cafe is open (6 AM to 5 PM) --> <<set _isOpen = (_currentHour >= 6 && _currentHour < 17)>> <!-- Employees can access anytime, others need to check hours --> <<if !_isOpen && !_isEmployee>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #8d6e63; text-align: center;">☕ Manta Ray Cafe - CLOSED</h1> <div style="background: #2a2a2a; border: 3px solid #8d6e63; padding: 25px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 600px;"> <p style="color: #8d6e63; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">🔒 Cafe is Currently Closed</p> <p style="color: #aaa; font-size: 16px; margin: 0 0 20px 0;"> Manta Ray Cafe is open from <span style="color: #8d6e63; font-weight: bold;">6:00 AM to 5:00 PM</span> daily. </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> Come back during operating hours for coffee and conversation! </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #8d6e63; text-align: center;">☕ Manta Ray Cafe</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Cafe.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Manta Ray Cafe"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8d6e63;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if !_isOpen && _isEmployee>> The cafe is closed to the public, but as an employee, you have access. The lights are dim and the space is quiet without customers. Equipment sits clean and ready for the next shift. <<else>> The rich aroma of freshly brewed coffee fills the air. Business professionals sit at sleek tables, laptops open, discussing deals over lattes and cappuccinos. Soft jazz plays in the background, creating an atmosphere of sophisticated productivity. <</if>> </p> </div> <!-- Operating Hours Display --> <div style="background: #2a2a2a; border: 2px solid #8d6e63; padding: 15px; border-radius: 8px; margin-bottom: 20px;"> <div style="color: #8d6e63; font-size: 14px; font-weight: bold;"> 🕐 Hours: 6:00 AM - 5:00 PM <<if _isEmployee>> <span style="color: #51cf66;"> (Employee Access: 24/7)</span> <</if>> </div> </div> <h2 style="color: #8d6e63;">Cafe Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Order Coffee --> <<set _canAffordCoffee = setup.canAffordTotal(5)>> <div style="border: 3px solid #8d6e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #8d6e63; margin: 0 0 10px 0;">☕ Order Coffee</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Grab a premium coffee to energize yourself.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 auto 0;">Cost: $5</p> <<if _canAffordCoffee>> <<link "<div style='background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Order Coffee</div>">> <<set _payment = setup.payAmount(5)>> <<if _payment.success>> <<goto "CafeCoffee">> <</if>> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> <!-- Apply for Job --> <div style="border: 3px solid #4dabf7; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #4dabf7; margin: 0 0 10px 0;">💼 Apply for Barista Position</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Join the team as a barista.</p> <p style="color: #ffd43b; font-size: 14px; margin: 0 0 auto 0;">Requirements: 10 Dexterity, 10 Charisma</p> <<if $jobs && $jobs.includes("Barista")>> <div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>✓ Currently Employed</div> <<elseif $jobs && $jobs.includes("Criminal")>> <<if setup.getTotalStat("dexterity") >= 10 && setup.getTotalStat("charisma") >= 10>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Now</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "jobApplication">> <<goto "CaughtByPolice">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Stats</div> <</if>> <<elseif setup.getTotalStat("dexterity") >= 10 && setup.getTotalStat("charisma") >= 10>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Now</div>">> <<set $jobs = ["Barista"]>> <<set $homeless = false>> <<goto "CafeHired">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Stats</div> <</if>> </div> </div> <!-- Work Area (if employed) --> <<if $jobs && $jobs.includes("Barista")>> <h2 style="color: #8d6e63; margin-top: 30px;">Work Area</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">☕ Barista Station</h3> <p style="color: #aaa; margin: 0 0 15px 0;">Your workspace behind the coffee bar.</p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>⚒️ Start Work Shift</div>" "UniversalWork">><</link>> </div> </div> <</if>> <!-- NPCs Present --> <<set _baristas = setup.getNPCsByJob("Barista")>> <<if _baristas && _baristas.length > 0>> <h2 style="color: #8d6e63; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _baristas>> <<capture _npc>> <div style="border: 3px solid #8d6e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #8d6e63; margin: 0 0 10px 0;"><<= _npc.name>></h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #8d6e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to <<= _npc.name>></div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #8d6e63; margin-top: 30px;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No baristas are working right now. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Apartments")>> <<run $visitedLocations.push("Apartments")>> <</if>> <<set $lastLocation = "Apartments">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">🏢 Sunfish Apartments</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 18px; margin: 0;"> A modest apartment building with a clean, professional lobby. The receptionist sits behind a polished desk, ready to help prospective tenants. </p> </div> <!-- Check if player already has an apartment --> <<if $hasApartment>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">🔑 Your Studio Apartment</h2> <p style="color: #ccc; margin: 0 0 10px 0;">You have a studio apartment here. Your next rent payment is due in <<print $rentDaysRemaining>> days.</p> <p style="color: #aaa; margin: 0; font-size: 14px;">Monthly Rent: $1,500 (due every 30 days)</p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Enter Apartment --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🚪 Enter Your Apartment</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Go inside your studio apartment.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Apartment</div>">> <<goto "StudioApartment">> <</link>> </div> <!-- Pay Rent Early --> <<if $rentDaysRemaining > 0>> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">💰 Pay Rent Early</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Pay next month's rent ($1,500) to extend your lease by 30 days.</p> <<if $money >= 1500>> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Pay $1,500</div>">> <<set $money -= 1500>> <<set $rentDaysRemaining += 30>> <<goto "Apartments">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Enough Money</div> <</if>> </div> <</if>> <!-- Meet the Neighbors --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">👥 Meet the Neighbors</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Visit the common area and meet your fellow tenants.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Meet Neighbors</div>">> <<goto "MeetNeighbors">> <</link>> </div> </div> <<else>> <!-- Player doesn't have an apartment - Show rental options --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #3498db; margin: 0 0 15px 0;">💼 Front Desk Receptionist</h2> <p style="color: #ccc; margin: 0 0 15px 0;">"Welcome to Sunfish Apartments! We have studio apartments available for rent."</p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 15px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">📋 Studio Apartment Details</h3> <p style="color: #aaa; margin: 0 0 5px 0;">• Down Payment: <strong style="color: #51cf66;">$300</strong> (one-time)</p> <p style="color: #aaa; margin: 0 0 5px 0;">• Monthly Rent: <strong style="color: #51cf66;">$1,500</strong> (due every 30 days)</p> <p style="color: #aaa; margin: 0;">• First month's rent included with down payment</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db; margin-bottom: 15px;"> <p style="color: #3498db; margin: 0; text-align: center;"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> <<if $money >= 300>> <<link "<div style='background: #28a745; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px;'>💳 Pay Down Payment ($300)</div>">> <<set $money -= 300>> <<set $hasApartment = true>> <<set $rentDaysRemaining = 30>> <<set $homeless = false>> <<run setup.achievements.unlock("unlock_apartment")>> <<goto "Apartments">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 15px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 18px;'>💸 Not Enough Money (Need $300)</div> <p style="color: #dc3545; margin: 15px 0 0 0; text-align: center; font-style: italic;">You need $<<print 300 - $money>> more to afford the down payment.</p> <</if>> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Criminal Heat-Based Arrest Check */ <<if $jobs && $jobs.includes("Criminal")>> <<if !$heat>> <<set $heat = 0>> <</if>> /* Calculate arrest chance: 1% at 0 heat, 90% at 100 heat */ <<set _arrestChance = 1 + ($heat * 0.89)>> <<set _arrestRoll = random(1, 100)>> <<if _arrestRoll <= _arrestChance>> <<goto "CaughtByPolice">> <</if>> <</if>> <<set $lastLocation = "DanceStudio">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("DanceStudio")>> <<run $visitedLocations.push("DanceStudio")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b9d; text-align: center;">🎀 Ribbonfish Dance Studio</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/DanceStudio.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Ribbonfish Dance Studio"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <p style="color: white; font-size: 18px; margin: 0;"> Floor-to-ceiling mirrors reflect dancers practicing their craft. Soft music plays from speakers as people move gracefully across the polished hardwood floor. The energy is electric yet refined. </p> </div> <!-- Initialize weekly dance lesson trackers (3 per activity per week) --> <<if !$weeklyDanceGroupLessons>> <<set $weeklyDanceGroupLessons = {week: 0, count: 0}>> <</if>> <<if !$weeklyDancePrivateLessons>> <<set $weeklyDancePrivateLessons = {week: 0, count: 0}>> <</if>> <!-- Calculate current week number (weeks start on Monday) --> <<set _currentWeek = Math.floor($dayNumber / 7)>> <!-- Reset weekly counts if new week --> <<if $weeklyDanceGroupLessons.week !== _currentWeek>> <<set $weeklyDanceGroupLessons = {week: _currentWeek, count: 0}>> <</if>> <<if $weeklyDancePrivateLessons.week !== _currentWeek>> <<set $weeklyDancePrivateLessons = {week: _currentWeek, count: 0}>> <</if>> <h2 style="color: #ff6b9d;">Dance Classes</h2> <!-- Weekly Limit Display --> <div style="background: #2a2a2a; border: 3px solid #ff6b9d; padding: 18px; border-radius: 10px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div style="text-align: center;"> <span style="color: #ff6b9d; font-weight: bold;">🩰 Group Lessons:</span> <span style="color: <<if $weeklyDanceGroupLessons.count >= 3>>#ff6b6b<<else>>#51cf66<</if>>; font-weight: bold;"> <<= $weeklyDanceGroupLessons.count>> / 3 this week </span> </div> <div style="text-align: center;"> <span style="color: #FFD700; font-weight: bold;">👥 Private Sessions:</span> <span style="color: <<if $weeklyDancePrivateLessons.count >= 3>>#ff6b6b<<else>>#51cf66<</if>>; font-weight: bold;"> <<= $weeklyDancePrivateLessons.count>> / 3 this week </span> </div> </div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Group Dance Lessons --> <<set _canAffordGroupLesson = setup.canAffordTotal(50)>> <<set _groupLessonsRemaining = 3 - $weeklyDanceGroupLessons.count>> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #ff6b9d; margin: 0 0 10px 0;">🩰 Group Dance Lessons</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">Improve your grace and dexterity through dance with other students.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 5px 0;">Cost: $50</p> <p style="color: <<if _groupLessonsRemaining > 0>>#aaa<<else>>#ff6b6b<</if>>; font-size: 13px; margin: 0 0 auto 0;"> <<if _groupLessonsRemaining > 0>> <<= _groupLessonsRemaining>> lesson<<if _groupLessonsRemaining !== 1>>s<</if>> remaining this week <<else>> Weekly limit reached <</if>> </p> <<if _groupLessonsRemaining <= 0>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Weekly Limit Reached</div> <<elseif _canAffordGroupLesson>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Join Class</div>">> <<set _payment = setup.payAmount(50)>> <<if _payment.success>> <<goto "DanceGroupLesson">> <</if>> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> <!-- Private Sessions --> <<set _canAffordPrivateLesson = setup.canAffordTotal(200)>> <<set _privateLessonsRemaining = 3 - $weeklyDancePrivateLessons.count>> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #FFD700; margin: 0 0 10px 0;">👥 Private Coaching</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0; line-height: 1.4;">One-on-one instruction with a professional dance coach for maximum results.</p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 0 0 5px 0;">Cost: $200</p> <p style="color: <<if _privateLessonsRemaining > 0>>#aaa<<else>>#ff6b6b<</if>>; font-size: 13px; margin: 0 0 auto 0;"> <<if _privateLessonsRemaining > 0>> <<= _privateLessonsRemaining>> session<<if _privateLessonsRemaining !== 1>>s<</if>> remaining this week <<else>> Weekly limit reached <</if>> </p> <<if _privateLessonsRemaining <= 0>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Weekly Limit Reached</div> <<elseif _canAffordPrivateLesson>> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Book Session</div>">> <<set _payment = setup.payAmount(200)>> <<if _payment.success>> <<goto "DancePrivateLesson">> <</if>> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Insufficient Funds</div> <</if>> </div> </div> <!-- Dancing Instructors Section --> <<set _danceInstructors = []>> <<for _npc range $npcs>> <<set _hasDanceJob = false>> <<if typeof _npc.jobs === "string">> <<if _npc.jobs === "Dancing Instructor">> <<set _hasDanceJob = true>> <</if>> <<elseif Array.isArray(_npc.jobs)>> <<if _npc.jobs.includes("Dancing Instructor")>> <<set _hasDanceJob = true>> <</if>> <</if>> <<if _hasDanceJob>> <<run _danceInstructors.push(_npc)>> <</if>> <</for>> <<if _danceInstructors.length > 0>> <h2 style="color: #ff6b9d;">Instructors Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 15px; margin: 0 0 15px 0; font-style: italic;"> Professional dance instructors are available... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _danceInstructors>> <<capture _npc>> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 5px 0;"> <em>Dancing Instructor</em> </p> <<link "<div style='background: #ff6b9d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Criminal Heat-Based Arrest Check */ <<if $jobs && $jobs.includes("Criminal")>> <<if !$heat>> <<set $heat = 0>> <</if>> /* Calculate arrest chance: 1% at 0 heat, 90% at 100 heat */ <<set _arrestChance = 1 + ($heat * 0.89)>> <<set _arrestRoll = random(1, 100)>> <<if _arrestRoll <= _arrestChance>> <<goto "CaughtByPolice">> <</if>> <</if>> <<set $lastLocation = "TrainingCenter">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("TrainingCenter")>> <<run $visitedLocations.push("TrainingCenter")>> <</if>> <!-- Initialize training count for today --> <<if !$trainingCount>> <<set $trainingCount = 0>> <<set $lastTrainingDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastTrainingDay !== $dayNumber>> <<set $trainingCount = 0>> <<set $lastTrainingDay = $dayNumber>> <</if>> <!-- ===== SKILL TREE: Get bonuses ===== --> <<set _trainingReduction = setup.skillTree.getEffect("trainingReduction")>> <<set _statTrainingDiscount = setup.skillTree.getEffect("statTrainingDiscount")>> <!-- Calculate actual stat training cost --> <<set _baseStatCost = 25>> <<set _statTrainingCost = Math.max(5, _baseStatCost - _statTrainingDiscount)>> <!-- Initialize skill training progress --> <<if !$skillTrainingProgress>> <<set $skillTrainingProgress = { "Math Skills": {current: 0, required: 5, timesLearned: 0}, "Coding": {current: 0, required: 5, timesLearned: 0}, "Makeup": {current: 0, required: 5, timesLearned: 0}, "Cooking": {current: 0, required: 5, timesLearned: 0}, "Cleaning": {current: 0, required: 5, timesLearned: 0}, "First Aid": {current: 0, required: 5, timesLearned: 0}, "Painting": {current: 0, required: 5, timesLearned: 0} }>> <</if>> <!-- Check Quick Learner and Skill Tree bonus every time player enters --> <<for _skillName, _skillData range $skillTrainingProgress>> <<if !$skills.includes(_skillName)>> <!-- Calculate base requirement --> <<set _baseRequired = 5>> <!-- Apply Quick Learner reduction (also applies to Werefox transformation) --> <<if $skills.includes("Quick Learner") || $physicalTraits.includes("Werefox")>> <<set _baseRequired = 3>> <</if>> <!-- ===== SKILL TREE: Apply training reduction ===== --> <<if _trainingReduction > 0>> <<set _baseRequired = Math.max(1, _baseRequired - _trainingReduction)>> <</if>> <<set _skillData.required = _baseRequired>> <</if>> <</for>> <!-- Initialize weekly class limit tracker (5 classes per week) --> <<if !$weeklyClassesTaken>> <<set $weeklyClassesTaken = {week: 0, count: 0}>> <</if>> <!-- Calculate current week number (weeks start on Monday) --> <<set _currentWeek = Math.floor($dayNumber / 7)>> <!-- Reset weekly class count if new week --> <<if $weeklyClassesTaken.week !== _currentWeek>> <<set $weeklyClassesTaken = {week: _currentWeek, count: 0}>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #5c6bc0; text-align: center;">🎓 Bluefin Development Center</h1> <div style="padding: 20px; background: linear-gradient(135deg, #5c6bc0 0%, #3f51b5 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #5c6bc0;"> <p style="color: white; font-size: 18px; margin: 0;"> Modern classrooms equipped with the latest technology line the hallways. Whiteboards display complex diagrams and business strategies. Professionals gather here to sharpen their skills and advance their careers. </p> </div> <!-- Training Limit Display --> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 18px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="color: #ffc107; font-size: 18px; font-weight: bold;"> ⚡ Stat Training Sessions Remaining Today: <span style="color: #5c6bc0;"><<print 2 - $trainingCount>> / 2</span> </div> <div style="color: #51cf66; font-size: 18px; font-weight: bold; margin-top: 10px;"> 📚 Skill Classes Remaining This Week: <span style="color: <<if $weeklyClassesTaken.count >= 5>>#ff6b6b<<else>>#5c6bc0<</if>>;"> <<print 5 - $weeklyClassesTaken.count>> / 5 </span> </div> </div> <!-- ===== SKILL TREE: Bonus Display ===== --> <<if _trainingReduction > 0 || _statTrainingDiscount > 0>> <div style="background: #2a2a2a; border: 3px solid #9C27B0; padding: 15px; border-radius: 10px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #CE93D8; margin: 0 0 10px 0;">⭐ Skill Tree Bonuses Active</h3> <<if _statTrainingDiscount > 0>> <p style="color: #CE93D8; margin: 5px 0;">• Stat training cost reduced by $<<print _statTrainingDiscount>> (<span style="text-decoration: line-through;">$25</span> → $<<print _statTrainingCost>>)</p> <</if>> <<if _trainingReduction > 0>> <p style="color: #CE93D8; margin: 5px 0;">• Skill courses require <<print _trainingReduction>> fewer class<<if _trainingReduction !== 1>>es<</if>> to complete</p> <</if>> </div> <</if>> <h2 style="color: #5c6bc0;">Training Programs</h2> <!-- Stat Training --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">📊 Stat Training</h3> <p style="color: #aaa; font-size: 15px; margin: 0 0 20px 0;"> Intensive programs to boost your attributes. Train up to 2 times per day for <<if _statTrainingDiscount > 0>> <span style="text-decoration: line-through; color: #666;">$25</span> <span style="color: #51cf66;">$<<print _statTrainingCost>></span> <<else>> $25 <</if>> each. </p> <<if $trainingCount >= 2>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; text-align: center;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">You have completed all training sessions for today. Come back tomorrow!</p> </div> <<else>> <<set _canAffordStatTraining = setup.canAffordTotal(_statTrainingCost)>> <<capture _statTrainingCost, _canAffordStatTraining>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Charisma Training --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #e91e63; margin: 0 0 10px 0;">💬 Charisma</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.charisma</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;"> Cost: <<if _statTrainingDiscount > 0>> <span style="text-decoration: line-through; color: #666;">$25</span> $<<print _statTrainingCost>> <<else>> $<<print _statTrainingCost>> <</if>> </p> <<if $stats.charisma >= $statMaxCaps.charisma>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif !_canAffordStatTraining>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set _payment = setup.payAmount(_statTrainingCost)>> <<if _payment.success>> <<set $stats.charisma += 1>> <<set $trainingCount += 1>> <<advancetime 60>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Dexterity Training --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #51cf66; margin: 0 0 10px 0;">🤸 Dexterity</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.dexterity</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;"> Cost: <<if _statTrainingDiscount > 0>> <span style="text-decoration: line-through; color: #666;">$25</span> $<<print _statTrainingCost>> <<else>> $<<print _statTrainingCost>> <</if>> </p> <<if $stats.dexterity >= $statMaxCaps.dexterity>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif !_canAffordStatTraining>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set _payment = setup.payAmount(_statTrainingCost)>> <<if _payment.success>> <<set $stats.dexterity += 1>> <<set $trainingCount += 1>> <<advancetime 60>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Strength Training --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0;">💪 Strength</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.strength</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;"> Cost: <<if _statTrainingDiscount > 0>> <span style="text-decoration: line-through; color: #666;">$25</span> $<<print _statTrainingCost>> <<else>> $<<print _statTrainingCost>> <</if>> </p> <<if $stats.strength >= $statMaxCaps.strength>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif !_canAffordStatTraining>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set _payment = setup.payAmount(_statTrainingCost)>> <<if _payment.success>> <<set $stats.strength += 1>> <<set $trainingCount += 1>> <<advancetime 60>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Intelligence Training --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: #9b59b6; margin: 0 0 10px 0;">🧠 Intelligence</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Current: $stats.intelligence</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;"> Cost: <<if _statTrainingDiscount > 0>> <span style="text-decoration: line-through; color: #666;">$25</span> $<<print _statTrainingCost>> <<else>> $<<print _statTrainingCost>> <</if>> </p> <<if $stats.intelligence >= $statMaxCaps.intelligence>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Max Reached</div> <<elseif !_canAffordStatTraining>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Train (+1)</div>">> <<set _payment = setup.payAmount(_statTrainingCost)>> <<if _payment.success>> <<set $stats.intelligence += 1>> <<set $trainingCount += 1>> <<advancetime 60>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> </div> <</capture>> <</if>> </div> <!-- Skill Courses --> <<set _canAffordSkillCourse = setup.canAffordTotal(75)>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">📚 Skill Courses</h3> <p style="color: #aaa; font-size: 15px; margin: 0 0 20px 0;">Learn professional skills through multiple sessions ($75 per session, 8 hours each). You can take up to 5 classes per week total.</p> <<if $weeklyClassesTaken.count >= 5>> <div style="background: #1a1a1a; border: 3px solid #ffc107; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 20px;"> <p style="color: #ffc107; margin: 0; font-weight: bold;">You have taken all 5 classes this week. Come back next week to learn more!</p> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px;"> <!-- Math Skills --> <<set _hasSkill = $skills.includes("Math Skills")>> <<set _progress = $skillTrainingProgress["Math Skills"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; margin: 0 0 10px 0;">🔢 Math Skills</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +5 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Math Skills"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Math Skills"].current >= $skillTrainingProgress["Math Skills"].required>> <<set $skills.push("Math Skills")>> <<set $stats.intelligence += 5>> <<set $skillTrainingProgress["Math Skills"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Coding --> <<set _hasSkill = $skills.includes("Coding")>> <<set _progress = $skillTrainingProgress["Coding"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#9b59b6<</if>>; margin: 0 0 10px 0;">💻 Coding</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +6 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Coding"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Coding"].current >= $skillTrainingProgress["Coding"].required>> <<set $skills.push("Coding")>> <<set $stats.intelligence += 6>> <<set $skillTrainingProgress["Coding"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Makeup --> <<set _hasSkill = $skills.includes("Makeup")>> <<set _progress = $skillTrainingProgress["Makeup"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#e91e63<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#e91e63<</if>>; margin: 0 0 10px 0;">💄 Makeup</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Dexterity, +3 Charisma</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Makeup"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Makeup"].current >= $skillTrainingProgress["Makeup"].required>> <<set $skills.push("Makeup")>> <<set $stats.dexterity += 3>> <<set $stats.charisma += 3>> <<set $skillTrainingProgress["Makeup"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Cooking --> <<set _hasSkill = $skills.includes("Cooking")>> <<set _progress = $skillTrainingProgress["Cooking"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#ffc107<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#ffc107<</if>>; margin: 0 0 10px 0;">🍳 Cooking</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Intelligence, +2 Dexterity</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Cooking"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Cooking"].current >= $skillTrainingProgress["Cooking"].required>> <<set $skills.push("Cooking")>> <<set $stats.intelligence += 3>> <<set $stats.dexterity += 2>> <<set $skillTrainingProgress["Cooking"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Cleaning --> <<set _hasSkill = $skills.includes("Cleaning")>> <<set _progress = $skillTrainingProgress["Cleaning"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#17a2b8<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#17a2b8<</if>>; margin: 0 0 10px 0;">🧹 Cleaning</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +3 Dexterity</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Cleaning"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Cleaning"].current >= $skillTrainingProgress["Cleaning"].required>> <<set $skills.push("Cleaning")>> <<set $stats.dexterity += 3>> <<set $skillTrainingProgress["Cleaning"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- First Aid --> <<set _hasSkill = $skills.includes("First Aid")>> <<set _progress = $skillTrainingProgress["First Aid"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#dc3545<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#dc3545<</if>>; margin: 0 0 10px 0;">🏥 First Aid</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +4 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["First Aid"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["First Aid"].current >= $skillTrainingProgress["First Aid"].required>> <<set $skills.push("First Aid")>> <<set $stats.intelligence += 4>> <<set $skillTrainingProgress["First Aid"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> <!-- Painting --> <<set _hasSkill = $skills.includes("Painting")>> <<set _progress = $skillTrainingProgress["Painting"]>> <div style="border: 3px solid <<if _hasSkill>>#51cf66<<else>>#ff6b6b<</if>>; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: flex; flex-direction: column;"> <h4 style="color: <<if _hasSkill>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 10px 0;">🎨 Painting</h4> <<if _hasSkill>> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0; font-weight: bold;">✓ Mastered</p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Progress: _progress.current / _progress.required</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Cost: $75 per session</p> <p style="color: #666; font-size: 12px; margin: 0 0 10px 0;">Bonus: +4 Dexterity, +3 Intelligence</p> <</if>> <<if _hasSkill>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Already Learned</div> <<elseif $weeklyClassesTaken.count >= 5>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Weekly Limit Reached</div> <<elseif !_canAffordSkillCourse>> <div style="background: #3a3a3a; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: auto;">Insufficient Funds</div> <<else>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: auto;'>Take Class (8 hours, $75)</div>">> <<set _payment = setup.payAmount(75)>> <<if _payment.success>> <<set $skillTrainingProgress["Painting"].current += 1>> <<set $weeklyClassesTaken.count += 1>> <<if $skillTrainingProgress["Painting"].current >= $skillTrainingProgress["Painting"].required>> <<set $skills.push("Painting")>> <<set $stats.dexterity += 4>> <<set $stats.intelligence += 3>> <<set $skillTrainingProgress["Painting"].current = 0>> <<run setup.achievements.unlock("bluefin_skill")>> <</if>> <<advancetime 480>> <</if>> <<goto "TrainingCenter">> <</link>> <</if>> </div> </div> </div> <br> <!-- NPCs Present --> <<set _npcsHere = setup.getNPCsAtLocation("TrainingCenter")>> <h2 style="color: #5c6bc0;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #5c6bc0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #5c6bc0; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #5c6bc0; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"> <<if Array.isArray(_npc.jobs)>> <<print _npc.jobs.join(", ")>> <<else>> <<print _npc.jobs>> <</if>> </p> <<link "<div style='background: #5c6bc0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The training center is empty right now. No one else is here. </p> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "TownHall">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("TownHall")>> <<run $visitedLocations.push("TownHall")>> <</if>> /* Check if player is a Criminal and arrest them */ <<if $jobs && $jobs.includes("Criminal")>> <<set $arrestedAtStation = true>> <<goto "CaughtByPolice">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🏛️ Town Hall</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/TownHall.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Town Hall"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #8e44ad 0%, #6c3483 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> An imposing stone building with grand columns and marble floors. The halls echo with the footsteps of bureaucrats and citizens alike. Official notices and city announcements line bulletin boards near the entrance. The air carries the weight of civic authority. </p> </div> <!-- Legal Name Change Section --> <h2 style="color: #9b59b6;">📜 City Services</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if $hasChangedNameLegally>> <!-- Already changed name --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📝 Legal Name Change</h3> <p style="font-size: 14px; color: #666; margin: 0;">You have already used your one-time legal name change. Sunfish City law only permits one official name change per citizen.</p> </div> <<else>> <!-- Can still change name --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📝 Legal Name Change</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 10px 0;">File paperwork to legally change your name. This service can only be used <strong style="color: #e74c3c;">once</strong>.</p> <p style="font-size: 13px; color: #888; margin: 0 0 15px 0;">Current Name: <strong style="color: #9b59b6;"><<= $firstName>> <<= $lastName>></strong></p> <p style="font-size: 14px; color: #f1c40f; margin: 0 0 15px 0;">💰 Cost: <strong>$2,500</strong></p> <<if $money >= 2500>> <div style="margin-bottom: 15px;"> <label style="color: #ccc; display: block; margin-bottom: 5px;">New First Name:</label> <<textbox "_newLegalFirst" "" autofocus>> </div> <div style="margin-bottom: 15px;"> <label style="color: #ccc; display: block; margin-bottom: 5px;">New Last Name:</label> <<textbox "_newLegalLast" "">> </div> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Submit Name Change ($2,500)</div>">> <<if _newLegalFirst && _newLegalFirst.trim() !== "" && _newLegalLast && _newLegalLast.trim() !== "">> <<set $money -= 2500>> <<set $firstName = _newLegalFirst.trim()>> <<set $lastName = _newLegalLast.trim()>> <<set $hasChangedNameLegally = true>> <<run setup.achievements.unlock("townhall_name_change")>> <<run UI.alert("Your name has been legally changed to " + $firstName + " " + $lastName + "!")>> <<goto "TownHall">> <<else>> <<run UI.alert("Please enter both a first and last name.")>> <</if>> <</link>> <<else>> <div style="background: #3d1a1a; padding: 10px; border-radius: 6px; border: 1px solid #e74c3c;"> <p style="color: #e74c3c; margin: 0; font-size: 14px;">⚠️ You need $2,500 to file for a name change. You only have $<<print $money>>.</p> </div> <</if>> </div> <</if>> <!-- Donate to the City --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-top: 15px;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">💚 Donate to Sunfish City</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 10px 0;">Support your community by donating all your on-hand money to city improvement projects.</p> <p style="font-size: 13px; color: #888; margin: 0 0 15px 0;">Current On-Hand Cash: <strong style="color: #2ecc71;">$<<print $money>></strong></p> <<if $money > 0>> <<link "<div style='background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Donate All ($<<print $money>>)</div>">> <<set _donationAmount = $money>> <<set $totalDonatedToCity = ($totalDonatedToCity || 0) + _donationAmount>> <<set $money = 0>> <<run UI.alert("Thank you for your generous donation of $" + _donationAmount + " to Sunfish City! Your contribution will help improve our community.")>> <<goto "TownHall">> <</link>> <<else>> <div style="background: #2a2a2a; padding: 10px; border-radius: 6px; border: 1px solid #666;"> <p style="color: #888; margin: 0; font-size: 14px;">You don't have any money to donate.</p> </div> <</if>> <<if $totalDonatedToCity > 0>> <p style="font-size: 12px; color: #666; margin: 15px 0 0 0; text-align: center;">Total donated to date: <strong style="color: #2ecc71;">$<<print $totalDonatedToCity>></strong></p> <</if>> </div> </div> <!-- City Mayor Work Section --> <<if $jobs && $jobs.length > 0 && $jobs.includes("City Mayor")>> <<if !$mayorHoursWorkedToday>> <<set $mayorHoursWorkedToday = 0>> <</if>> <h2 style="color: #FFD700;">Mayoral Duties</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0;">👑 Oversee City Operations</h3> <<if $mayorHoursWorkedToday >= 4>> <p style="font-size: 14px; color: #ff6b6b; margin: 0 0 10px 0; font-weight: bold;">You've already completed your mayoral duties for today (4/4 hours).</p> <div style="background: #333; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; border: 2px solid #444;">Perform Mayoral Duties</div> <<else>> <p style="font-size: 14px; color: #ccc; margin: 0 0 10px 0;">Attend to your mayoral responsibilities... or at least appear to.</p> <p style="font-size: 12px; color: #aaa; margin: 0 0 15px 0;">Hours worked today: <span style="color: #FFD700; font-weight: bold;"><<print $mayorHoursWorkedToday>>/4</span></p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Perform Mayoral Duties</div>">> <<goto "MayorWork">> <</link>> <</if>> </div> </div> <</if>> <!-- Mayor's Secretary Work Section --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Mayor's Secretary")>> <h2 style="color: #9b59b6;">Secretary Work</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if !$secretaryHoursWorkedToday>> <<set $secretaryHoursWorkedToday = 0>> <</if>> <<if $secretaryHoursWorkedToday >= 8>> <!-- Work limit reached --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📋 Attend to Secretarial Duties</h3> <p style="font-size: 14px; color: #666; margin: 0 0 15px 0;">You've already worked your full 8-hour shift today.</p> <p style="font-size: 14px; color: #888; margin: 0;">Hours worked today: $secretaryHoursWorkedToday/8</p> </div> <<else>> <!-- Can still work --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📋 Attend to Secretarial Duties</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 10px 0;">Handle your responsibilities as the mayor's secretary.</p> <p style="font-size: 13px; color: #888; margin: 0 0 15px 0;">Hours worked today: $secretaryHoursWorkedToday/8</p> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Begin Work</div>">> <<goto "SecretaryWork">> <</link>> </div> <</if>> </div> <</if>> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _secretaryNPCs = setup.getNPCsByJob("Mayor's Secretary")>> <h2 style="color: #9b59b6;">City Government</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-top: 20px;"> <!-- Mayor's Office --> <<if _mayorNPCs.length > 0>> <<set _mayorNPC = _mayorNPCs[0]>> <<if true>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"><strong style="color: #9b59b6;"><<print _mayorNPC.name>></strong> - City Mayor</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">The highest authority in Sunfish City.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Meet the Mayor</div>">> <<set $tradingWithNPC = _mayorNPC>> <<goto "NPCInteraction">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #666;">The mayor is not available right now.</p> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">🎩 Mayor's Office</h3> <p style="font-size: 14px; color: #666;">No mayor currently appointed.</p> </div> <</if>> <!-- Secretary's Office --> <<if _secretaryNPCs.length > 0>> <<set _secretaryNPC = _secretaryNPCs[0]>> <<if true>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"><strong style="color: #9b59b6;"><<print _secretaryNPC.name>></strong> - Mayor's Secretary</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">Handles appointments and city business.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Talk to Secretary</div>">> <<set $tradingWithNPC = _secretaryNPC>> <<goto "NPCInteraction">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #666;">The secretary is not available right now.</p> </div> <</if>> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">📋 Secretary's Office</h3> <p style="font-size: 14px; color: #666;">No secretary currently appointed.</p> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("TownHall")>> <<set _otherNPCs = []>> <!-- Filter out Mayor and Secretary since they have dedicated sections --> <<if _npcsHere && _npcsHere.length > 0>> <<for _npc range _npcsHere>> <<set _isMayor = false>> <<set _isSecretary = false>> <<if _npc.jobs.includes("City Mayor")>> <<set _isMayor = true>> <</if>> <<if _npc.jobs.includes("Mayor's Secretary")>> <<set _isSecretary = true>> <</if>> <<if !_isMayor && !_isSecretary>> <<run _otherNPCs.push(_npc)>> <</if>> <</for>> <</if>> <<if _otherNPCs.length > 0>> <h2 style="color: #9b59b6; margin-top: 25px;">🏛️ Visitors</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #b19cd9; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic;"> Others are here conducting city business... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _otherNPCs>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #b19cd9; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Gym">> <h1>💪 Training Complete!</h1> <div style="padding: 25px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); text-align: center;"> <h2 style="color: white; margin: 0 0 10px 0; font-size: 32px;">✅ Workout Session Complete</h2> <p style="color: white; margin: 0; font-size: 18px;">You've finished your training</p> </div> <!-- Training Message Based on Strength Level --> <div style="background: white; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 2px 4px rgba(0,0,0,0.1);"> <<if $stats.strength >= 100>> <h2 style="color: #ffd700; margin-top: 0; text-align: center;">🏆 LEGENDARY PHYSIQUE</h2> <p style="color: #333; font-size: 16px; line-height: 1.8; text-align: center;"> You've achieved the pinnacle of human strength. Your body is a perfect sculpture of muscle and power. Other gym-goers stop their workouts just to watch you in awe. The weights you lift seem impossibly heavy to everyone else, yet you handle them with casual ease. You've transcended ordinary fitness - you're a living legend. </p> <<elseif $stats.strength >= 71>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">💪 ELITE ATHLETE</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You crush your workout with incredible intensity. The heavy weights that once seemed impossible now feel manageable. Your form is impeccable, every rep controlled and powerful. Other gym members frequently ask you for advice, recognizing your expertise. Your body has transformed into a powerhouse of muscle and definition. You're approaching the limits of natural human strength. </p> <<elseif $stats.strength >= 51>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">🔥 ADVANCED LIFTER</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You power through an intense training session. The weights feel heavy but manageable as you push yourself harder than before. Your muscles burn with satisfying exertion. You're noticing significant changes in your physique - more definition, more mass, more power. People are starting to notice your transformation. You're becoming a regular force in the gym. </p> <<elseif $stats.strength >= 21>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">💪 INTERMEDIATE GAINS</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You complete a solid workout, feeling the satisfying pump in your muscles. The exercises are getting easier as your body adapts and grows stronger. You're starting to see real changes in the mirror - your arms are filling out your sleeves a bit more, your shoulders are broader. The initial soreness is fading, replaced by a sense of capability and confidence. </p> <<else>> <h2 style="color: #e74c3c; margin-top: 0; text-align: center;">🌱 BEGINNER GAINS</h2> <p style="color: #333; font-size: 16px; line-height: 1.8;"> You work through your training routine, muscles trembling from the unfamiliar exertion. Everything feels heavy and awkward, but you push through it. Sweat pours down your face as you struggle with weights that more experienced lifters handle easily. Your form needs work, but you're learning. By the end, you're exhausted but proud - you showed up and did the work. That's what matters at this stage. </p> <</if>> </div> <!-- Stats Display --> <div style="background: white; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745;"> <h3 style="color: #28a745; margin-top: 0; text-align: center;">📊 Strength Progress</h3> <div style="text-align: center;"> <p style="color: #333; font-size: 18px; margin: 10px 0;"> <strong>Previous Strength:</strong> <span style="color: #666;"><<print $stats.strength - 1>></span> </p> <p style="color: #28a745; font-size: 24px; font-weight: bold; margin: 10px 0;"> ⬆️ +1 Strength </p> <p style="color: #333; font-size: 18px; margin: 10px 0;"> <strong>Current Strength:</strong> <span style="color: #e74c3c; font-weight: bold;">$stats.strength</span> / $statMaxCaps.strength </p> </div> </div> <!-- Time Display --> <div style="background: #fff3cd; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <p style="color: #856404; margin: 0; font-weight: bold;"> ⏰ Time passed: 1 hour </p> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>Continue Training</div>">> <<goto "Gym">> <</link>> <br><br> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>Leave Gym</div>">> <<goto "BusinessDistrict">> <</link>> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<if !_npc>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: No NPC selected.</p> [[Go Back|$lastLocation]] </div> <<else>> <<set _relationship = $relationships[_npc.name] || {level: 1, points: 0}>> <<set _relLevel = _relationship.level>> <<set _npcPrefs = setup.getNPCPreferences(_npc)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header with Relationship Display --> <div style="background: #2a2a2a; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 15px 0; font-size: 32px; text-align: center;">💬 Talking with _npc.name</h1> <!-- Relationship Level and XP Bar --> <<set _relColor = setup.getRelationshipColor(_relLevel)>> <<set _levelData = setup.getRelationshipLevelData(_relLevel)>> <<set _levelName = _levelData ? _levelData.name : "Unknown">> <div style="text-align: center; margin-bottom: 15px;"> <div @style="'color: ' + _relColor + '; font-size: 18px; font-weight: bold; margin-bottom: 8px;'"> Relationship: <<print _levelName>> </div> <!-- XP Progress Bar --> <<if _relLevel < 4>> <<if _relLevel === -1>> <<set _currentLevelMin = -50>> <<set _nextThreshold = 0>> <<elseif _relLevel === 0>> <<set _currentLevelMin = 0>> <<set _nextThreshold = 25>> <<elseif _relLevel === 1>> <<set _currentLevelMin = 25>> <<set _nextThreshold = 75>> <<elseif _relLevel === 2>> <<set _currentLevelMin = 75>> <<set _nextThreshold = 175>> <<else>> <<set _currentLevelMin = 175>> <<set _nextThreshold = 425>> <</if>> <<set _xpInLevel = _relationship.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <<if _xpPercent < 0>><<set _xpPercent = 0>><</if>> <<if _xpPercent > 100>><<set _xpPercent = 100>><</if>> <div @style="'background: #000000; border: 2px solid ' + _relColor + '; border-radius: 10px; height: 30px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);'"> <div @style="'background: linear-gradient(90deg, ' + _relColor + ' 0%, ' + _relColor + 'dd 100%); height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s ease; position: absolute; left: 0; top: 0;'"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 14px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> <<print _relationship.points>> / <<print _nextThreshold>> points (<<print _xpPercent>>%) </div> </div> <<else>> <div @style="'background: #000000; border: 2px solid ' + _relColor + '; border-radius: 10px; height: 30px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);'"> <div @style="'background: linear-gradient(90deg, ' + _relColor + ' 0%, ' + _relColor + 'dd 100%); height: 100%; width: 100%; position: absolute; left: 0; top: 0;'"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 14px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> MAX LEVEL </div> </div> <</if>> </div> </div> <!-- NPC's Initial Reaction based on your appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;">_npc.name's Reaction</h3> <div style="color: #ccc; font-size: 16px; line-height: 1.8; font-style: italic;"> "<<print setup.getNPCGreeting(_npc, _relLevel)>>" </div> </div> <!-- Dynamic Conversation Topics --> <<set _availableOptions = setup.getAvailableConversationOptions(_npc, _relLevel)>> <!-- Group options by category --> <<set _coreOptions = _availableOptions.filter(function(o) { return o.category === "core"; })>> <<set _personalityOptions = _availableOptions.filter(function(o) { return o.category === "personality"; })>> <<set _relOptions = _availableOptions.filter(function(o) { return o.category === "relationship"; })>> <<set _riskyOptions = _availableOptions.filter(function(o) { return o.category === "risky"; })>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 20px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">What do you want to talk about?</h3> <!-- Core Options --> <<if _coreOptions.length > 0>> <h4 style="color: #51cf66; margin: 15px 0 10px 0; font-size: 16px;">General Topics</h4> <div style="display: grid; gap: 10px; margin-bottom: 20px;"> <<for _opt range _coreOptions>> <<capture _opt>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid ' + _opt.option.color + '; cursor: pointer;'"> <<link `'<span style="color: ' + _opt.option.color + '; font-weight: bold;">' + _opt.option.label + '</span>'`>> <<set $currentTopic = _opt.option.id>> <<set $currentTopicData = _opt.option>> <<goto "NPCTalkResponse">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- Personality-Specific Options --> <<if _personalityOptions.length > 0>> <h4 style="color: #e91e63; margin: 15px 0 10px 0; font-size: 16px;">Special Topics <span style="font-weight: normal; color: #888; font-size: 13px;">(based on _npc.name's personality)</span></h4> <div style="display: grid; gap: 10px; margin-bottom: 20px;"> <<for _opt range _personalityOptions>> <<capture _opt>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid ' + _opt.option.color + '; cursor: pointer;'"> <<link `'<span style="color: ' + _opt.option.color + '; font-weight: bold;">' + _opt.option.label + '</span>'`>> <<set $currentTopic = _opt.option.id>> <<set $currentTopicData = _opt.option>> <<goto "NPCTalkResponse">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- Relationship-Gated Options --> <<if _relOptions.length > 0>> <h4 style="color: #9b59b6; margin: 15px 0 10px 0; font-size: 16px;">Friendship Topics <span style="font-weight: normal; color: #888; font-size: 13px;">(unlocked by your relationship)</span></h4> <div style="display: grid; gap: 10px; margin-bottom: 20px;"> <<for _opt range _relOptions>> <<capture _opt>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid ' + _opt.option.color + '; cursor: pointer;'"> <<link `'<span style="color: ' + _opt.option.color + '; font-weight: bold;">' + _opt.option.label + '</span>'`>> <<set $currentTopic = _opt.option.id>> <<set $currentTopicData = _opt.option>> <<goto "NPCTalkResponse">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- Risky Options --> <<if _riskyOptions.length > 0>> <h4 style="color: #ff6b6b; margin: 15px 0 10px 0; font-size: 16px;">Risky Topics <span style="font-weight: normal; color: #888; font-size: 13px;">(may backfire!)</span></h4> <div style="display: grid; gap: 10px; margin-bottom: 20px;"> <<for _opt range _riskyOptions>> <<capture _opt>> <<set _riskText = "">> <<if _opt.option.riskLevel === "high">> <<set _riskText = " (High Risk)">> <<elseif _opt.option.riskLevel === "medium">> <<set _riskText = " (Medium Risk)">> <</if>> <div @style="'background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid ' + _opt.option.color + '; cursor: pointer;'"> <<link `'<span style="color: ' + _opt.option.color + '; font-weight: bold;">' + _opt.option.label + _riskText + '</span>'`>> <<set $currentTopic = _opt.option.id>> <<set $currentTopicData = _opt.option>> <<goto "NPCTalkResponse">> <</link>> </div> <</capture>> <</for>> </div> <</if>> </div> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto "NPCInteraction">> <</link>> </div> </div> <</if>> <</nobr>>
<div style="display: grid; gap: 15px; margin: 0; padding: 0;"> <<for _traitName, _traitDesc range $availableTraits>><<capture _traitName, _traitDesc>><<set _isSelected = $selectedTraits.has(_traitName)>><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid <<if _isSelected>>#51cf66<<else>>#666<</if>>;"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"><strong style="color: <<if _isSelected>>#51cf66<<else>>#ccc<</if>>; font-size: 18px;">_traitName</strong><<if _isSelected>><<link "<span style='color: #ff6b6b; font-weight: bold; font-size: 16px;'>REMOVE</span>">><<run $selectedTraits.delete(_traitName)>><<replace "#trait-list">><<include "TraitListDisplay">><</replace>><<replace "#trait-counter">><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"><p style="color: #51cf66; margin: 0; font-size: 16px; font-weight: bold;">You may choose up to <span style="color: #ffc107;">1</span> trait.</p></div><</replace>><</link>><<else>><<link "<span style='color: #51cf66; font-weight: bold; font-size: 16px;'>SELECT</span>">><<if $selectedTraits.size < $maxTraits>><<run $selectedTraits.add(_traitName)>><<replace "#trait-list">><<include "TraitListDisplay">><</replace>><<replace "#trait-counter">><div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"><p style="color: #51cf66; margin: 0; font-size: 16px; font-weight: bold;">You may choose up to <span style="color: #ffc107;">1</span> trait.</p></div><</replace>><<else>><<script>>UI.alert("You can only select 1 trait!");<</script>><</if>><</link>><</if>></div><p style="color: #aaa; margin: 0; font-style: italic; font-size: 15px;">_traitDesc</p></div><</capture>><</for>> </div>
<<nobr>> <<set $lastLocation = "ShadyShop">> <h1>🕶️ Shady Shop</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The dim interior reeks of cigarette smoke and desperation. An old man sits behind the counter, cackling to himself. His eyes light up when he sees you. "Welcome, welcome! Looking for a little excitement? A little chaos in your life? I can help with that... hehehehe!" </p> </div> <h2>Shop Services</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <div style="border: 2px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; opacity: 0.6;"> <h3 style="color: #666; margin-top: 0;">🎲 Shady Deal</h3> <p style="font-size: 14px; color: #ccc;">The old man loves chaos. Gain a positive trait, but receive a negative one too.</p> <p style="font-size: 13px; color: #999; font-style: italic; margin: 8px 0;">This feature will be fixed in a future update.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Disabled</div> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">💊 Black Market Goods</h3> <p style="font-size: 14px; color: #ccc;">Questionable items of dubious origin.</p> <p style="font-size: 13px; color: #999; font-style: italic;">Coming soon...</p> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">🔓 Illegal Services</h3> <p style="font-size: 14px; color: #ccc;">Off-the-books transactions and services.</p> <<link "<div style='background: #ff4444; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter</div>">> <<goto "IllegalServices">> <</link>> </div> <div style="border: 2px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff4444; margin-top: 0;">💰 Fence Stolen Goods</h3> <p style="font-size: 14px; color: #ccc;">Sell items without asking questions.</p> <p style="font-size: 13px; color: #999; font-style: italic;">Coming soon...</p> </div> </div> <br><br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Alleyway</div>">> <<goto "Alleyway">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ShadyDeal">> <!-- Initialize shady deals counter if it doesn't exist --> <<if !$shadyDealsToday>> <<set $shadyDealsToday = 0>> <<set $lastShadyDealDay = $dayNumber>> <</if>> <!-- Reset counter if it's a new day --> <<if $lastShadyDealDay !== $dayNumber>> <<set $shadyDealsToday = 0>> <<set $lastShadyDealDay = $dayNumber>> <</if>> <h1>🕶️ Shady Deal</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 20px; border: 2px solid #ff4444;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The old man cackles with glee, his eyes gleaming with malicious amusement. "Hehehehe... I just love watching people squirm! I got connections to some real special folks. They can change you... make you better, make you worse. Who knows?" He grins wickedly. "I just do it for the entertainment, ya know? Watching you deal with the consequences... priceless!" </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107;"> <h2 style="color: #ffc107; margin-top: 0;">⚠️ How It Works</h2> <ul style="color: #ccc; font-size: 15px;"> <li><strong>You will receive:</strong> One random positive physical or mental trait (value: 1-20+)</li> <li><strong>You will also receive:</strong> One random negative trait (value: -20 to -1)</li> <li><strong>Cost:</strong> FREE - The old man just likes the chaos</li> <li><strong>Limit:</strong> 3 deals per day</li> <li><strong>Warning:</strong> The negative trait could be severe. This is pure gambling.</li> </ul> </div> <div style="background: #3a3a3a; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 20px; border: 2px solid #666;"> <p style="color: #ffc107; font-size: 18px; font-weight: bold; margin: 0;"> 🎲 Deals Remaining Today: <<print 3 - $shadyDealsToday>> / 3 </p> </div> <<if $shadyDealsToday < 3>> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🎲 Roll the Dice (FREE)</div>">> <<set $shadyDealsToday += 1>> <!-- Get all positive traits player doesn't have --> <<set _positivePhysical = ["Tall", "Curvy", "Lean", "Muscular", "Soft", "Sharp Features", "Smooth Skin", "Pierced", "Youthful", "Mature", "Tan Skin", "Dark Skin", "Pale Skin", "Attractive", "Fit", "Graceful", "Strong", "Flexible", "Freckled", "Tattooed", "Athletic Build", "Petite", "Voluptuous", "Broad-shouldered", "Quick", "Sturdy"]>> <<set _positiveMental = ["Extroverted", "Kind", "Sly", "Dominant", "Confident", "Optimistic", "Empathetic", "Supportive", "Friendly", "Competitive", "Logical", "Shrewd", "Hardworking", "Humble", "Trusting", "Ambitious", "Creative", "Brave", "Patient", "Wise", "Intelligent", "Analytical", "Outgoing", "Curious", "Witty", "Calm", "Energetic", "Thoughtful"]>> <<set _negativePhysical = ["Plain", "Ugly", "Overweight", "Underweight", "Clumsy", "Weak", "Stiff", "Blemished", "Short", "Scarred"]>> <<set _negativeMental = ["Bitchy", "Cruel", "Jealous", "Lazy", "Arrogant", "Complacent", "Dull", "Cowardly", "Impatient", "Foolish", "Introverted", "Submissive", "Shy", "Aggressive", "Passive", "Pessimistic", "Stubborn", "Paranoid"]>> <!-- Filter out traits player already has or are blocked by transformation --> <<set _availablePositivePhysical = []>> <<for _trait range _positivePhysical>> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation(_trait, "physical")>> <<if !$physicalTraits.includes(_trait) && !_blockedByTransform>> <<run _availablePositivePhysical.push(_trait)>> <</if>> <</for>> <<set _availablePositiveMental = []>> <<for _trait range _positiveMental>> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation(_trait, "mental")>> <<if !$mentalTraits.includes(_trait) && !_blockedByTransform>> <<run _availablePositiveMental.push(_trait)>> <</if>> <</for>> <<set _availableNegativePhysical = []>> <<for _trait range _negativePhysical>> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation(_trait, "physical")>> <<if !$physicalTraits.includes(_trait) && !_blockedByTransform>> <<run _availableNegativePhysical.push(_trait)>> <</if>> <</for>> <<set _availableNegativeMental = []>> <<for _trait range _negativeMental>> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation(_trait, "mental")>> <<if !$mentalTraits.includes(_trait) && !_blockedByTransform>> <<run _availableNegativeMental.push(_trait)>> <</if>> <</for>> <!-- Combine all available positive and negative traits --> <<set _allPositive = _availablePositivePhysical.concat(_availablePositiveMental)>> <<set _allNegative = _availableNegativePhysical.concat(_availableNegativeMental)>> <<if _allPositive.length === 0 || _allNegative.length === 0>> <<set $shadyDealResult = { success: false, reason: "insufficient_traits" }>> <<else>> <!-- Pick random positive trait --> <<set _positiveTrait = _allPositive[Math.floor(Math.random() * _allPositive.length)]>> <<set _isPositivePhysical = _availablePositivePhysical.includes(_positiveTrait)>> <!-- Pick random negative trait --> <<set _negativeTrait = _allNegative[Math.floor(Math.random() * _allNegative.length)]>> <<set _isNegativePhysical = _availableNegativePhysical.includes(_negativeTrait)>> <!-- Add traits to player --> <<if _isPositivePhysical>> <<run $physicalTraits.push(_positiveTrait)>> <<else>> <<run $mentalTraits.push(_positiveTrait)>> <</if>> <<if _isNegativePhysical>> <<run $physicalTraits.push(_negativeTrait)>> <<else>> <<run $mentalTraits.push(_negativeTrait)>> <</if>> <!-- Calculate values --> <<set _positiveValue = setup.getTraitValue(_isPositivePhysical ? "physical" : "mental", _positiveTrait)>> <<set _negativeValue = setup.getTraitValue(_isNegativePhysical ? "physical" : "mental", _negativeTrait)>> <<set $shadyDealResult = { success: true, positiveTrait: _positiveTrait, positiveType: _isPositivePhysical ? "Physical" : "Mental", positiveValue: _positiveValue, negativeTrait: _negativeTrait, negativeType: _isNegativePhysical ? "Physical" : "Mental", negativeValue: _negativeValue }>> <</if>> <<goto "ShadyDealResult">> <</link>> </div> <<else>> <div style="background: #3a3a3a; padding: 20px; border-radius: 12px; text-align: center; border: 2px solid #666;"> <p style="color: #ff6b6b; font-size: 18px; margin: 0;"> ❌ You've used all your deals for today. </p> <p style="color: #999; font-size: 14px; margin: 10px 0 0 0;"> <em>The old man cackles: "That's enough chaos for one day! Come back tomorrow if you want more!"</em> </p> </div> <</if>> <br><br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Shop</div>">> <<goto "ShadyShop">> <</link>> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <<if $shadyDealResult.success>> <!-- SUCCESS --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 3px solid #ff4444;"> <h1 style="color: #ff4444; margin: 0 0 10px 0; font-size: 36px;">🎲 The Deal is Done</h1> <p style="color: #ccc; margin: 0; font-size: 18px;">The shopkeeper smiles wickedly as the transformation takes hold...</p> </div> <!-- What You Gained --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #51cf66; padding-bottom: 10px;">✅ What You Gained</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; text-align: center;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 22px;">$shadyDealResult.positiveTrait</h3> <p style="color: #aaa; margin: 5px 0; font-size: 16px;"> <strong>Type:</strong> $shadyDealResult.positiveType Trait </p> <p style="color: #51cf66; margin: 5px 0; font-size: 18px; font-weight: bold;"> Trade Value: +$shadyDealResult.positiveValue </p> </div> </div> <!-- What You Lost --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">❌ The Price You Paid</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 22px;">$shadyDealResult.negativeTrait</h3> <p style="color: #aaa; margin: 5px 0; font-size: 16px;"> <strong>Type:</strong> $shadyDealResult.negativeType Trait </p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 18px; font-weight: bold;"> Trade Value: $shadyDealResult.negativeValue </p> </div> </div> <!-- Net Result --> <<set _netValue = $shadyDealResult.positiveValue + $shadyDealResult.negativeValue>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; text-align: center; border: 3px solid <<if _netValue >= 0>>#17a2b8<<else>>#ffc107<</if>>; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<if _netValue >= 0>>#17a2b8<<else>>#ffc107<</if>>; margin: 0 0 10px 0;">📊 Net Result</h3> <p style="color: #ccc; font-size: 20px; font-weight: bold; margin: 0;"> <<if _netValue > 0>> You came out ahead! Net value: <span style="color: #51cf66;">+_netValue</span> <<elseif _netValue === 0>> It is a wash. Net value: <span style="color: #ffc107;">0</span> <<else>> You got the short end of the stick. Net value: <span style="color: #ff6b6b;">_netValue</span> <</if>> </p> </div> <<else>> <!-- FAILURE --> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #dc3545 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 3px solid #ff6b6b;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">❌ Deal Cancelled</h1> <p style="color: white; margin: 0; font-size: 18px;">You do not have enough available traits to make this deal.</p> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; text-align: center; font-size: 16px; margin: 0;"> The shopkeeper shrugs. "Come back when you are less full of yourself. Or more full of problems. Either way." </p> </div> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue</div>">> <<goto "ShadyShop">> <</link>> </div> </div> <</nobr>>
<!-- Reset shady deals counter --> <<set $shadyDealsToday = 0>>
https://www.patreon.com/Grankor <!-- Return to Game Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div>
https://discord.gg/z9eDdQC6zA <!-- Return to Game Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div>
''Alpha Version: 0.24.2''
<<nobr>> <<set $lastLocation = "Brothel">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Brothel")>> <<run $visitedLocations.push("Brothel")>> <</if>> <!-- Check job availability --> <<set _alreadyHasBrothelJob = $jobs && $jobs.includes("Brothel Worker")>> <<set _meetsRequirements = false>> <!-- Check all requirements --> <<if $bodyParts.gender === "female" && $skills && ($skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")) && $stats && $stats.charisma >= 35>> <<set _meetsRequirements = true>> <</if>> <<set _brothelWorkerNPCs = setup.getNPCsByJob("Brothel Worker")>> <<set _brothelWorkerCount = _brothelWorkerNPCs ? _brothelWorkerNPCs.length : 0>> <<set _canHire = _brothelWorkerCount < 8>> <!-- Check requirements --> <<set _canWorkBrothel = $bodyParts.gender === "female" && ($skills && $skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut"))>> <!-- Initialize Brothel Work System --> <<if !$brothelLevel>> <<set $brothelLevel = 1>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = 100>> <<set $brothelClients = 0>> <<set $brothelClientsToday = 0>> <<set $brothelLastWorkDay = 0>> <</if>> <!-- Initialize sexual skills if needed --> <<if _canWorkBrothel>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Reset daily client count if new day --> <<if $brothelLastWorkDay !== $dayNumber>> <<set $brothelClientsToday = 0>> <<set $brothelLastWorkDay = $dayNumber>> <</if>> <!-- Calculate max work hours per day based on brothel level --> <<set _maxBrothelHours = 3>> <<if $brothelLevel === 2>> <<set _maxBrothelHours = 4>> <<elseif $brothelLevel === 3>> <<set _maxBrothelHours = 5>> <<elseif $brothelLevel === 4>> <<set _maxBrothelHours = 6>> <<elseif $brothelLevel >= 5>> <<set _maxBrothelHours = 8>> <</if>> <!-- Calculate bonus money from relevant traits/skills --> <<set _brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion", "Oral Expert", "Anal Expert", "Rough Sex Enthusiast", "Sensual Lover", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Roleplay Expert", "Dirty Talker", "Tantric Master", "Exhibitionist", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]>> <<set _brothelBonusMoney = 0>> <<for _trait range _brothelBonusTraits>> <<if ($mentalTraits && $mentalTraits.includes(_trait)) || ($physicalTraits && $physicalTraits.includes(_trait)) || ($skills && $skills.includes(_trait))>> <<set _brothelBonusMoney += 15>> <</if>> <</for>> <!-- Display level up messages --> <<if $brothelLevelUpMessages && $brothelLevelUpMessages.length > 0>> <<for _msg range $brothelLevelUpMessages>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #FFD700; box-shadow: 0 6px 12px rgba(255,215,0,0.5); text-align: center;"> <h2 style="color: #000; margin: 0; font-size: 24px; text-shadow: 2px 2px 4px rgba(255,255,255,0.3);">_msg</h2> </div> <</for>> <<set $brothelLevelUpMessages = []>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #007FFF; text-align: center;">💋 Azure Angelfish Lounge</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Brothel.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Azure Angelfish Lounge"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 18px; margin: 0;"> Plush velvet furniture and dim mood lighting create an atmosphere of luxury and discretion. Well-dressed hosts and hostesses attend to clients with professional grace. The air carries hints of expensive perfume and champagne. </p> </div> <!-- REQUIREMENTS NOT MET WARNING (Only shows if player already has Brothel Worker job) --> <<if $jobs && $jobs.includes("Brothel Worker")>> <<if $bodyParts.gender !== "female">> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 10px 0;">❌ Employment Requirements Not Met</h2> <p style="color: #ccc; margin: 0;">This establishment only hires <strong style="color: #e91e63;">female</strong> workers. You do not meet this requirement.</p> </div> <</if>> <<if !$skills.includes("Sexually Skilled") && !$physicalTraits.includes("Succubus") && !$physicalTraits.includes("Slut")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 10px 0;">❌ Skills Requirement Not Met</h2> <p style="color: #ccc; margin: 0;">To work at the Azure Angelfish Lounge, you need the <strong style="color: #e91e63;">"Sexually Skilled"</strong> trait or be a <strong style="color: #e91e63;">Succubus/Slut</strong>. This is a professional establishment that requires experienced workers.</p> <p style="color: #888; margin: 10px 0 0 0; font-size: 14px; font-style: italic;">Hint: You can acquire this trait through various means in the city...</p> </div> <</if>> <</if>> <!-- Apply for Job Section --> <<if !$jobs || !$jobs.includes("Brothel Owner")>> <h2 style="color: #007FFF;">Employment</h2> <div style="display: grid; grid-template-columns: 1fr; gap: 15px; margin-bottom: 25px;"> <<if _alreadyHasBrothelJob>> <!-- Already working here --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">💼 Employment Status</h3> <p style="font-size: 14px; color: #51cf66; margin-bottom: 15px;">You're already employed here!</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Already Employed</div> </div> <<elseif !_meetsRequirements>> <!-- Doesn't meet requirements --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6;"> <h3 style="color: #666; margin: 0 0 10px 0;">💼 Apply for Position</h3> <p style="font-size: 14px; color: #666; margin-bottom: 10px;">You don't meet the requirements to work here.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Qualified</div> </div> <<elseif !_canHire>> <!-- Brothel is fully staffed --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">💼 Apply for Position</h3> <p style="font-size: 14px; color: #ff6b6b; margin-bottom: 10px;">The lounge is fully staffed (<<print _brothelWorkerCount>>/8 workers)</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Hiring</div> </div> <<else>> <!-- Can apply for the job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">💼 Apply for Position</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;">Join the Azure Angelfish Lounge as a professional companion.</p> <p style="font-size: 13px; color: #aaa; margin-bottom: 15px;">High-end establishment | Professional discretion required</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Apply Now</div>">> <<goto "BrothelJobOffer">> <</link>> </div> <</if>> </div> <</if>> <!-- Management Area (Only shows if player has Brothel Owner job) --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Brothel Owner")>> <h2 style="color: #FFD700;">Brothel Management</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0;">👑 Manage Your Business</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Oversee operations, finances, and staff at the Azure Angelfish Lounge.</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Enter Management Office</div>">> <<goto "BrothelManagement">> <</link>> </div> </div> <</if>> <!-- Work Area (Only shows if player has Brothel Worker job AND meets requirements) --> <<if $jobs && $jobs.length > 0 && $jobs.includes("Brothel Worker")>> <<if _canWorkBrothel>> <h2 style="color: #007FFF;">Your Work</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <!-- Professional Level Display --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #007FFF;"> <h3 style="color: #007FFF; margin: 0 0 10px 0;"> Professional Level: $brothelLevel <<if $brothelLevel === 1>> <span style="color: #999; font-size: 14px;">(Novice)</span> <<elseif $brothelLevel === 2>> <span style="color: #51cf66; font-size: 14px;">(Experienced)</span> <<elseif $brothelLevel === 3>> <span style="color: #ffc107; font-size: 14px;">(Professional)</span> <<elseif $brothelLevel === 4>> <span style="color: #ff9800; font-size: 14px;">(Expert)</span> <<elseif $brothelLevel >= 5>> <span style="color: #e91e63; font-size: 14px;">(Elite)</span> <</if>> </h3> <!-- XP Progress Bar --> <<if $brothelLevel < 5>> <<set _brothelLevelProgress = Math.floor(($brothelLevelExp / $brothelMaxExp) * 100)>> <div style="margin-bottom: 10px;"> <div style="background-color: #0a0a0a; border-radius: 10px; height: 12px; overflow: hidden; border: 1px solid #444; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);"> <div @style="'background: linear-gradient(90deg, #007FFF 0%, #00bfff 100%); height: 100%; width: ' + _brothelLevelProgress + '%; transition: width 0.3s ease; box-shadow: 0 0 10px #007FFF;'"></div> </div> <p style="color: #aaa; margin: 5px 0 0 0; font-size: 13px; text-align: center;"> <<print $brothelLevelExp>> / <<print $brothelMaxExp>> XP to Level <<print $brothelLevel + 1>> </p> </div> <<else>> <p style="color: #e91e63; margin: 10px 0 0 0; font-weight: bold; text-align: center;">★ MAX LEVEL REACHED ★</p> <</if>> <!-- Level Benefits --> <div style="background: #0a0a0a; padding: 10px; border-radius: 6px; margin-top: 10px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0 0 5px 0; font-size: 14px;"><strong style="color: #007FFF;">Current Benefits:</strong></p> <ul style="color: #aaa; font-size: 13px; margin: 5px 0 0 20px; padding: 0;"> <li>Available Clients: <span style="color: #51cf66;"><<print 3 + $brothelLevel>></span></li> <li>Max Work Hours/Day: <span style="color: #51cf66;"><<print _maxBrothelHours>></span></li> <li>Max Client Difficulty: <<if $brothelLevel <= 2>> <span style="color: #ffc107;">Medium</span> <<elseif $brothelLevel <= 4>> <span style="color: #ff9800;">Hard</span> <<else>> <span style="color: #e91e63;">Very Hard</span> <</if>> </li> </ul> </div> <p style="color: #ccc; margin: 10px 0 0 0;">Total Clients Served: <span style="color: #007FFF;">$brothelClients</span></p> <p style="color: #ffc107; margin: 5px 0 0 0;"> Today's Sessions: $brothelClientsToday / _maxBrothelHours hours <<if _brothelBonusMoney > 0>> <span style="color: #51cf66;"> (+$<<print _brothelBonusMoney>> per client from skills/traits)</span> <</if>> </p> </div> <!-- Work Button --> <<if $brothelClientsToday >= _maxBrothelHours>> <div style="background: #1a1a1a; border: 3px solid #666; padding: 15px; border-radius: 8px; text-align: center;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">You're exhausted for today. Come back tomorrow.</p> <p style="color: #888; margin: 10px 0 0 0; font-size: 14px;">You've worked $brothelClientsToday / _maxBrothelHours hours today.</p> </div> <<else>> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💼 Wait for Client</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 15px 0;">Take the next available client. Each session lasts 1 hour.</p> <<link "<div style='background: #e91e63; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Service Next Client (<<print _maxBrothelHours - $brothelClientsToday>> hours remaining)</div>">> <<goto "BrothelClientSelection">> <</link>> </div> <</if>> </div> <<else>> <h2 style="color: #ff6b6b;">Cannot Work</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 10px 0;">You no longer meet the requirements to work here:</p> <ul style="color: #ccc; margin: 0; padding-left: 20px;"> <<if $bodyParts.gender !== "female">> <li>You must be <strong style="color: #e91e63;">female</strong></li> <</if>> <<if !$skills.includes("Sexually Skilled") && !$physicalTraits.includes("Succubus") && !$physicalTraits.includes("Slut")>> <li>You must have the <strong style="color: #e91e63;">"Sexually Skilled"</strong> trait or be a <strong style="color: #e91e63;">Succubus/Slut</strong></li> <</if>> </ul> </div> <</if>> <</if>> <!-- NPCs Present --> <<set _brothelWorkers = setup.getNPCsByJob("Brothel Worker")>> <<set _brothelOwner = setup.getNPCsByJob("Brothel Owner")>> <<set _npcsHere = _brothelWorkers.concat(_brothelOwner)>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #007FFF;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #007FFF; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #007FFF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #007FFF;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The lounge is quiet right now. No one is available. </p> </div> <</if>> <!-- Navigation Buttons --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #ff1493; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClub">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("StripClub")>> <<run $visitedLocations.push("StripClub")>> <</if>> <!-- Check if player is an employee --> <<set _isEmployee = ($jobs.includes("Stripper") || $jobs.includes("Bouncer"))>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(157, 0, 255, 0.8), 0 0 40px rgba(255, 20, 147, 0.6);">🪼 Electric Jelly Revue</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/StripClub.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 30px rgba(157, 0, 255, 0.5), 0 4px 8px rgba(0,0,0,0.6);" alt="Electric Jelly Revue"> </div> <</if>> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #9D00FF; box-shadow: 0 0 30px rgba(157, 0, 255, 0.4), inset 0 0 20px rgba(255, 20, 147, 0.2);"> <p style="color: #fff; font-size: 20px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Bass-heavy music throbs through the air as colorful lights pulse across the stage in hypnotic patterns—purple, pink, electric blue. Dancers move gracefully on gleaming chrome poles while patrons sip drinks and watch from plush velvet booths. </p> <p style="color: #D8BFD8; font-size: 18px; margin: 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The atmosphere crackles with energy and anticipation. Money flows freely here, and desire hangs thick in the air. </p> </div> <!-- Work Section (only shows if player has Stripper or Bouncer job) --> <<if $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💼 Employee Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 20px; margin-bottom: 30px;"> <<if $jobs.includes("Stripper")>> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 25px rgba(255, 20, 147, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h4 style="color: #FF1493; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);">💃 Work as Stripper</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;">Clock in for your shift. Perform on stage, work the floor, or take private bookings. Your body is your business, and business is good.</p> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6);'>🎭 Start Shift</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> <</if>> <<if $jobs.includes("Bouncer")>> <div style="border: 3px solid #9D00FF; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 20px rgba(157, 0, 255, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9D00FF, transparent); opacity: 0.6;"></div> <h4 style="color: #9D00FF; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(157, 0, 255, 0.8);">🛡️ Work as Bouncer</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;">Maintain security and keep the peace. Make sure everyone follows the rules and nobody gets too handsy with the dancers.</p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(157, 0, 255, 0.5);'>💪 Start Shift</div>">> <<goto "StripClubWorkBouncer">> <</link>> </div> <</if>> </div> <</if>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; margin-top: 40px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">📍 Club Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 20px; margin-bottom: 30px;"> <!-- VIP Lounge --> <<if $stripClubVIPMember || $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> <div style="border: 3px solid #FFD700; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); box-shadow: 0 0 25px rgba(255, 215, 0, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, transparent); opacity: 0.6;"></div> <h4 style="color: #FFD700; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 215, 0, 0.8);">👑 VIP Lounge</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> <<if $jobs.includes("Stripper") || $jobs.includes("Bouncer")>> Access the exclusive VIP area behind the velvet rope. As an employee, you can enter anytime to network with the club's wealthiest clientele. <<else>> Behind the velvet rope lies the VIP section—exclusive, luxurious, and decadent. Private booths, premium service, and intimate entertainment await members. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.6);'>✨ Enter VIP Lounge</div>">> <<goto "StripClubVIP">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); box-shadow: 0 0 15px rgba(102, 102, 102, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #666, transparent); opacity: 0.6;"></div> <h4 style="color: #999; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(153, 153, 153, 0.8);">👑 VIP Lounge</h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0; line-height: 1.5;">Exclusive access to private entertainment and premium services. Elite members only.</p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: auto; border: 2px solid #FFD700;"> <p style="color: #FFD700; font-size: 18px; font-weight: bold; margin: 0; text-align: center; text-shadow: 0 0 10px rgba(255, 215, 0, 0.6);"> Membership: $5,000 </p> </div> <<if $money >= 5000>> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 215, 0, 0.5);'>💳 Purchase Membership</div>">> <<set $money -= 5000>> <<set $stripClubVIPMember = true>> <<goto "StripClub">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; margin-top: 15px; cursor: not-allowed; border: 2px solid #666;'>❌ Insufficient Funds</div> <</if>> </div> <</if>> </div> <!-- NPCs Present --> <<set _strippers = setup.getNPCsByJob("Stripper")>> <<set _bouncers = setup.getNPCsByJob("Bouncer")>> <<set _npcsHere = _strippers.concat(_bouncers)>> <<if _npcsHere && _npcsHere.length > 0>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-top: 40px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">👥 People Here</h2> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.3);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9D00FF; border-radius: 12px; padding: 18px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 15px rgba(157, 0, 255, 0.2), 0 4px 8px rgba(0,0,0,0.6); position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, transparent, #9D00FF, transparent); opacity: 0.6;"></div> <h3 style="color: #FF69B4; margin: 0 0 10px 0; font-size: 20px; text-shadow: 0 0 8px rgba(255, 105, 180, 0.6);">_npc.name</h3> <p style="font-size: 14px; color: #D8BFD8; margin: 0 0 12px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 10px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(157, 0, 255, 0.4);'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-top: 40px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">👥 People Here</h2> <div style="background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 0 15px rgba(102, 102, 102, 0.2);"> <p style="text-align: center; color: #888; margin: 0; font-style: italic; font-size: 16px;"> The club is quiet right now. No dancers or staff are currently available to chat. </p> </div> <</if>> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Casino")>> <<run $visitedLocations.push("Casino")>> <</if>> <<set $lastLocation = "Casino">> <!-- Check for gambling addiction forced play --> <<if setup.checkGamblingAddiction() && !$forcedGambling>> <<goto "ForcedGambling">> <</if>> <!-- Clear forced gambling flag if set --> <<if $forcedGambling>> <<set $forcedGambling = false>> <</if>> <!-- Check if player has bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎰 Silver Marlin Casino</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Neon lights flash in rhythmic patterns across walls lined with slot machines and gaming tables. The constant chiming of wins mixes with the shuffle of cards and the roll of dice. Cocktail servers weave through crowds of hopeful gamblers while security watches from discrete corners. The air is thick with cigarette smoke and expensive cologne. </p> </div> <!-- Casino Activities Section --> <h2 style="color: #ffd700;">Casino Games</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 30px;"> <!-- Slot Machines --> <<set _canPlaySlots = $money >= 50>> <div style="border: 3px solid <<if _canPlaySlots>>#ffd700<<else>>#666<</if>>; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if _canPlaySlots>>rgba(255, 215, 0, 0.3)<<else>>rgba(102, 102, 102, 0.2)<</if>>;"> <h3 style="color: <<if _canPlaySlots>>#ffd700<<else>>#666<</if>>; margin: 0 0 10px 0;">🎰 Slot Machines</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 5px;">Pull the lever for instant wins!</p> <p style="font-size: 13px; color: #f39c12; margin-bottom: 10px;">💵 $50 per spin</p> <<if $slotMachineSystem && $slotMachineSystem.totalPlays > 0>> <p style="font-size: 13px; color: #4dabf7; margin-bottom: 10px;"> Total plays: $slotMachineSystem.totalPlays </p> <</if>> <<if _canPlaySlots>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3);'>🎰 Play Slots</div>">> <<goto "SlotMachine">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> <p style="font-size: 13px; color: #888; margin: 8px 0 0 0; font-style: italic; text-align: center;">You need at least $50 to play slots</p> <</if>> </div> <!-- Roulette --> <<set _rouletteAccess = setup.canPlayRoulette()>> <<set _hasRouletteAccess = _rouletteAccess.canPlay && $money >= 100>> <<set _rouletteBanned = !_rouletteAccess.canPlay>> <<set _rouletteColor = _hasRouletteAccess ? "#ffd700" : (_rouletteBanned ? "#c62828" : "#666")>> <div style="border: 3px solid <<print _rouletteColor>>; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if _hasRouletteAccess>>rgba(255, 215, 0, 0.3)<<elseif _rouletteBanned>>rgba(198, 40, 40, 0.3)<<else>>rgba(102, 102, 102, 0.2)<</if>>;"> <h3 style="color: <<print _rouletteColor>>; margin: 0 0 10px 0;">🎡 Roulette</h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 5px;">Bet on numbers or colors</p> <p style="font-size: 13px; color: #f39c12; margin-bottom: 10px;">⚠️ Limit: $50,000 (30-day cooldown after limit)</p> <<if $rouletteSystem.periodWinnings > 0 && !$rouletteSystem.kickedOut>> <p style="font-size: 13px; color: <<if $rouletteSystem.periodWinnings >= 50000>>#c62828<<elseif $rouletteSystem.periodWinnings >= 25000>>#f39c12<<else>>#51cf66<</if>>; margin-bottom: 10px;"> Winnings: $<<print $rouletteSystem.periodWinnings.toLocaleString()>> / $50,000 </p> <</if>> <<if _hasRouletteAccess>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3);'>🎡 Enter Roulette Room</div>">> <<goto "RouletteRoom">> <</link>> <<elseif _rouletteBanned>> <<set _daysRemaining = 30 - ($dayNumber - $rouletteSystem.lockoutStartDay)>> <<if _daysRemaining < 0>><<set _daysRemaining = 0>><</if>> <div style='background: #c62828; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-bottom: 8px;'>🚫 Banned for <<print _daysRemaining>> more day<<if _daysRemaining !== 1>>s<</if>></div> <p style="font-size: 13px; color: #ff6b6b; margin: 0; font-style: italic;"><<print _rouletteAccess.reason>></p> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>Not Enough Money</div> <p style="font-size: 13px; color: #888; margin: 8px 0 0 0; font-style: italic; text-align: center;">You need at least $100 to play roulette</p> <</if>> </div> </div> <!-- NPCs at Casino Section --> <<set _rouletteNPCs = setup.getNPCsAtLocation("Casino")>> <<if _rouletteNPCs && _rouletteNPCs.length > 0>> <h2 style="color: #ffd700;">🎰 Gamblers at the Tables</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(255, 215, 0, 0.2);"> <p style="color: #ffa500; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(255, 165, 0, 0.5);"> High rollers and hopeful gamblers gather around the tables... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _rouletteNPCs>> <<capture _npc>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 215, 0, 0.2);"> <h3 style="color: #ffd700; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(255, 215, 0, 0.5);">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 5px 0;"> <<if typeof _npc.jobs === "string">> <em>_npc.jobs</em> <<else>> <<set _displayJob = _npc.jobs[0]>> <em>_displayJob</em> <</if>> </p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 15px rgba(255, 215, 0, 0.3);'>💬 Approach _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #ffd700;">Casino Patrons</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #666; font-size: 15px; margin: 0; font-style: italic; text-align: center;"> The casino floor is busy, but you don't see anyone you know at the moment. </p> </div> <</if>> <!-- Compact ATM Section - Bottom --> <div style="background: #2a2a2a; padding: 12px 20px; border-radius: 8px; margin-bottom: 20px; border: 2px solid <<if _hasBankAccount>>#4dabf7<<else>>#555<</if>>; display: flex; align-items: center; justify-content: space-between; gap: 15px; flex-wrap: wrap;"> <div style="flex: 1; min-width: 200px;"> <span style="color: <<if _hasBankAccount>>#4dabf7<<else>>#888<</if>>; font-size: 16px; font-weight: bold;">🏧 ATM</span> <<if _hasBankAccount>> <span style="color: #aaa; font-size: 12px; margin-left: 10px;">FREE - no fees! • $30K/day • 24/7</span> <<else>> <span style="color: #ff6b6b; font-size: 12px; margin-left: 10px;">Requires bank account ($250 at Downtown Bank, open 8 AM - 5 PM)</span> <</if>> </div> <div> <<if _hasBankAccount>> <<link "<div style='display: inline-block; background: #4dabf7; color: white; padding: 8px 20px; border-radius: 6px; font-weight: bold; font-size: 14px;'>Use ATM</div>" "ATM">><</link>> <<else>> <div style='display: inline-block; background: #444; color: #888; padding: 8px 20px; border-radius: 6px; font-weight: bold; font-size: 14px; cursor: not-allowed; border: 1px solid #555;'> No Account </div> <</if>> </div> </div> <!-- Navigation --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<workShift>> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <<set _alreadyTalkedToday = ($dailyConversations[_npc.name] !== undefined && $dailyConversations[_npc.name] >= $dayNumber)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Page Header --> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 20px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0; font-size: 28px; text-align: center;">💬 Conversation with <<= _npc.name>></h1> </div> <!-- Player's Dialogue --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px;">You say...</h3> <div style="color: #ccc; font-size: 17px; line-height: 1.8; font-style: italic;"> "<<print setup.getPlayerDialogue($currentTopic)>>" </div> </div> <!-- NPC's Response --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px;"><<= _npc.name>> responds...</h3> <div style="color: #ccc; font-size: 17px; line-height: 1.8; font-style: italic;"> <<set _relationship = $relationships[_npc.name] || {level: 1, points: 0}>> <<set _relLevel = _relationship.level>> "<<print setup.getNPCResponse(_npc, $currentTopic, _relLevel)>>" </div> </div> <!-- Relationship Change - ONLY if not already talked today --> <<if !_alreadyTalkedToday>> <!-- Use new dynamic calculation system --> <<set _backfired = false>> <<set _flirtResult = null>> <!-- Special handling for flirt topic --> <<if $currentTopic === "flirt">> <<set _flirtResult = setup.calculateFlirtOutcome(_npc, _relLevel)>> <<set _basePointsChange = _flirtResult.points>> <<if !_flirtResult.success && _flirtResult.points < 0>> <<set _backfired = true>> <</if>> <<else>> <!-- Use dynamic calculation for other topics --> <<set _dynamicResult = setup.calculateDynamicRelationshipChange(_npc, $currentTopic, _relLevel)>> <<set _basePointsChange = _dynamicResult.points>> <<set _backfired = _dynamicResult.backfired>> <</if>> <!-- ===== SKILL TREE: Daily Talk Bonus ===== --> <<set _skillTreeTalkBonus = setup.skillTree.getEffect("dailyTalkBonus")>> <<if _skillTreeTalkBonus > 0 && _basePointsChange > 0>> <<set _basePointsChange += _skillTreeTalkBonus>> <</if>> <!-- ===== BUFF: Daily Talk Bonus (well_rested, satisfied, food_social_glow, food_hearty_meal, etc.) ===== --> <<set _buffTalkBonus = 0>> <<if typeof setup.getBuffEffect === 'function'>> <<set _buffTalkBonus = setup.getBuffEffect("dailyTalkBonus") + setup.getBuffEffect("relationshipBonus")>> <</if>> <<if _buffTalkBonus > 0 && _basePointsChange > 0>> <<set _basePointsChange += _buffTalkBonus>> <</if>> <<set _finalPointsChange = _basePointsChange>> <!-- Apply Gentle Giant's Heart multiplier (4x) --> <<if $currentArtifact === "The Gentle Giant's Heart" && _basePointsChange !== 0>> <<set _finalPointsChange = _basePointsChange * 4>> <</if>> <<if _finalPointsChange !== 0>> <<run setup.addRelationshipPoints(_npc.name, _finalPointsChange)>> <<set $dailyConversations[_npc.name] = $dayNumber>> <div style="background: <<if _finalPointsChange > 0>>#2a4a2a<<else>>#4a2a2a<</if>>; border: 2px solid <<if _finalPointsChange > 0>>#51cf66<<else>>#ff6b6b<</if>>; padding: 15px; border-radius: 8px; margin-bottom: 25px; text-align: center;"> <span style="color: <<if _finalPointsChange > 0>>#51cf66<<else>>#ff6b6b<</if>>; font-weight: bold; font-size: 16px;"> <<if _backfired>> ⚠️ The conversation backfired! <br>(<<= _finalPointsChange>> points) <<elseif _finalPointsChange > 0>> 💚 Relationship improved! <<if _skillTreeTalkBonus > 0>> <span style="color: #9C27B0;">(⭐ +<<= _skillTreeTalkBonus>> Skill Tree)</span> <</if>> <<if _buffTalkBonus > 0>> <span style="color: #51cf66;">(🍽️ +<<= _buffTalkBonus>> Buff Bonus)</span> <</if>> <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Bonus!)</span> <</if>> <<if _flirtResult && _flirtResult.sexualIntensity >= 1>> <span style="color: #ff69b4;">(🔥 Intense!)</span> <</if>> <br>(+<<= _finalPointsChange>> points) <<else>> 💔 Relationship worsened! <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Penalty!)</span> <</if>> <br>(<<= _finalPointsChange>> points) <</if>> </span> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Conversation</div>">> <<goto "NPCTalk">> <</link>> </div> </div> <</nobr>>
<<silently>> <<if !$showScrollbar>> <<run $('<style id="scrollbar-toggle">::-webkit-scrollbar { display: none; } body { -ms-overflow-style: none; scrollbar-width: none; }</style>').appendTo('head')>> <<else>> <<run $('style#scrollbar-toggle').remove()>> <</if>> <</silently>>
<<nobr>> <<set $lastLocation = "VIPLounge">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("VIPLounge")>> <<run $visitedLocations.push("VIPLounge")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center;">🔒 VIP Lounge</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0;"> Private rooms with soundproof walls and exclusive service. Only the most privileged patrons are allowed access to this area. Ambient music plays softly while elegant decor creates an intimate atmosphere. </p> </div> <h2 style="color: #9D00FF;">This area is currently under development.</h2> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("VIPLounge")>> <h2 style="color: #9D00FF;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="background: #1e1e1e; padding: 15px; border-radius: 8px; border: 2px solid #9D00FF; transition: all 0.3s;"> <<set _relLevel = setup.getRelationshipLevel(_npc.originalName || _npc.name)>> <<set _relColor = setup.getRelationshipColor(_relLevel)>> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <span style="color: #9D00FF; font-weight: bold; font-size: 16px;"><<print _npc.name>></span> <span @style="'color: ' + _relColor + '; font-size: 13px; font-weight: bold;'"> <<print setup.getRelationshipStatus(_npc.originalName || _npc.name)>> </span> </div> <div style="color: #aaa; font-size: 14px; margin-bottom: 12px;"> <div><strong style="color: #9D00FF;">Job:</strong> <<print _npc.job>></div> <<if _npc.primaryPersonality>> <div><strong style="color: #9D00FF;">Personality:</strong> <<print _npc.primaryPersonality>></div> <</if>> </div> <div style="display: flex; gap: 10px; flex-wrap: wrap;"> <<link "<div style='background: #9D00FF; color: white; padding: 8px 15px; border-radius: 6px; font-weight: bold; font-size: 13px; text-align: center; flex: 1; min-width: 80px;'>Talk</div>">> <<set $talkingToNPC = _npc>> <<goto "NPCTalk">> <</link>> <<link "<div style='background: #444; color: #9D00FF; padding: 8px 15px; border-radius: 6px; border: 2px solid #9D00FF; font-weight: bold; font-size: 13px; text-align: center; flex: 1; min-width: 80px;'>Trade</div>">> <<set $tradingWithNPC = _npc>> <<goto "TradeHub">> <</link>> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 2px solid #444; margin-bottom: 25px;"> <p style="color: #888; text-align: center; margin: 0; font-size: 15px;"> No one is currently in the VIP lounge. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #9D00FF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Strip Club</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
:: DayAdvancement <<widget "advanceDay">> <<set $dayNumber += 1>> <<set $dayCount = $dayNumber>> /* Advance day of week */ <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _nextDayIndex = (_currentDayIndex + 1) % 7>> <<set $dayOfWeek = setup.dayOrder[_nextDayIndex]>> /* Check if new week */ <<if $dayOfWeek === "Monday">> <<set $weekNumber += 1>> <</if>> /* Reset daily trades (base 5 + bonus from home offices) */ <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> /* Check if hair styling has expired */ <<if $hairStyleExpiry && $dayNumber >= $hairStyleExpiry>> <<set $appearance.hairStyle = "messy">> <<set $hairStyleExpiry = null>> <</if>> /* Reset secretary work hours */ <<if $secretaryHoursWorkedToday>> <<set $secretaryHoursWorkedToday = 0>> <</if>> /* Reset time to morning */ <<set $timeInMinutes = 480>> /* Reset daily conversations */ <<set $dailyConversations = {}>> <</widget>> <<widget "masturbationImage">><<nobr>> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _location = _args[0] || "bed">> <<set _gender = $bodyParts.gender || "Female">> <<set _genderType = _gender.toLowerCase() === "male" ? "male" : "female">> <<set _ageType = $appearance.age === "Mature Adult" ? "mature" : "adult">> <<set _povImagePath = "Images/M/pov/masturbation_" + _location + "_" + _genderType + ".webp">> <<set _regularImagePath = "Images/M/regular/masturbation_" + _location + "_" + _genderType + "_" + _ageType + ".webp">> <div style="display: flex; gap: 20px; justify-content: center; margin-bottom: 15px; flex-wrap: wrap;"> <div style="text-align: center;"><img @src="_povImagePath" style="max-width: 350px; height: auto; border-radius: 10px; border: 2px solid #ff6b6b;" onerror="this.onerror=null; this.style.display='none'; this.nextElementSibling.style.display='block';"><div style="display: none; width: 300px; height: 200px; border-radius: 10px; border: 2px solid #ff6b6b; background: #1a1a1a;"></div></div> <div style="text-align: center;"><img @src="_regularImagePath" style="max-width: 350px; height: auto; border-radius: 10px; border: 2px solid #ff6b6b;" onerror="this.onerror=null; this.style.display='none'; this.nextElementSibling.style.display='block';"><div style="display: none; width: 300px; height: 200px; border-radius: 10px; border: 2px solid #ff6b6b; background: #1a1a1a;"></div></div> </div> <</if>> <</nobr>><</widget>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("StudioApartment")>> <<run $visitedLocations.push("StudioApartment")>> <</if>> <<set $lastLocation = "StudioApartment">> <<set _home = "StudioApartment">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(26, 26, 26, 0.9); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("StudioApartment")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h2 style="color: #51cf66;">Main Room</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bedroom --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🛏️ Bedroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Your sleeping area with a fold-out bed.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bedroom</div>">> <<run advanceTime(1)>> <<goto "StudioBedroom">> <</link>> </div> <!-- Kitchenette --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🍳 Kitchenette</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small cooking area with basic appliances.</p> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Cook Something</div>">> <<run advanceTime(1)>> <<goto "HomeKitchen">> <</link>> </div> <!-- TV Area --> <<if $hasTV>> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">📺 Television</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Watch TV and relax.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Watch TV</div>">> <<goto "WatchTV">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">📺 TV Stand</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An empty TV stand. You could buy a television to place here.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No TV</div> </div> <</if>> <!-- Laptop Area --> <<if $hasLaptop>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Laptop</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Use your laptop for various activities.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Laptop</div>">> <<set $laptopReturnLocation = "StudioApartment">> <<goto "UseLaptop">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💻 Desk</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An empty desk. You could buy a laptop to place here.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No Laptop</div> </div> <</if>> </div> <h2 style="color: #51cf66;">Other Rooms</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bathroom --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Bathroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small bathroom with shower, toilet, mirror, and storage cabinet.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bathroom</div>">> <<run advanceTime(1)>> <<goto "StudioBathroom">> <</link>> </div> </div> <h2 style="color: #51cf66;">Home Management</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Decor Manager --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🎨 Decor Manager</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">View and manage your placed decorations.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Manage Decor</div>">> <<goto "HomeDecorManager">> <</link>> </div> <!-- Wall Color --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🖌️ Wall Paint</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Change your wall colors.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Paint Walls</div>">> <<goto "WallColorPicker">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Apartment</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Prevent infinite loop - only process once per work session */ <<if $lastWorkProcessed === true>> <<goto $lastLocation || "Home">> <</if>> <<set $lastWorkProcessed = true>> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes($lastWorkJob)>> <<run $jobsWorked.push($lastWorkJob)>> <</if>> <!-- SAVE CASH TO PREVENT ACCIDENTAL DOUBLE ADDITIONS --> <<set _savedMoney = $money>> <<set _savedBankBalance = $bankAccount ? $bankAccount.balance : 0>> <!-- ===== SKILL TREE: Get hourly pay bonus ===== --> <<set _hourlyPayBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _hourlyPayBonus = setup.skillTree.getEffect("hourlyPayBonus") || 0>> <</if>> <!-- Universal hours counter for trait gain (guaranteed every 40 hours) --> <<if typeof $hourlyJobHoursWorked === "undefined">> <<set $hourlyJobHoursWorked = 0>> <</if>> <<set $hourlyJobHoursWorked += $lastWorkHours>> <<set _gainedWorkTrait = false>> <<set _gainedWorkTraitName = "">> <<set _gainedWorkTraitType = "">> <<set _hasConflict = false>> <<set _conflictingTrait = "">> <<set _pendingTrait = null>> <!-- Gain a trait every 40 hours worked (trait comes from current job) --> <<if $hourlyJobHoursWorked >= 40>> <<set $hourlyJobHoursWorked -= 40>> <<set _jobTraitPools = { "Dock Worker": [ {name: "Athletic Build", type: "physical"}, {name: "Fit", type: "physical"}, {name: "Relaxed", type: "mental"}, {name: "Strong", type: "physical"}, {name: "Sturdy", type: "physical"}, {name: "Forklift Certified", type: "skill"}, {name: "Heavy Lifting", type: "skill"} ], "Tech Store Clerk": [ {name: "Deep Thinker", type: "mental"}, {name: "Analytical", type: "mental"}, {name: "Direct", type: "mental"}, {name: "Focused", type: "mental"}, {name: "Intelligent", type: "mental"}, {name: "Resourceful", type: "mental"}, {name: "Customer Service", type: "skill"}, {name: "Inventory Management", type: "skill"}, {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Tech-Savvy", type: "skill"} ], "Adult Store Clerk": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Charming", type: "mental"}, {name: "Chill", type: "mental"}, {name: "Curious", type: "mental"}, {name: "Flirty", type: "mental"}, {name: "Nonchalant", type: "mental"}, {name: "Sly", type: "mental"} ], "Eccentric Shop Worker": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Goth", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Introverted", type: "mental"} ], "Baker": [ {name: "Baking", type: "skill"}, {name: "Cooking", type: "skill"}, {name: "Creative", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Hardworking", type: "mental"}, {name: "Focused", type: "mental"}, {name: "Organized", type: "mental"}, {name: "Detail-Oriented", type: "physical"} ], "Fitness Shop Clerk": [ {name: "Athletic Build", type: "physical"}, {name: "Fit", type: "physical"}, {name: "Sales", type: "skill"}, {name: "Customer Service", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Product Knowledge", type: "skill"}, {name: "Friendly", type: "mental"}, {name: "Energetic", type: "mental"} ], "Beauty Salon Stylist": [ {name: "Hair Styling", type: "skill"}, {name: "Makeup", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Creative", type: "mental"}, {name: "Perceptive", type: "mental"}, {name: "Friendly", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Customer Service", type: "skill"} ] }>> <!-- Check if this job has a trait pool --> <<if _jobTraitPools[$lastWorkJob]>> <<set _availableWorkTraits = []>> <!-- Filter out traits the player already has --> <<for _i = 0; _i < _jobTraitPools[$lastWorkJob].length; _i++>> <<set _traitData = _jobTraitPools[$lastWorkJob][_i]>> <<set _hasIt = false>> <<if _traitData.type === "physical" && $physicalTraits.includes(_traitData.name)>> <<set _hasIt = true>> <<elseif _traitData.type === "mental" && $mentalTraits.includes(_traitData.name)>> <<set _hasIt = true>> <<elseif _traitData.type === "skill" && $skills.includes(_traitData.name)>> <<set _hasIt = true>> <</if>> <<if !_hasIt>> <<set _availableWorkTraits.push(_traitData)>> <</if>> <</for>> <!-- If there are traits available to gain, pick one randomly --> <<if _availableWorkTraits.length > 0>> <<set _selectedWorkTrait = _availableWorkTraits.random()>> <<set _gainedWorkTraitName = _selectedWorkTrait.name>> <<set _gainedWorkTraitType = _selectedWorkTrait.type>> <!-- Check for mutually exclusive trait conflict --> <<set _existingTraits = []>> <<if _gainedWorkTraitType === "physical">> <<set _existingTraits = $physicalTraits>> <<elseif _gainedWorkTraitType === "mental">> <<set _existingTraits = $mentalTraits>> <</if>> <!-- Only check for conflicts on physical/mental traits, not skills --> <<if (_gainedWorkTraitType === "physical" || _gainedWorkTraitType === "mental") && typeof setup.getConflictingTrait === "function">> <<set _conflictingTrait = setup.getConflictingTrait(_gainedWorkTraitName, _existingTraits)>> <</if>> <<if _conflictingTrait>> <!-- Has conflict - store pending trait for popup, DON'T add yet --> <<set _hasConflict = true>> <<set _pendingTrait = _selectedWorkTrait>> <!-- Store for the result passage --> <<set $pendingWorkTrait = _selectedWorkTrait>> <<set $pendingWorkTraitConflict = _conflictingTrait>> <<else>> <!-- No conflict - add trait directly --> <<if _selectedWorkTrait.type === "skill">> <<if !$skills.includes(_gainedWorkTraitName)>> <<set $skills.push(_gainedWorkTraitName)>> <</if>> <<elseif _selectedWorkTrait.type === "mental">> <<if !$mentalTraits.includes(_gainedWorkTraitName)>> <<set $mentalTraits.push(_gainedWorkTraitName)>> <</if>> <<elseif _selectedWorkTrait.type === "physical">> <<if !$physicalTraits.includes(_gainedWorkTraitName)>> <<set $physicalTraits.push(_gainedWorkTraitName)>> <</if>> <</if>> <<set _gainedWorkTrait = true>> <</if>> <</if>> <</if>> <</if>> <!-- Co-worker relationship bonus (if worked 2+ hours with co-workers) --> <<set _coworkerBonuses = []>> <<if $lastWorkHours >= 2>> <<set _coworkers = setup.getNPCsByJob($lastWorkJob)>> <<if _coworkers && _coworkers.length > 0>> <<for _i = 0; _i < _coworkers.length; _i++>> <<set _coworker = _coworkers[_i]>> <<set _coworkerName = _coworker.name>> <!-- 50% chance to gain relationship points with each co-worker --> <<if random(1, 100) <= 50>> <!-- Random 1-5 points --> <<set _relPoints = random(1, 5)>> <!-- Ensure we've "met" this co-worker --> <<run setup.meetNPC(_coworker)>> <!-- Add relationship points --> <<run setup.addRelationshipPoints(_coworkerName, _relPoints)>> <!-- Track for display --> <<run _coworkerBonuses.push({name: _coworkerName, points: _relPoints})>> <</if>> <</for>> <</if>> <</if>> <<set $lastWorkCoworkerBonuses = _coworkerBonuses>> <!-- Calculate earnings breakdown for display --> <!-- $lastWorkEarnings already has stat/trait modifiers and Pearl bonus applied from workShift --> <!-- $lastWorkBasePay is the true base (hours × hourlyPay without any modifiers) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <!-- Extract base pay with stat/trait modifiers but WITHOUT Pearl bonus --> <<set _baseWithModifiers = _pearlActive ? Math.floor($lastWorkEarnings / 1.5) : $lastWorkEarnings>> <<set _pearlBonus = _pearlActive ? ($lastWorkEarnings - _baseWithModifiers) : 0>> <!-- ===== SKILL TREE: Calculate hourly pay bonus ===== --> <<set _skillTreeBonus = 0>> <<if _hourlyPayBonus > 0>> <<set _skillTreeBonus = Math.floor(_baseWithModifiers * (_hourlyPayBonus / 100))>> <</if>> <!-- ===== BUFF: Food money bonuses ===== --> <<set _foodMoneyBonus = 0>> <<if typeof setup.getBuffEffect === 'function'>> <<set _buffMoneyBonusMin = setup.getBuffEffect("moneyBonusMin")>> <<set _buffMoneyBonusMax = setup.getBuffEffect("moneyBonusMax")>> <<set _buffMoneyBonus = setup.getBuffEffect("moneyBonus")>> <<if _buffMoneyBonusMin > 0 || _buffMoneyBonusMax > 0>> <<set _foodMoneyBonus += Math.floor(Math.random() * (_buffMoneyBonusMax - _buffMoneyBonusMin + 1)) + _buffMoneyBonusMin>> <</if>> <<if _buffMoneyBonus > 0>> <<set _foodMoneyBonus += _buffMoneyBonus>> <</if>> <</if>> <!-- Total earnings before bank bonus --> <<set _totalEarningsBeforeBank = _baseWithModifiers + _pearlBonus + _skillTreeBonus + _foodMoneyBonus>> <!-- Check if player has bank account for direct deposit --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<set _totalDeposited = 0>> <!-- RESTORE CASH/BANK TO PREVENT DOUBLE ADDITIONS FROM HELPER FUNCTIONS --> <<set $money = _savedMoney>> <<if $bankAccount>> <<set $bankAccount.balance = _savedBankBalance>> <</if>> <<if _hasBankAccount>> <!-- Calculate 5% direct deposit bonus --> <<set _creditBonus = Math.floor(_totalEarningsBeforeBank * 0.05)>> <<set _totalDeposited = _totalEarningsBeforeBank + _creditBonus>> <!-- Add directly to bank account --> <<set $bankAccount.balance += _totalDeposited>> <<else>> <!-- No bank account - pay in cash only --> <<set $money += _totalEarningsBeforeBank>> <</if>> <!-- Store earnings info for trait result passage if needed --> <<set $lastWorkPearlActive = _pearlActive>> <<set $lastWorkBaseEarnings = _baseWithModifiers>> <!-- Base + stat/trait modifiers, no Pearl/skill bonuses --> <<set $lastWorkPearlBonus = _pearlBonus>> <<set $lastWorkSkillTreeBonus = _skillTreeBonus>> <<set $lastWorkFoodMoneyBonus = _foodMoneyBonus>> <<set $lastWorkHasBankAccount = _hasBankAccount>> <<set $lastWorkCreditBonus = _creditBonus>> <<set $lastWorkTotalDeposited = _totalDeposited>> <<set $lastWorkTotalEarningsBeforeBank = _totalEarningsBeforeBank>> <<set $lastWorkGainedTrait = _gainedWorkTrait>> <<set $lastWorkGainedTraitName = _gainedWorkTraitName>> <<set $lastWorkGainedTraitType = _gainedWorkTraitType>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">✅ Shift Complete!</h1> <p style="color: white; margin: 0; font-size: 18px;">You've finished your shift as a <<print $lastWorkJob>></p> </div> <!-- MUTUALLY EXCLUSIVE TRAIT CONFLICT POPUP --> <<if _hasConflict && _pendingTrait>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(243, 156, 18, 0.5); margin-bottom: 25px;"> <h2 style="color: white; margin: 0 0 15px 0; text-align: center;">⚡ Trait Conflict Detected!</h2> <p style="color: #fff; font-size: 16px; margin: 0 0 15px 0; text-align: center;"> Your work experience would grant you <strong style="color: #ffd43b;"><<print _gainedWorkTraitName>></strong>, but it conflicts with your existing trait <strong style="color: #ff6b6b;"><<print _conflictingTrait>></strong>. </p> <p style="color: #ffd; font-size: 14px; margin: 0 0 20px 0; text-align: center; font-style: italic;"> These traits are mutually exclusive - you can only have one. </p> <!-- Trait Comparison --> <div style="display: grid; grid-template-columns: 1fr auto 1fr; gap: 15px; margin-bottom: 20px; align-items: center;"> <!-- Current Trait --> <div style="background: #3a2020; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center;"> <p style="color: #ff6b6b; font-size: 12px; margin: 0 0 5px 0;">CURRENT</p> <p style="color: #fff; font-size: 18px; font-weight: bold; margin: 0;"><<print _conflictingTrait>></p> <<if typeof setup.getTraitValue === "function">> <p style="color: #aaa; font-size: 12px; margin: 5px 0 0 0;">Value: <<print setup.getTraitValue(_pendingTrait.type, _conflictingTrait)>></p> <</if>> </div> <!-- Arrow --> <div style="color: #ffd43b; font-size: 24px;">→</div> <!-- New Trait --> <div style="background: #203a20; padding: 15px; border-radius: 8px; border: 2px solid #51cf66; text-align: center;"> <p style="color: #51cf66; font-size: 12px; margin: 0 0 5px 0;">NEW</p> <p style="color: #fff; font-size: 18px; font-weight: bold; margin: 0;"><<print _gainedWorkTraitName>></p> <<if typeof setup.getTraitValue === "function">> <p style="color: #aaa; font-size: 12px; margin: 5px 0 0 0;">Value: <<print setup.getTraitValue(_pendingTrait.type, _gainedWorkTraitName)>></p> <</if>> </div> </div> <!-- Choice Buttons --> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='display: inline-block; background: #28a745; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; cursor: pointer; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>✓ Replace with New Trait</div>">> <<set $workTraitSwapped = true>> <<goto "WorkCompleteTraitResult">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; cursor: pointer; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>✗ Keep Current Trait</div>">> <<set $workTraitSwapped = false>> <<goto "WorkCompleteTraitResult">> <</link>> </div> </div> <<else>> <!-- No conflict - show normal trait gain notification --> <<if _gainedWorkTrait>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(155, 89, 182, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">✨ Work Experience Gained!</h2> <p style="color: #ffd; font-size: 18px; margin: 0 0 10px 0;"> Your hard work has paid off!<br> You gained: <strong style="color: #ffd43b;"><<print _gainedWorkTraitName>></strong> </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> <<if _gainedWorkTraitType === "skill">> (New Skill) <<elseif _gainedWorkTraitType === "mental">> (Mental Trait) <<elseif _gainedWorkTraitType === "physical">> (Physical Trait) <</if>> </p> </div> <!-- Transformation text for gained trait --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; text-align: center;">🔄 Transformation</h3> <<if _gainedWorkTraitType === "skill">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<set _transformText = "">> <<if typeof setup.getSkillGainText === "function">> <<set _transformText = setup.getSkillGainText(_gainedWorkTraitName)>> <</if>> <<if _transformText && _transformText.length > 0>> <<print _transformText>> <<else>> Through dedicated practice at work, you've developed a new ability: <strong><<print _gainedWorkTraitName>></strong>. This skill will serve you well in future endeavors. <</if>> </p> </div> <<elseif _gainedWorkTraitType === "mental">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #764ba2;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<set _transformText = "">> <<if typeof setup.getMentalTraitChangeText === "function">> <<set _transformText = setup.getMentalTraitChangeText(_gainedWorkTraitName, true)>> <</if>> <<if _transformText && _transformText.length > 0>> <<print _transformText>> <<else>> Your experiences at work have subtly changed your mindset. You find yourself becoming more <strong><<print _gainedWorkTraitName>></strong> as each day passes. <</if>> </p> </div> <<elseif _gainedWorkTraitType === "physical">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #28a745;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<set _transformText = "">> <<if typeof setup.getPhysicalTraitChangeText === "function">> <<set _transformText = setup.getPhysicalTraitChangeText(_gainedWorkTraitName, true)>> <</if>> <<if _transformText && _transformText.length > 0>> <<print _transformText>> <<else>> The physical demands of your job have transformed your body over time. You now possess the trait: <strong><<print _gainedWorkTraitName>></strong>. <</if>> </p> </div> <</if>> </div> <</if>> <</if>> <<if $lastWorkTraitChanges && $lastWorkTraitChanges.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffc107; margin-top: 0; font-size: 24px; border-bottom: 3px solid #ffc107; padding-bottom: 10px;">⭐ Personal Changes</h2> <<for _i, _change range $lastWorkTraitChanges>> <<if _change.type === "gain">> <div style="background: #1a3a1a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #28a745;"> <p style="color: #28a745; margin: 0; font-size: 16px; font-weight: bold;">✨ Gained New Trait: _change.trait</p> </div> <<elseif _change.type === "upgrade">> <div style="background: #1a1a3a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-size: 16px; font-weight: bold;">⬆️ Upgraded: _change.oldTrait → _change.newTrait</p> </div> <<elseif _change.type === "remove">> <div style="background: #3a1a1a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #dc3545;"> <p style="color: #dc3545; margin: 0; font-size: 16px; font-weight: bold;">❌ Removed: _change.trait</p> </div> <<elseif _change.type === "replace">> <div style="background: #3a1a3a; padding: 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #9b59b6;"> <p style="color: #9b59b6; margin: 0; font-size: 16px; font-weight: bold;">🔄 Replaced: _change.oldTrait → _change.newTrait</p> </div> <</if>> <</for>> </div> <</if>> <!-- Co-worker relationship bonuses --> <<if _coworkerBonuses && _coworkerBonuses.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin-top: 0; font-size: 24px; border-bottom: 3px solid #667eea; padding-bottom: 10px;">👥 Co-Worker Bonding</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Working alongside your co-workers has strengthened your relationships!</p> <<for _cwb range _coworkerBonuses>> <div style="background: #1a2a3a; padding: 12px 15px; border-radius: 8px; margin-top: 10px; border: 2px solid #51cf66; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #fff; font-size: 16px;">💚 <<print _cwb.name>></span> <span style="color: #51cf66; font-weight: bold;">+<<print _cwb.points>> points</span> </div> <</for>> </div> <</if>> <!-- Show earnings - always show this now, even with conflict (earnings already processed) --> <<if !_hasConflict>> <<include "WorkCompleteEarnings">> <<else>> <!-- Show earnings summary for conflict case too --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #28a745; margin-top: 0; font-size: 24px; border-bottom: 3px solid #28a745; padding-bottom: 10px;">💰 Earnings</h2> <p style="color: #ccc; font-size: 16px; margin: 10px 0;">Base Pay: <span style="color: #51cf66;">$<<print _baseEarnings>></span></p> <<if _pearlBonus > 0>> <p style="color: #ccc; font-size: 16px; margin: 10px 0;">✨ Pearl Bonus: <span style="color: #ffd43b;">+$<<print _pearlBonus>></span></p> <</if>> <<if _skillTreeBonus > 0>> <p style="color: #ccc; font-size: 16px; margin: 10px 0;">⭐ Skill Tree Bonus: <span style="color: #9C27B0;">+$<<print _skillTreeBonus>></span></p> <</if>> <<if _hasBankAccount>> <p style="color: #ccc; font-size: 16px; margin: 10px 0;">🏦 Direct Deposit Bonus (5%): <span style="color: #3498db;">+$<<print _creditBonus>></span></p> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 15px 0;">Total Deposited: $<<print _totalDeposited>></p> <<else>> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 15px 0;">Total Earned: $<<print _totalEarningsBeforeBank>></p> <</if>> </div> <p style="color: #888; text-align: center; font-style: italic;">Choose whether to accept or reject the new trait above, then continue.</p> <</if>> <!-- Trait Progress Section --> <<set _jobTraitPoolsForProgress = { "Dock Worker": [ {name: "Athletic Build", type: "physical"}, {name: "Fit", type: "physical"}, {name: "Relaxed", type: "mental"}, {name: "Strong", type: "physical"}, {name: "Sturdy", type: "physical"}, {name: "Forklift Certified", type: "skill"}, {name: "Heavy Lifting", type: "skill"} ], "Tech Store Clerk": [ {name: "Deep Thinker", type: "mental"}, {name: "Analytical", type: "mental"}, {name: "Direct", type: "mental"}, {name: "Focused", type: "mental"}, {name: "Intelligent", type: "mental"}, {name: "Resourceful", type: "mental"}, {name: "Customer Service", type: "skill"}, {name: "Inventory Management", type: "skill"}, {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Tech-Savvy", type: "skill"} ], "Adult Store Clerk": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Charming", type: "mental"}, {name: "Chill", type: "mental"}, {name: "Curious", type: "mental"}, {name: "Flirty", type: "mental"}, {name: "Nonchalant", type: "mental"}, {name: "Sly", type: "mental"} ], "Eccentric Shop Worker": [ {name: "Product Knowledge", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Sales", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Perceptive", type: "mental"}, {name: "Goth", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Introverted", type: "mental"} ], "Baker": [ {name: "Baking", type: "skill"}, {name: "Cooking", type: "skill"}, {name: "Creative", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Hardworking", type: "mental"}, {name: "Focused", type: "mental"}, {name: "Organized", type: "mental"}, {name: "Detail-Oriented", type: "physical"} ], "Fitness Shop Clerk": [ {name: "Athletic Build", type: "physical"}, {name: "Fit", type: "physical"}, {name: "Sales", type: "skill"}, {name: "Customer Service", type: "skill"}, {name: "Retail", type: "skill"}, {name: "Product Knowledge", type: "skill"}, {name: "Friendly", type: "mental"}, {name: "Energetic", type: "mental"} ], "Beauty Salon Stylist": [ {name: "Hair Styling", type: "skill"}, {name: "Makeup", type: "skill"}, {name: "Fashionable", type: "physical"}, {name: "Creative", type: "mental"}, {name: "Perceptive", type: "mental"}, {name: "Friendly", type: "mental"}, {name: "Patient", type: "mental"}, {name: "Customer Service", type: "skill"} ] }>> <<set _hoursUntilNextTrait = 40 - $hourlyJobHoursWorked>> <<if _hoursUntilNextTrait < 0>> <<set _hoursUntilNextTrait = 0>> <</if>> <<set _currentJobPool = _jobTraitPoolsForProgress[$lastWorkJob]>> <<set _traitsObtained = 0>> <<set _totalJobTraits = 0>> <<if _currentJobPool>> <<set _totalJobTraits = _currentJobPool.length>> <<for _t range _currentJobPool>> <<if _t.type === "physical" && $physicalTraits.includes(_t.name)>> <<set _traitsObtained++>> <<elseif _t.type === "mental" && $mentalTraits.includes(_t.name)>> <<set _traitsObtained++>> <<elseif _t.type === "skill" && $skills.includes(_t.name)>> <<set _traitsObtained++>> <</if>> <</for>> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #17a2b8; margin-top: 0; font-size: 24px; border-bottom: 3px solid #17a2b8; padding-bottom: 10px;">📊 Trait Progress</h2> <!-- Hours until next trait --> <div style="background: #1a2a3a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #3498db;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <span style="color: #ccc; font-size: 16px;">⏱️ Hours until next trait:</span> <span style="color: #3498db; font-size: 18px; font-weight: bold;"><<print _hoursUntilNextTrait>> hours</span> </div> <<set _progressPercent = Math.round(($hourlyJobHoursWorked / 40) * 100)>> <<if _progressPercent > 100>><<set _progressPercent = 100>><</if>> <div style="background: #000000; border: 2px solid #3498db; border-radius: 10px; height: 25px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);"> <div @style="'background: linear-gradient(90deg, #3498db 0%, #2980b9 100%); height: 100%; width: ' + _progressPercent + '%; transition: width 0.3s ease; position: absolute; left: 0; top: 0;'"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 12px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> <<print $hourlyJobHoursWorked>> / 40 hours worked </div> </div> </div> <!-- Traits from current job --> <<if _currentJobPool>> <div style="background: #1a3a2a; padding: 15px; border-radius: 8px; border: 2px solid #28a745;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <span style="color: #ccc; font-size: 16px;">🎯 <<print $lastWorkJob>> traits obtained:</span> <span style="color: #28a745; font-size: 18px; font-weight: bold;"><<print _traitsObtained>> / <<print _totalJobTraits>></span> </div> <<set _traitProgressPercent = _totalJobTraits > 0 ? Math.round((_traitsObtained / _totalJobTraits) * 100) : 0>> <<if _traitProgressPercent > 100>><<set _traitProgressPercent = 100>><</if>> <div style="background: #000000; border: 2px solid #28a745; border-radius: 10px; height: 25px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);"> <div @style="'background: linear-gradient(90deg, #28a745 0%, #20c997 100%); height: 100%; width: ' + _traitProgressPercent + '%; transition: width 0.3s ease; position: absolute; left: 0; top: 0;'"></div> <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: bold; font-size: 12px; text-shadow: 1px 1px 2px rgba(0,0,0,0.8); z-index: 10;"> <<print _traitsObtained>> / <<print _totalJobTraits>> traits (<<print _traitProgressPercent>>%) </div> </div> <<if _traitsObtained >= _totalJobTraits>> <p style="color: #ffd43b; font-size: 14px; margin: 10px 0 0 0; text-align: center; font-weight: bold;">✨ You've mastered all traits from this job!</p> <</if>> </div> <<else>> <div style="background: #3a3a2a; padding: 15px; border-radius: 8px; border: 2px solid #f39c12;"> <p style="color: #f39c12; font-size: 14px; margin: 0; text-align: center;">This job doesn't have a trait pool.</p> </div> <</if>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("StudioBathroom")>> <<run $visitedLocations.push("StudioBathroom")>> <</if>> <<set $lastLocation = "StudioBathroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">🚿 Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> A small but functional bathroom. White tiles line the walls, and everything is kept reasonably clean. The mirror above the sink reflects your image back at you. </p> </div> <h2 style="color: #3498db;">Bathroom Features</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Shower --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Shower</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A basic shower with hot water. Clean yourself up.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Shower</div>">> <<set $bathroomMode = "shower">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Toilet --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">🚽 Toilet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A standard toilet. Nothing special.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Mirror --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🪞 Mirror</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Look at yourself and check your appearance.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Look in Mirror</div>">> <<set $mirrorReturnLocation = "StudioBathroom">> <<goto "MirrorView">> <</link>> </div> <!-- Storage Cabinet --> <div style="border: 3px solid #8e44ad; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #8e44ad; margin: 0 0 10px 0;">🗄️ Storage Cabinet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A small cabinet for storing bathroom items and supplies.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Main Room</div>">> <<goto "StudioApartment">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="max-width: 600px; margin: 0 auto; padding: 20px;"> <div style="background: #2a2a2a; padding: 30px; border-radius: 15px; border: 3px solid #51cf66; text-align: center;"> <h1 style="color: #51cf66; margin-top: 0;">Confirm Home Purchase</h1> <p style="color: #ccc; font-size: 18px; margin-bottom: 20px;">Are you sure you want to purchase this home?</p> <p style="color: #ffc107; font-size: 28px; font-weight: bold; margin-bottom: 10px;"> Price: <<print setup.formatMoney($pendingHomePurchase.price)>> </p> <p style="color: #51cf66; font-size: 16px; margin-bottom: 30px;"> No rent required - this home is yours forever! </p> <p style="color: #aaa; margin-bottom: 30px;"> Your current balance: <<print setup.formatMoney($money)>> </p> <div style="display: flex; justify-content: center; gap: 20px; flex-wrap: wrap;"> <<link "<div style='background: #51cf66; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; cursor: pointer;'>Confirm Purchase</div>">> <<set $money -= $pendingHomePurchase.price>> <<set $ownsHouse = true>> <<set $houseLocation = $pendingHomePurchase.location>> <<set $housePurchaseDate = $dayNumber>> <<set $homeless = false>> <<set _dest = $pendingHomePurchase.destination>> <<unset $pendingHomePurchase>> <<goto _dest>> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; cursor: pointer;'>Cancel</div>">> <<set _returnTo = $pendingHomePurchase.returnTo>> <<unset $pendingHomePurchase>> <<goto _returnTo>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PlayerSuburbanHome")>> <<run $visitedLocations.push("PlayerSuburbanHome")>> <</if>> <<set $lastLocation = "PlayerSuburbanHome">> <<set _home = "PlayerSuburbanHome">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(26, 26, 26, 0.9); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerSuburbanHome")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h2 style="color: #51cf66;">Main Floor</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Master Bedroom --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🛏️ Master Bedroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spacious bedroom with a king-size bed and walk-in closet.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bedroom</div>">> <<run advanceTime(1)>> <<goto "PlayerSuburbanBedroom">> <</link>> </div> <!-- Living Room --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🛋️ Living Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A comfortable living area with plush couches and entertainment space.</p> <<if $hasTV>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Watch TV</div>">> <<goto "WatchTV">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No TV</div> <</if>> </div> <!-- Kitchen --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🍳 Kitchen</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A full-size kitchen with modern appliances, granite countertops, and plenty of cabinet space.</p> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Cook Something</div>">> <<run advanceTime(1)>> <<goto "HomeKitchen">> <</link>> </div> <!-- Laptop/Office Area --> <<if $hasLaptop>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Home Office</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A dedicated workspace with your laptop setup.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Laptop</div>">> <<set $laptopReturnLocation = "PlayerSuburbanHome">> <<goto "UseLaptop">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💻 Home Office</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An empty desk awaits a laptop or computer.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No Laptop</div> </div> <</if>> </div> <h2 style="color: #51cf66;">Other Rooms</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Master Bathroom --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Master Bathroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A luxurious bathroom with walk-in shower, bathtub, and double vanity.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bathroom</div>">> <<run advanceTime(1)>> <<goto "PlayerSuburbanBathroom">> <</link>> </div> <!-- Small Custom Room 1 --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _room1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[0]>> <<if _room1>> <<set _roomData = setup.roomRenovations.small.find(function(r) { return r.id === _room1; })>> <h3 style="color: <<print _roomData.color>>; margin: 0 0 10px 0;"><<print _roomData.icon>> <<print _roomData.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _roomData.description>></p> <<link "<div style='background: <<print _roomData.color>>; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter <<print _roomData.name>></div>">> <<set $renovateReturnPassage = "PlayerSuburbanHome">> <<goto _roomData.passage>> <</link>> <<else>> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Medium Custom Room 1 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[0]>> <<if _medRoom1>> <<set _medRoomData = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom1; })>> <h3 style="color: <<print _medRoomData.color>>; margin: 0 0 10px 0;"><<print _medRoomData.icon>> <<print _medRoomData.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData.description>></p> <<link `"<div style='background: " + _medRoomData.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerSuburbanHome">> <<goto _medRoomData.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Garage --> <div style="border: 3px solid #7f8c8d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #7f8c8d; margin: 0 0 10px 0;">🚗 Garage</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A two-car garage with storage space.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Backyard --> <div style="border: 3px solid #27ae60; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #27ae60; margin: 0 0 10px 0;">🌴 Backyard</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A fenced tropical backyard with palm trees and a patio.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <h2 style="color: #51cf66;">Home Management</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Decor Manager --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🎨 Decor Manager</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">View and manage your placed decorations.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Manage Decor</div>">> <<goto "HomeDecorManager">> <</link>> </div> <!-- Wall Color --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🖌️ Wall Paint</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Change your wall colors.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Paint Walls</div>">> <<goto "WallColorPicker">> <</link>> </div> <!-- Renovate Rooms --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🔧 Renovate Rooms</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Convert empty rooms into functional spaces.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Renovation Menu</div>">> <<set $renovateReturnPassage = "PlayerSuburbanHome">> <<goto "RoomRenovationManager">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Home</div>">> <<goto "ResidentialNormalHomes">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PlayerSuburbanBathroom")>> <<run $visitedLocations.push("PlayerSuburbanBathroom")>> <</if>> <<set $lastLocation = "PlayerSuburbanBathroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">🚿 Master Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> A spacious master bathroom with marble countertops and modern fixtures. The walk-in shower has rainfall and handheld showerheads, while a deep soaking tub sits beneath a frosted window. Double vanities provide plenty of space for getting ready. </p> </div> <h2 style="color: #3498db;">Bathroom Features</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Walk-in Shower --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Walk-in Shower</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A luxurious glass-enclosed shower with dual showerheads.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Shower</div>">> <<set $bathroomMode = "shower">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Bathtub --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛁 Bathtub</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A deep freestanding bathtub perfect for relaxation.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Bathtub</div>">> <<set $bathroomMode = "bath">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Toilet --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">🚽 Toilet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A modern toilet in a private water closet.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Mirror/Vanity --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🪞 Vanity Mirror</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A large backlit mirror above the double vanity.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Look in Mirror</div>">> <<set $mirrorReturnLocation = "PlayerSuburbanBathroom">> <<goto "MirrorView">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Main House</div>">> <<goto "PlayerSuburbanHome">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PlayerExpensiveHome")>> <<run $visitedLocations.push("PlayerExpensiveHome")>> <</if>> <<set $lastLocation = "PlayerExpensiveHome">> <<set _home = "PlayerExpensiveHome">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(26, 26, 26, 0.9); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerExpensiveHome")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h2 style="color: #ffc107;">Main Floor</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Master Suite --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🛏️ Master Suite</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A stunning master suite with California king bed, walk-in closet, and private balcony.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bedroom</div>">> <<run advanceTime(1)>> <<goto "PlayerExpensiveBedroom">> <</link>> </div> <!-- Living Room --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🛋️ Living Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An expansive living room with vaulted ceilings, designer furniture, and a stunning entertainment center.</p> <<if $hasTV>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Watch TV</div>">> <<goto "WatchTV">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No TV</div> <</if>> </div> <!-- Gourmet Kitchen --> <div style="border: 3px solid #e67e22; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e67e22; margin: 0 0 10px 0;">🍳 Gourmet Kitchen</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A chef's dream kitchen with professional-grade appliances, marble countertops, and a large island.</p> <<link "<div style='background: #e67e22; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Cook Something</div>">> <<run advanceTime(1)>> <<goto "HomeKitchen">> <</link>> </div> <!-- Home Office --> <<if $hasLaptop>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💻 Home Office</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A private study with built-in bookshelves and panoramic windows.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Laptop</div>">> <<set $laptopReturnLocation = "PlayerExpensiveHome">> <<goto "UseLaptop">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💻 Home Office</h3> <p style="font-size: 14px; color: #888; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A private study awaiting your equipment.</p> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic; margin-top: 10px;'>No Laptop</div> </div> <</if>> <!-- Dining Room --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🍽️ Dining Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An elegant formal dining room with seating for twelve and a crystal chandelier.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <h2 style="color: #ffc107;">Other Rooms</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Master Bathroom --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Master Bathroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spa-like master bathroom with rainfall shower and jacuzzi tub.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bathroom</div>">> <<run advanceTime(1)>> <<goto "PlayerExpensiveBathroom">> <</link>> </div> <!-- Large Custom Room 1 --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _largeRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].large && $homeRenovations[_home].large[0]>> <<if _largeRoom1>> <<set _largeRoomData1 = setup.roomRenovations.large.find(function(r) { return r.id === _largeRoom1; })>> <h3 style="color: <<print _largeRoomData1.color>>; margin: 0 0 10px 0;"><<print _largeRoomData1.icon>> <<print _largeRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _largeRoomData1.description>></p> <<link `"<div style='background: " + _largeRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _largeRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto _largeRoomData1.passage>> <</link>> <<else>> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🪟 Large Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spacious room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Pool & Spa --> <div style="border: 3px solid #00bcd4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #00bcd4; margin: 0 0 10px 0;">🏊 Pool & Spa</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A heated infinity pool with attached hot tub and waterfall feature.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Medium Custom Room 1 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[0]>> <<if _medRoom1>> <<set _medRoomData1 = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom1; })>> <h3 style="color: <<print _medRoomData1.color>>; margin: 0 0 10px 0;"><<print _medRoomData1.icon>> <<print _medRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData1.description>></p> <<link `"<div style='background: " + _medRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto _medRoomData1.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Medium Custom Room 2 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom2 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[1]>> <<if _medRoom2>> <<set _medRoomData2 = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom2; })>> <h3 style="color: <<print _medRoomData2.color>>; margin: 0 0 10px 0;"><<print _medRoomData2.icon>> <<print _medRoomData2.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData2.description>></p> <<link `"<div style='background: " + _medRoomData2.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData2.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto _medRoomData2.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 1 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[0]>> <<if _smallRoom1>> <<set _smallRoomData1 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom1; })>> <h3 style="color: <<print _smallRoomData1.color>>; margin: 0 0 10px 0;"><<print _smallRoomData1.icon>> <<print _smallRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData1.description>></p> <<link `"<div style='background: " + _smallRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto _smallRoomData1.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 2 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom2 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[1]>> <<if _smallRoom2>> <<set _smallRoomData2 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom2; })>> <h3 style="color: <<print _smallRoomData2.color>>; margin: 0 0 10px 0;"><<print _smallRoomData2.icon>> <<print _smallRoomData2.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData2.description>></p> <<link `"<div style='background: " + _smallRoomData2.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData2.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto _smallRoomData2.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- 3-Car Garage --> <div style="border: 3px solid #7f8c8d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #7f8c8d; margin: 0 0 10px 0;">🚗 3-Car Garage</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spacious three-car garage with built-in storage and workshop area.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Backyard & Patio --> <div style="border: 3px solid #1abc9c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1abc9c; margin: 0 0 10px 0;">🌴 Backyard & Patio</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Lush tropical landscaping with outdoor kitchen, fire pit, and covered lanai.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <h2 style="color: #ffc107;">Home Management</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Decor Manager --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🎨 Decor Manager</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">View and manage your placed decorations.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Manage Decor</div>">> <<goto "HomeDecorManager">> <</link>> </div> <!-- Wall Color --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🖌️ Wall Paint</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Change your wall colors.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Paint Walls</div>">> <<goto "WallColorPicker">> <</link>> </div> <!-- Renovate Rooms --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🔧 Renovate Rooms</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Convert empty rooms into functional spaces.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Renovation Menu</div>">> <<set $renovateReturnPassage = "PlayerExpensiveHome">> <<goto "RoomRenovationManager">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Home</div>">> <<goto "ResidentialExpensiveHomes">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PlayerExpensiveBathroom")>> <<run $visitedLocations.push("PlayerExpensiveBathroom")>> <</if>> <<set $lastLocation = "PlayerExpensiveBathroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">🚿 Master Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> A spa-worthy master bathroom with Italian marble floors, heated towel racks, and ambient lighting. The glass-enclosed rainfall shower and deep jacuzzi tub offer the ultimate in relaxation. Dual vanities with backlit mirrors complete this luxurious retreat. </p> </div> <h2 style="color: #3498db;">Bathroom Features</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Rainfall Shower --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Rainfall Shower</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A massive glass-enclosed shower with rainfall and body spray jets.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Shower</div>">> <<set $bathroomMode = "shower">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Jacuzzi Tub --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛁 Jacuzzi Tub</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A deep soaking tub with jets, perfect for unwinding after a long day.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Bathtub</div>">> <<set $bathroomMode = "bath">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Toilet --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">🚽 Toilet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A smart toilet with heated seat and bidet in a private water closet.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Vanity Mirror --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🪞 Vanity Mirror</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Backlit dual vanity mirrors with built-in TV display.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Look in Mirror</div>">> <<set $mirrorReturnLocation = "PlayerExpensiveBathroom">> <<goto "MirrorView">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Main House</div>">> <<run advanceTime(1)>> <<goto "PlayerExpensiveHome">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PlayerModernMansion">> <<set _home = "PlayerModernMansion">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(26, 26, 26, 0.9); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerModernMansion")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h2 style="color: #fd7e14;">Main Floor</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Grand Master Suite --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9D00FF; margin: 0 0 10px 0;">🛏️ Grand Master Suite</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A palatial master bedroom with California king bed, walk-in closets the size of apartments, and panoramic city views.</p> <<link "<div style='background: #9D00FF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bedroom</div>">> <<run advanceTime(1)>> <<goto "PlayerMansionBedroom">> <</link>> </div> <!-- Living Room --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🛋️ Great Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An expansive great room with 30-foot ceilings, designer furniture, and a massive entertainment system.</p> <<if $hasTV>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Watch TV</div>">> <<goto "WatchTV">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>No TV Installed</div> <</if>> </div> <!-- Gourmet Kitchen --> <div style="border: 3px solid #e67e22; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e67e22; margin: 0 0 10px 0;">👨🍳 Chef's Kitchen</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A professional-grade kitchen with two islands, imported marble, and restaurant-quality appliances.</p> <<link "<div style='background: #e67e22; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Cook Something</div>">> <<run advanceTime(1)>> <<goto "HomeKitchen">> <</link>> </div> <!-- Home Office --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">💼 Executive Office</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A corner office with floor-to-ceiling windows, built-in bookshelves, and smart glass technology.</p> <<if $hasLaptop>> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Laptop</div>">> <<set $laptopReturnLocation = "PlayerModernMansion">> <<goto "UseLaptop">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>No Laptop</div> <</if>> </div> <!-- Formal Dining --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🍽️ Formal Dining</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A grand dining room with seating for 16, crystal chandelier, and butler's pantry.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Library --> <div style="border: 3px solid #8e44ad; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #8e44ad; margin: 0 0 10px 0;">📚 Library</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A two-story library with rolling ladder, rare first editions, and a cozy reading nook.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> </div> <h2 style="color: #fd7e14;">Other Rooms</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Master Bathroom --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Spa Bathroom</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An opulent spa bathroom with steam shower, soaking tub, and heated floors.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bathroom</div>">> <<run advanceTime(1)>> <<goto "PlayerMansionBathroom">> <</link>> </div> <!-- Large Custom Room 1 --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _largeRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].large && $homeRenovations[_home].large[0]>> <<if _largeRoom1>> <<set _largeRoomData1 = setup.roomRenovations.large.find(function(r) { return r.id === _largeRoom1; })>> <h3 style="color: <<print _largeRoomData1.color>>; margin: 0 0 10px 0;"><<print _largeRoomData1.icon>> <<print _largeRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _largeRoomData1.description>></p> <<link `"<div style='background: " + _largeRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _largeRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _largeRoomData1.passage>> <</link>> <<else>> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🪟 Large Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spacious room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Indoor Pool --> <div style="border: 3px solid #1abc9c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1abc9c; margin: 0 0 10px 0;">🏊 Indoor Pool</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">An Olympic-length indoor pool with retractable roof and adjacent hot tub.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Large Custom Room 2 --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _largeRoom2 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].large && $homeRenovations[_home].large[1]>> <<if _largeRoom2>> <<set _largeRoomData2 = setup.roomRenovations.large.find(function(r) { return r.id === _largeRoom2; })>> <h3 style="color: <<print _largeRoomData2.color>>; margin: 0 0 10px 0;"><<print _largeRoomData2.icon>> <<print _largeRoomData2.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _largeRoomData2.description>></p> <<link `"<div style='background: " + _largeRoomData2.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _largeRoomData2.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _largeRoomData2.passage>> <</link>> <<else>> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🪟 Large Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A spacious room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Medium Custom Room 1 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[0]>> <<if _medRoom1>> <<set _medRoomData1 = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom1; })>> <h3 style="color: <<print _medRoomData1.color>>; margin: 0 0 10px 0;"><<print _medRoomData1.icon>> <<print _medRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData1.description>></p> <<link `"<div style='background: " + _medRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _medRoomData1.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Medium Custom Room 2 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom2 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[1]>> <<if _medRoom2>> <<set _medRoomData2 = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom2; })>> <h3 style="color: <<print _medRoomData2.color>>; margin: 0 0 10px 0;"><<print _medRoomData2.icon>> <<print _medRoomData2.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData2.description>></p> <<link `"<div style='background: " + _medRoomData2.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData2.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _medRoomData2.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Medium Custom Room 3 --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _medRoom3 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].medium && $homeRenovations[_home].medium[2]>> <<if _medRoom3>> <<set _medRoomData3 = setup.roomRenovations.medium.find(function(r) { return r.id === _medRoom3; })>> <h3 style="color: <<print _medRoomData3.color>>; margin: 0 0 10px 0;"><<print _medRoomData3.icon>> <<print _medRoomData3.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _medRoomData3.description>></p> <<link `"<div style='background: " + _medRoomData3.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _medRoomData3.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _medRoomData3.passage>> <</link>> <<else>> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🚪 Medium Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A versatile room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 1 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom1 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[0]>> <<if _smallRoom1>> <<set _smallRoomData1 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom1; })>> <h3 style="color: <<print _smallRoomData1.color>>; margin: 0 0 10px 0;"><<print _smallRoomData1.icon>> <<print _smallRoomData1.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData1.description>></p> <<link `"<div style='background: " + _smallRoomData1.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData1.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _smallRoomData1.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 2 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom2 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[1]>> <<if _smallRoom2>> <<set _smallRoomData2 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom2; })>> <h3 style="color: <<print _smallRoomData2.color>>; margin: 0 0 10px 0;"><<print _smallRoomData2.icon>> <<print _smallRoomData2.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData2.description>></p> <<link `"<div style='background: " + _smallRoomData2.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData2.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _smallRoomData2.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 3 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom3 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[2]>> <<if _smallRoom3>> <<set _smallRoomData3 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom3; })>> <h3 style="color: <<print _smallRoomData3.color>>; margin: 0 0 10px 0;"><<print _smallRoomData3.icon>> <<print _smallRoomData3.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData3.description>></p> <<link `"<div style='background: " + _smallRoomData3.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData3.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _smallRoomData3.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- Small Custom Room 4 --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <<set _smallRoom4 = $homeRenovations && $homeRenovations[_home] && $homeRenovations[_home].small && $homeRenovations[_home].small[3]>> <<if _smallRoom4>> <<set _smallRoomData4 = setup.roomRenovations.small.find(function(r) { return r.id === _smallRoom4; })>> <h3 style="color: <<print _smallRoomData4.color>>; margin: 0 0 10px 0;"><<print _smallRoomData4.icon>> <<print _smallRoomData4.name>></h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;"><<print _smallRoomData4.description>></p> <<link `"<div style='background: " + _smallRoomData4.color + "; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter " + _smallRoomData4.name + "</div>"`>> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto _smallRoomData4.passage>> <</link>> <<else>> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A cozy room ready for customization.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Not Renovated</div> <</if>> </div> <!-- 6-Car Garage --> <div style="border: 3px solid #34495e; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #34495e; margin: 0 0 10px 0;">🚗 6-Car Garage</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Climate-controlled garage with car lift, workshop, and showroom lighting.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Grounds --> <div style="border: 3px solid #27ae60; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #27ae60; margin: 0 0 10px 0;">🌳 Estate Grounds</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">3 acres of manicured gardens, tennis court, outdoor kitchen, and helipad.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Private Aquarium --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🐠 Private Aquarium</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A magnificent floor-to-ceiling aquarium showcasing your prized fish collection.</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>View Aquarium</div>">> <<run advanceTime(1)>> <<goto "PlayerMansionAquarium">> <</link>> </div> </div> <h2 style="color: #fd7e14;">Home Management</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Decor Manager --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🎨 Decor Manager</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">View and manage your placed decorations.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Manage Decor</div>">> <<goto "HomeDecorManager">> <</link>> </div> <!-- Wall Color --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🖌️ Wall Paint</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Change your wall colors.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Paint Walls</div>">> <<goto "WallColorPicker">> <</link>> </div> <!-- Renovate Rooms --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🔧 Renovate Rooms</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Convert empty rooms into functional spaces.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Renovation Menu</div>">> <<set $renovateReturnPassage = "PlayerModernMansion">> <<goto "RoomRenovationManager">> <</link>> </div> </div> <h2 style="color: #fd7e14;">Leave</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🚪 Leave Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Head out to Mansion Row.</p> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave</div>">> <<goto "ResidentialMansions">> <</link>> </div> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PlayerMansionBathroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #fd7e14; text-align: center;">🚿 Spa Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #fd7e14 0%, #e8590c 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #fd7e14;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A spa-like retreat with imported Italian marble, heated floors, and a stunning chandelier. </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Steam Shower --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🚿 Steam Shower</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A massive walk-in shower with multiple heads, body jets, and built-in steam system.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Shower</div>">> <<set $bathroomMode = "shower">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Soaking Tub --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🛁 Freestanding Tub</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A sculptural soaking tub carved from a single block of marble with city views.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Use Bathtub</div>">> <<set $bathroomMode = "bath">> <<goto "HomeBathroomActions">> <</link>> </div> <!-- Toilet --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">🚽 Private Water Closet</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A Japanese smart toilet with all the features in its own private room.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Work in Progress</div> </div> <!-- Vanity Mirror --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🪞 Lighted Vanity</h3> <p style="font-size: 14px; color: #ccc; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A custom vanity with Hollywood lighting, magnifying mirrors, and smart display.</p> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Look in Mirror</div>">> <<set $mirrorReturnLocation = "PlayerMansionBathroom">> <<goto "MirrorView">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Main House</div>">> <<run advanceTime(1)>> <<goto "PlayerModernMansion">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "SuburbanGuestBedroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #9b59b6; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Suburban</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerSuburbanHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "SuburbanThirdBedroom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #e67e22; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Suburban</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerSuburbanHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "ExpensiveHomeTheater">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #e74c3c; text-align: center;">🪟 Large Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Large | Home: Expensive</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerExpensiveHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "ExpensiveWineCellar">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #8e44ad; text-align: center;">🚪 Medium Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Medium | Home: Expensive</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerExpensiveHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "ExpensiveGuestSuite1">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #27ae60; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Expensive</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerExpensiveHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "ExpensiveGuestSuite2">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #2ecc71; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Expensive</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerExpensiveHome">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionPrivateTheater">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #e74c3c; text-align: center;">🪟 Large Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Large | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionPrivateGym">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #e67e22; text-align: center;">🪟 Large Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Large | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionWineCellar">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #722f37; text-align: center;">🚪 Medium Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Medium | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionGameRoom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #f1c40f; text-align: center;">🚪 Medium Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Medium | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionStaffQuarters">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #7f8c8d; text-align: center;">🚪 Medium Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Medium | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionCustomRoom1">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #95a5a6; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionCustomRoom2">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #95a5a6; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionCustomRoom3">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #95a5a6; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "MansionCustomRoom4">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #95a5a6; text-align: center;">🧱 Small Custom Room</h1> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Customizable Room</h2> <p style="color: #ccc;">This room can be customized in future updates!</p> <p style="color: #888; font-size: 14px;">Room Size: Small | Home: Mansion</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto "PlayerModernMansion">><</link>> </div> </div></div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("GroceryStore")>> <<run $visitedLocations.push("GroceryStore")>> <</if>> <<set $lastLocation = "GroceryStore">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">🛒 Fresh Catch Grocery</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/GroceryStore.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Grocery Store"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1e4a2d 0%, #143d1f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0;"> The main grocery store serving Sunfish City. Fluorescent lights illuminate aisles of fresh produce, packaged goods, and everyday essentials. Shopping carts rattle across the polished floors as customers browse the selections. </p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #28a745; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <h2 style="color: #28a745;">🥬 Buy Ingredients</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _ingId, _ingredient range setup.ingredients>> <<set _canAfford = $money >= _ingredient.price>> <<set _currentStock = ($kitchenInventory.ingredients[_ingId] || 0)>> <div style="border: 3px solid <<if _canAfford>>#51cf66<<else>>#666<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;"><<print _ingredient.name>></h3> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Per <<print _ingredient.unit>></p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">$<<print _ingredient.price>></p> <p style="color: #1e90ff; font-size: 14px; margin: 0 0 10px 0;">In pantry: <<print _currentStock>></p> <<if _canAfford>> <<capture _ingId, _ingredient>> <<link "<div style='background: #51cf66; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Buy 1 ($<<print _ingredient.price>>)</div>">> <<set $money -= _ingredient.price>> <<if !$kitchenInventory.ingredients[_ingId]>><<set $kitchenInventory.ingredients[_ingId] = 0>><</if>> <<set $kitchenInventory.ingredients[_ingId]++>> <<goto "GroceryStore">> <</link>> <<if $money >= _ingredient.price * 5>> <div style="margin-top: 8px;"> <<link "<div style='background: #40c057; color: white; padding: 6px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 12px;'>Buy 5 ($<<print _ingredient.price * 5>>)</div>">> <<set $money -= _ingredient.price * 5>> <<if !$kitchenInventory.ingredients[_ingId]>><<set $kitchenInventory.ingredients[_ingId] = 0>><</if>> <<set $kitchenInventory.ingredients[_ingId] += 5>> <<goto "GroceryStore">> <</link>> </div> <</if>> <</capture>> <<else>> <div style="background: #444; color: #888; padding: 8px; border-radius: 6px; text-align: center;">Cannot afford</div> <</if>> </div> <</for>> </div> <!-- Coming Soon Sections --> <h2 style="color: #17a2b8;">🧹 Cleaning Supplies</h2> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; text-align: center;"> <p style="color: #ffa500; font-size: 20px; margin: 0 0 10px 0;">🚧 Coming Soon</p> <p style="color: #888; margin: 0;">Dish soap, laundry detergent, all-purpose cleaner, and more!</p> </div> <h2 style="color: #e91e63;">🧴 Personal Care</h2> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; text-align: center;"> <p style="color: #ffa500; font-size: 20px; margin: 0 0 10px 0;">🚧 Coming Soon</p> <p style="color: #888; margin: 0;">Shampoo, toothpaste, soap, deodorant, and more!</p> </div> <h2 style="color: #9c27b0;">🏠 Household Items</h2> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; text-align: center;"> <p style="color: #ffa500; font-size: 20px; margin: 0 0 10px 0;">🚧 Coming Soon</p> <p style="color: #888; margin: 0;">Light bulbs, batteries, trash bags, paper towels, and more!</p> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("GroceryStore")>> <h2 style="color: #28a745;">🛒 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;"><<print _npc.name>></h3> <p style="font-size: 14px; color: #6fbf7f; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to <<print _npc.name>></div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one else is shopping right now. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #20c997; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Store</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set $lastLocation = "HomeKitchen">> <div style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(26, 26, 26, 0.9); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("HomeKitchen")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h2 style="color: #ffc107;">🍳 Kitchen</h2> <!-- Pantry Contents --> <div style="border: 3px solid #51cf66; border-radius: 10px; background: #2a2a2a; padding: 20px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">📦 Pantry Contents</h3> <<set _hasIngredients = false>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _ingId, _qty range $kitchenInventory.ingredients>> <<if _qty > 0>> <<set _hasIngredients = true>> <<set _ingData = setup.ingredients[_ingId]>> <span style="display: inline-block; background: #1a1a1a; padding: 8px 12px; border-radius: 5px; color: #ccc;"> <<print _ingData.name>>: <<print _qty>> </span> <</if>> <</for>> </div> <<if !_hasIngredients>> <p style="color: #888; margin: 0;">Your pantry is empty. Visit the grocery store to stock up!</p> <</if>> <<if $physicalTraits && $physicalTraits.includes("Hucow")>> <div style="margin-top: 15px; padding: 10px; background: linear-gradient(135deg, #ff69b4 0%, #ff1493 100%); border-radius: 8px;"> <span style="color: white; font-weight: bold;">🐄 Hucow Bonus: Unlimited Milk for all recipes!</span> </div> <</if>> </div> <!-- Recipes --> <h3 style="color: #51cf66;">🍳 Recipes</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<set _hasCookingSkill = $skills && $skills.includes("Cooking")>> <<for _recipeId, _recipe range setup.recipes>> <<set _canCook = setup.canCookRecipe(_recipeId)>> <<set _needsCookingSkill = _recipe.requiresCooking && !_hasCookingSkill>> <<set _isAvailable = _canCook && !_needsCookingSkill>> <div style="border: 3px solid <<if _isAvailable>>#51cf66<<elseif _needsCookingSkill>>#ffc107<<else>>#666<</if>>; border-radius: 10px; background: #2a2a2a; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h4 style="color: <<if _isAvailable>>#51cf66<<elseif _needsCookingSkill>>#ffc107<<else>>#888<</if>>; margin: 0 0 10px 0;"> <<print _recipe.name>> <<if _recipe.requiresCooking>><span style="font-size: 12px; color: #ffc107;"> (Advanced)</span><</if>> </h4> <p style="color: #ccc; margin: 0 0 10px 0; font-weight: bold;">Ingredients:</p> <<set _hasHucow = $physicalTraits && $physicalTraits.includes("Hucow")>> <ul style="margin: 0 0 10px 0; padding-left: 20px;"> <<for _ingId, _needed range _recipe.ingredients>> <<set _ingData = setup.ingredients[_ingId]>> <<set _have = $kitchenInventory.ingredients[_ingId] || 0>> <<if _ingId === "milk" && _hasHucow>> <li style="color: #ff69b4;"> <<print _ingData.name>>: 🐄 Hucow (Unlimited) </li> <<else>> <li style="color: <<if _have >= _needed>>#51cf66<<else>>#ff6b6b<</if>>;"> <<print _ingData.name>>: <<print _have>> / <<print _needed>> </li> <</if>> <</for>> </ul> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">⏱️ Time: <<print _recipe.time>> minutes</p> <p style="color: #1e90ff; font-size: 14px; margin: 0 0 5px 0;">✨ Random buff for <<print Math.floor(_recipe.buffDuration / 60)>> hours</p> <p style="color: #888; font-size: 12px; margin: 0 0 15px 0;"> <<if _recipe.ingredientCost < 10>>Strength: +5-10% <<elseif _recipe.ingredientCost < 25>>Strength: +10-15% <<else>>Strength: +15-25% <</if>> </p> <<if _needsCookingSkill>> <div style="background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;">Requires Cooking Skill</div> <<elseif _canCook>> <<capture _recipeId, _recipe>> <<set _cookButtonText = "🍳 Cook " + _recipe.name>> <<link `"<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>" + _cookButtonText + "</div>"`>> <<run setup.consumeIngredients(_recipeId)>> <<set $lastCookedMeal = _recipe.name>> <<set $lastCookedRecipeId = _recipeId>> <<run advanceTime(_recipe.time)>> <<goto "CookingComplete">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center;">Missing ingredients</div> <</if>> </div> <</for>> </div> <!-- Quick Actions --> <div style="border: 3px solid #1e90ff; border-radius: 10px; background: #2a2a2a; padding: 20px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 15px 0;">Quick Actions</h3> <<link "<span style='color: #1e90ff; cursor: pointer;'>🥤 Get a glass of water</span>">> <<run advanceTime(2)>> <<replace "#water-result">> <p style="color: #51cf66; margin: 10px 0;">You drink a refreshing glass of water. Feeling hydrated!</p> <</replace>> <</link>> <span id="water-result"></span> <<if setup.hasDecorItem("espresso_machine")>> <br><br> <<link "<span style='color: #8b4513; cursor: pointer;'>☕ Make an espresso</span>">> <<run advanceTime(5)>> <<replace "#coffee-result">> <p style="color: #8b4513; margin: 10px 0;">The rich aroma fills the kitchen as you enjoy your espresso. (+Energy)</p> <</replace>> <</link>> <span id="coffee-result"></span> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Home</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "CookingComplete">> <<set _recipe = setup.recipes[$lastCookedRecipeId]>> <<set _buffDef = setup.foodBuffs[_recipe.buffId]>> <!-- Add food to inventory --> <<if !$foodInventory>><<set $foodInventory = []>><</if>> <<run $foodInventory.push({ recipeId: $lastCookedRecipeId, name: _recipe.name, buffId: _recipe.buffId, buffDuration: _recipe.buffDuration, cookedTime: $timeInMinutes })>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="border: 3px solid #51cf66; border-radius: 15px; background: #2a2a2a; padding: 40px; max-width: 500px; text-align: center;"> <h2 style="color: #51cf66; margin: 0 0 20px 0;">🍽️ Meal Ready!</h2> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> The delicious aroma of your <<print $lastCookedMeal>> fills the kitchen. Your meal has been added to your food inventory! </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="font-size: 28px; margin: 0 0 10px 0;"><<print _buffDef.icon>></p> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0 0 5px 0;"><<print _buffDef.name>></p> <p style="color: #888; font-size: 14px; margin: 0 0 10px 0;"><<print _buffDef.description>></p> <p style="color: #1e90ff; font-size: 16px; margin: 0;"> Duration: <<print Math.floor(_recipe.buffDuration / 60)>> hours </p> </div> <p style="color: #888; font-size: 14px; margin: 0 0 25px 0;"> Eat this meal from your inventory to gain its buff! </p> <<link "<div style='background: #51cf66; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer;'>Continue</div>">> <<goto "HomeKitchen">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$foodInventory || $eatFoodIndex === undefined || $eatFoodIndex < 0 || $eatFoodIndex >= $foodInventory.length>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="border: 3px solid #ff6b6b; border-radius: 15px; background: #2a2a2a; padding: 40px; max-width: 400px; text-align: center;"> <h2 style="color: #ff6b6b;">Error</h2> <p style="color: #ccc;">No food selected.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; cursor: pointer;'>Back</div>">> <<set $inventoryTab = "food">> <<goto "Inventory">> <</link>> </div> </div> <<else>> <<set _food = $foodInventory[$eatFoodIndex]>> <<set _buffDef = setup.foodBuffs[_food.buffId]>> <!-- Apply the food buff --> <<run setup.addBuff(_food.buffId, _food.buffDuration, 1)>> <!-- Remove food from inventory --> <<run $foodInventory.splice($eatFoodIndex, 1)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="border: 3px solid #51cf66; border-radius: 15px; background: #2a2a2a; padding: 40px; max-width: 500px; text-align: center;"> <h2 style="color: #51cf66; margin: 0 0 20px 0;">🍴 Delicious!</h2> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> You enjoyed your <<print _food.name>>. It was perfectly prepared! </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="font-size: 28px; margin: 0 0 10px 0;"><<print _buffDef ? _buffDef.icon : "🍽️">></p> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0 0 5px 0;"><<print _buffDef ? _buffDef.name : "Food Buff">></p> <p style="color: #888; font-size: 14px; margin: 0 0 10px 0;"><<print _buffDef ? _buffDef.description : "">></p> <p style="color: #1e90ff; font-size: 16px; margin: 0;"> Active for <<print Math.floor(_food.buffDuration / 60)>> hours </p> </div> <p style="color: #888; font-size: 14px; margin: 0 0 25px 0;"> Your buff is now active! </p> <<link "<div style='background: #51cf66; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer;'>Continue</div>">> <<set $inventoryTab = "food">> <<goto "Inventory">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasLuxury = setup.hasLuxuryBathroom()>> <<set _hasImprovedShower = $homeUpgrades.improvedShower>> <<set _hasWaterHeater = $homeUpgrades.waterHeater>> <<set _hasSpaKit = setup.hasDecorItem("spa_kit")>> <<set $lastLocation = "HomeBathroomActions">> <div style="background: <<print _wallColor>>33; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #1e90ff; text-align: center;">🚿 Bathroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #0d6efd 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Time to freshen up... </p> </div> <<set _ageStr = ($appearance.age === "Mature Adult") ? "mature" : "adult">> <!-- Bathroom Image --> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<if $bathroomMode === "shower">> <div style="text-align: center; margin-bottom: 20px;"> <img src="Images/M/shower_m_<<print $gender>>_<<print _ageStr>>.webp" style="max-width: 100%; width: 400px; border-radius: 10px; border: 2px solid #1e90ff;" onerror="this.style.display='none'"> </div> <<elseif $bathroomMode === "bath">> <div style="text-align: center; margin-bottom: 20px;"> <img src="Images/M/bath_m_<<print $gender>>_<<print _ageStr>>.webp" style="max-width: 100%; width: 400px; border-radius: 10px; border: 2px solid #667eea;" onerror="this.style.display='none'"> </div> <</if>> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Shower Options --> <<if $bathroomMode === "shower">> <!-- Quick Shower --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🚿 Quick Shower</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;">A refreshing shower to clean up.</p> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">⏱️ Time: 15 minutes</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 15px 0;">🚿 Fresh & Clean buff (+15% trading, 3 hours)</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Take Quick Shower</div>">> <<run advanceTime(15)>> <<set $lastShowerType = "quick">> <<goto "ShowerComplete">> <</link>> </div> <!-- Long Shower --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🚿 Long Hot Shower</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;">Take your time and relax under the hot water.</p> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">⏱️ Time: 30 minutes</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 15px 0;">🚿 Fresh & Clean buff (+15% trading, 3 hours)</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Take Long Shower</div>">> <<run advanceTime(30)>> <<set $lastShowerType = "long">> <<goto "ShowerComplete">> <</link>> </div> <</if>> <!-- Bath Options --> <<if $bathroomMode === "bath">> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🛁 Relaxing Bath</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;">Soak in the tub and let your worries melt away.</p> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">⏱️ Time: 45 minutes</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 15px 0;">🛁 Fresh & Clean buff (+15% trading, 3 hours)</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Take a Bath</div>">> <<run advanceTime(45)>> <<set $lastBathType = "regular">> <<goto "BathComplete">> <</link>> </div> <!-- Bubble Bath - Spa Kit --> <<if _hasSpaKit>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🛁 Luxury Bubble Bath</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;">Use your spa kit for the ultimate relaxation.</p> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">⏱️ Time: 60 minutes</p> <p style="color: #51cf66; font-size: 14px; margin: 0 0 15px 0;">🛁 Fresh & Clean buff (+15% trading, 3 hours)</p> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Take Bubble Bath</div>">> <<run advanceTime(60)>> <<set $lastBathType = "bubble">> <<goto "BathComplete">> <</link>> </div> <</if>> <</if>> <!-- Masturbate --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔞 Masturbate</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">The bathroom offers privacy for personal activities...</p> <<if $bathroomMode === "shower">> <<link "<div style='background: #ff6b6b; color: white; padding: 8px 15px; border-radius: 6px; text-align: center; cursor: pointer;'>In the Shower...</div>">> <<set $masturbationStats.lastLocation = "shower">> <<goto "MasturbationShower">> <</link>> <</if>> <<if $bathroomMode === "bath">> <<link "<div style='background: #667eea; color: white; padding: 8px 15px; border-radius: 6px; text-align: center; cursor: pointer;'>In the Bathtub...</div>">> <<set $masturbationStats.lastLocation = "bathtub">> <<goto "MasturbationBathtub">> <</link>> <</if>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Bathroom</div>">> <<goto `setup.getCurrentBathroom()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ShowerComplete">> <<run setup.addBuff("shower_fresh", 180)>> <<set $appearance.hairStyle = "messy">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="border: 3px solid #1e90ff; border-radius: 15px; background: #2a2a2a; padding: 40px; max-width: 500px; text-align: center;"> <h2 style="color: #1e90ff; margin: 0 0 20px 0;">🚿 Refreshed!</h2> <<if $lastShowerType === "long">> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> The warm water cascades over you, washing away all tension. Steam fills the bathroom as you take your time, enjoying every moment. You step out feeling completely refreshed and relaxed. </p> <<else>> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> The water cascades over you, washing away the grime of the day. You step out feeling clean and refreshed. </p> <</if>> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">🚿 Fresh & Clean buff gained!</p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">+15% trading bonus for 3 hours</p> <<if $lastShowerType === "long">> <p style="color: #51cf66; font-size: 16px; margin: 10px 0 0 0;">✓ Feeling more relaxed</p> <</if>> </div> <<link "<div style='background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer;'>Continue</div>">> <<goto `setup.getCurrentBathroom()`>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BathComplete">> <<if $lastBathType === "bubble">> <<run setup.addBuff("bath_luxury", 240)>> <<else>> <<run setup.addBuff("shower_fresh", 180)>> <<run setup.addBuff("bath_relaxed", 180)>> <</if>> <<set $appearance.hairStyle = "messy">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="border: 3px solid <<if $lastBathType === 'bubble'>>#ffd700<<else>>#667eea<</if>>; border-radius: 15px; background: #2a2a2a; padding: 40px; max-width: 500px; text-align: center;"> <<if $lastBathType === "bubble">> <h2 style="color: #ffd700; margin: 0 0 20px 0;">✨ Spa Experience</h2> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> Surrounded by fragrant bubbles and luxurious bath oils, you let yourself drift into a state of complete bliss. This is what the good life is all about. </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #ffd700; font-size: 16px; margin: 0;">✨ Spa Bliss buff gained!</p> <p style="color: #b8860b; font-size: 14px; margin: 5px 0 0 0;">+20% trading, +5% steal chance for 4 hours</p> <p style="color: #ffd700; font-size: 16px; margin: 10px 0 0 0;">★ Deep relaxation achieved</p> </div> <<else>> <h2 style="color: #667eea; margin: 0 0 20px 0;">🛁 Deeply Relaxed</h2> <p style="color: #ccc; font-size: 18px; line-height: 1.6; margin: 0 0 20px 0;"> You sink into the warm water, feeling the tension melt from your muscles. The quiet solitude of the bath brings a sense of peace. </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">🚿 Fresh & Clean buff gained!</p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">+15% trading bonus for 3 hours</p> <p style="color: #667eea; font-size: 16px; margin: 10px 0 0 0;">🛁 Deeply Relaxed buff gained!</p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">+10% steal chance for 3 hours</p> </div> <</if>> <<link "<div style='background: <<if $lastBathType === 'bubble'>>#ffd700; color: #1a1a1a;<<else>>#667eea; color: white;<</if>> padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer;'>Continue</div>">> <<goto `setup.getCurrentBathroom()`>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <<set _hasBoth = $bodyParts.genitals === "both">> <<set _chestSize = $bodyParts.chest>> <<set _hasBreasts = _chestSize !== "flat" && _chestSize !== "flat masculine">> <<set _penisSize = $bodyParts.genitals>> <<set _isSmallPenis = _penisSize === "small penis">> <<set _isAveragePenis = _penisSize === "average penis">> <<set _isBigPenis = _penisSize === "big penis">> <<set _isHugePenis = _penisSize === "huge penis">> <<set _isGiantPenis = _penisSize === "giant penis">> <<set _isSmallBreasts = _chestSize === "small">> <<set _isMediumBreasts = _chestSize === "medium">> <<set _isLargeBreasts = _chestSize === "large">> <<set _isHugeBreasts = _chestSize === "huge">> <<set _isMassiveBreasts = _chestSize === "massive">> <<set $lastLocation = "MasturbationBedroom">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #ff6b6b; text-align: center;">🛏️ Masturbate in Bed</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <<masturbationImage "bed">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <p>You lock the door with a soft click, savoring the anticipation already building inside you. The bedroom is quiet, intimate - just you and the soft sheets waiting to embrace your body. You strip off your clothes, feeling the cool air kiss your bare skin, then sink onto the bed with a contented sigh. The mattress gives beneath you as you settle against the pillows, your body already tingling with need.</p> <<if _hasBreasts>> <<if _isSmallBreasts>> <p>Your hands drift up to your small, pert breasts, cupping their delicate weight. They fit perfectly in your palms, so sensitive that even the lightest touch sends shivers down your spine. You circle your thumbs around your hardening nipples, gasping softly as sparks of pleasure radiate through your chest. The sheets feel silky against your back as you arch into your own touch.</p> <<elseif _isMediumBreasts>> <p>Your hands slide up to cup your shapely breasts, feeling their soft weight fill your palms. You squeeze them gently, watching the flesh yield between your fingers. Your nipples stiffen as you roll them between thumb and forefinger, sending pulses of warmth straight to your core. A soft moan escapes your lips as you knead the supple mounds, losing yourself in the sensation.</p> <<elseif _isLargeBreasts>> <p>Your large, heavy breasts spill into your hands as you lift them, marveling at their generous weight. You squeeze them together, feeling the soft flesh bulge between your fingers. Your nipples are achingly hard now, and you pinch them with increasing pressure, gasping at the pleasure-pain that shoots through you. Each touch makes your core clench with need.</p> <<elseif _isHugeBreasts>> <p>Your huge breasts spread across your chest, so heavy and full that they need both hands just to lift. You grip them firmly, feeling the soft flesh overflow your grasp. Your swollen nipples beg for attention, and you bring one to your lips, sucking on the hardened bud while your free hand roughly massages the other. The sensation is overwhelming, making you writhe against the sheets.</p> <<elseif _isMassiveBreasts>> <p>Your massive breasts dominate your torso, their extraordinary weight pressing you into the mattress. You struggle to contain even one in both hands as you knead the impossibly soft flesh. Your thick nipples are so sensitive they ache, and every touch sends lightning bolts of pleasure through your body. You bury your face between them, losing yourself in their warmth while your hands continue their desperate exploration.</p> <</if>> <</if>> <<if _hasPenis>> <<if _isSmallPenis>> <p>Your cock stiffens eagerly, standing at attention despite its modest size. You wrap your fingers around it, your hand easily enclosing the entire length. What you lack in size, you make up for in sensitivity - every nerve ending fires as you begin to stroke with tight, focused motions. Your thumb swirls over the sensitive head, making you gasp and buck your hips.</p> <p>You build a steady rhythm, your tight grip working your shaft with practiced expertise. The pleasure mounts quickly, your balls drawing tight as tension coils in your core. With a sharp grunt, your cock pulses in your grip as you climax, your release spurting onto your stomach as waves of satisfaction wash through you.</p> <<elseif _isAveragePenis>> <p>Your cock swells to full hardness, throbbing with need. You grip your satisfying length, feeling the heat pulse against your palm. Slowly, you begin to stroke, savoring the sensation of your foreskin gliding over the swollen head. Your thumb teases the sensitive tip, spreading the bead of pre-cum that forms there.</p> <p>Your strokes grow faster, more urgent. The slick sounds of your hand working your shaft fill the quiet room. You imagine a lover's touch, their eager hands on your body. The pressure builds until you can't hold back - your cock throbs powerfully as ropes of cum paint your stomach, leaving you gasping and utterly satisfied.</p> <<elseif _isBigPenis>> <p>Your substantial cock rises thick and proud from your body, the impressive length demanding attention. You grip it with both hands, still leaving shaft exposed above and below your fists. The veins pulse visibly as you begin to stroke, the thick head swelling to an angry purple. Pre-cum leaks freely, providing natural lubrication.</p> <p>You pump your thick shaft with long, powerful strokes, one hand twisting around the head while the other works the base. The pleasure is intense, building like a storm. When you finally cum, your big cock erupts violently, thick streams of seed arcing through the air and splattering across your chest. Your whole body shakes from the force of your release.</p> <<elseif _isHugePenis>> <p>Your massive cock swells to its full, intimidating size, so long and thick it looks almost unreal. The weight of it is substantial as you grip the shaft with both hands - and there's still more exposed. Veins thick as cables throb along its length, pulsing with your heartbeat. Just holding something this big feels obscene.</p> <p>You stroke your huge member with determination, your arms working hard to pleasure its entire length. Pre-cum drools continuously from the fat head. When climax hits, it's volcanic - your enormous cock bucks and convulses as massive ropes of thick cum blast across your body, painting you from chest to chin. You cry out, overwhelmed by the intensity.</p> <<elseif _isGiantPenis>> <p>Your monster cock stirs to life, engorging with blood until it reaches its breathtaking full size. It's so large it borders on the inhuman - a magnificent pillar of flesh that demands worship. Both hands wrapped around it barely cover half the shaft. The head is swollen and angry, already weeping with need.</p> <p>Stroking something this massive is an athletic feat, but the sensations are worth every effort. Pre-cum pours from your cock in a steady stream. When you finally explode, it's like a force of nature - your giant cock convulses as an almost inhuman flood of cum erupts, jet after jet covering your entire torso. You roar with release, your body shaking uncontrollably.</p> <</if>> <</if>> <<if _hasVagina>> <p>Your hand slides down your stomach, fingers trailing through the heat between your thighs. You're already wet, your body eager and ready. You spread your legs against the cool sheets, giving yourself full access. One finger traces along your slick folds before finding your swollen clit.</p> <p>A moan escapes you as you begin to circle the sensitive nub with practiced expertise. Your hips rock against your hand as you work yourself, alternating between teasing your clit and plunging fingers deep inside. Two fingers curl forward, finding that perfect spot that makes your toes curl and back arch.</p> <p>The pressure builds with every stroke. You add a third finger, stretching yourself deliciously as your thumb maintains its relentless rhythm on your clit. When orgasm finally crashes through you, your inner walls clench hard around your fingers as waves of pleasure pulse through your core, leaving you trembling and breathless against the sheets.</p> <</if>> <<if _hasBoth>> <p>Having both sets of equipment gives you options most people can only dream of. One hand wraps around your stiffening cock while the other slides between your thighs to your slick pussy. The dual stimulation is electric, each touch amplifying the other until the pleasure bounces between them like lightning.</p> <p>You stroke yourself in rhythm while your fingers work your sensitive clit, then plunge inside. Your cock throbs in your grip while your inner walls clench around your fingers. When you cum, you cum HARD - your cock spurts across your stomach while your pussy clenches in powerful contractions. The dual orgasm leaves you seeing stars, completely overwhelmed by the intensity.</p> <</if>> <p>You lie back against the pillows, utterly spent and satisfied. The tension has melted from your body, replaced by a warm, pleasant glow. That was exactly what you needed.</p> </div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Penis Options --> <<if _hasPenis>> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">Manual Stimulation</h3> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use your hand</div>">> <<set $masturbationStats.timesTotal++>> <<set _toyUsed = false>> <<goto "MasturbationPenisScene">> <</link>> </div> <<if $ownsFleshlight>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">Use Toy</h3> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use your fleshlight</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.fleshlight++>> <<set _toyUsed = "fleshlight">> <<goto "MasturbationPenisScene">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 20px; background: #1a1a1a; opacity: 0.7;"> <h3 style="color: #888; margin: 0 0 10px 0;">Fleshlight</h3> <p style="color: #666; font-size: 14px; margin: 0;">You don't own one. Visit the Adult Store ($50).</p> </div> <</if>> <</if>> <!-- Vagina Options --> <<if _hasVagina>> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">Manual Stimulation</h3> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use your fingers</div>">> <<set $masturbationStats.timesTotal++>> <<set _toyUsed = false>> <<goto "MasturbationVaginaScene">> <</link>> </div> <<if $ownsDildo>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">Use Toy</h3> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use your dildo</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.dildo++>> <<set _toyUsed = "dildo">> <<goto "MasturbationVaginaScene">> <</link>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 20px; background: #1a1a1a; opacity: 0.7;"> <h3 style="color: #888; margin: 0 0 10px 0;">Dildo</h3> <p style="color: #666; font-size: 14px; margin: 0;">You don't own one. Visit the Adult Store ($45).</p> </div> <</if>> <</if>> <!-- Chest Play Option --> <<if _hasBreasts>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">Breast Play</h3> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Focus on your chest</div>">> <<set $masturbationStats.timesTotal++>> <<goto "MasturbationChestScene">> <</link>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Changed my mind</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _size = $bodyParts.genitals>> <<set _chestSize = $bodyParts.chest>> <<set _hasBreasts = _chestSize !== "flat" && _chestSize !== "flat masculine">> <<set _buttSize = $bodyParts.butt>> <<set $lastLocation = "MasturbationPenisScene">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="border: 3px solid #ff6b6b; border-radius: 15px; background: #2a2a2a; padding: 30px; max-width: 700px; margin: 0 auto;"> <h2 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0;">🔞 Private Pleasure</h2> <<masturbationImage "bed">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <!-- Opening varies by size --> <<if _size === "small penis">> <p>You wrap your fingers around your modest cock, the familiar sensation sending a shiver up your spine. Your thumb traces the sensitive head, smearing the bead of precum that's already formed. You know exactly how to work your length, your grip tightening as you begin to stroke in earnest.</p> <<elseif _size === "big penis">> <p>You grip your thick, impressive shaft, both hands finding plenty to work with. The heavy weight of your cock feels incredible in your palms as you begin long, slow strokes from base to tip. Precum wells up, slicking your length and making your grip slide deliciously along your veiny shaft.</p> <<elseif _size === "huge penis" || _size === "giant penis">> <p>Your massive cock throbs demandingly, too thick for one hand to fully encircle. You grip it with both fists, pumping up and down the ridiculous length. Precum drools from the swollen head, running down over your knuckles. Every stroke sends bolts of pleasure through your body, your heavy balls tightening beneath.</p> <<else>> <p>You take hold of your hardening cock, wrapping your fingers around the shaft. A familiar warmth spreads through your groin as you begin to stroke, your hand sliding up and down in a practiced rhythm. Your cock stiffens fully under your touch, the head flushing a deeper color.</p> <</if>> <!-- Toy variation --> <<if _toyUsed === "fleshlight">> <p>You reach for your fleshlight, squirting a generous amount of lube inside before pressing your swollen head against the entrance. You moan softly as you slide in, the textured interior gripping and massaging every inch of your shaft. You begin thrusting, fucking the toy with increasing urgency.</p> <<if _size === "big penis" || _size === "huge penis" || _size === "giant penis">> <p>The toy stretches obscenely around your considerable girth, the tight sleeve milking your cock as you pump into it. The squelching sounds fill the room as lube and precum mix together.</p> <</if>> <</if>> <!-- Chest involvement for those with breasts --> <<if _hasBreasts>> <<if _chestSize === "large" || _chestSize === "huge" || _chestSize === "giant" || _chestSize === "gigantic">> <p>Your free hand wanders up to your heavy breasts, cupping and squeezing the soft flesh. You pinch a stiffening nipple between your fingers, rolling it as pleasure shoots down to join the sensations in your groin. Your <<print _chestSize>> tits bounce gently as your stroking grows more urgent.</p> <<elseif _chestSize === "small" || _chestSize === "medium">> <p>Your fingers find your chest, circling a sensitive nipple before pinching it firmly. The sharp pleasure mixes perfectly with the heat building in your cock, making you moan.</p> <</if>> <</if>> <!-- Building intensity --> <p>Your breathing grows ragged as the pleasure mounts. Your hand moves faster, gripping tighter, chasing that building pressure. Your balls draw up tight, your cock throbbing and pulsing in your grip. You can feel it coming, that familiar tension coiling in your core...</p> <!-- Climax varies by size --> <<if _size === "huge penis" || _size === "giant penis">> <p>With a strangled cry, you explode. Your massive cock jerks violently, spurting thick ropes of cum that arc through the air. Load after load pumps from your throbbing shaft, coating your stomach and chest in hot, sticky release. The orgasm seems to go on forever, your cock continuing to twitch and dribble as the waves of pleasure slowly subside.</p> <<elseif _size === "big penis">> <p>You gasp as the orgasm hits, your cock pulsing hard in your grip. Thick cum spurts from the head, splashing across your stomach in long strings. Your hips buck involuntarily as you milk every last drop from your throbbing shaft, the pleasure washing through you in powerful waves.</p> <<else>> <p>The orgasm crashes through you, your cock twitching and spurting in your hand. Hot cum splashes across your skin as you stroke through the climax, riding out every pulse of pleasure until you're left panting and satisfied, your spent cock softening in your grip.</p> <</if>> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">✓ Feeling satisfied</p> <<if _toyUsed>> <p style="color: #ffd700; font-size: 16px; margin: 5px 0 0 0;">★ Toy made it extra satisfying</p> <</if>> </div> <<run advanceTime(20)>> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; display: inline-block;'>Clean up and continue</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _chestSize = $bodyParts.chest>> <<set _hasBreasts = _chestSize !== "flat" && _chestSize !== "flat masculine">> <<set _buttSize = $bodyParts.butt>> <<set $lastLocation = "MasturbationVaginaScene">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="border: 3px solid #ff6b6b; border-radius: 15px; background: #2a2a2a; padding: 30px; max-width: 700px; margin: 0 auto;"> <h2 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0;">🔞 Private Pleasure</h2> <<masturbationImage "bed">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <p>You lie back on the bed, spreading your thighs as your hand trails down your body. Your fingers find their way between your legs, tracing along the soft folds of your pussy. Already you can feel the slick wetness gathering, your body responding to your touch. You tease yourself, running a fingertip along your slit, dipping just barely inside before circling your swelling clit.</p> <!-- Chest variation --> <<if _hasBreasts>> <<if _chestSize === "large" || _chestSize === "huge" || _chestSize === "giant" || _chestSize === "gigantic">> <p>Your other hand finds your heavy breasts, cupping and squeezing the abundant flesh. You roll a stiffening nipple between your fingers, pinching until you gasp. Your <<print _chestSize>> tits jiggle as your breathing quickens, their weight shifting as you arch into your own touch.</p> <<elseif _chestSize === "small" || _chestSize === "medium">> <p>Your free hand cups your breast, thumb circling a hardening nipple. You pinch and tug at the sensitive peak, sending sparks of pleasure down to join the heat building between your legs.</p> <</if>> <</if>> <!-- Toy variation --> <<if _toyUsed === "dildo">> <p>You reach for your dildo, running the thick head teasingly along your soaking slit. You press it against your entrance, feeling yourself stretch to accommodate it as you push it slowly inside. A moan escapes your lips as the toy fills you, inch by inch, until you're stuffed full. You begin pumping it in and out, the wet squelching sounds filling the room as you fuck yourself with increasing urgency.</p> <<else>> <p>You slide two fingers inside yourself, gasping at the slick heat that grips them. Your fingers curl forward, finding that spongy spot that makes your toes curl. Your palm grinds against your throbbing clit as you finger yourself, your inner walls clenching hungrily around the intrusion.</p> <</if>> <!-- Butt variation --> <<if _buttSize === "large" || _buttSize === "huge" || _buttSize === "giant" || _buttSize === "gigantic">> <p>Your hips rock desperately, your plump ass pressing into the mattress before lifting as you chase your pleasure. The bed creaks beneath your <<print _buttSize>> rear as you grind and thrust against your own hand.</p> <</if>> <!-- Building and climax --> <p>The pleasure builds relentlessly, each stroke and circle driving you higher. Your breath comes in desperate pants, your pussy clenching and dripping, your whole body tensing toward release. You can feel it coming, that tightening coil of pleasure ready to snap...</p> <p>The orgasm crashes through you like a wave, your inner walls spasming rhythmically as you cry out. Your hips buck uncontrollably, grinding against your hand as pulse after pulse of pleasure rolls through your core. You keep rubbing your clit through the aftershocks, milking every last tremor until you collapse back onto the bed, thoroughly satisfied and deliciously spent.</p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">✓ Feeling satisfied</p> <<if _toyUsed>> <p style="color: #ffd700; font-size: 16px; margin: 5px 0 0 0;">★ Your dildo made it extra satisfying</p> <</if>> </div> <<run advanceTime(25)>> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; display: inline-block;'>Clean up and continue</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _chestSize = $bodyParts.chest>> <<set $lastLocation = "MasturbationChestScene">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="border: 3px solid #ff6b6b; border-radius: 15px; background: #2a2a2a; padding: 30px; max-width: 700px; margin: 0 auto;"> <h2 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0;">🔞 Breast Play</h2> <<masturbationImage "bed">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <<if _chestSize === "gigantic">> <p>You lift your enormous, wobbling breasts, marveling at their impossible weight. The soft flesh spills through your fingers no matter how you try to contain them. You squeeze them together, watching them bulge and jiggle, the sensation alone enough to make you moan.</p> <p>Your nipples are swollen and aching for attention. You pinch them firmly, gasping as bolts of pleasure shoot through your chest. With breasts this massive, you can easily lift one to your mouth, swirling your tongue around the stiff peak before sucking hungrily. Your other hand kneads the neglected breast, squeezing and groping the pliant flesh.</p> <p>You lose yourself in the sensation, your gigantic tits bouncing and wobbling as you pleasure them. Heat spreads between your legs as the stimulation builds, each pinch and squeeze pushing you closer to a nipple-induced orgasm.</p> <<elseif _chestSize === "giant">> <p>Your massive breasts overflow your hands as you cup and squeeze them. The heavy, soft flesh molds under your fingers as you knead them eagerly. You press them together, creating deep cleavage before letting them bounce apart.</p> <p>Your nipples stiffen into hard peaks as you roll and pinch them. The sensation goes straight to your core, making your pussy clench with need. You alternate between squeezing and stroking, moaning as waves of pleasure radiate from your sensitive chest.</p> <<elseif _chestSize === "huge">> <p>You take your huge breasts in hand, savoring their heavy weight and softness. Your thumbs trace circles around your areolas, teasing closer and closer to the stiff peaks in the center. When you finally pinch your nipples, you gasp at the intensity.</p> <p>You squeeze and massage your tits, feeling them jiggle and bounce with every movement. The pleasure builds steadily as you continue, your nipples throbbing with sensitivity, your breathing growing ragged.</p> <<elseif _chestSize === "large">> <p>Your large breasts fill your palms nicely as you cup and squeeze them together. You trace circles around your puffy areolas, watching your nipples stiffen in anticipation. When you finally pinch them, a moan escapes your lips.</p> <p>You knead the soft flesh, tugging your nipples and rolling them between your fingers. Each touch sends sparks of pleasure down to join the growing warmth between your thighs.</p> <<elseif _chestSize === "medium">> <p>You caress your breasts, cupping them and squeezing gently. Your nipples respond immediately, stiffening under your fingers as you trace around them. You pinch and roll them, gasping at the sensitivity.</p> <p>The stimulation builds a delicious warmth that spreads through your body, making you squirm with arousal.</p> <<else>> <p>What you lack in size, you make up for in sensitivity. Your small breasts are incredibly responsive - even the lightest brush of your fingers across your nipples makes you gasp and shiver.</p> <p>You tease yourself mercilessly, circling and pinching your achingly hard nipples. Each touch sends electric pleasure coursing through your body, making your toes curl.</p> <</if>> <p>After a blissful session of teasing and pleasuring your sensitive breasts, you lie back with a satisfied sigh. Your nipples are still tingling, your body buzzing with the afterglow of purely chest-focused pleasure.</p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">✓ Feeling sensual and satisfied</p> </div> <<run advanceTime(15)>> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; display: inline-block;'>Continue</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <<set _hasBoth = $bodyParts.genitals === "both">> <<set _chestSize = $bodyParts.chest>> <<set _hasBreasts = _chestSize !== "flat" && _chestSize !== "flat masculine">> <<set _penisSize = $bodyParts.genitals>> <<set _isSmallPenis = _penisSize === "small penis">> <<set _isAveragePenis = _penisSize === "average penis">> <<set _isBigPenis = _penisSize === "big penis">> <<set _isHugePenis = _penisSize === "huge penis">> <<set _isGiantPenis = _penisSize === "giant penis">> <<set _isSmallBreasts = _chestSize === "small">> <<set _isMediumBreasts = _chestSize === "medium">> <<set _isLargeBreasts = _chestSize === "large">> <<set _isHugeBreasts = _chestSize === "huge">> <<set _isMassiveBreasts = _chestSize === "massive">> <<set $lastLocation = "MasturbationShower">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="border: 3px solid #1e90ff; border-radius: 15px; background: #2a2a2a; padding: 30px; max-width: 700px; margin: 0 auto;"> <h2 style="color: #1e90ff; text-align: center; margin: 0 0 20px 0;">🚿 Shower Fun</h2> <<masturbationImage "shower">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <p>Steam billows around you as scalding water cascades down your naked body. The bathroom fills with a thick, humid warmth that clings to your skin. Standing beneath the rainfall showerhead, you let the water pound against your shoulders and run in rivulets down every curve and contour. The heat seeps into your muscles, making you feel languid and aroused. With total privacy surrounding you, your thoughts drift to pleasure...</p> <<if _hasBreasts>> <<if _isSmallBreasts>> <p>The water flows over your small, pert breasts, the stream making your sensitive nipples harden instantly. You cup them gently, feeling how perfectly they fit in your palms. Your thumbs circle your nipples, sending little sparks of pleasure down your spine. Each drop of water that hits your chest feels magnified, a thousand tiny caresses against your delicate flesh.</p> <<elseif _isMediumBreasts>> <p>Hot water streams over your shapely breasts, running around and between them in tantalizing paths. You cup their soft weight in your hands, feeling them fill your palms beautifully. Your nipples stiffen under the water's assault as you roll them between your fingers, a soft moan escaping your lips. The sensation sends pulses of warmth straight to your core.</p> <<elseif _isLargeBreasts>> <p>The water cascades over your large, heavy breasts, streaming around their generous curves and dripping from your hardened nipples. You lift them with both hands, marveling at their substantial weight as the water flows between your fingers. When you squeeze them together, the sensation makes you gasp. Your nipples are achingly sensitive now, and you pinch them gently, then harder, feeling the pleasure-pain radiate through your chest.</p> <<elseif _isHugeBreasts>> <p>Hot water pours over your huge breasts, struggling to flow around their impressive mass. They hang heavy and full on your chest, the water streaming off in waterfalls from your swollen nipples. You grip them firmly, feeling the soft flesh spill between your fingers. Each squeeze sends waves of pleasure through you - they're so sensitive, so responsive. You lift one to your mouth, licking the water from your own nipple, sucking on the hardened bud while your free hand continues to massage the other.</p> <<elseif _isMassiveBreasts>> <p>The water cascades over your massive breasts like a river dividing around boulders. Their extraordinary weight pulls at your chest, the warm water doing little to lighten them. You struggle to lift them, both hands barely containing a single breast as water streams off in sheets. Your nipples are so thick and hard now they ache with need. Every touch sends lightning bolts of pleasure through your body. You press them together, bury your face between them, losing yourself in their incredible softness while the hot water pounds against your back.</p> <</if>> <</if>> <<if _hasPenis>> <<if _isSmallPenis>> <p>Despite the heat, you feel yourself stiffening with arousal. You look down at your compact member, fully erect now, bobbing slightly under the spray. You wrap your fingers around it, your hand easily enclosing its modest length. The soap provides perfect lubrication as you begin to stroke with a tight grip, working your entire shaft with quick, focused motions. What you lack in size, you make up for in sensitivity - every nerve ending fires with pleasure as your pace quickens.</p> <p>The water hammers against your back as you brace yourself against the tile with one hand. Your other hand works faster now, tight strokes from base to tip. The heat builds rapidly in your core, your balls tightening. With a grunt, you feel the pressure peak - your cock pulses in your grip as you climax, your release mixing with the water and swirling down the drain. Your legs tremble from the intensity.</p> <<elseif _isAveragePenis>> <p>The warm water teases your cock to attention, blood rushing south as you feel yourself growing harder. You wrap your soapy fist around your shaft, feeling its satisfying heft in your palm. You begin to stroke with long, deliberate movements, savoring the slick sensation of soap and water as your foreskin glides over the swollen head. Your thumb swirls over the tip each time you reach the top, sending shivers up your spine.</p> <p>Steam swirls around you as you pick up the pace, your hand making wet slapping sounds against your thighs. You imagine a lover on their knees before you, mouth open, eager. Your breathing grows ragged. The pressure builds until you can't hold back anymore - your cock throbs powerfully as ropes of cum spray against the shower wall, immediately washed away by the cascading water. You slump against the tile, spent and satisfied.</p> <<elseif _isBigPenis>> <p>Your substantial cock responds eagerly to the warm water, thickening and lengthening until it stands proud from your body, heavy with arousal. You grip it with both hands - the thick shaft fills your fingers completely. The veins pulse visibly beneath the skin as you begin to stroke, the soap creating obscene sounds that echo off the tile walls. Your impressive length requires full-arm movements to pleasure properly.</p> <p>The head swells until it's an angry purple, hypersensitive as water streams over it. You work your shaft with determined focus, one hand twisting around the head while the other pumps the thick base. Pre-cum leaks freely, mixing with water and soap. When your orgasm hits, it hits HARD - your cock erupts like a geyser, thick streams of cum painting the shower wall as wave after wave of pleasure crashes through you. Your knees nearly buckle as you ride out the intense release.</p> <<elseif _isHugePenis>> <p>Even soft, your cock is impressive, but as arousal floods through you, it swells to its full, intimidating size. The weight of it is substantial as it rises, pointing outward like a weapon. You grip it with both hands and there's still shaft visible above and below your fists. The thick veins throb visibly as blood engorges every inch. Stroking something this size is an athletic endeavor - your arms work hard as you pump your massive member with long, powerful strokes.</p> <p>The head is so swollen it looks almost angry, pre-cum drooling from the tip in long, sticky strands. Your balls churn heavy between your thighs. The pleasure builds inexorably, your huge cock throbbing in your grip. When you finally cum, it's like an explosion - your cock bucks violently as massive ropes of thick cum blast across the shower, hitting the far wall with audible splats. You cry out, overwhelmed by the intensity as your enormous member continues to pulse and spurt, emptying what feels like an ocean of seed down the drain.</p> <<elseif _isGiantPenis>> <p>Your monster cock stirs to life, engorging with blood until it reaches its breathtaking full size. It's so long and thick it borders on the inhuman - a magnificent pillar of flesh that juts from your body with almost aggressive power. Both hands wrapped around it only cover half the shaft. The veins crisscrossing its length are thick as cables, pulsing with your heartbeat. Just holding something this massive feels obscene.</p> <p>You have to lean back against the tile just to support the weight as you begin stroking your colossal member. The water runs down its incredible length in streams. Your arms burn from the effort of pleasuring something so large, but the sensations are overwhelming. Pre-cum pours from the fat head in a continuous stream. When climax finally arrives, it's volcanic - your giant cock convulses as you unleash an almost inhuman amount of cum, jet after jet splattering the shower like a fire hose. You roar with release, your entire body shaking as your enormous member continues pumping out seed for what feels like an eternity. You're left trembling, utterly drained.</p> <</if>> <</if>> <<if _hasVagina>> <p>The hot water flows between your thighs, teasing your most intimate places. You spread your legs slightly, letting the spray caress your sensitive folds. One hand braces against the slick tile wall while the other slides down your wet stomach. Your fingers find your lips, already slick with more than just water. You part them gently, exposing your swollen clit to the warm cascade.</p> <p>A gasp escapes you as your fingertips circle your sensitive nub. The water heightens every sensation, making you feel slippery and electric all at once. You work yourself with practiced expertise, alternating between teasing circles around your clit and dipping inside your eager entrance. Two fingers slide in easily - you're so wet, so ready. You curl them forward, finding that perfect spot that makes your legs shake.</p> <p>Your hips rock against your hand as you build toward release. Steam swirls around you as your moans echo off the tile. The pressure builds and builds until finally it crests - your inner walls clench hard around your fingers as waves of orgasm wash through you. Your knees buckle and you have to grip the safety bar to stay upright as pleasure pulses through your core, spreading outward until even your toes curl against the wet shower floor.</p> <</if>> <<if _hasBoth>> <p>The unique sensation of having both sets of equipment throbs with arousal. You have so many options for pleasure, and you intend to explore them all. One hand wraps around your stiff cock while the other slides between your thighs to your dripping pussy. The dual stimulation is almost overwhelming.</p> <p>You stroke yourself in rhythm while your fingers work your sensitive clit, then plunge inside your wet channel. The pleasure bounces between both sources, amplifying and echoing until you can't tell where one sensation ends and another begins. Your cock throbs in your grip while your inner walls squeeze your fingers. When you cum, you cum EVERYWHERE - your cock spurts against the wall while your pussy clenches in powerful contractions. The dual orgasm leaves you seeing stars, slumped against the tile, completely overwhelmed by the intensity.</p> <</if>> <p>The hot water continues to pour over you as you float in the blissful aftermath, all tension melted away. You feel completely relaxed, satisfied, and squeaky clean.</p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">✓ Feeling satisfied</p> <p style="color: #1e90ff; font-size: 16px; margin: 5px 0 0 0;">✓ Also got clean!</p> </div> <<set $hygiene = Math.min(100, $hygiene + 40)>> <<set $masturbationStats.timesTotal++>> <<run advanceTime(30)>> <div style="text-align: center;"> <<link "<div style='background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; display: inline-block;'>Finish showering</div>">> <<goto `setup.getCurrentBathroom()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <<set _hasBoth = $bodyParts.genitals === "both">> <<set _chestSize = $bodyParts.chest>> <<set _hasBreasts = _chestSize !== "flat" && _chestSize !== "flat masculine">> <<set _buttSize = $bodyParts.butt>> <<set _penisSize = $bodyParts.genitals>> <<set _isSmallPenis = _penisSize === "small penis">> <<set _isAveragePenis = _penisSize === "average penis">> <<set _isBigPenis = _penisSize === "big penis">> <<set _isHugePenis = _penisSize === "huge penis">> <<set _isGiantPenis = _penisSize === "giant penis">> <<set _isSmallBreasts = _chestSize === "small">> <<set _isMediumBreasts = _chestSize === "medium">> <<set _isLargeBreasts = _chestSize === "large">> <<set _isHugeBreasts = _chestSize === "huge">> <<set _isMassiveBreasts = _chestSize === "massive">> <<set _isLargeBass = _buttSize === "large" || _buttSize === "huge" || _buttSize === "giant" || _buttSize === "gigantic">> <<set $lastLocation = "MasturbationBathtub">> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="border: 3px solid #667eea; border-radius: 15px; background: #2a2a2a; padding: 30px; max-width: 700px; margin: 0 auto;"> <h2 style="color: #667eea; text-align: center; margin: 0 0 20px 0;">🛁 Bathtub Bliss</h2> <<masturbationImage "bathtub">> <div style="color: #ccc; font-size: 16px; line-height: 1.8;"> <p>You lower yourself into the steaming bath, sighing with pleasure as the hot water envelops your naked body inch by inch. The porcelain is smooth against your skin as you settle in, letting the warmth seep into your muscles and bones. Fragrant steam rises around you, and the soft glow of candles (or perhaps the bathroom light) casts everything in a flattering, intimate haze. This is your sanctuary, your private retreat - and you intend to make the most of it.</p> <<if _hasBreasts>> <<if _isSmallBreasts>> <p>Your small breasts bob gently at the water's surface, the tips of your hardened nipples breaking through like little pink islands. You cup them, feeling the warm water slosh between your fingers. They fit perfectly in your palms - delicate and sensitive. You pinch your nipples, rolling them between thumb and forefinger, gasping at the electric sensations that shoot straight to your core. The bathwater makes everything slippery, sensual.</p> <<elseif _isMediumBreasts>> <p>Your shapely breasts float beautifully in the bathwater, rising and falling with your breath. The warm water laps at them as you arch your back, making the soft flesh buoyant and tempting. You take one in each hand, squeezing gently, watching the water displaced by their fullness. Your thumbs find your hardened nipples and you circle them slowly, teasingly. The dual sensation of warm water and your own touch makes you moan softly.</p> <<elseif _isLargeBreasts>> <p>Your large breasts break the surface magnificently, their considerable mass creating gentle waves as you move. The water can barely contain them - they float heavily, nipples pointing toward the ceiling like beacons of arousal. You grip them firmly, feeling the soft, pillowy flesh yield to your fingers. Water streams between them as you push them together, creating a deep, tempting cleavage. You lean forward to flick your tongue against your own nipples, tasting the bathwater on your skin.</p> <<elseif _isHugeBreasts>> <p>Your huge breasts dominate the bathwater, their extraordinary buoyancy making them float like flesh-colored balloons. They spread across the surface of the water, barely contained by the tub. Your swollen nipples jut upward, achingly sensitive. You struggle to contain even one in both hands as you massage and squeeze. The water displacement is significant every time you move them. You lift one to your mouth, latching onto your own nipple with hungry lips, suckling while the other breast bobs heavily in the waves you're creating.</p> <<elseif _isMassiveBreasts>> <p>Your massive breasts take up half the bathtub, their unbelievable size making the water level rise visibly as they float. Each one is larger than your head, soft mountains of flesh that seem to have their own gravity. Your nipples are thick and long, impossibly sensitive. Even the water lapping against them makes you shiver. You can barely reach around them to massage their incredible mass. You press your face between them, lost in their warmth and softness while the bathwater swirls around their curves. Every movement of your body makes them shift and bounce, creating waves that splash against the tub's edges.</p> <</if>> <</if>> <<if _isLargeBass>> <p>Your <<print setup.getBodyDescription("butt", _buttSize)>> spreads against the smooth bottom of the tub, providing a plush cushion. You rock your hips experimentally, feeling your generous cheeks shift against the porcelain. The buoyancy of the water makes even your substantial rear feel lighter, almost playful as you squirm in search of pleasure.</p> <</if>> <<if _hasPenis>> <<if _isSmallPenis>> <p>Beneath the warm water, you feel yourself stirring. You look down through the slightly clouded bathwater to see your compact cock at full attention, standing straight up from your body. Your hand encircles it easily, the warm water providing a unique, slippery sensation. You stroke slowly, savoring how different it feels underwater - there's resistance, but also a silky smoothness. Your tight grip works your entire length with each stroke.</p> <p>The water sloshes gently as your arm moves rhythmically beneath the surface. Your head falls back against the tub's edge as pleasure builds. Your balls tighten, and with a deep groan, you erupt beneath the water. You watch through half-lidded eyes as milky clouds bloom in the bathwater, your cock pulsing as you empty yourself completely. The warm water seems to prolong your orgasm, each throb sending new ribbons of cum swirling through the bath.</p> <<elseif _isAveragePenis>> <p>Your cock rises through the warm water like a periscope, breaking the surface slightly as it reaches full hardness. The heat of the bath has made you achingly sensitive. You grip yourself beneath the water, marveling at the unique sensation - your strokes create small currents that swirl around your balls. The water's warmth feels like a lover's embrace as you pump steadily.</p> <p>Water slaps against the sides of the tub as your movements grow more urgent. You imagine being pleasured by invisible hands, the warmth surrounding every inch of your throbbing member. Your breath comes in ragged gasps. When you cum, the sensation is incredible - the warm water seems to milk every drop from you as your cock jerks and spurts. You watch your seed cloud the water, thick ropes dissolving into milky swirls. You float in the aftermath, utterly boneless.</p> <<elseif _isBigPenis>> <p>Your substantial cock displaces water as it rises to full mast, the thick shaft breaching the surface like a sea creature. You grip it with both hands beneath the bathwater - even in this position, your impressive length demands attention. The water resistance makes every stroke feel deliberate, purposeful. Your thick head breaks the surface repeatedly as you pump, creating small splashes.</p> <p>The bathwater sloshes violently now as you work your big cock with increasing urgency. Water splashes over the tub's edges but you don't care - you're lost in sensation. Your heavy balls churn in the warmth. When your climax hits, it's like a dam breaking. Your cock erupts with force, the first jet actually shooting above the water's surface before falling back with a splash. Again and again you pulse, turning the bath cloudy with your copious release. You groan deeply, completely spent.</p> <<elseif _isHugePenis>> <p>Your enormous cock rises from the water like a leviathan, its massive length and girth impossible to ignore. The thick shaft towers over the surface, dripping water, veins pulsing visibly. You grip it with both hands and still have room to spare. Stroking something this large underwater is an experience - the water resistance makes it feel even more substantial. Your arms work to pleasure your monstrous member.</p> <p>Water crashes against the sides of the tub like stormy waves as you pump your huge cock. Your balls are so heavy they sink to the bottom, churning with building pressure. Pre-cum leaks freely into the bath. When you finally explode, it's almost violent - massive jets of thick cum rocket from your engorged head, some shooting clear over the tub's edge. Your hips buck wildly, sending water everywhere. Pulse after powerful pulse empties what feels like a pint of cum into the thoroughly ruined bathwater. You collapse back, seeing stars.</p> <<elseif _isGiantPenis>> <p>Your gigantic cock rises from the bathwater like something out of a fantasy - a pillar of flesh so massive it seems almost impossible. It towers over the tub, water streaming down its incredible length. You can barely wrap your fingers around its breathtaking girth. Stroking it requires your entire arms to move, the muscles burning from the effort. The water churns chaotically around you.</p> <p>The bathroom looks like a storm hit it - water splashes everywhere as you vigorously pump your monster cock. Your inhuman endowment throbs with your heartbeat, thick as your arm and longer than your forearm. When you finally cum, it's apocalyptic. The first blast rockets across the entire bathroom, splattering against the far wall. Subsequent jets flood the tub with an obscene amount of thick seed. Your vision goes white as your entire body convulses with release. The orgasm seems to last forever, your gigantic cock pumping out what seems like gallons. When it finally subsides, you're utterly destroyed, floating in what is now more cum than bathwater.</p> <</if>> <</if>> <<if _hasVagina>> <p>The warm water laps between your thighs like a patient lover. You spread your legs, letting the heat caress your most intimate places. Your fingers drift downward through the water, finding your lips already swollen with arousal. You part them gently, gasping as the warm water rushes against your exposed clit. The sensation is uniquely delicious - wet touching wet, heat meeting heat.</p> <p>You slide two fingers inside yourself, marveling at how the water changes the sensation. You're so slick inside, so ready. Your fingers curl forward to find that perfect spot while your thumb circles your throbbing clit. The bathwater swirls with your movements as your hips begin to rock. One hand grips the tub's edge while the other works you with increasing urgency.</p> <p>Your moans echo off the tile walls as pleasure spirals higher. The water sloshes against the sides of the tub in rhythm with your grinding hips. You add a third finger, stretching yourself deliciously, pumping in and out while your palm grinds against your clit. The pressure builds and builds until you can't take anymore - your inner walls clench like a vise around your fingers as orgasm crashes through you in waves. You cry out, back arching, water splashing everywhere as your entire body quakes with release. The contractions seem to go on forever, milking your fingers as aftershocks ripple through your core.</p> <</if>> <<if _hasBoth>> <p>With both sets of equipment aching for attention, you have the unique pleasure of dual stimulation. One hand wraps around your stiff cock beneath the water while the other slips between your thighs to find your dripping pussy. The sensation of pleasuring both at once is almost too much to handle.</p> <p>You stroke your cock while fingering yourself, the dual sensations bouncing back and forth until you can't tell where one pleasure ends and another begins. The bathwater churns violently as your movements grow frantic. Your cock pulses in your grip while your inner walls squeeze your fingers desperately. When you cum, it's a full-body explosion - your cock spurts thick ropes of cum into the water while your pussy clenches in powerful waves. The dual orgasm is so intense you actually black out for a moment, coming back to yourself floating in the cooling, cum-clouded water, utterly wrecked and blissfully satisfied.</p> <</if>> <p>You float in the now-cooling water, every muscle in your body completely relaxed. A satisfied smile plays across your lips as you soak in the afterglow. Eventually, you'll have to get out and drain this bath... but for now, you simply exist in a state of pure, post-orgasmic bliss.</p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin: 20px 0;"> <p style="color: #ffd700; font-size: 16px; margin: 0;">★ Ultimate relaxation achieved</p> <p style="color: #51cf66; font-size: 16px; margin: 5px 0 0 0;">✓ Feeling blissfully satisfied</p> <p style="color: #667eea; font-size: 16px; margin: 5px 0 0 0;">✓ Squeaky clean</p> </div> <<set $hygiene = Math.min(100, $hygiene + 50)>> <<set $relaxation = Math.min(100, $relaxation + 30)>> <<set $masturbationStats.timesTotal++>> <<run advanceTime(45)>> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: pointer; display: inline-block;'>Reluctantly get out</div>">> <<goto `setup.getCurrentBathroom()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set $lastLocation = "HomeDecorManager">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #667eea; text-align: center;">🏠 Home Decoration Manager</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #5a67d8 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Arrange your purchased decorations and customize your space. </p> </div> <!-- Room-by-Room Decor --> <h3 style="color: #51cf66;">📦 Placed Decorations by Room</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _roomName, _items range $homeDecor[_home]>> <<if _roomName !== "wallColor" && _roomName !== "roomColors" && Array.isArray(_items)>> <div style="border: 3px solid #51cf66; border-radius: 10px; background: #2a2a2a; padding: 20px;"> <h4 style="color: #51cf66; margin: 0 0 15px 0; text-transform: capitalize;"><<print _roomName.replace(/([A-Z])/g, " $1").trim()>></h4> <<if _items.length > 0>> <<for _i, _itemId range _items>> <<set _itemData = setup.getDecorItem(_itemId)>> <<if _itemData>> <div style="background: #1a1a1a; padding: 10px; border-radius: 5px; margin: 5px 0; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #ccc;"><<print _itemData.name>></span> <<capture _i, _roomName>> <<link "<span style='color: #ff6b6b; cursor: pointer;'>Remove</span>">> <<run $homeDecor[_home][_roomName].splice(_i, 1)>> <<goto "HomeDecorManager">> <</link>> <</capture>> </div> <</if>> <</for>> <<else>> <p style="color: #888; margin: 0;">No decorations placed</p> <</if>> </div> <</if>> <</for>> </div> <!-- Paintings Section --> <h3 style="color: #9b59b6; margin-top: 25px;">🖼️ Wall Paintings</h3> <<if $playerPaintings && $playerPaintings.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: #888; font-size: 12px; margin: 0 0 15px 0;">Click a painting to hang it in one of your rooms.</p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px;"> <<for _i, _painting range $playerPaintings>> <<set _hungRoom = setup.roomPaintings.isHung(_painting.id)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid <<if _hungRoom>>#51cf66<<else>>#9b59b6<</if>>; text-align: center;"> <<if _painting.imageData>> <img @src="_painting.imageData" class="painting-thumbnail" alt="Painting"> <<else>> <div style="font-size: 48px; margin-bottom: 10px;">🎨</div> <</if>> <p style="color: #9b59b6; font-weight: bold; margin: 10px 0 5px 0;"><<print _painting.title>></p> <<if _painting.isPreset>> <p style="color: #ffd700; font-size: 10px; margin: 0;">⭐ Preset Artwork</p> <<else>> <p style="color: #666; font-size: 11px; margin: 0;">Day <<print _painting.createdDay>></p> <</if>> <<if _hungRoom>> <p class="painting-hung-badge">🖼️ Hung</p> <</if>> <<capture _painting>> <<link "<button class='painting-select-btn'><<if _hungRoom>>Move / Remove<<else>>Hang in Room<</if>></button>">> <<set $selectedPaintingForHanging = _painting>> <<goto "DecorHangPainting">> <</link>> <</capture>> </div> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: #888; margin: 0;">You don't have any paintings yet. Create some in your Art Studio!</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Return to Home</div>">> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set _rooms = Object.keys($homeDecor[_home].roomColors)>> <<if !$tempSelectedRoom || _rooms.indexOf($tempSelectedRoom) === -1>> <<set $tempSelectedRoom = _rooms[0]>> <</if>> <<set _currentRoomColor = $homeDecor[_home].roomColors[$tempSelectedRoom] || "#2a2a2a">> <<if !$tempSelectedColor>> <<set $tempSelectedColor = _currentRoomColor>> <</if>> <<set $lastLocation = "WallColorPicker">> <<set _selectedRoomDisplay = $tempSelectedRoom.replace(/([A-Z])/g, " $1").trim()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button Top --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Home</div>">> <<unset $tempSelectedRoom>> <<unset $tempSelectedColor>> <<goto `setup.getCurrentHome()`>> <</link>> </div> <!-- Header --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px; text-align: center;"> <h2 style="color: #667eea; margin: 0 0 10px 0;">🎨 Room Painter</h2> <p style="color: #51cf66; font-size: 18px; margin: 0;">💵 Balance: $<<print $money>></p> <p style="color: #ffd700; font-size: 14px; margin: 5px 0 0 0;">Cost: $50 per room</p> </div> <!-- Room Selector --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0;">Select Room to Paint</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _room range _rooms>> <<set _roomColor = $homeDecor[_home].roomColors[_room] || '#2a2a2a'>> <<set _isSelected = $tempSelectedRoom === _room>> <<set _roomDisplay = _room.replace(/([A-Z])/g, " $1").trim()>> <<set _borderColor = _isSelected ? '#667eea' : '#333'>> <<set _textColor = _isSelected ? '#667eea' : '#ccc'>> <<set _fontWeight = _isSelected ? 'bold' : 'normal'>> <<capture _room, _roomDisplay, _isSelected, _roomColor, _borderColor, _textColor, _fontWeight>> <div @style="'background-color: #1a1a1a; padding: 12px 16px; border-radius: 8px; border: 2px solid ' + _borderColor + '; cursor: pointer; display: flex; align-items: center; gap: 10px;'" @data-room-btn="_room"> <div @style="'width: 28px; height: 28px; border-radius: 6px; border: 2px solid #555; background-color: ' + _roomColor + ';'" @data-room-swatch="_room"></div> <span @style="'color: ' + _textColor + '; font-weight: ' + _fontWeight + '; text-transform: capitalize;'"><<print _roomDisplay>></span> </div> <</capture>> <</for>> </div> </div> <!-- Color Picker Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">Choose Color</h3> <div style="display: flex; align-items: flex-end; gap: 20px; flex-wrap: wrap; margin-bottom: 20px;"> <!-- HTML5 Color Picker --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <label style="color: #888; display: block; margin-bottom: 8px; font-size: 12px;">COLOR PICKER</label> <input type="color" id="wall-color-picker" @value="$tempSelectedColor || '#2a2a2a'" style="width: 80px; height: 50px; border: 2px solid #555; cursor: pointer; border-radius: 6px;"> </div> <!-- Hex Input --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <label style="color: #888; display: block; margin-bottom: 8px; font-size: 12px;">HEX CODE</label> <input type="text" id="hex-input" @value="$tempSelectedColor || '#2a2a2a'" maxlength="7" style="width: 100px; padding: 12px; font-size: 16px; background: #2a2a2a; color: #fff; border: 2px solid #555; border-radius: 6px; font-family: monospace;"> </div> <!-- Preview --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <label style="color: #888; display: block; margin-bottom: 8px; font-size: 12px;">PREVIEW</label> <<set _previewColor = $tempSelectedColor || '#2a2a2a'>> <div id="color-preview" @style="'width: 80px; height: 50px; border-radius: 6px; border: 2px solid #555; background-color: ' + _previewColor + ';'"></div> </div> </div> <!-- Apply Button --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #ccc; margin: 0 0 10px 0;">Painting: <span style="color: #667eea; font-weight: bold; text-transform: capitalize;"><<print _selectedRoomDisplay>></span></p> <<if $money >= 50>> <<link "Paint Room - $50">> <<set $money -= 50>> <<set $homeDecor[_home].roomColors[$tempSelectedRoom] = $tempSelectedColor>> <<goto "WallColorPicker">> <</link>> <<else>> <span style="color: #ff6b6b;">Cannot Afford ($50 needed)</span> <</if>> </div> </div> <!-- Saved Colors Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #ffd43b; margin: 0 0 15px 0;">Saved Colors</h3> <<if $savedWallColors.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 15px; margin-bottom: 15px;"> <<for _i, _savedColor range $savedWallColors>> <<capture _i, _savedColor>> <div style="background-color: #1a1a1a; padding: 10px; border-radius: 8px; border: 1px solid #333; display: flex; flex-direction: column; align-items: center; gap: 8px;"> <div @style="'width: 50px; height: 50px; border-radius: 8px; border: 2px solid #555; cursor: pointer; background-color: ' + _savedColor + ';'" @data-saved-color="_savedColor"></div> <span style="color: #888; font-size: 10px; font-family: monospace;"><<print _savedColor>></span> <<link "Remove">> <<set $savedWallColors.splice(_i, 1)>> <<goto "WallColorPicker">> <</link>> </div> <</capture>> <</for>> </div> <<else>> <p style="color: #888; margin: 0 0 15px 0;">No saved colors yet. Save colors you like for quick access!</p> <</if>> <!-- Save Current Color Button --> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; display: inline-block;"> <<if $savedWallColors.indexOf($tempSelectedColor) === -1>> <<link "Save Current Color">> <<set $savedWallColors.push($tempSelectedColor)>> <<goto "WallColorPicker">> <</link>> <<else>> <span style="color: #888;">Color already saved</span> <</if>> </div> </div> <!-- Quick Preset Colors --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">Quick Presets</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _colorName, _colorHex range setup.wallColors>> <<capture _colorName, _colorHex>> <div style="background-color: #1a1a1a; padding: 10px 14px; border-radius: 8px; border: 1px solid #333; cursor: pointer; display: flex; align-items: center; gap: 10px;" @data-preset-btn="_colorHex"> <div @style="'width: 24px; height: 24px; border-radius: 6px; border: 2px solid #555; background-color: ' + _colorHex + ';'" @data-preset-color="_colorHex"></div> <span style="color: #ccc; font-size: 13px;"><<print _colorName>></span> </div> <</capture>> <</for>> </div> </div> <!-- Back Button Bottom --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Home</div>">> <<unset $tempSelectedRoom>> <<unset $tempSelectedColor>> <<goto `setup.getCurrentHome()`>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set $lastLocation = "MallCoralFurnishings">> <div style="background: linear-gradient(135deg, #2a2a2a 0%, #1a3a2a 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">🪴 Coral Furnishings</h1> <div style="padding: 10px; background: #1a1a1a; border-radius: 8px; margin-bottom: 15px; text-align: center;"> <p style="color: #90caf9; font-size: 14px; margin: 0;">Mall Floor 2 - Basic Home Goods</p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #51cf66; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _item range setup.decorItems.basic>> <<set _owned = setup.hasDecorItem(_item.id)>> <<set _canAfford = $money >= _item.price>> <<set _hasCompatibleRoom = _item.room.some(function(r) { return $homeDecor[_home][r] !== undefined; })>> <div style="border: 3px solid <<if _owned>>#ffd700<<elseif _canAfford && _hasCompatibleRoom>>#51cf66<<else>>#666<</if>>; border-radius: 10px; background: #2a2a2a; padding: 20px;"> <h4 style="color: <<if _owned>>#ffd700<<else>>#51cf66<</if>>; margin: 0 0 10px 0;"><<print _item.name>></h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;"><<print _item.desc>></p> <p style="color: <<if _canAfford>>#51cf66<<else>>#ff6b6b<</if>>; font-weight: bold; margin: 0 0 5px 0;">$<<print _item.price>></p> <p style="color: #888; font-size: 12px; margin: 0 0 15px 0;">Fits: <<print _item.room.join(", ")>></p> <<if _owned>> <span style="color: #ffd700;">✓ Owned</span> <<elseif !_hasCompatibleRoom>> <span style="color: #888;">No compatible room</span> <<elseif _canAfford>> <<capture _item>> <<link "<div style='background: #51cf66; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= _item.price>> <<set _targetRoom = _item.room.find(function(r) { return $homeDecor[_home][r] !== undefined; })>> <<run setup.addDecorToRoom(_item.id, _targetRoom)>> <<goto "MallCoralFurnishings">> <</link>> <</capture>> <<else>> <span style="color: #666;">Cannot afford</span> <</if>> </div> <</for>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Mall Floor 2</div>">> <<goto "MallFloor2">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set $lastLocation = "GoldenSeahorseDecor">> <div style="background: linear-gradient(135deg, #2a2a2a 0%, #3a2a1a 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">✨ The Golden Seahorse</h1> <div style="padding: 10px; background: #1a1a1a; border-radius: 8px; margin-bottom: 15px; text-align: center;"> <p style="color: #90caf9; font-size: 14px; margin: 0;">Commercial District - Premium Furniture</p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #51cf66; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <<if _home === "StudioApartment">> <div style="background: #4a3000; border: 2px solid #ffd700; border-radius: 8px; padding: 15px; margin-bottom: 20px;"> <p style="color: #ffd700; margin: 0;">⚠️ Many premium items require a larger home. Consider upgrading from your studio apartment!</p> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _item range setup.decorItems.premium>> <<set _owned = setup.hasDecorItem(_item.id)>> <<set _canAfford = $money >= _item.price>> <<set _hasCompatibleRoom = _item.room.some(function(r) { return $homeDecor[_home][r] !== undefined; })>> <div style="border: 3px solid <<if _owned>>#ffd700<<elseif _canAfford && _hasCompatibleRoom>>#51cf66<<else>>#666<</if>>; border-radius: 10px; background: #2a2a2a; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h4 style="color: #ffd700; margin: 0 0 10px 0;"><<print _item.name>></h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;"><<print _item.desc>></p> <p style="color: <<if _canAfford>>#51cf66<<else>>#ff6b6b<</if>>; font-weight: bold; margin: 0 0 5px 0;">$<<print _item.price>></p> <p style="color: #888; font-size: 12px; margin: 0 0 15px 0;">Fits: <<print _item.room.join(", ")>></p> <<if _owned>> <span style="color: #ffd700;">✓ Owned</span> <<elseif !_hasCompatibleRoom>> <span style="color: #ff6b6b;">Requires larger home</span> <<elseif _canAfford>> <<capture _item>> <<set _purchaseLabel = "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase ($" + _item.price + ")</div>">> <<link _purchaseLabel>> <<set $money -= _item.price>> <<set _targetRoom = _item.room.find(function(r) { return $homeDecor[_home][r] !== undefined; })>> <<run setup.addDecorToRoom(_item.id, _targetRoom)>> <<goto "GoldenSeahorseDecor">> <</link>> <</capture>> <<else>> <span style="color: #666;">Cannot afford</span> <</if>> </div> <</for>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Leave Store</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set $lastLocation = "AquariumGiftShopDecor">> <div style="background: linear-gradient(135deg, #0a1628 0%, #1a3a5c 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Aquarium Gift Shop - Home Decor</h1> <div style="padding: 10px; background: #1a1a1a; border-radius: 8px; margin-bottom: 15px; text-align: center;"> <p style="color: #90caf9; font-size: 14px; margin: 0;">Ocean-themed decor and souvenirs</p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #51cf66; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _item range setup.decorItems.aquarium>> <<set _owned = setup.hasDecorItem(_item.id)>> <<set _canAfford = $money >= _item.price>> <<set _hasCompatibleRoom = _item.room.some(function(r) { return $homeDecor[_home][r] !== undefined; })>> <div style="border: 3px solid <<if _owned>>#ffd700<<elseif _canAfford>>#1e90ff<<else>>#666<</if>>; border-radius: 10px; background: #2a2a2a; padding: 20px;"> <h4 style="color: #1e90ff; margin: 0 0 10px 0;"><<print _item.name>></h4> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;"><<print _item.desc>></p> <p style="color: <<if _canAfford>>#51cf66<<else>>#ff6b6b<</if>>; font-weight: bold; margin: 0 0 5px 0;">$<<print _item.price>></p> <p style="color: #888; font-size: 12px; margin: 0 0 10px 0;">Fits: <<print _item.room.join(", ")>></p> <<if _item.room.includes("aquariumRoom") && _home !== "PlayerModernMansion">> <p style="color: #ffd700; font-size: 12px; margin: 0 0 15px 0;">★ Perfect for mansion aquarium room!</p> <</if>> <<if _owned>> <span style="color: #ffd700;">✓ Owned</span> <<elseif !_hasCompatibleRoom>> <span style="color: #888;">No compatible room in current home</span> <<elseif _canAfford>> <<capture _item>> <<link "<div style='background: #1e90ff; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set $money -= _item.price>> <<set _targetRoom = _item.room.find(function(r) { return $homeDecor[_home][r] !== undefined; })>> <<run setup.addDecorToRoom(_item.id, _targetRoom)>> <<goto "AquariumGiftShopDecor">> <</link>> <</capture>> <<else>> <span style="color: #666;">Cannot afford</span> <</if>> </div> <</for>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if $houseLocation !== "ResidentialMansions">> <p style="color: #ff6b6b;">You don't have access to this location.</p> <<link "Go back">><<goto "previousPassage">><</link>> <<else>> <<set _decor = setup.getDecorForRoom("aquariumRoom")>> <<set _currentLevel = $mansionAquarium.capacityLevel || 1>> <<set _capacityData = setup.aquariumCapacityUpgrades.find(function(u) { return u.level === _currentLevel; })>> <<set _capacity = _capacityData ? _capacityData.capacity : 10>> <<set $lastLocation = "PlayerMansionAquarium">> <div style="background: linear-gradient(180deg, #0a1628 0%, #1a3a5c 50%, #0a1628 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Mansion Aquarium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #0d6efd 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Your personal aquarium stretches across the wall, a mesmerizing window into an underwater world. </p> </div> <!-- Aquarium Stats --> <div style="display: flex; gap: 20px; margin-bottom: 20px; flex-wrap: wrap; justify-content: center;"> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #1e90ff;">🐟 Fish:</span> <span style="color: #51cf66;"><<print $mansionAquarium.fish.length>> / <<print _capacity>></span> </div> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #1e90ff;">🏷️ Tank Level:</span> <span style="color: #ffd700;"><<print _currentLevel>></span> </div> </div> <!-- Fish Tank Display --> <style> .swimming-fish { position: absolute; transition: left 3s ease-in-out, top 2.5s ease-in-out, transform 0.3s ease; cursor: pointer; } .swimming-fish:hover { transform: scale(1.1); } .swimming-fish:hover .fish-tooltip { opacity: 1; visibility: visible; } .fish-tooltip { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0,0,0,0.9); padding: 8px 12px; border-radius: 6px; white-space: nowrap; opacity: 0; visibility: hidden; transition: opacity 0.2s; z-index: 10; pointer-events: none; } .pellet { position: absolute; width: 12px; height: 12px; background: radial-gradient(circle, #8B4513 0%, #654321 100%); border-radius: 50%; z-index: 5; transition: top 2s ease-in; box-shadow: 0 2px 4px rgba(0,0,0,0.4); } </style> <div id="aquarium-tank" style="background: linear-gradient(180deg, #0d47a1 0%, #1565c0 30%, #0d47a1 100%); border-radius: 15px; padding: 30px; min-height: 300px; position: relative; overflow: hidden; margin-bottom: 25px; border: 3px solid #1e90ff;"> <<if $mansionAquarium.fish.length === 0>> <p style="text-align: center; color: #90caf9; padding-top: 100px; font-size: 18px;">The tank is empty. Transfer some fish from your inventory!</p> <<else>> <<set _fishIndex = 0>> <<for _fish range $mansionAquarium.fish>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <<set _startLeft = Math.random() * 75>> <<set _startTop = Math.random() * 60 + 10>> <div class="swimming-fish" style="left: <<print _startLeft>>%; top: <<print _startTop>>%;"> <div class="fish-tooltip"> <span style="color: <<print _rarityColor>>; font-weight: bold;"><<print _fish.name>></span> <br><span style="color: #90caf9; font-size: 11px; text-transform: capitalize;"><<print _fish.rarity>></span> </div> <<if _fish.icon>><img @src="_fish.icon" style="width: 64px; height: 64px; image-rendering: pixelated;" onerror="this.style.display='none'; this.nextElementSibling.style.display='inline';"><span style="display: none; font-size: 48px;">🐟</span><<else>><span style="font-size: 48px;">🐟</span><</if>> </div> <<set _fishIndex++>> <</for>> <</if>> </div> <<if $mansionAquarium.fish.length > 0>> <<run setTimeout(function() { var fish = document.querySelectorAll('.swimming-fish'); function moveFish() { fish.forEach(function(f) { f.style.left = (Math.random() * 75) + '%'; f.style.top = (Math.random() * 60 + 10) + '%'; }); } moveFish(); setInterval(moveFish, 3500); }, 100)>> <</if>> <!-- Actions --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Transfer Fish --> <div style="border: 3px solid #51cf66; border-radius: 10px; background: #2a2a2a; padding: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🐟 Manage Fish</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Add or remove fish from your aquarium.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Manage Fish</div>">> <<goto "AquariumFishTransfer">> <</link>> </div> <!-- Upgrade Capacity --> <div style="border: 3px solid #667eea; border-radius: 10px; background: #2a2a2a; padding: 20px;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">📈 Upgrade Tank</h3> <<set _nextUpgrade = setup.aquariumCapacityUpgrades.find(function(u) { return u.level === _currentLevel + 1; })>> <<if _nextUpgrade>> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;">Expand to <<print _nextUpgrade.capacity>> fish capacity.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 15px 0;">Cost: $<<print _nextUpgrade.cost>></p> <<if $money >= _nextUpgrade.cost>> <<capture _nextUpgrade>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Upgrade ($<<print _nextUpgrade.cost>>)</div>">> <<set $money -= _nextUpgrade.cost>> <<set $mansionAquarium.capacityLevel = _nextUpgrade.level>> <<goto "PlayerMansionAquarium">> <</link>> <</capture>> <<else>> <p style="color: #ff6b6b;">Cannot afford</p> <</if>> <<else>> <p style="color: #ffd700;">Maximum capacity reached!</p> <</if>> </div> </div> <!-- Room Decorations --> <<if _decor.length > 0>> <div style="border: 3px solid #1e90ff; border-radius: 10px; background: #2a2a2a; padding: 20px; margin-bottom: 20px;"> <h4 style="color: #1e90ff; margin: 0 0 10px 0;">Room Decorations:</h4> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _itemId range _decor>> <<set _itemData = setup.getDecorItem(_itemId)>> <<if _itemData>> <span style="background: #1a1a1a; padding: 8px 12px; border-radius: 5px; color: #ccc;"><<print _itemData.name>></span> <</if>> <</for>> </div> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Return to Mansion</div>">> <<goto "PlayerModernMansion">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _currentLevel = $mansionAquarium.capacityLevel || 1>> <<set _capacityData = setup.aquariumCapacityUpgrades.find(function(u) { return u.level === _currentLevel; })>> <<set _capacity = _capacityData ? _capacityData.capacity : 10>> <<set _spotsLeft = _capacity - $mansionAquarium.fish.length>> <<set $lastLocation = "AquariumFishTransfer">> <div style="background: linear-gradient(180deg, #0a1628 0%, #1a3a5c 50%, #0a1628 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐟 Fish Transfer</h1> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #51cf66; font-size: 18px; margin: 0;">Select fish to transfer. <span style="color: #ffd700;"><<print _spotsLeft>> spots remaining.</span></p> </div> <!-- Fish Inventory --> <h3 style="color: #51cf66;">Your Inventory (<<print $fishInventory ? $fishInventory.length : 0>> fish)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 30px;"> <<if $fishInventory && $fishInventory.length > 0>> <<for _i, _fish range $fishInventory>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <div style="border: 3px solid <<print _rarityColor>>; border-radius: 10px; background: #2a2a2a; padding: 15px; text-align: center;"> <div style="font-size: 2em;"><<if _fish.icon>><img @src="_fish.icon" style="width: 64px; height: 64px; image-rendering: pixelated;" onerror="this.style.display='none'; this.nextElementSibling.style.display='inline';"><span style="display: none;">🐟</span><<else>>🐟<</if>></div> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold;"><<print _fish.name>></p> <p style="font-size: 12px; color: #888; text-transform: capitalize; margin: 0 0 10px 0;"><<print _fish.rarity>></p> <p style="font-size: 12px; color: #51cf66; margin: 0 0 10px 0;">Value: $<<print _fish.basePrice>></p> <<if _spotsLeft > 0>> <<capture _i, _fish>> <<link "<div style='background: #51cf66; color: white; padding: 6px; border-radius: 4px; cursor: pointer; font-size: 12px;'>Add to Tank</div>">> <<run $mansionAquarium.fish.push(clone(_fish))>> <<run $fishInventory.splice(_i, 1)>> <<goto "AquariumFishTransfer">> <</link>> <</capture>> <<else>> <span style="color: #ff6b6b; font-size: 12px;">Tank full</span> <</if>> </div> <</for>> <<else>> <p style="color: #888;">No fish in your inventory.</p> <</if>> </div> <!-- Fish in Tank --> <h3 style="color: #1e90ff;">Fish in Aquarium (<<print $mansionAquarium.fish.length>>/<<print _capacity>>)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 30px;"> <<if $mansionAquarium.fish.length > 0>> <<for _i, _fish range $mansionAquarium.fish>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <div style="border: 3px solid <<print _rarityColor>>; border-radius: 10px; background: #1a3a5c; padding: 15px; text-align: center;"> <div style="font-size: 2em;"><<if _fish.icon>><img @src="_fish.icon" style="width: 64px; height: 64px; image-rendering: pixelated;" onerror="this.style.display='none'; this.nextElementSibling.style.display='inline';"><span style="display: none;">🐟</span><<else>>🐟<</if>></div> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold;"><<print _fish.name>></p> <p style="font-size: 12px; color: #90caf9; text-transform: capitalize; margin: 0 0 10px 0;"><<print _fish.rarity>></p> <<capture _i, _fish>> <<link "<div style='background: #ff6b6b; color: white; padding: 6px; border-radius: 4px; cursor: pointer; font-size: 12px;'>Remove</div>">> <<run $fishInventory.push(clone(_fish))>> <<run $mansionAquarium.fish.splice(_i, 1)>> <<goto "AquariumFishTransfer">> <</link>> <</capture>> </div> <</for>> <<else>> <p style="color: #888;">No fish in aquarium yet.</p> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>Done</div>">> <<goto "PlayerMansionAquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StudioBedroom">> <<set _home = "StudioApartment">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("StudioBedroom")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #667eea; text-align: center;">🛏️ Your Bedroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #5a6fd6 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Your cozy studio bedroom. The fold-out bed takes up most of the space, but it's home. </p> </div> <!-- Decor Display --> <<if $homeDecor[_home].bedroom && $homeDecor[_home].bedroom.length > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Room Decorations</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _decor range $homeDecor[_home].bedroom>> <span style="background: #3a3a3a; padding: 5px 10px; border-radius: 5px; font-size: 14px;"><<print _decor.icon>> <<print _decor.name>></span> <</for>> </div> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Sleep Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">😴 Sleep</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Rest and recover your energy.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Go to Sleep</div>">> <<popover "rest-popover">> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; max-width: 350px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">How long do you want to sleep?</h3> <div style="text-align: center; margin-bottom: 15px;"> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 80px; padding: 10px; font-size: 18px; text-align: center; border-radius: 5px; border: 2px solid #51cf66; background: #1a1a1a; color: white;"> <span style="color: #ccc; margin-left: 10px;">hours</span> </div> <p style="color: #888; font-size: 12px; text-align: center; margin-bottom: 15px;">Sleep 6+ hours to remove exhaustion. Sleep 8+ hours for the Well Rested buff.</p> <div style="margin-top: 20px; text-align: center;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<if _restHours >= 8>> <<run setup.achievements.unlock("full_rest")>> <</if>> <<run advanceTime(_restHours * 60)>> <<set $appearance.hairStyle = "messy">> <<set $lastSleepTime = setup.getTotalGameMinutes()>> <<if _restHours >= 6>> <<run setup.removeDebuff("exhaustion")>> <</if>> <<if _restHours >= 8 && !setup.hasSleepImmunity()>> <<run setup.addBuff("well_rested", 480)>> <</if>> <<run Dialog.close()>> <<goto "StudioBedroom">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Masturbate Option --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">💋 Masturbate</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Enjoy some personal relaxation.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Masturbate</div>">> <<goto "MasturbationBedroom">> <</link>> </div> <!-- Sex Toys Section --> <<if $ownsDildo || $ownsFleshlight>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">🎁 Sex Toys</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Use your toys for enhanced pleasure.</p> <<if $ownsDildo && _hasVagina>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Use Dildo</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.dildo++>> <<set _toyUsed = "dildo">> <<goto "MasturbationVaginaScene">> <</link>> <</if>> <<if $ownsFleshlight && _hasPenis>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use Fleshlight</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.fleshlight++>> <<set _toyUsed = "fleshlight">> <<goto "MasturbationPenisScene">> <</link>> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Apartment</div>">> <<goto "StudioApartment">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PlayerSuburbanBedroom">> <<set _home = "PlayerSuburbanHome">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerSuburbanBedroom")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #667eea; text-align: center;">🛏️ Master Bedroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #5a6fd6 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A comfortable suburban bedroom with a queen-sized bed and plenty of natural light from the window. </p> </div> <!-- Decor Display --> <<if $homeDecor[_home].bedroom && $homeDecor[_home].bedroom.length > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Room Decorations</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _decor range $homeDecor[_home].bedroom>> <span style="background: #3a3a3a; padding: 5px 10px; border-radius: 5px; font-size: 14px;"><<print _decor.icon>> <<print _decor.name>></span> <</for>> </div> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Sleep Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">😴 Sleep</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Rest in your comfortable bed.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Go to Sleep</div>">> <<popover "rest-popover">> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; max-width: 350px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">How long do you want to sleep?</h3> <div style="text-align: center; margin-bottom: 15px;"> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 80px; padding: 10px; font-size: 18px; text-align: center; border-radius: 5px; border: 2px solid #51cf66; background: #1a1a1a; color: white;"> <span style="color: #ccc; margin-left: 10px;">hours</span> </div> <p style="color: #888; font-size: 12px; text-align: center; margin-bottom: 15px;">Sleep 6+ hours to remove exhaustion. Sleep 8+ hours for the Well Rested buff.</p> <div style="margin-top: 20px; text-align: center;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<if _restHours >= 8>> <<run setup.achievements.unlock("full_rest")>> <</if>> <<run advanceTime(_restHours * 60)>> <<set $appearance.hairStyle = "messy">> <<set $lastSleepTime = setup.getTotalGameMinutes()>> <<if _restHours >= 6>> <<run setup.removeDebuff("exhaustion")>> <</if>> <<if _restHours >= 8 && !setup.hasSleepImmunity()>> <<run setup.addBuff("well_rested", 480)>> <</if>> <<run Dialog.close()>> <<goto "PlayerSuburbanBedroom">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Masturbate Option --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">💋 Masturbate</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Enjoy some personal relaxation.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Masturbate</div>">> <<goto "MasturbationBedroom">> <</link>> </div> <!-- Sex Toys Section --> <<if $ownsDildo || $ownsFleshlight>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">🎁 Sex Toys</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Use your toys for enhanced pleasure.</p> <<if $ownsDildo && _hasVagina>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Use Dildo</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.dildo++>> <<set _toyUsed = "dildo">> <<goto "MasturbationVaginaScene">> <</link>> <</if>> <<if $ownsFleshlight && _hasPenis>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use Fleshlight</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.fleshlight++>> <<set _toyUsed = "fleshlight">> <<goto "MasturbationPenisScene">> <</link>> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Living Room</div>">> <<goto "PlayerSuburbanHome">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PlayerExpensiveBedroom">> <<set _home = "PlayerExpensiveHome">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerExpensiveBedroom")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #ffd700; text-align: center;">🛏️ Luxury Master Suite</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: #1a1a1a; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> An elegant master suite with a king-sized bed, walk-in closet, and stunning city views. </p> </div> <!-- Decor Display --> <<if $homeDecor[_home].bedroom && $homeDecor[_home].bedroom.length > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Room Decorations</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _decor range $homeDecor[_home].bedroom>> <span style="background: #3a3a3a; padding: 5px 10px; border-radius: 5px; font-size: 14px;"><<print _decor.icon>> <<print _decor.name>></span> <</for>> </div> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Sleep Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">😴 Sleep</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Rest in your luxurious king bed.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Go to Sleep</div>">> <<popover "rest-popover">> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; max-width: 350px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">How long do you want to sleep?</h3> <div style="text-align: center; margin-bottom: 15px;"> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 80px; padding: 10px; font-size: 18px; text-align: center; border-radius: 5px; border: 2px solid #51cf66; background: #1a1a1a; color: white;"> <span style="color: #ccc; margin-left: 10px;">hours</span> </div> <p style="color: #888; font-size: 12px; text-align: center; margin-bottom: 15px;">Sleep 6+ hours to remove exhaustion. Sleep 8+ hours for the Well Rested buff.</p> <div style="margin-top: 20px; text-align: center;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<if _restHours >= 8>> <<run setup.achievements.unlock("full_rest")>> <</if>> <<run advanceTime(_restHours * 60)>> <<set $appearance.hairStyle = "messy">> <<set $lastSleepTime = setup.getTotalGameMinutes()>> <<if _restHours >= 6>> <<run setup.removeDebuff("exhaustion")>> <</if>> <<if _restHours >= 8 && !setup.hasSleepImmunity()>> <<run setup.addBuff("well_rested", 480)>> <</if>> <<run Dialog.close()>> <<goto "PlayerExpensiveBedroom">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Masturbate Option --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">💋 Masturbate</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Enjoy some personal relaxation.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Masturbate</div>">> <<goto "MasturbationBedroom">> <</link>> </div> <!-- Sex Toys Section --> <<if $ownsDildo || $ownsFleshlight>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">🎁 Sex Toys</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Use your toys for enhanced pleasure.</p> <<if $ownsDildo && _hasVagina>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Use Dildo</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.dildo++>> <<set _toyUsed = "dildo">> <<goto "MasturbationVaginaScene">> <</link>> <</if>> <<if $ownsFleshlight && _hasPenis>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use Fleshlight</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.fleshlight++>> <<set _toyUsed = "fleshlight">> <<goto "MasturbationPenisScene">> <</link>> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Living Room</div>">> <<run advanceTime(1)>> <<goto "PlayerExpensiveHome">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PlayerMansionBedroom">> <<set _home = "PlayerModernMansion">> <<set _wallColor = $homeDecor[_home].wallColor || "#2a2a2a">> <<set _hasPenis = $bodyParts.genitals && $bodyParts.genitals.includes("penis")>> <<set _hasVagina = $bodyParts.genitals && ($bodyParts.genitals.includes("vagina") || $bodyParts.genitals === "both")>> <div id="home-wall-color" style="background: <<print _wallColor>>; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42, 42, 42, 0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("PlayerMansionBedroom")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #9D00FF; text-align: center;">🛏️ Grand Master Suite</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9D00FF 0%, #7B00CC 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9D00FF;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> The palatial master suite features a California king bed, automated blinds, and a private balcony overlooking the estate. </p> </div> <!-- Decor Display --> <<if $homeDecor[_home].masterBedroom && $homeDecor[_home].masterBedroom.length > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Room Decorations</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _decor range $homeDecor[_home].masterBedroom>> <span style="background: #3a3a3a; padding: 5px 10px; border-radius: 5px; font-size: 14px;"><<print _decor.icon>> <<print _decor.name>></span> <</for>> </div> </div> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Sleep Option --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">😴 Sleep</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Rest in absolute luxury.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Go to Sleep</div>">> <<popover "rest-popover">> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; max-width: 350px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">How long do you want to sleep?</h3> <div style="text-align: center; margin-bottom: 15px;"> <input type="number" id="rest-time-input" min="1" max="12" value="8" style="width: 80px; padding: 10px; font-size: 18px; text-align: center; border-radius: 5px; border: 2px solid #51cf66; background: #1a1a1a; color: white;"> <span style="color: #ccc; margin-left: 10px;">hours</span> </div> <p style="color: #888; font-size: 12px; text-align: center; margin-bottom: 15px;">Sleep 6+ hours to remove exhaustion. Sleep 8+ hours for the Well Rested buff.</p> <div style="margin-top: 20px; text-align: center;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; margin-right: 10px;'>Confirm</div>">> <<set _restHours = Number(jQuery("#rest-time-input").val())>> <<if _restHours < 1 || _restHours > 12 || Number.isNaN(_restHours)>> <<set _restHours = 8>> <</if>> <<if _restHours >= 8>> <<run setup.achievements.unlock("full_rest")>> <</if>> <<run advanceTime(_restHours * 60)>> <<set $appearance.hairStyle = "messy">> <<set $lastSleepTime = setup.getTotalGameMinutes()>> <<if _restHours >= 6>> <<run setup.removeDebuff("exhaustion")>> <</if>> <<if _restHours >= 8 && !setup.hasSleepImmunity()>> <<run setup.addBuff("well_rested", 480)>> <</if>> <<run Dialog.close()>> <<goto "PlayerMansionBedroom">> <</link>> <<link "<div style='display: inline-block; background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Masturbate Option --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">💋 Masturbate</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Enjoy some personal relaxation.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Masturbate</div>">> <<goto "MasturbationBedroom">> <</link>> </div> <!-- Sex Toys Section --> <<if $ownsDildo || $ownsFleshlight>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">🎁 Sex Toys</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Use your toys for enhanced pleasure.</p> <<if $ownsDildo && _hasVagina>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-bottom: 10px;'>Use Dildo</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.dildo++>> <<set _toyUsed = "dildo">> <<goto "MasturbationVaginaScene">> <</link>> <</if>> <<if $ownsFleshlight && _hasPenis>> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f0c000 100%); color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Use Fleshlight</div>">> <<set $masturbationStats.timesTotal++>> <<set $masturbationStats.toysUsed.fleshlight++>> <<set _toyUsed = "fleshlight">> <<goto "MasturbationPenisScene">> <</link>> <</if>> </div> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Great Hall</div>">> <<run advanceTime(1)>> <<goto "PlayerModernMansion">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "MirrorView">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #f39c12; text-align: center;">🪞 Looking in the Mirror</h1> <div style="padding: 20px; background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #f39c12;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> You gaze at your reflection... </p> </div> <!-- Description Box --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<set _genderWord = "">> <<set _pronounNoun = "">> <<if $bodyParts.gender === "female">> <<set _genderWord = "feminine">> <<set _pronounNoun = "woman">> <<elseif $bodyParts.gender === "male">> <<set _genderWord = "masculine">> <<set _pronounNoun = "man">> <<else>> <<set _genderWord = "androgynous">> <<set _pronounNoun = "person">> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You look and see a <<print _genderWord>> <<print _pronounNoun>> staring back at you in the mirror. <<if $appearance.age === "Mature Adult">> Your face shows the marks of experience, mature and distinguished. <<else>> Your youthful features are still unburdened by the weight of years. <</if>> Your <<print $appearance.skinTone>> skin <<if $appearance.skinTone === "pale">>has a porcelain quality<<elseif $appearance.skinTone === "tan">>has a warm, sun-kissed glow<<elseif $appearance.skinTone === "dark">>has a rich, deep tone<<else>>looks healthy<</if>>, and your <<print $appearance.hairLength>> <<print $appearance.hairColor.toLowerCase()>> hair <<if $appearance.hairStyle === "messy">>falls in an untamed cascade<<else>>is neatly styled<</if>>. </p> <<set _chestDescription = "">> <<if $bodyParts.chest === "flat masculine">> <<set _chestDescription = "Your chest is flat and masculine, with defined pectorals.">> <<elseif $bodyParts.chest === "flat">> <<set _chestDescription = "Your chest is flat, with only the slightest hint of femininity.">> <<elseif $bodyParts.chest === "small">> <<set _chestDescription = "You have small, perky breasts that sit high on your chest.">> <<elseif $bodyParts.chest === "medium">> <<set _chestDescription = "You have medium-sized breasts with a pleasant, natural shape.">> <<elseif $bodyParts.chest === "large">> <<set _chestDescription = "Your large breasts are impossible to ignore, straining against any top you wear.">> <<elseif $bodyParts.chest === "huge">> <<set _chestDescription = "Your huge breasts are gravity-defying, drawing eyes wherever you go.">> <<elseif $bodyParts.chest === "giant">> <<set _chestDescription = "Your giant breasts are almost absurdly large, dominating your silhouette.">> <<elseif $bodyParts.chest === "gigantic">> <<set _chestDescription = "Your gigantic breasts are beyond belief, each one larger than your head.">> <<else>> <<set _chestDescription = "You examine your chest in the mirror.">> <</if>> <<set _buttDescription = "">> <<if $bodyParts.butt === "flat">> <<set _buttDescription = "Your backside is flat and unremarkable.">> <<elseif $bodyParts.butt === "small">> <<set _buttDescription = "You have a small, tight rear.">> <<elseif $bodyParts.butt === "medium">> <<set _buttDescription = "Your butt has a nice, rounded shape.">> <<elseif $bodyParts.butt === "large">> <<set _buttDescription = "Your large butt curves outward noticeably, filling out any pants you wear.">> <<elseif $bodyParts.butt === "huge">> <<set _buttDescription = "Your huge butt jiggles with every step, impossible to hide.">> <<elseif $bodyParts.butt === "giant">> <<set _buttDescription = "Your giant butt is almost comically large, a shelf you could balance things on.">> <<elseif $bodyParts.butt === "gigantic">> <<set _buttDescription = "Your gigantic butt is truly massive, each cheek bigger than a watermelon.">> <<else>> <<set _buttDescription = "You turn to examine your backside.">> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<print _chestDescription>> <<print _buttDescription>> </p> <<set _genitalsDescription = "">> <<if $bodyParts.genitals === "vagina">> <<set _genitalsDescription = "Between your legs, you have female anatomy.">> <<elseif $bodyParts.genitals === "penis">> <<set _genitalsDescription = "Between your legs, you have male anatomy.">> <<elseif $bodyParts.genitals === "both">> <<set _genitalsDescription = "Between your legs, you have both male and female anatomy.">> <</if>> <<if _genitalsDescription !== "">> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<print _genitalsDescription>> </p> <</if>> <!-- Physical Traits Summary --> <<if $physicalTraits && $physicalTraits.length > 0>> <<set _physTraitDisplay = $physicalTraits.filter(function(t) { return t !== "Short Hair" && t !== "Long Hair"; })>> <<if _physTraitDisplay.length > 0>> <p style="color: #aaa; font-size: 14px; line-height: 1.6; margin: 0; font-style: italic;"> Your body could be described as: <<print _physTraitDisplay.join(", ").toLowerCase()>>. </p> <</if>> <</if>> </div> <!-- Image Display Section --> <h2 style="color: #f39c12; text-align: center;">Your Reflection</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Face Image --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #667eea; margin: 0 0 10px 0; text-align: center;">Your Face</h3> <<set _faceImage = setup.getPlayerFaceImage()>> <div style="text-align: center;"> <img @src="_faceImage" style="max-width: 100%; height: auto; border-radius: 8px;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #1a1a1a; border-radius: 8px; color: #999; font-style: italic;"> Image not found </div> </div> </div> <!-- Chest Image --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0; text-align: center;">Your Chest</h3> <<set _chestImage = setup.getPlayerChestImage()>> <div style="text-align: center;"> <img @src="_chestImage" style="max-width: 100%; height: auto; border-radius: 8px;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #1a1a1a; border-radius: 8px; color: #999; font-style: italic;"> Image not found </div> </div> </div> </div> <!-- Additional Info Box --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 15px 0;">Additional Details</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Skin Tone:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.skinTone>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Color:</p> <p style="color: #fff; margin: 0; font-size: 16px;"><<print $appearance.hairColor>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Style:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.hairStyle>></p> </div> <div> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Hair Length:</p> <p style="color: #fff; margin: 0; font-size: 16px; text-transform: capitalize;"><<print $appearance.hairLength>></p> </div> </div> </div> <!-- Internal Monologue Section - Varies by Personality Traits --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">Inner Thoughts</h3> <div style="color: #ccc; font-size: 15px; line-height: 1.8; font-style: italic;"> <<if $mentalTraits && $mentalTraits.length > 0>> <!-- Confident thoughts --> <<if $mentalTraits.includes("Confident") || $mentalTraits.includes("Arrogant")>> <p style="margin: 0 0 10px 0;">"Looking good, as always. I know exactly who I am and what I'm worth."</p> <</if>> <!-- Shy/Insecure thoughts --> <<if $mentalTraits.includes("Shy") || $mentalTraits.includes("Insecure")>> <p style="margin: 0 0 10px 0;">"I wonder what people think when they look at me... Do they notice me at all?"</p> <</if>> <!-- Dominant thoughts --> <<if $mentalTraits.includes("Dominant")>> <p style="margin: 0 0 10px 0;">"This is the face of someone in control. People follow my lead, and they should."</p> <</if>> <!-- Submissive thoughts --> <<if $mentalTraits.includes("Submissive")>> <p style="margin: 0 0 10px 0;">"I hope I can make someone happy today... I just want to be useful."</p> <</if>> <!-- Intelligent/Analytical thoughts --> <<if $mentalTraits.includes("Intelligent") || $mentalTraits.includes("Analytical")>> <p style="margin: 0 0 10px 0;">"Fascinating how light reflects off my features at this angle. The physics of perception..."</p> <</if>> <!-- Optimistic thoughts --> <<if $mentalTraits.includes("Optimistic")>> <p style="margin: 0 0 10px 0;">"Today is going to be amazing! I can feel it. So many possibilities ahead!"</p> <</if>> <!-- Pessimistic thoughts --> <<if $mentalTraits.includes("Pessimistic") || $mentalTraits.includes("Cynical")>> <p style="margin: 0 0 10px 0;">"Another day, another disappointment waiting to happen. Let's see what goes wrong this time."</p> <</if>> <!-- Flirty/Seductive thoughts --> <<if $mentalTraits.includes("Flirty") || $mentalTraits.includes("Seductive") || $mentalTraits.includes("Alluring")>> <p style="margin: 0 0 10px 0;">"Mmm, looking delicious today. I wonder who I'll catch staring at me..."</p> <</if>> <!-- Kind/Empathetic thoughts --> <<if $mentalTraits.includes("Kind") || $mentalTraits.includes("Empathetic") || $mentalTraits.includes("Warm")>> <p style="margin: 0 0 10px 0;">"I hope everyone I meet today is doing okay. Maybe I can brighten someone's day."</p> <</if>> <!-- Bitchy/Cruel thoughts --> <<if $mentalTraits.includes("Bitchy") || $mentalTraits.includes("Cruel")>> <p style="margin: 0 0 10px 0;">"Better than most of the trash walking around this city. Not that that's saying much."</p> <</if>> <!-- Lazy thoughts --> <<if $mentalTraits.includes("Lazy")>> <p style="margin: 0 0 10px 0;">"Ugh, do I really have to do anything today? Looking at myself is exhausting enough."</p> <</if>> <!-- Hardworking/Ambitious thoughts --> <<if $mentalTraits.includes("Hardworking") || $mentalTraits.includes("Ambitious")>> <p style="margin: 0 0 10px 0;">"No time to waste. I've got goals to achieve and nobody's going to hand them to me."</p> <</if>> <!-- Paranoid thoughts --> <<if $mentalTraits.includes("Paranoid")>> <p style="margin: 0 0 10px 0;">"Is someone watching me? I swear I heard something... Stay alert."</p> <</if>> <!-- Creative/Artistic thoughts --> <<if $mentalTraits.includes("Creative") || $mentalTraits.includes("Artistic")>> <p style="margin: 0 0 10px 0;">"The interplay of shadow and light... I could make something beautiful of this moment."</p> <</if>> <!-- Brave thoughts --> <<if $mentalTraits.includes("Brave")>> <p style="margin: 0 0 10px 0;">"Whatever comes my way today, I'll face it head-on. Nothing can stop me."</p> <</if>> <!-- Cowardly thoughts --> <<if $mentalTraits.includes("Cowardly")>> <p style="margin: 0 0 10px 0;">"I hope nothing scary happens today... Maybe I should just stay inside."</p> <</if>> <!-- Awkward thoughts --> <<if $mentalTraits.includes("Awkward")>> <p style="margin: 0 0 10px 0;">"Why did I make that face? What do I do with my hands? Being me is so weird sometimes."</p> <</if>> <!-- Nerd thoughts --> <<if $mentalTraits.includes("Nerd") || $mentalTraits.includes("Bookworm")>> <p style="margin: 0 0 10px 0;">"I wonder if I have time to read another chapter today... or maybe finish that research."</p> <</if>> <!-- Energetic thoughts --> <<if $mentalTraits.includes("Energetic") || $mentalTraits.includes("High Energy")>> <p style="margin: 0 0 10px 0;">"Let's GO! I'm ready to take on the world! Where's my first adventure?!"</p> <</if>> <!-- Calm/Chill thoughts --> <<if $mentalTraits.includes("Calm") || $mentalTraits.includes("Chill") || $mentalTraits.includes("Relaxed")>> <p style="margin: 0 0 10px 0;">"...Yeah. This is fine. Everything's fine. No rush."</p> <</if>> <!-- Impulsive/Reckless thoughts --> <<if $mentalTraits.includes("Impulsive") || $mentalTraits.includes("Reckless")>> <p style="margin: 0 0 10px 0;">"Screw planning! Let's just do something crazy and see what happens!"</p> <</if>> <!-- Deep Thinker thoughts --> <<if $mentalTraits.includes("Deep Thinker") || $mentalTraits.includes("Overthinker")>> <p style="margin: 0 0 10px 0;">"Who am I really? Is this reflection the true me, or just what I show the world?"</p> <</if>> <!-- Sarcastic thoughts --> <<if $mentalTraits.includes("Sarcastic")>> <p style="margin: 0 0 10px 0;">"Oh great, it's me. What a thrilling discovery. Never saw that coming."</p> <</if>> <!-- Moody thoughts --> <<if $mentalTraits.includes("Moody")>> <p style="margin: 0 0 10px 0;">"I don't know how I feel right now. Happy? Sad? Angry? All of them? None?"</p> <</if>> <!-- Lucky thoughts --> <<if $mentalTraits.includes("Lucky")>> <p style="margin: 0 0 10px 0;">"I've got a good feeling about today. Things always seem to work out for me."</p> <</if>> <!-- Unlucky thoughts --> <<if $mentalTraits.includes("Unlucky")>> <p style="margin: 0 0 10px 0;">"Knowing my luck, something terrible is about to happen. It always does."</p> <</if>> <!-- Default if no specific trait matched but has mental traits --> <<set _hasShownThought = $mentalTraits.includes("Confident") || $mentalTraits.includes("Arrogant") || $mentalTraits.includes("Shy") || $mentalTraits.includes("Insecure") || $mentalTraits.includes("Dominant") || $mentalTraits.includes("Submissive") || $mentalTraits.includes("Intelligent") || $mentalTraits.includes("Analytical") || $mentalTraits.includes("Optimistic") || $mentalTraits.includes("Pessimistic") || $mentalTraits.includes("Cynical") || $mentalTraits.includes("Flirty") || $mentalTraits.includes("Seductive") || $mentalTraits.includes("Alluring") || $mentalTraits.includes("Kind") || $mentalTraits.includes("Empathetic") || $mentalTraits.includes("Warm") || $mentalTraits.includes("Bitchy") || $mentalTraits.includes("Cruel") || $mentalTraits.includes("Lazy") || $mentalTraits.includes("Hardworking") || $mentalTraits.includes("Ambitious") || $mentalTraits.includes("Paranoid") || $mentalTraits.includes("Creative") || $mentalTraits.includes("Artistic") || $mentalTraits.includes("Brave") || $mentalTraits.includes("Cowardly") || $mentalTraits.includes("Awkward") || $mentalTraits.includes("Nerd") || $mentalTraits.includes("Bookworm") || $mentalTraits.includes("Energetic") || $mentalTraits.includes("High Energy") || $mentalTraits.includes("Calm") || $mentalTraits.includes("Chill") || $mentalTraits.includes("Relaxed") || $mentalTraits.includes("Impulsive") || $mentalTraits.includes("Reckless") || $mentalTraits.includes("Deep Thinker") || $mentalTraits.includes("Overthinker") || $mentalTraits.includes("Sarcastic") || $mentalTraits.includes("Moody") || $mentalTraits.includes("Lucky") || $mentalTraits.includes("Unlucky")>> <<if !_hasShownThought>> <p style="margin: 0 0 10px 0;">"Hmm, that's me alright. Just... me."</p> <</if>> <<else>> <p style="margin: 0;">"Hmm, that's me alright. Just... me."</p> <</if>> </div> </div> <!-- Hair Styling Option (if player has Hair Styling skill) --> <<if $skills && $skills.includes("Hair Styling")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-top: 25px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 15px 0;">💇 Style Your Hair</h3> <<if $appearance.hairStyle === "messy">> <p style="color: #aaa; margin-bottom: 15px;">Your hair is currently messy. With your Hair Styling skill, you can style it yourself!</p> <<link "<div style='background: #e91e63; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>💇 Style Your Hair (10 min)</div>">> <<run advanceTime(10)>> <<set $appearance.hairStyle = "styled">> <<goto "MirrorView">> <</link>> <<else>> <p style="color: #51cf66; margin: 0;">✓ Your hair is already styled and looks great!</p> <</if>> </div> <<elseif $appearance.hairStyle === "messy">> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-top: 25px; border: 2px solid #666;"> <p style="color: #888; margin: 0; font-style: italic;">Your hair is messy. Learn the Hair Styling skill or visit a salon to style it.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<if $mirrorReturnLocation === "PlayerMansionBathroom">> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Bathroom</div>">> <<goto "PlayerMansionBathroom">> <</link>> <<elseif $mirrorReturnLocation === "PlayerExpensiveBathroom">> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Bathroom</div>">> <<goto "PlayerExpensiveBathroom">> <</link>> <<elseif $mirrorReturnLocation === "PlayerSuburbanBathroom">> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Bathroom</div>">> <<goto "PlayerSuburbanBathroom">> <</link>> <<else>> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Bathroom</div>">> <<goto "StudioBathroom">> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center;">😴 Restless Sleep</h1> <div style="padding: 20px; background: linear-gradient(135deg, #434343 0%, #000000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 18px; margin: 0;"> You manage to get some fitful sleep behind the trash bags. The smell is unbearable and every sound makes you jolt awake, but at least you got some rest. Your body aches from the hard ground, but you're safe... for now. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Wake Up</div>">> <<goto "Alleyway">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">😱 Robbed!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0;"> You wake up suddenly to find someone rifling through your pockets! Before you can react, they sprint off into the darkness with half your money! </p> <p style="color: white; font-size: 16px; margin: 0; font-weight: bold;"> You lost half your money! </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; font-size: 15px; margin: 0; text-align: center;"> You curse yourself for sleeping in such a dangerous place. The streets are ruthless to those who let their guard down. </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Get Up</div>">> <<goto "Alleyway">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Aquarium")>> <<run $visitedLocations.push("Aquarium")>> <</if>> <<set $lastLocation = "Aquarium">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Sunfish City Aquarium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0;"> The aquarium's grand entrance hall opens into a world of blue. Massive glass tanks stretch from floor to ceiling, filled with... sunfish. Only sunfish. Exclusively sunfish. Every single tank contains ocean sunfish (Mola mola) in various sizes, all drifting lazily and rotating in that vacant way they do. You expected dolphins, sharks, tropical fish, coral reefs... but no. Just hundreds upon hundreds of sunfish. The plaques on each tank read things like "Sunfish Exhibit A", "Sunfish Exhibit B", and "Really Big Sunfish Exhibit". Why would anyone build an entire aquarium dedicated solely to sunfish? It doesn't make any sense. The gentle sound of bubbling water and the blank stares of countless sunfish create an unsettling atmosphere. </p> </div> <h2 style="color: #1e90ff;">What do you want to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Explore Exhibits --> <div style="border: 3px solid #00ced1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #00ced1; margin-top: 0;">🌊 Explore Exhibits</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Wander through the various sunfish exhibits. There are baby sunfish, adult sunfish, and really big sunfish. That's it. That's all there is.</p> <<link "<div style='background: #00ced1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Explore</div>">> <<set $timeInMinutes += 60>> <<set _sunfishRoll = Math.random()>> <<set _gotSunfishTrait = false>> <<if _sunfishRoll < (1/32768) && !$physicalTraits.includes("Sunfish")>> <<run $physicalTraits.push("Sunfish")>> <<set _gotSunfishTrait = true>> <</if>> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px; max-width: 500px;"> <h2 style="color: #00ced1; margin-top: 0;">🌊 Exploring the Exhibits</h2> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You wander through the dimly lit corridors, passing tank after tank of slowly rotating sunfish. Their vacant eyes follow you—or maybe they don't, it's hard to tell. </p> <div style="margin: 20px 0;"> <img src="Images/Other/Sunfish.jpg" style="max-width: 100%; border-radius: 8px; border: 2px solid #00ced1;"> </div> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> The sunfish drift peacefully, their enormous disc-shaped bodies rotating slowly in the water. It's actually quite mesmerizing. </p> <<if _gotSunfishTrait>> <div style="background: #ffd700; padding: 15px; border-radius: 8px; margin: 15px 0; border: 3px solid #ffaa00;"> <p style="color: #000; font-weight: bold; font-size: 18px; margin: 0 0 10px 0;">✨ ULTRA RARE! ✨</p> <p style="color: #000; font-weight: bold; margin: 0;">You feel a strange connection to the sunfish... You have become one with the Mola mola!</p> <p style="color: #ff6b00; font-weight: bold; margin: 10px 0 0 0;">Gained trait: Sunfish</p> </div> <</if>> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> As you continue walking, you swear someone is following you from the corner of your eye. Every time you turn to look, there's no one there... except for a suspicious puddle on the floor and a trail of water leading around the corner. </p> <p style="color: #ffc107; line-height: 1.6; margin: 15px 0; font-style: italic;"> The wet footprints look oddly disc-shaped. </p> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #00ced1; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Continue</div>">> <<run Dialog.close()>> <<goto "Aquarium">> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Touch Tank --> <div style="border: 3px solid #20b2aa; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20b2aa; margin-top: 0;">✋ Touch Tank</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Interactive touch pool with small sunfish. They feel slimy and confused. Why is this the only interactive exhibit?</p> <<link "<div style='background: #20b2aa; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Touch Tank</div>">> <<set $timeInMinutes += 30>> <<set _sunfishRoll = Math.random()>> <<set _gotSunfishTrait = false>> <<if _sunfishRoll < (1/32768) && !$physicalTraits.includes("Sunfish")>> <<run $physicalTraits.push("Sunfish")>> <<set _gotSunfishTrait = true>> <</if>> <<popover 'noclick'>> <div style="padding: 20px; text-align: center; background: #1a1a1a; border-radius: 10px; max-width: 500px;"> <h2 style="color: #20b2aa; margin-top: 0;">✋ Touch Tank Experience</h2> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You approach the shallow touch pool, eager to feel the texture of a sunfish. Several small sunfish drift lazily near the surface. </p> <p style="color: #ccc; line-height: 1.6; margin: 15px 0;"> You reach your hand into the water toward one... and it instantly disappears. Not swims away—<em>disappears</em>. You blink and try again with another sunfish. The same thing happens. </p> <<if _gotSunfishTrait>> <div style="background: #ffd700; padding: 15px; border-radius: 8px; margin: 15px 0; border: 3px solid #ffaa00;"> <p style="color: #000; font-weight: bold; font-size: 18px; margin: 0 0 10px 0;">✨ ULTRA RARE! ✨</p> <p style="color: #000; font-weight: bold; margin: 0;">As your hand touches the water, you feel a profound transformation... You have become one with the Mola mola!</p> <p style="color: #ff6b00; font-weight: bold; margin: 10px 0 0 0;">Gained trait: Sunfish</p> </div> <</if>> <p style="color: #ff6b6b; line-height: 1.6; margin: 15px 0; font-weight: bold;"> Every single sunfish you try to touch vanishes the moment your hand gets close. </p> <p style="color: #aaa; line-height: 1.6; margin: 15px 0; font-style: italic;"> You have no idea what's going on. This place is deeply unsettling. </p> <div style="margin-top: 20px;"> <<link "<div style='display: inline-block; background: #20b2aa; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Back Away Slowly</div>">> <<run Dialog.close()>> <<goto "Aquarium">> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Gift Shop --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🎁 Gift Shop</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Browse sunfish-themed souvenirs. Plush sunfish, sunfish keychains, sunfish t-shirts, sunfish mugs, sunfish everything...</p> <<link "<div style='background: #ffd700; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Shop</div>">> <<goto "AquariumGiftShop">> <</link>> </div> <!-- Cafe --> <div style="border: 3px solid #32cd32; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #32cd32; margin-top: 0;">☕ Ocean View Cafe</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Grab a bite with a view of the main tank. Watch sunfish slowly rotate while you eat. It's hypnotic and deeply weird.</p> <<link "<div style='background: #32cd32; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Cafe</div>">> <<goto "AquariumCafe">> <</link>> </div> </div> <!-- NPCs Section --> <h2 style="color: #1e90ff;">People Here</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">Normal Man</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;">Normal Employee</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to Normal Man</div>">> <<goto "SunfishFakeInterface">> <</link>> </div> </div> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "IllegalServices">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("IllegalServices")>> <<run $visitedLocations.push("IllegalServices")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff4444; text-align: center;">🔓 Illegal Services</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff4444;"> <p style="color: #ccc; font-size: 18px; margin: 0;"> The old man leans in close, his breath reeking of cheap whiskey. "Looking for some... personality adjustments? Criminal record problems? I know people. They can make problems disappear, or give you new... perspectives. For the right price, of course. Hehehehe..." </p> </div> <div style="background: #2a2a2a; border: 2px solid #ffc107; padding: 15px; border-radius: 10px; margin-bottom: 25px;"> <p style="color: #ffc107; margin: 0; font-weight: bold; font-size: 16px;">💰 Your Money: $<<print $money.toLocaleString()>></p> </div> <!-- ERASE CRIMINAL RECORD --> <<if $jobs && $jobs.includes("Criminal")>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #e74c3c; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #e74c3c; padding-bottom: 10px;">🚔 Erase Criminal Record</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Completely wipe your criminal history clean. All records destroyed, heat cleared, warrant removed. It's like you were never a criminal...</p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0; font-size: 18px;">What This Includes:</h3> <ul style="color: #ccc; font-size: 14px; margin: 5px 0; padding-left: 20px;"> <<if $jailSystem && $jailSystem.previousJob && $jailSystem.previousJob !== "Unemployed">> <li>Restore your previous job: <span style="color: #51cf66;">$jailSystem.previousJob</span></li> <<else>> <li>Remove Criminal status (become Unemployed)</li> <</if>> <li>Clear all arrest records and crime statistics</li> <li>Remove heat level and active warrants</li> <li>Erase all evidence of criminal activity</li> <li><span style="color: #51cf66;">Keep all traits you've acquired</span></li> </ul> <p style="color: #888; font-size: 13px; margin: 10px 0 0 0; font-style: italic;">Note: Any traits you've stolen remain yours. This only clears your record.</p> </div> <<if $money >= 50000>> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Erase Record for $50,000</div>">> <<set $money -= 50000>> /* Restore previous job or make unemployed */ <<if $jailSystem && $jailSystem.previousJob && $jailSystem.previousJob !== "Unemployed" && $jailSystem.previousJob !== "Criminal">> <<set $jobs = [$jailSystem.previousJob]>> <<else>> <<set $jobs = ["Unemployed"]>> <</if>> /* Clear all crime system data */ <<set $crimeSystem.warnings = 0>> <<set $crimeSystem.witnessedCrimes = 0>> <<set $crimeSystem.totalThefts = 0>> <<set $crimeSystem.successfulThefts = 0>> <<set $crimeSystem.failedThefts = 0>> <<set $crimeSystem.arrestCount = 0>> <<set $crimeSystem.resistedArrestCount = 0>> <<set $crimeSystem.surrenderCount = 0>> <<set $crimeSystem.heatLevel = 0>> <<set $crimeSystem.activeWarrant = false>> <<set $crimeSystem.crimesCommitted = 0>> /* Clear jail system */ <<if $jailSystem>> <<set $jailSystem.previousJob = "">> <</if>> /* Achievement for erasing criminal record */ <<run setup.achievements.unlock("erase_criminal_record")>> <<goto "IllegalServices">> <</link>> </div> <<else>> <div style="text-align: center;"> <div style='display: inline-block; background: #666; color: #999; padding: 15px 30px; border-radius: 8px; font-weight: bold; font-size: 18px; opacity: 0.5;'> Can't Afford ($50,000 required) </div> </div> <</if>> </div> <</if>> <!-- CURE GAMBLING ADDICTION --> <<if $mentalTraits && $mentalTraits.includes("Gambling Addiction")>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 215, 0, 0.3);"> <h2 style="color: #ffd700; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ffd700; padding-bottom: 10px;">🎰 Cure Gambling Addiction</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">The old man grins wickedly. "Gambling problem, eh? I know a... specialist. Hypnotherapy, they call it. He'll rewire your brain, make you forget you ever liked the slots. Won't be cheap though..."</p> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0; font-size: 18px;">Treatment Includes:</h3> <ul style="color: #ccc; font-size: 14px; margin: 5px 0; padding-left: 20px;"> <li>Permanent removal of Gambling Addiction trait</li> <li>No more forced gambling when entering casino</li> <li>Complete freedom from compulsive urges</li> <li>Ability to walk away from games anytime</li> </ul> <div style="background: #2d2020; padding: 10px; border-radius: 6px; margin-top: 10px; border-left: 4px solid #c62828;"> <p style="color: #ff6b6b; font-size: 13px; margin: 0; font-weight: bold;">⚠️ Warning: Extremely expensive procedure - $100,000</p> <p style="color: #888; font-size: 12px; margin: 5px 0 0 0; font-style: italic;">Ironically, you'll need to win big at gambling to afford the cure for gambling addiction...</p> </div> </div> <<if $money >= 100000>> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px rgba(255, 215, 0, 0.5);'>Get Treatment for $100,000</div>">> <<set $money -= 100000>> <<run $mentalTraits.delete("Gambling Addiction")>> /* Achievement for curing gambling addiction */ <<run setup.achievements.unlock("remove_gambling_addiction")>> /* Also counts as removing a negative trait */ <<run setup.achievements.unlock("remove_negative_trait")>> <<goto "IllegalServices">> <</link>> </div> <<else>> <div style="text-align: center;"> <div style='display: inline-block; background: #666; color: #999; padding: 15px 30px; border-radius: 8px; font-weight: bold; font-size: 18px; opacity: 0.5;'> Can't Afford ($100,000 required) </div> <p style="color: #888; font-size: 13px; margin: 10px 0 0 0; font-style: italic;">You need $<<print (100000 - $money).toLocaleString()>> more...</p> </div> <</if>> </div> <</if>> <!-- REMOVE NEGATIVE TRAITS --> <<set _negativeTraits = []>> <<set _purelyNegativeTraits = [ "Blemished", "Clumsy", "Overweight", "Plain", "Slow", "Stiff", "Ugly", "Underweight", "Weak", "Arrogant", "Bitchy", "Cold", "Complacent", "Cowardly", "Cruel", "Deceitful", "Disorganized", "Dull", "Erratic", "Foolish", "Forgetful", "Impatient", "Insecure", "Insensitive", "Jealous", "Lazy", "Obsessive", "Reckless", "Rude", "Selfish", "Short Tempered", "Slow Learner", "Unreliable" ]>> <<for _trait range $mentalTraits>> <<if _purelyNegativeTraits.includes(_trait)>> <<run _negativeTraits.push(_trait)>> <</if>> <</for>> <<for _trait range $physicalTraits>> <<if _purelyNegativeTraits.includes(_trait)>> <<run _negativeTraits.push(_trait)>> <</if>> <</for>> <<if _negativeTraits.length > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #ff6b6b; padding-bottom: 10px;">❌ Remove Negative Traits</h2> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Get rid of your worst qualities... for a price. Each trait removal costs $500.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 15px;"> <<for _trait range _negativeTraits>> <<capture _trait>> <<if $money >= 500>> <div style="border: 2px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 18px;">_trait</h3> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Remove for $500</div>">> <<set $money -= 500>> <<if $physicalTraits.includes(_trait)>> <<run $physicalTraits.delete(_trait)>> <<else>> <<run $mentalTraits.delete(_trait)>> <</if>> /* Achievement for removing a negative trait */ <<run setup.achievements.unlock("remove_negative_trait")>> <<goto "IllegalServices">> <</link>> </div> <<else>> <div style="border: 2px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; opacity: 0.5;"> <h3 style="color: #666; margin: 0 0 10px 0; font-size: 18px;">_trait</h3> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Can't Afford</div> </div> <</if>> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #666; margin: 0 0 15px 0; font-size: 24px; border-bottom: 3px solid #666; padding-bottom: 10px;">❌ Remove Negative Traits</h2> <p style="color: #666; font-size: 14px; margin: 0; text-align: center; font-style: italic;">You have no negative traits to remove.</p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #434343; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Shady Shop</div>">> <<goto "ShadyShop">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("AquariumCafe")>> <<run $visitedLocations.push("AquariumCafe")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">☕ Aquarium Café</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> The café is eerily quiet. A few empty tables sit scattered around the room. The lighting is dim, casting strange shadows on the walls. </p> </div> <!-- If player just ate the food --> <<if $justAteSunfishFood>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 8px 16px rgba(77, 171, 247, 0.4);"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">Something Changes...</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You consume the mysterious substance. The taste is indescribable - neither pleasant nor unpleasant, existing somehow outside normal sensory experience. It slides down your throat with an odd, gelatinous texture. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> For a moment, everything goes silent. Then you feel it - a fundamental shift deep within you. Your connection to sunfish becomes... profound. Innate. As if you've always been part of their world. </p> <p style="color: #4caf50; margin: 0; text-align: center; font-weight: bold; font-size: 18px;"> ✓ You have gained the Sunfish skill! </p> </div> <<set $justAteSunfishFood = false>> <</if>> <!-- The Wall Sign --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">On the Wall</h3> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b; text-align: center;"> <p style="color: #4caf50; font-size: 24px; margin: 0 0 15px 0; font-weight: bold;"> SAFE TO EAT </p> <div style="margin: 15px 0;"> <p style="color: #1e90ff; font-size: 60px; margin: 0; line-height: 1;"> 🐟 </p> </div> <p style="color: #ccc; margin: 0; font-style: italic; font-size: 14px;"> The sunfish image seems to watch you. No matter where you stand, its eyes follow your movement. It makes your skin crawl. </p> </div> </div> <!-- The Counter/Menu --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">The Counter</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Normal Man stands behind the counter. Again. The same damp trench coat. The same mismatched, unblinking eyes. Water drips steadily onto the floor beneath him, forming a small puddle. You hear those wet slapping sounds from inside the coat once more. </p> <p style="color: #ccc; margin: 0 0 20px 0; line-height: 1.6; font-style: italic;"> How does he keep appearing everywhere? You're starting to feel very uncomfortable. </p> </div> <!-- If player has the food but hasn't eaten it yet --> <<if $hasSunfishFood && !$skills.includes("Sunfish")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; text-align: center;">You Have Sunfish Food?</h3> <p style="color: #ccc; margin: 0 0 20px 0; text-align: center; line-height: 1.6;"> The mysterious dish sits before you. Do you dare consume it? </p> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #ffc107; color: #1a1a1a; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Eat the Sunfish Food?</div>">> <<if !$skills>><<set $skills = []>><</if>> <<set $skills.push("Sunfish")>> <<set $hasSunfishFood = false>> <<set $justAteSunfishFood = true>> <<goto "AquariumCafe">> <</link>> </div> </div> <<else>> <!-- The Menu (only shows if you don't have the food or already ate it) --> <h2 style="color: #1e90ff; text-align: center;">Menu</h2> <div style="display: grid; grid-template-columns: 1fr; gap: 15px; margin-bottom: 25px; max-width: 600px; margin-left: auto; margin-right: auto;"> <!-- Sunfish Food --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 8px 16px rgba(255, 193, 7, 0.3);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; text-align: center; font-size: 24px;">🍽️ Sunfish Food?</h3> <<if $skills.includes("Sunfish")>> <p style="font-size: 14px; color: #4caf50; margin: 0; text-align: center; font-style: italic;"> You've already consumed this mysterious dish. Its effects course through you. </p> <<else>> <p style="font-size: 14px; color: #aaa; margin: 0 0 15px 0; text-align: center; line-height: 1.6;"> A mysterious dish. You can't quite tell what it is. It sits under a glass dome on the counter, looking... odd. The texture is strange. The color is stranger. </p> <p style="font-size: 14px; color: #ff6b6b; margin: 0 0 15px 0; text-align: center; font-style: italic;"> Is it food FOR sunfish? Or food MADE FROM sunfish? Or something else entirely? You're not sure you want to know. </p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 20px 0; text-align: center; font-size: 28px;"> $1,000,000 </p> <p style="color: #ff6b6b; margin: 0 0 20px 0; text-align: center; font-size: 14px; font-style: italic;"> Who in the world would pay this much for... whatever this is? </p> <<if $money >= 1000000>> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Purchase Sunfish Food?</div>">> <<set $money -= 1000000>> <<set $hasSunfishFood = true>> <<run setup.achievements.unlock("buy_sunfish_food")>> <<goto "AquariumCafe">> <</link>> <<else>> <div style='background: #666; color: #aaa; padding: 12px 25px; border-radius: 6px; text-align: center; font-weight: bold;'>Cannot Afford (Thank goodness?)</div> <</if>> <</if>> </div> </div> <</if>> <!-- Normal Man's Stare --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0; text-align: center; line-height: 1.6;"> Normal Man continues to stare at you with those bulging, unblinking eyes. One looking at you. One looking... elsewhere. The silence is deafening except for the drip, drip, drip of water and those occasional wet slapping sounds. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">❓ Information Desk</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a6f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> You approach the information desk. The figure standing behind it is... wrong. They're impossibly tall and disc-shaped, wearing a soaking wet trench coat that's clearly too small. Their "face" is just two bulging eyes staring in slightly different directions. They're not moving like a human should - instead, they're sort of... wobbling? Rotating? There's a constant stream of water dripping from the coat onto the floor, forming a substantial puddle. You can hear a faint "bloop bloop" sound coming from somewhere within the coat. This absolutely doesn't make sense. It's as if multiple mola mola sunfish somehow stacked themselves inside a trench coat and are pretending to be a person, which is impossible because fish can't do that. </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> The "person" slowly rotates to face you, making a sloshing sound. Their mouth opens slightly. </p> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #1e90ff; margin-bottom: 20px;"> <p style="color: #1e90ff; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> "Bloop bloop. Nothing to see here. Bloop bloop." </p> </div> <p style="color: #ccc; font-size: 16px; margin-top: 20px;"> They continue staring at you with those vacant, fishy eyes. A small fin briefly pokes out from under the trench coat before quickly retracting. You're not sure what you expected. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐠 Trade with Normal Man</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> "Bloop bloop. Nothing to see here. Bloop bloop." </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff;"> <p style="color: #ccc; font-size: 16px;"> Normal Man stares at you with vacant, unblinking eyes. Water drips from somewhere within the trench coat. You hear a faint sloshing sound. A fin briefly pokes out before disappearing again. This is deeply uncomfortable. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">💬 Talk to Normal Man</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0;"> You attempt to strike up a conversation with Normal Man. </p> </div> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1e90ff;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Normal Man who is Normal stares at you. His bulging eyes don't blink. They don't move. One eye seems to be looking at you. The other is looking at something behind you. Or maybe at nothing. The silence stretches on. Water continues to drip. You hear a wet slapping sound from inside the coat. The stare continues. It's making you very uncomfortable. </p> <p style="color: #ccc; font-size: 16px; margin-top: 20px;"> You give up at any attempt to talk to the... Normal Man... </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #667eea;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Normal Man</h1> <p style="color: white; margin: 0; font-size: 18px; text-align: center;"> Normal Employee </p> </div> <!-- NPC Stats --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #17a2b8; padding-bottom: 10px;">📊 Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; font-size: 16px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Charisma:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Dexterity:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Strength:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #17a2b8;"> <strong style="color: #aaa;">Intelligence:</strong> <span style="color: #17a2b8; font-weight: bold;">Bloop</span> </div> </div> </div> <!-- NPC Appearance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">👤 Appearance</h3> <div style="font-size: 16px; color: #ccc; line-height: 1.8;"> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Hair:</strong> None</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Skin Tone:</strong> Wet and Slimy</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Physique:</strong> Disc-Shaped</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Chest:</strong> ????</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Butt:</strong> ????</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Gender:</strong> Bloop</p> <p style="margin: 8px 0;"><strong style="color: #9b59b6;">Age:</strong> ????</p> </div> </div> <!-- NPC Traits --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #51cf66; padding-bottom: 10px;">💪 Physical Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Disc-Shaped</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Wet</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Wobbling</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Has Fins (??)</span> <span style="background: #1a1a1a; color: #51cf66; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #51cf66; font-weight: 500;">Multiple Eyes</span> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">🧠 Mental Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Vacant</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Fishy</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Suspicious</span> <span style="background: #1a1a1a; color: #9b59b6; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #9b59b6; font-weight: 500;">Definitely Not Multiple Sunfish</span> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #ffc107; padding-bottom: 10px;">🎯 Skills</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Blooping</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Standing Still</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Avoiding Questions</span> <span style="background: #1a1a1a; color: #ffc107; padding: 8px 15px; border-radius: 20px; font-size: 15px; border: 2px solid #ffc107; font-weight: 500;">Rotating Slowly</span> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: #667eea; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💱 Initiate Trade</div>">> <<goto "NormalManTrade">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>💬 Talk</div>">> <<goto "NormalManTalk">> <</link>> </div> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #2a2a2a; color: #667eea; padding: 12px 30px; border-radius: 8px; border: 2px solid #667eea; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Go Back</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("AquariumGiftShop")>> <<run $visitedLocations.push("AquariumGiftShop")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🎁 Aquarium Gift Shop</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #00bfff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> The gift shop is packed wall-to-wall with sunfish merchandise. Plush sunfish in every size. Sunfish keychains. Sunfish t-shirts. Sunfish coffee mugs. Sunfish everything. It's almost overwhelming. </p> </div> <!-- Special Display Case --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 8px 16px rgba(255, 215, 0, 0.3);"> <h3 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">✨ Premium Display ✨</h3> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #ffd700;"> <p style="color: #ffd700; font-size: 18px; margin: 0 0 10px 0; font-weight: bold; text-align: center;">Jeweled Sunfish Statue</p> <p style="color: #ccc; margin: 0 0 15px 0; text-align: center; line-height: 1.6;"> A magnificent sunfish carved from rare blue stone and encrusted with precious gems. Its eyes seem to follow you around the room. The craftsmanship is extraordinary - almost unnatural in its detail. </p> <p style="color: #4caf50; font-size: 20px; margin: 0 0 15px 0; text-align: center; font-weight: bold;"> Price: $500,000 </p> <div style='background: #ff9800; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Coming Soon</div> </div> </div> <!-- Regular Merchandise --> <h2 style="color: #1e90ff;">Sunfish Merchandise</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Plush Sunfish --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🧸 Plush Sunfish</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A soft, huggable sunfish plushie.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$25</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> <!-- Sunfish T-Shirt --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">👕 Sunfish T-Shirt</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">"I ♥ SUNFISH" printed on front.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$20</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> <!-- Sunfish Keychain --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🔑 Sunfish Keychain</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A metal sunfish charm for your keys.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$8</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> <!-- Sunfish Coffee Mug --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">☕ Sunfish Mug</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Ceramic mug with sunfish design.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$15</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> <!-- Sunfish Poster --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">🖼️ Sunfish Poster</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Educational poster about sunfish.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$12</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> <!-- Sunfish Stickers --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1e90ff; margin: 0 0 10px 0;">✨ Sunfish Sticker Pack</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Set of 10 holographic stickers.</p> <p style="color: #4caf50; font-weight: bold; margin: 0 0 10px 0;">$5</p> <div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Coming Soon</div> </div> </div> <!-- Home Decor Section --> <h2 style="color: #1e90ff;">Home Decor</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #1abc9c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #1abc9c; margin: 0 0 15px 0;">🐚 Ocean-Themed Home Decor</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Bring the beauty of the ocean into your home with our collection of nautical and marine-themed decorations. Perfect for any room! </p> <<link "<div style='background: #1abc9c; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>Browse Ocean Decor</div>">> <<goto "AquariumGiftShopDecor">> <</link>> </div> <!-- The Cashier --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">The Counter</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Behind the counter stands... Normal Man. The same one from the entrance. You're sure of it. Same damp trench coat. Same unblinking, bulging eyes pointing in different directions. Same wet slapping sounds coming from inside the coat. </p> <p style="color: #ccc; margin: 0; line-height: 1.6; font-style: italic;"> How did he get here so fast? You just saw him at the entrance... This is deeply unsettling. </p> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Aquarium</div>">> <<goto "Aquarium">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("FenRisTraining")>> <<run $visitedLocations.push("FenRisTraining")>> <</if>> /* Initialize relationship if this is first meeting */ <<if !$npcRelationships["Fen Ris"]>> <<set $npcRelationships["Fen Ris"] = { level: 0, points: 0, xp: 0, maxXp: 20, levelName: "Stranger", bestFriendUnlocked: false }>> <</if>> <<if $npcRelationships["Fen Ris"].points === undefined || $npcRelationships["Fen Ris"].points === null || isNaN($npcRelationships["Fen Ris"].points)>> <<set $npcRelationships["Fen Ris"].points = 0>> <</if>> /* Add Fen Ris to met NPCs if not already there */ <<if !$metNPCs.includes("Fen Ris")>> <<run $metNPCs.push("Fen Ris")>> <</if>> <<silently>> /* Get all trainers by job */ <<set _trainers = setup.getNPCsByJob("Fitness Trainer")>> <<set _canTrainToday = true>> /* Check if player already trained today (track by job, not name) */ <<if $lastFenRisTrainingDay === $dayNumber>> <<set _canTrainToday = false>> <</if>> <</silently>> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px;"> <h2 style="margin: 0; color: white; text-align: center;">Personal Training</h2> </div> <<if _trainers && _trainers.length > 0>> <<for _trainerIndex = 0; _trainerIndex < _trainers.length; _trainerIndex++>> <<set _trainer = _trainers[_trainerIndex]>> <<silently>> /* Calculate trainer effectiveness */ <<set _effectiveness = 100>> /* Base effectiveness */ /* Check if this is the original Fen Ris by checking for Were-Creature trait */ <<set _isOriginalFenRis = _trainer.physicalTraits.includes("Were-Creature")>> <<if !_isOriginalFenRis>> /* Calculate trainer's total stats (base + trait/skill bonuses) */ <<set _trainerStrength = _trainer.stats.strength>> <<set _trainerDex = _trainer.stats.dexterity>> /* Add bonuses from physical traits */ <<for _i = 0; _i < _trainer.physicalTraits.length; _i++>> <<set _trait = _trainer.physicalTraits[_i]>> <<if setup.traitBonuses[_trait]>> <<if setup.traitBonuses[_trait].strength>> <<set _trainerStrength += setup.traitBonuses[_trait].strength>> <</if>> <<if setup.traitBonuses[_trait].dexterity>> <<set _trainerDex += setup.traitBonuses[_trait].dexterity>> <</if>> <</if>> <</for>> /* Add bonuses from mental traits */ <<for _i = 0; _i < _trainer.mentalTraits.length; _i++>> <<set _trait = _trainer.mentalTraits[_i]>> <<if setup.traitBonuses[_trait]>> <<if setup.traitBonuses[_trait].strength>> <<set _trainerStrength += setup.traitBonuses[_trait].strength>> <</if>> <<if setup.traitBonuses[_trait].dexterity>> <<set _trainerDex += setup.traitBonuses[_trait].dexterity>> <</if>> <</if>> <</for>> /* Add bonuses from skills */ <<for _i = 0; _i < _trainer.skills.length; _i++>> <<set _skill = _trainer.skills[_i]>> <<if setup.skillBonuses[_skill]>> <<if setup.skillBonuses[_skill].strength>> <<set _trainerStrength += setup.skillBonuses[_skill].strength>> <</if>> <<if setup.skillBonuses[_skill].dexterity>> <<set _trainerDex += setup.skillBonuses[_skill].dexterity>> <</if>> <</if>> <</for>> /* Check if both stats meet the threshold */ <<if _trainerStrength >= 80 && _trainerDex >= 80>> <<set _effectiveness = 100>> <<else>> /* Start at 50% base effectiveness */ <<set _effectiveness = 50>> /* Compare physical traits (excluding body parts) */ <<set _fenRisPhysical = ["Tall", "Muscular", "Athletic Build", "Sharp Features", "Were-Creature"]>> <<set _matchingPhysical = 0>> <<for _i = 0; _i < _fenRisPhysical.length; _i++>> <<if _trainer.physicalTraits.includes(_fenRisPhysical[_i])>> <<set _matchingPhysical++>> <</if>> <</for>> <<set _effectiveness += (_matchingPhysical / _fenRisPhysical.length) * 15>> /* Compare mental traits */ <<set _fenRisMental = ["Confident", "Calm", "Honest", "Patient"]>> <<set _matchingMental = 0>> <<for _i = 0; _i < _fenRisMental.length; _i++>> <<if _trainer.mentalTraits.includes(_fenRisMental[_i])>> <<set _matchingMental++>> <</if>> <</for>> <<set _effectiveness += (_matchingMental / _fenRisMental.length) * 10>> /* Compare skills */ <<set _fenRisSkills = ["Athletics", "Heavy Lifting", "Combat", "Yoga", "Teaching"]>> <<set _matchingSkills = 0>> <<for _i = 0; _i < _fenRisSkills.length; _i++>> <<if _trainer.skills.includes(_fenRisSkills[_i])>> <<set _matchingSkills++>> <</if>> <</for>> <<set _effectiveness += (_matchingSkills / _fenRisSkills.length) * 15>> /* Compare appearance (hair color, skin tone, age) */ <<set _appearanceMatches = 0>> <<if _trainer.appearance.hairColor === "Black">><<set _appearanceMatches++>><</if>> <<if _trainer.appearance.skinTone === "tan">><<set _appearanceMatches++>><</if>> <<if _trainer.appearance.age === "Adult">><<set _appearanceMatches++>><</if>> <<set _effectiveness += (_appearanceMatches / 3) * 10>> /* Round to whole number */ <<set _effectiveness = Math.round(_effectiveness)>> <</if>> <</if>> /* Calculate actual stat gains based on effectiveness */ /* Hellhound/Gym Bunny 4x / Himbo 2x gym bonus */ <<set _hellhoundBonus = $physicalTraits.includes("Hellhound") ? 4 : ($physicalTraits.includes("Gym Bunny") ? 4 : ($physicalTraits.includes("Himbo") ? 2 : 1))>> <<set _strengthGain = Math.round(5 * (_effectiveness / 100) * _hellhoundBonus)>> <<set _dexGain = Math.round(4 * (_effectiveness / 100) * _hellhoundBonus)>> <<set _charismaGain = Math.round(3 * (_effectiveness / 100) * _hellhoundBonus)>> <<set _intGain = Math.round(2 * (_effectiveness / 100) * _hellhoundBonus)>> <</silently>> <!-- Transformation Gym Multiplier Display --> <<if _hellhoundBonus > 1>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #ff6b6b; margin-bottom: 20px; box-shadow: 0 0 15px rgba(255,107,107,0.4);"> <p style="color: #ff6b6b; margin: 0; text-align: center; font-size: 14px; font-weight: bold; text-shadow: 0 0 8px rgba(255,107,107,0.5);"> ✓ <<if $physicalTraits.includes("Hellhound")>>Hellhound<<elseif $physicalTraits.includes("Gym Bunny")>>Gym Bunny<<else>>Himbo<</if>>: <<print _hellhoundBonus>>x Training Gains </p> </div> <</if>> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b; margin-bottom: 20px;"> <h3 style="color: #ff6b6b; margin-top: 0;">About Your Trainer</h3> <!-- NPC Image --> <<set _trainerImage = setup.getNPCImage(_trainer.name)>> <<if _trainerImage>> <div style="text-align: center; margin-bottom: 20px;"> <img @src="_trainerImage" style="max-width: 300px; max-height: 400px; border-radius: 10px; border: 3px solid #ff6b6b; box-shadow: 0 0 20px rgba(255,107,107,0.6);" onerror="this.style.display='none';"> </div> <</if>> <<if _isOriginalFenRis>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> <<= _trainer.name>> stands before you, her imposing figure radiating strength and confidence. Her olive-brown skin glistens with a light sheen of sweat, and her wild black mane of wavy hair reaches her upper back, slightly unkempt in that effortlessly cool way. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> Her deep yellow eyes with black sclera meet yours with an intensity that's both captivating and slightly intimidating. Black wolf ears perk up from her hair, twitching as she sizes you up, while a matching tail sways lazily behind her. Her upper arms and legs are covered in dark fur, ending in sharp claws that she's clearly mastered handling around gym equipment. When she grins, revealing sharp canines, you feel both welcomed and challenged. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> "Ready to push your limits?" she asks in a laid-back but direct tone. Despite her nonchalant demeanor, there's a forceful charisma about her that makes you want to prove yourself. Her high moral standards are evident in how she carries herself - no shortcuts, no excuses, just honest hard work. </p> <</if>> <<if !_isOriginalFenRis>> <div style="margin-top: 15px; padding: 12px; background-color: #1a1a1a; border-left: 4px solid #ffd43b; border-radius: 4px;"> <p style="color: #ffd43b; margin: 0; font-weight: bold;">Training Effectiveness: <<= _effectiveness>>%</p> <<if _effectiveness < 100>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-size: 14px;"> This trainer is less effective than the original Fen Ris. <<if _trainerStrength < 80 || _trainerDex < 80>> They need at least 80 Strength and 80 Dexterity for full effectiveness. <</if>> </p> <</if>> </div> <</if>> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px;"> <h3 style="color: #51cf66; margin-top: 0;">Training Session Details</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 15px;"> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 6px;"> <div style="color: #999; font-size: 14px;">Cost</div> <div style="color: #51cf66; font-size: 20px; font-weight: bold;">$100</div> </div> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 6px;"> <div style="color: #999; font-size: 14px;">Duration</div> <div style="color: #51cf66; font-size: 20px; font-weight: bold;">4 Hours</div> </div> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 15px;"> <h4 style="color: #51cf66; margin: 0 0 10px 0;">Stat Gains (at <<= _effectiveness>>% effectiveness):</h4> <div style="color: #e0e0e0; line-height: 1.8;"> • Strength: <span style="color: #ff6b6b; font-weight: bold;">+<<= _strengthGain>></span><br> • Dexterity: <span style="color: #51cf66; font-weight: bold;">+<<= _dexGain>></span><br> • Charisma: <span style="color: #ffd43b; font-weight: bold;">+<<= _charismaGain>></span><br> • Intelligence: <span style="color: #4dabf7; font-weight: bold;">+<<= _intGain>></span> </div> </div> <<set _canAffordTraining = setup.canAffordTotal(100)>> <<if !_canTrainToday>> <div style="background-color: #c92a2a; padding: 12px; border-radius: 6px; margin-bottom: 15px;"> <p style="color: white; margin: 0; text-align: center; font-weight: bold;"> You've already trained today. Come back tomorrow! </p> </div> <<elseif !_canAffordTraining>> <div style="background-color: #c92a2a; padding: 12px; border-radius: 6px; margin-bottom: 15px;"> <p style="color: white; margin: 0; text-align: center; font-weight: bold;"> You don't have enough money for a training session. (Need: $100) </p> </div> <<else>> <<capture _trainer, _effectiveness, _strengthGain, _dexGain, _charismaGain, _intGain>> <<link "<div style='background: #ff6b6b; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Train with <<= _trainer.name>> ($100, 4 hours)</div>" "FenRisTrainingSession">> <<set _payment = setup.payAmount(100)>> <<if _payment.success>> <<set $lastFenRisTrainingDay = $dayNumber>> <<set $trainedWith = _trainer.name>> <<set $trainingEffectiveness = _effectiveness>> <<set $strengthGained = _strengthGain>> <<set $dexGained = _dexGain>> <<set $charismaGained = _charismaGain>> <<set $intGained = _intGain>> /* Apply stat gains */ <<set $stats.strength += _strengthGain>> <<set $stats.dexterity += _dexGain>> <<set $stats.charisma += _charismaGain>> <<set $stats.intelligence += _intGain>> /* Add relationship XP for training together (skip achievements) */ <<run setup.addRelationshipXP(_trainer.name, 2, true)>> /* Gym Bunny workout satisfaction */ <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> /* Advance time by 4 hours */ <<run advanceTime(240)>> <</if>> <</link>> <</capture>> <</if>> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; margin-bottom: 20px;"> <h3 style="color: #9b59b6; margin-top: 0;">Other Options</h3> <<capture _trainer>> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Talk to <<= _trainer.name>> </div>" "NPCInteraction">> <<set $tradingWithNPC = _trainer>> <<set $currentTradeNPC = _trainer>> /* Add relationship XP for talking */ <<run setup.addRelationshipXP(_trainer.name, 2)>> <</link>> <</capture>> </div> <</for>> <<else>> <div style="background-color: #c92a2a; padding: 20px; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: white; margin: 0; text-align: center;"> No fitness trainers are currently available. </p> </div> <</if>> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Gym</div>" "OpahFitness">><</link>> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #ff6b6b 0%, #c92a2a 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px;"> <h2 style="margin: 0; color: white; text-align: center;">Training Complete!</h2> </div> <div style="background-color: #2d2d2d; padding: 20px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px;"> <<if $trainedWith === "Fen Ris">> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> The next four hours are intense. Fen Ris pushes you through a grueling combination of strength training, cardio, flexibility work, and mental conditioning. Her yellow eyes watch your every move, correcting your form with a sharp but not unkind word. Her clawed hands demonstrate proper technique with surprising grace. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> "Good," she says simply when you finish, her tail swishing approvingly. "You actually put in the work. That's what I like to see." There's no excessive praise, just honest acknowledgment of your effort. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> Despite the exhaustion, you feel stronger, more agile, and strangely more confident. Even your mind feels sharper from the mental focus required to keep up with her demanding routine. </p> <<else>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6;"> <<= $trainedWith>> guides you through a <<= $trainingEffectiveness>>% effective training session. While competent, you can't help but notice the difference from when Fen Ris was in charge. </p> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 20px;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">Your Gains:</h3> <div style="color: #e0e0e0; font-size: 18px; line-height: 2;"> <span style="color: #ff6b6b;">■</span> Strength: <span style="color: #ff6b6b; font-weight: bold;">+<<= $strengthGained>></span><br> <span style="color: #51cf66;">■</span> Dexterity: <span style="color: #51cf66; font-weight: bold;">+<<= $dexGained>></span><br> <span style="color: #ffd43b;">■</span> Charisma: <span style="color: #ffd43b; font-weight: bold;">+<<= $charismaGained>></span><br> <span style="color: #4dabf7;">■</span> Intelligence: <span style="color: #4dabf7; font-weight: bold;">+<<= $intGained>></span> </div> <<if $trainingEffectiveness < 100>> <div style="margin-top: 15px; padding: 10px; background-color: #2d2d2d; border-left: 4px solid #ffd43b; border-radius: 4px;"> <p style="color: #ffd43b; margin: 0; font-size: 14px;"> Training effectiveness was only <<= $trainingEffectiveness>>%. With Fen Ris, you would have gained more! </p> </div> <</if>> </div> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #51cf66; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>" "OpahFitness">><</link>> </div> <</nobr>>
<<nobr>> /* Ensure all NPCs have relationship entries - BUT DON'T OVERWRITE EXISTING ONES */ <<for _i = 0; _i < $npcs.length; _i++>> <<if !$relationships[$npcs[_i].name]>> <<set $relationships[$npcs[_i].name] = { level: 0, points: 0 }>> <</if>> <</for>> /* Clean up orphaned relationships (old names that don't match any current NPC) */ <<set _currentNPCNames = $npcs.map(function(npc) { return npc.name; })>> <<set _relationshipNames = Object.keys($relationships)>> <<for _j = 0; _j < _relationshipNames.length; _j++>> <<set _relName = _relationshipNames[_j]>> <<if !_currentNPCNames.includes(_relName) && $metNPCs.includes(_relName)>> /* This is an orphaned relationship - remove it from metNPCs too */ <<set $metNPCs = $metNPCs.filter(function(name) { return name !== _relName; })>> <</if>> <</for>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b9d; text-align: center;">💕 Relationships</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #c92a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> Track your connections with the people of Sunfish City </p> </div> <!-- Sort relationships by points (highest to lowest) - ONLY INCLUDE MET NPCs --> <<set _sortedRelationships = []>> <<for _npcName, _rel range $relationships>> <<if $metNPCs.includes(_npcName)>> <<set _sortedRelationships.push({name: _npcName, rel: _rel})>> <</if>> <</for>> <<run _sortedRelationships.sort(function(a, b) { return b.rel.points - a.rel.points; })>> <<if _sortedRelationships.length === 0>> <div style="background-color: #2d2d2d; padding: 30px; border-radius: 12px; border: 3px solid #666; text-align: center;"> <p style="color: #999; font-size: 18px; margin: 0;"> You haven't met anyone yet. Go explore Sunfish City and make some connections! </p> </div> <<else>> <!-- Relationship List --> <div style="display: grid; gap: 15px; margin-bottom: 25px;"> <<for _i = 0; _i < _sortedRelationships.length; _i++>> <<set _npcName = _sortedRelationships[_i].name>> <<set _rel = _sortedRelationships[_i].rel>> <<set _npc = setup.getNPCByName(_npcName)>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <<set _levelData = setup.getRelationshipLevelData(_rel.level)>> <<if _rel.level < 4>> <<if _rel.level === -1>> /* Disliked: show progress from -50 to 0 */ <<set _currentLevelMin = -50>> <<set _nextThreshold = 0>> <<elseif _rel.level === 0>> /* Stranger: show progress from 0 to 25 */ <<set _currentLevelMin = 0>> <<set _nextThreshold = 25>> <<elseif _rel.level === 1>> /* Acquaintance: show progress from 25 to 75 */ <<set _currentLevelMin = 25>> <<set _nextThreshold = 75>> <<elseif _rel.level === 2>> /* Friend: show progress from 75 to 175 */ <<set _currentLevelMin = 75>> <<set _nextThreshold = 175>> <<else>> /* Close Friend: show progress from 175 to 425 */ <<set _currentLevelMin = 175>> <<set _nextThreshold = 425>> <</if>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <<if _xpPercent < 0>><<set _xpPercent = 0>><</if>> <<if _xpPercent > 100>><<set _xpPercent = 100>><</if>> <<else>> <<set _xpPercent = 100>> <</if>> <<set _levelName = _levelData ? _levelData.name : "Unknown">> <<capture _npcName, _relColor, _rel, _xpPercent, _levelName>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid <<= _relColor>>; box-shadow: 0 4px 12px rgba(0,0,0,0.6), 0 0 20px <<= _relColor>>33; cursor: pointer; transition: all 0.3s ease;" onmouseover="this.style.transform='scale(1.02)'; this.style.boxShadow='0 6px 16px rgba(0,0,0,0.8), 0 0 30px <<= _relColor>>66';" onmouseout="this.style.transform='scale(1)'; this.style.boxShadow='0 4px 12px rgba(0,0,0,0.6), 0 0 20px <<= _relColor>>33';"> <<link `"<div style='display: flex; justify-content: space-between; align-items: center;'><h2 style='color: " + _relColor + "; margin: 0; font-size: 22px; text-shadow: 0 0 10px " + _relColor + "88;'>" + _npcName + "</h2><div style='background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 100%); padding: 8px 15px; border-radius: 20px; border: 2px solid " + _relColor + "; box-shadow: 0 0 10px " + _relColor + "44;'><span style='color: " + _relColor + "; font-weight: bold; font-size: 16px;'>" + _levelName + "</span></div></div><div style='background-color: #0a0a0a; border-radius: 10px; height: 12px; overflow: hidden; border: 1px solid #444; margin-top: 10px; box-shadow: inset 0 2px 4px rgba(0,0,0,0.5);'><div style='background: linear-gradient(90deg, " + _relColor + " 0%, " + _relColor + "dd 100%); height: 100%; width: " + _xpPercent + "%; transition: width 0.3s ease; box-shadow: 0 0 10px " + _relColor + ";'></div></div>"` "RelationshipDetail">> <<set $viewingNPC = _npcName>> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- BACK BUTTON --> <div style="margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Return to Game</div>">> <<if $lastLocation && $lastLocation !== "">> <<goto $lastLocation>> <<else>> <<goto "Alleyway">> <</if>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$inventoryTab>><<set $inventoryTab = "items">><</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #3498db; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; display: inline-block;'>← Back</div>">><<goto $lastLocation>><</link>> </div> <h1 style="color: #3498db; text-align: center; margin: 0 0 20px 0;">🎒 Inventory</h1> <!-- Tab Navigation --> <div style="display: flex; gap: 10px; margin-bottom: 20px; flex-wrap: wrap; justify-content: center;"> <<link "<div style='background: <<if $inventoryTab === \"items\">>#f39c12<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 3px solid #f39c12; color: white; padding: 12px 20px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4)<<if $inventoryTab === \"items\">>, 0 0 15px #f39c1288<</if>>;'>📦 Items</div>">><<set $inventoryTab = "items">><<goto "Inventory">><</link>> <<link "<div style='background: <<if $inventoryTab === \"fish\">>#2ecc71<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 3px solid #2ecc71; color: white; padding: 12px 20px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4)<<if $inventoryTab === \"fish\">>, 0 0 15px #2ecc7188<</if>>;'>🐟 Fish</div>">><<set $inventoryTab = "fish">><<goto "Inventory">><</link>> <<link "<div style='background: <<if $inventoryTab === \"artifacts\">>#9b59b6<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 3px solid #9b59b6; color: white; padding: 12px 20px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4)<<if $inventoryTab === \"artifacts\">>, 0 0 15px #9b59b688<</if>>;'>✨ Artifacts</div>">><<set $inventoryTab = "artifacts">><<goto "Inventory">><</link>> <<if $traitStorageUnlocked>> <<link "<div style='background: <<if $inventoryTab === \"traitStorage\">>#e040fb<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 3px solid #e040fb; color: white; padding: 12px 20px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4)<<if $inventoryTab === \"traitStorage\">>, 0 0 15px #e040fb88<</if>>;'>🧬 Trait Storage</div>">><<set $inventoryTab = "traitStorage">><<goto "Inventory">><</link>> <</if>> <<link "<div style='background: <<if $inventoryTab === \"food\">>#51cf66<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 3px solid #51cf66; color: white; padding: 12px 20px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4)<<if $inventoryTab === \"food\">>, 0 0 15px #51cf6688<</if>>;'>🍽️ Food</div>">><<set $inventoryTab = "food">><<goto "Inventory">><</link>> </div> <!-- Tab Content --> <<if $inventoryTab === "items">><<set _tabColor = "#f39c12">><<elseif $inventoryTab === "fish">><<set _tabColor = "#2ecc71">><<elseif $inventoryTab === "artifacts">><<set _tabColor = "#9b59b6">><<elseif $inventoryTab === "traitStorage">><<set _tabColor = "#e040fb">><<elseif $inventoryTab === "food">><<set _tabColor = "#51cf66">><<else>><<set _tabColor = "#f39c12">><</if>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _tabColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _tabColor>>44;"> <<if $inventoryTab === "items">> <!-- Items Tab Content --> <h2 style="color: #f39c12; margin: 0 0 15px 0;">📦 Items</h2> <div style="background-color: #1a1a1a; padding: 30px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="font-size: 36px; margin-bottom: 10px;">📦</div> <div style="color: #888; font-size: 14px;">No items yet.</div> </div> <<elseif $inventoryTab === "fish">> <!-- Fish Tab Content --> <h2 style="color: #2ecc71; margin: 0 0 15px 0;">🐟 Fish Storage</h2> <div style="background-color: #1a1a1a; padding: 10px; border-radius: 8px; border: 1px solid #2ecc71; margin-bottom: 15px;"> <p style="color: #aaa; margin: 0; text-align: center; font-size: 14px;"> Capacity: <span style="color: #2ecc71; font-weight: bold;"><<print setup.fishing.getInventoryCount()>> / <<print setup.fishing.getMaxInventory()>></span> fish </p> </div> <div style="text-align: center; margin-bottom: 15px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px; display: inline-block;'>📖 Fish Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> <<if $fishInventory && $fishInventory.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _i, _fish range $fishInventory>> <<set _fishData = setup.fishing.fish[_fish.id]>> <<set _rarityColor = setup.fishing.rarityColors[_fish.rarity] || "#888">> <<set _fishIcon = _fish.icon || (_fishData ? _fishData.icon : null)>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid <<print _rarityColor>>; border-radius: 8px; padding: 12px;"> <div style="display: flex; align-items: center; gap: 10px;"> <div style="width: 48px; height: 48px; flex-shrink: 0;"> <<if _fishIcon>> <img @src="_fishIcon" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="width: 48px; height: 48px; background: #333; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 24px;">🐟</div> <</if>> </div> <div style="flex: 1;"> <div style="color: <<print _rarityColor>>; font-weight: bold; font-size: 14px;"><<print _fishData ? _fishData.name : _fish.name>></div> <div style="color: #888; font-size: 11px;"><<print _fish.rarity>></div> </div> <div style="color: #2ecc71; font-weight: bold; font-size: 14px;">$<<print _fish.basePrice>></div> </div> </div> <</for>> </div> <!-- Total Value --> <<set _totalFishValue = 0>> <<for _fish range $fishInventory>> <<set _totalFishValue += _fish.basePrice>> <</for>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333; text-align: center;"> <span style="color: #888;">Total Value: </span> <span style="color: #2ecc71; font-weight: bold; font-size: 18px;">$<<print _totalFishValue>></span> </div> </div> <<else>> <div style="background-color: #1a1a1a; padding: 30px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="font-size: 36px; margin-bottom: 10px;">🐟</div> <div style="color: #888; font-size: 14px;">No fish in storage. Go fishing at the Docks!</div> </div> <</if>> <<elseif $inventoryTab === "artifacts">> <!-- Artifacts Tab Content --> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">✨ Artifacts</h2> <<if $artifactsObtained && $artifactsObtained.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 15px;"> <<for _artifact range $artifactsObtained>> <<if _artifact === "The Slippery Scales">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9c27b0; border-radius: 8px; padding: 12px;"> <div style="color: #9c27b0; font-weight: bold; font-size: 14px;">🐟 The Slippery Scales</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Stealth Bonus</div> <<if $currentArtifact === "The Slippery Scales">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Gentle Giant's Heart">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; border-radius: 8px; padding: 12px;"> <div style="color: #e91e63; font-weight: bold; font-size: 14px;">💖 The Gentle Giant's Heart</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Relationship Bonus</div> <<if $currentArtifact === "The Gentle Giant's Heart">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Basking Charm">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff9800; border-radius: 8px; padding: 12px;"> <div style="color: #ff9800; font-weight: bold; font-size: 14px;">☀️ The Basking Charm</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Skill Learning Bonus</div> <<if $currentArtifact === "The Basking Charm">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Drifter's Coin">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #00bcd4; border-radius: 8px; padding: 12px;"> <div style="color: #00bcd4; font-weight: bold; font-size: 14px;">🪙 The Drifter's Coin</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Trading Bonus</div> <<if $currentArtifact === "The Drifter's Coin">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Pearl of Abundance">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f5f5f5; border-radius: 8px; padding: 12px;"> <div style="color: #f5f5f5; font-weight: bold; font-size: 14px;">🔮 The Pearl of Abundance</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Money Bonus</div> <<if $currentArtifact === "The Pearl of Abundance">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Crowd's Eye">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #673ab7; border-radius: 8px; padding: 12px;"> <div style="color: #673ab7; font-weight: bold; font-size: 14px;">👁️ The Crowd's Eye</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Popularity Bonus</div> <<if $currentArtifact === "The Crowd's Eye">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <<elseif _artifact === "The Tidal Memory Stone">> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; border-radius: 8px; padding: 12px;"> <div style="color: #4dabf7; font-weight: bold; font-size: 14px;">🌊 The Tidal Memory Stone</div> <div style="color: #888; font-size: 11px; margin-top: 5px;">Teleportation</div> <<if $currentArtifact === "The Tidal Memory Stone">><div style="color: #4caf50; font-size: 10px; margin-top: 5px;">Currently Equipped</div><</if>> </div> <</if>> <</for>> </div> </div> <<else>> <div style="background-color: #1a1a1a; padding: 30px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="font-size: 36px; margin-bottom: 10px;">✨</div> <div style="color: #888; font-size: 14px;">No artifacts discovered yet. Explore the island to find hidden treasures!</div> </div> <</if>> <<elseif $inventoryTab === "traitStorage">> <!-- Trait Storage Tab Content --> <h2 style="color: #e040fb; margin: 0 0 15px 0;">🧬 Trait Storage</h2> <!-- Life Swap Warning --> <<if $lifeSwapOriginalBodyNPC>> <div style="background: #3a2020; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-weight: bold;">⚠️ Life Swapped Body Detected</p> <p style="color: #aaa; margin: 5px 0 0 0; font-size: 13px;">You can TAKE traits from storage, but cannot STORE traits while in another body.</p> </div> <</if>> <!-- Stored Traits Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #e040fb; margin: 0 0 10px 0;">Stored Traits</h3> <<if $traitStorage && $traitStorage.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _i, _storedTrait range $traitStorage>> <<set _traitValue = setup.getTraitValue(_storedTrait.type, _storedTrait.name)>> <<set _traitColor = _storedTrait.type === "physical" ? "#51cf66" : "#9b59b6">> <div style="background: #2d2d2d; border: 2px solid <<print _traitColor>>; border-radius: 8px; padding: 10px 15px;"> <div style="color: <<print _traitColor>>; font-weight: bold;"><<print _storedTrait.name>></div> <div style="color: #888; font-size: 11px;"><<print _storedTrait.type>> (Value: <<print _traitValue>>)</div> <!-- Retrieve Button --> <<capture _storedTrait, _i>> <<set _alreadyHas = (_storedTrait.type === "physical" && $physicalTraits.includes(_storedTrait.name)) || (_storedTrait.type === "mental" && $mentalTraits.includes(_storedTrait.name))>> <<if _alreadyHas>> <div style="color: #888; font-size: 11px; margin-top: 5px;">Already have this trait</div> <<else>> <<link "<div style='background: #28a745; color: white; padding: 5px 10px; border-radius: 5px; font-size: 12px; margin-top: 5px; cursor: pointer;'>Retrieve</div>">> <<run setup.fishing.retrieveTraitFromStorage(_i)>> <<goto "Inventory">> <</link>> <</if>> <</capture>> </div> <</for>> </div> <<else>> <p style="color: #888; margin: 0;">No traits stored yet.</p> <</if>> </div> <!-- Store Traits Section (only if not life-swapped) --> <<if !$lifeSwapOriginalBodyNPC>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #e040fb; margin: 0 0 10px 0;">Store a Trait</h3> <p style="color: #aaa; font-size: 12px; margin: 0 0 10px 0;">Only positive traits can be stored. One of each trait maximum.</p> <!-- Physical Traits --> <<if $physicalTraits && $physicalTraits.length > 0>> <h4 style="color: #51cf66; margin: 10px 0 5px 0;">Physical Traits</h4> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _trait range $physicalTraits>> <<set _traitValue = setup.getTraitValue("physical", _trait)>> <<if _traitValue >= 0 && _trait !== "Soul">> <<set _alreadyStored = $traitStorage.some(function(t) { return t.name === _trait; })>> <<capture _trait>> <<if _alreadyStored>> <div style="background: #333; color: #666; padding: 5px 10px; border-radius: 5px; font-size: 12px;"><<print _trait>> (stored)</div> <<else>> <<link "<div style='background: #2d2d2d; border: 1px solid #51cf66; color: #51cf66; padding: 5px 10px; border-radius: 5px; font-size: 12px; cursor: pointer;'><<print _trait>></div>">> <<run setup.fishing.storeTraitToStorage("physical", _trait)>> <<goto "Inventory">> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> <</if>> <!-- Mental Traits --> <<if $mentalTraits && $mentalTraits.length > 0>> <h4 style="color: #9b59b6; margin: 10px 0 5px 0;">Mental Traits</h4> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _trait range $mentalTraits>> <<set _traitValue = setup.getTraitValue("mental", _trait)>> <<if _traitValue >= 0 && _trait !== "Soul">> <<set _alreadyStored = $traitStorage.some(function(t) { return t.name === _trait; })>> <<capture _trait>> <<if _alreadyStored>> <div style="background: #333; color: #666; padding: 5px 10px; border-radius: 5px; font-size: 12px;"><<print _trait>> (stored)</div> <<else>> <<link "<div style='background: #2d2d2d; border: 1px solid #9b59b6; color: #9b59b6; padding: 5px 10px; border-radius: 5px; font-size: 12px; cursor: pointer;'><<print _trait>></div>">> <<run setup.fishing.storeTraitToStorage("mental", _trait)>> <<goto "Inventory">> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> <</if>> </div> <</if>> <<elseif $inventoryTab === "food">> <!-- Food Tab Content --> <h2 style="color: #51cf66; margin: 0 0 15px 0;">🍽️ Cooked Meals</h2> <<if !$foodInventory>><<set $foodInventory = []>><</if>> <<if $foodInventory.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 15px;"> <<for _i, _food range $foodInventory>> <<set _buffDef = setup.foodBuffs[_food.buffId]>> <<capture _i, _food, _buffDef>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; border-radius: 10px; padding: 15px;"> <div style="display: flex; align-items: center; gap: 12px; margin-bottom: 12px;"> <div style="font-size: 36px;"><<print _buffDef ? _buffDef.icon : "🍽️">></div> <div style="flex: 1;"> <div style="color: #51cf66; font-weight: bold; font-size: 16px;"><<print _food.name>></div> <div style="color: #888; font-size: 12px;"><<print _buffDef ? _buffDef.name : "Unknown Buff">></div> </div> </div> <div style="background: #0a0a0a; padding: 10px; border-radius: 6px; margin-bottom: 12px;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 5px 0;"><<print _buffDef ? _buffDef.description : "">></p> <p style="color: #1e90ff; font-size: 12px; margin: 0;">Duration: <<print Math.floor(_food.buffDuration / 60)>> hours</p> </div> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🍴 Eat</div>">> <<set $eatFoodIndex = _i>> <<goto "EatFood">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background-color: #1a1a1a; padding: 30px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="font-size: 36px; margin-bottom: 10px;">🍽️</div> <div style="color: #888; font-size: 14px;">No cooked meals in storage. Cook something in your kitchen!</div> </div> <</if>> <</if>> </div> </div> <</nobr>>
<<nobr>> <<if !$viewingNPC || !$relationships[$viewingNPC]>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">Error: NPC not found</h1> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Back to Relationships</div>" "Relationships">> <<set $viewingNPC = null>> <</link>> </div> </div> <<else>> <<set _npc = setup.getNPCByName($viewingNPC)>> <<set _rel = $relationships[$viewingNPC]>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <<set _levelData = setup.getRelationshipLevelData(_rel.level)>> <<set _levelName = _levelData ? _levelData.name : "Unknown">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div @style="'padding: 20px; background: linear-gradient(135deg, ' + _relColor + ' 0%, ' + _relColor + 'aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid ' + _relColor + '; box-shadow: 0 0 20px ' + _relColor + '66;'"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);"><<print $viewingNPC>></h1> </div> <!-- Relationship Status Card --> <div @style="'background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid ' + _relColor + '; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px ' + _relColor + '44; margin-bottom: 20px;'"> <h2 @style="'color: ' + _relColor + '; margin: 0 0 15px 0; text-shadow: 0 0 10px ' + _relColor + '88;'">Relationship Status</h2> <div style="background-color: #0a0a0a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <span style="color: #fff; font-weight: bold; font-size: 18px;"><<print _levelName>> (Level <<print _rel.level>>)</span> <<if _rel.level < 4>> <<if _rel.level === -1>> <<set _currentLevelMin = -50>> <<set _nextThreshold = 0>> <<elseif _rel.level === 0>> <<set _currentLevelMin = 0>> <<set _nextThreshold = 25>> <<elseif _rel.level === 1>> <<set _currentLevelMin = 25>> <<set _nextThreshold = 75>> <<elseif _rel.level === 2>> <<set _currentLevelMin = 75>> <<set _nextThreshold = 175>> <<else>> <<set _currentLevelMin = 175>> <<set _nextThreshold = 425>> <</if>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <<if _xpPercent < 0>><<set _xpPercent = 0>><</if>> <<if _xpPercent > 100>><<set _xpPercent = 100>><</if>> <span @style="'color: ' + _relColor + '; font-weight: bold; font-size: 18px;'"><<print _rel.points>> / <<print _nextThreshold>> points</span> <<else>> <span @style="'color: ' + _relColor + '; font-weight: bold; font-size: 18px;'">MAX LEVEL</span> <</if>> </div> <<if _rel.level < 4>> <!-- XP Progress Bar --> <div @style="'background-color: #000; border-radius: 10px; height: 25px; overflow: hidden; border: 2px solid ' + _relColor + '; box-shadow: inset 0 2px 4px rgba(0,0,0,0.8); position: relative;'"> <div @style="'background: linear-gradient(90deg, ' + _relColor + ' 0%, ' + _relColor + 'dd 100%); height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s ease; box-shadow: 0 0 15px ' + _relColor + '; position: relative; overflow: hidden;'"> <<if _xpPercent > 0>> <div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%); background-size: 200% 100%; animation: shimmer 2s infinite;"></div> <</if>> </div> </div> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 14px;"> <<print _nextThreshold - _rel.points>> points until next level </p> <<else>> <p style="color: #ff6b9d; margin: 10px 0 0 0; font-size: 14px; font-weight: bold;"> Maximum relationship level! </p> <</if>> </div> </div> <!-- NPC Information Card --> <<if _npc>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">Character Information</h2> <!-- Basic Info with Image --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: flex; gap: 20px; align-items: flex-start;"> <!-- Stats Grid --> <div style="flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 15px; color: #e0e0e0; font-size: 15px;"> <div> <strong style="color: #4dabf7;">Job:</strong><br> <<print _npc.jobs && _npc.jobs.length > 0 ? _npc.jobs.join(", ") : "Unemployed">> </div> <div> <strong style="color: #4dabf7;">Gender:</strong><br> <<print _npc.bodyParts.gender.charAt(0).toUpperCase() + _npc.bodyParts.gender.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Age:</strong><br> <<print _npc.appearance.age>> </div> <div> <strong style="color: #4dabf7;">Skin Tone:</strong><br> <<print _npc.appearance.skinTone.charAt(0).toUpperCase() + _npc.appearance.skinTone.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Hair:</strong><br> <<print _npc.appearance.hairLength ? (_npc.appearance.hairLength.charAt(0).toUpperCase() + _npc.appearance.hairLength.slice(1)) : "Unknown">> <<print _npc.appearance.hairColor>> </div> <div> <strong style="color: #4dabf7;">Build:</strong><br> <<print _npc.appearance.physique.charAt(0).toUpperCase() + _npc.appearance.physique.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Chest:</strong><br> <<print _npc.bodyParts.chest.charAt(0).toUpperCase() + _npc.bodyParts.chest.slice(1)>> </div> <div> <strong style="color: #4dabf7;">Butt:</strong><br> <<print _npc.bodyParts.butt.charAt(0).toUpperCase() + _npc.bodyParts.butt.slice(1)>> </div> <div style="grid-column: 1 / -1;"> <strong style="color: #4dabf7;">Genitals:</strong><br> <<print (_npc.bodyParts.genitals || "Unknown").charAt(0).toUpperCase() + (_npc.bodyParts.genitals || "Unknown").slice(1)>> </div> </div> <!-- NPC Image --> <<if $imageSettings.imagesEnabled && $imageSettings.npcImagesEnabled>> <<set _npcImage = setup.getNPCImage(_npc.name)>> <<if _npcImage>> <div style="flex-shrink: 0;"> <img @src="_npcImage" style="max-width: 250px; max-height: 350px; border-radius: 8px; border: 2px solid #4dabf7; box-shadow: 0 0 15px rgba(77,171,247,0.4);" onerror="this.style.display='none';"> </div> <</if>> <</if>> </div> </div> <!-- Stats --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Stats</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; color: #e0e0e0; font-size: 15px;"> <div> <span style="color: #ff6b6b;">■</span> <strong>Strength:</strong> <<print _npc.stats.strength>> </div> <div> <span style="color: #51cf66;">■</span> <strong>Dexterity:</strong> <<print _npc.stats.dexterity>> </div> <div> <span style="color: #ffd43b;">■</span> <strong>Charisma:</strong> <<print _npc.stats.charisma>> </div> <div> <span style="color: #4dabf7;">■</span> <strong>Intelligence:</strong> <<print _npc.stats.intelligence>> </div> </div> </div> <!-- Physical Traits --> <<if _npc.physicalTraits && _npc.physicalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Physical Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.physicalTraits.length; _j++>> <<if _npc.physicalTraits[_j] !== "Short Hair" && _npc.physicalTraits[_j] !== "Long Hair">> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #51cf66; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #51cf66; box-shadow: 0 0 5px #51cf6644;"> <<print _npc.physicalTraits[_j]>> </span> <</if>> <</for>> </div> </div> <</if>> <!-- Mental Traits --> <<if _npc.mentalTraits && _npc.mentalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Mental Traits</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.mentalTraits.length; _j++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #9b59b6; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #9b59b6; box-shadow: 0 0 5px #9b59b644;"> <<print _npc.mentalTraits[_j]>> </span> <</for>> </div> </div> <</if>> <!-- Skills --> <<if _npc.skills && _npc.skills.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Skills</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _j = 0; _j < _npc.skills.length; _j++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ffd43b; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #ffd43b; box-shadow: 0 0 5px #ffd43b44;"> <<print _npc.skills[_j]>> </span> <</for>> </div> </div> <</if>> </div> <</if>> <!-- Current Location (Level 3+) --> <<if _rel.level >= 3>> <<set _currentDay = $dayOfWeek || "Monday">> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <<set _npcLocation = setup.getNPCLocation(_npc, _currentDay, _currentHour)>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">📍 Current Location</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <<if _npcLocation>> <div style="color: #e0e0e0; font-size: 16px; text-align: center;"> <span style="color: #51cf66; font-weight: bold; font-size: 18px;"> <<print _npcLocation.replace(/([A-Z])/g, ' $1').trim()>> </span> </div> <div style="color: #aaa; font-size: 14px; text-align: center; margin-top: 8px;"> As of <<print _currentDay>>, <<print _currentHour>>:00 </div> <<else>> <div style="color: #ff6b6b; font-size: 16px; text-align: center;"> Location unknown </div> <</if>> </div> <p style="color: #aaa; margin: 10px 0 0 0; font-size: 13px; font-style: italic; text-align: center;"> You know where they are! </p> </div> <</if>> <!-- Desired Traits (Level 4+) --> <<if _rel.level >= 4 && _npc>> <<set _tradePrefs = setup.npcTradingPreferences[_npc.name] || null>> <<if _tradePrefs && _tradePrefs.desires>> <<set _desires = _tradePrefs.desires>> <<set _hasDesires = (_desires.skills && _desires.skills.length > 0) || (_desires.mental && _desires.mental.length > 0) || (_desires.physical && _desires.physical.length > 0) || (_desires.bodyParts && _desires.bodyParts.length > 0) || (_desires.chestSize && _desires.chestSize.length > 0) || (_desires.buttSize && _desires.buttSize.length > 0) || (_desires.genitals && _desires.genitals.length > 0)>> <<if _hasDesires>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e83e8c; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(232, 62, 140, 0.3); margin-bottom: 20px;"> <h2 style="color: #e83e8c; margin: 0 0 15px 0;">💝 Desired Traits</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 13px; font-style: italic;"> Your close relationship has revealed what traits they desire in trades. </p> <<if _desires.skills && _desires.skills.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333;"> <h4 style="color: #ffd43b; margin: 0 0 8px 0; font-size: 14px;">Skills Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.skills.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ffd43b; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #ffd43b;"> <<print _desires.skills[_i]>> </span> <</for>> </div> </div> <</if>> <<if _desires.mental && _desires.mental.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333;"> <h4 style="color: #9b59b6; margin: 0 0 8px 0; font-size: 14px;">Mental Traits Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.mental.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #9b59b6; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #9b59b6;"> <<print _desires.mental[_i]>> </span> <</for>> </div> </div> <</if>> <<if _desires.physical && _desires.physical.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333;"> <h4 style="color: #51cf66; margin: 0 0 8px 0; font-size: 14px;">Physical Traits Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.physical.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #51cf66; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #51cf66;"> <<print _desires.physical[_i]>> </span> <</for>> </div> </div> <</if>> <<if _desires.chestSize && _desires.chestSize.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333;"> <h4 style="color: #ff6b9d; margin: 0 0 8px 0; font-size: 14px;">Chest Size Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.chestSize.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ff6b9d; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #ff6b9d;"> <<print _desires.chestSize[_i].charAt(0).toUpperCase() + _desires.chestSize[_i].slice(1)>> </span> <</for>> </div> </div> <</if>> <<if _desires.buttSize && _desires.buttSize.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 10px; border: 1px solid #333;"> <h4 style="color: #ff9f43; margin: 0 0 8px 0; font-size: 14px;">Butt Size Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.buttSize.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ff9f43; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #ff9f43;"> <<print _desires.buttSize[_i].charAt(0).toUpperCase() + _desires.buttSize[_i].slice(1)>> </span> <</for>> </div> </div> <</if>> <<if _desires.genitals && _desires.genitals.length > 0>> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333;"> <h4 style="color: #a29bfe; margin: 0 0 8px 0; font-size: 14px;">Genitals Wanted:</h4> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _i = 0; _i < _desires.genitals.length; _i++>> <span style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #a29bfe; padding: 4px 10px; border-radius: 12px; font-size: 12px; border: 1px solid #a29bfe;"> <<print _desires.genitals[_i].charAt(0).toUpperCase() + _desires.genitals[_i].slice(1)>> </span> <</for>> </div> </div> <</if>> </div> <</if>> <</if>> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2);'>← Back to Relationships</div>" "Relationships">> <<set $viewingNPC = null>> <</link>> </div> </div> <</if>> <</nobr>> <style> @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } </style>
<<nobr>> <<set $lastLocation = "GymLockerRoom">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("GymLockerRoom")>> <<run $visitedLocations.push("GymLockerRoom")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #667eeaaa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 0 20px #667eea66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🚿 Locker Room</h1> </div> <!-- Shower Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #667eea; margin: 0 0 15px 0;">💧 Shower</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.6; margin: 0;"> The locker room is clean and well-maintained. Rows of lockers line the walls, and you can hear the sound of running water from the shower stalls. </p> </div> <span id="showerMessage"></span> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🚿 Take a Shower</div>">> <<replace "#showerMessage">> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0; text-align: center;"> ✨ You take a refreshing shower and feel clean and rejuvenated! </p> </div> <</replace>> <</link>> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back</div>">> <<goto "OpahFitness">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "GymNPCs">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("GymNPCs")>> <<run $visitedLocations.push("GymNPCs")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #e91e63 0%, #e91e63aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63; box-shadow: 0 0 20px #e91e6366;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">👥 Gym Floor</h1> </div> <!-- Get NPCs at this location --> <<set _npcsHere = setup.getNPCsAtLocation("GymNPCs")>> <<if _npcsHere && _npcsHere.length > 0>> <!-- NPCs Present --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #f48fb1; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic;"> You spot some people working out on the gym floor... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #f48fb1; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Empty State --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">🏋️</div> <h2 style="color: #e91e63; margin: 0 0 15px 0;">Nobody Around Right Now</h2> <p style="color: #aaa; font-size: 16px; line-height: 1.6; max-width: 500px; margin: 0 auto;"> The gym floor is pretty empty at the moment. You don't see anyone you can chat with right now. Maybe try coming back later? </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back</div>">> <<goto "OpahFitness">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">💪 Physical Traits</h2> <<if $physicalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Current Traits:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $physicalTraits.length; _i++>> <<set _currentTrait = $physicalTraits[_i]>> <<if _currentTrait !== "Short Hair" && _currentTrait !== "Long Hair" && (!setup.exclusiveTraitGroups || !setup.exclusiveTraitGroups.voice || !setup.exclusiveTraitGroups.voice.includes(_currentTrait))>> <<capture _i, _currentTrait>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #51cf66; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #51cf66; box-shadow: 0 0 5px #51cf6644; cursor: pointer;'>" + _currentTrait + " ✕</span>"`>> <<run $physicalTraits.deleteAt(_i)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">Add Trait:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _physicalTraitList = [ "Artistic|INT +2, DEX +2", "Athletic Build|STR +5, DEX +5", "Attractive|CHA +8", "Blemished|CHA -4", "Broad-shouldered|STR +4", "Clumsy|DEX -6", "Curvy|CHA +5", "Customer-Focused|CHA +3, INT +1", "Dark Skin|None", "Deep Thinker|INT +4", "Detail-Oriented|INT +3, DEX +2", "Fashionable|CHA +5", "Fast|DEX +6", "Fit|STR +5, DEX +4", "Flexible|DEX +6", "Freckled|CHA +2", "Graceful|DEX +6, CHA +3", "High Energy|DEX +3, CHA +4", "Humorous|CHA +2", "Lactating|None", "Lean|DEX +4, STR +2", "Mature|INT +4, CHA +2", "Monotone Expression|INT +1", "Muscular|STR +8", "Overweight|STR -4, DEX -4, CHA -3", "Pale Skin|None", "Perceptive|INT +3, CHA +1", "Petite|DEX +4", "Pierced|CHA +2", "Plain|CHA -3", "Punctual|INT +1, CHA +1", "Quick|DEX +5", "Quick Reflexes|DEX +6", "Relaxed|CHA +2", "Sarcastic|CHA +2, INT +1", "Scarred|STR +2, CHA -3", "Sharp Features|CHA +4", "Short|None", "Slow|DEX -5, STR -2", "Smooth Skin|CHA +3", "Soft|CHA +3", "Stiff|DEX -5", "Strong|STR +7", "Sturdy|STR +4", "Tall|None", "Tan Skin|None", "Tattooed|CHA +3", "Tech Savvy|INT +5, DEX +2", "Ugly|CHA -8", "Underweight|STR -5, CHA -2", "Voluptuous|CHA +6", "Weak|STR -7", "Youthful|CHA +3, DEX +2" ]>> <<for _j = 0; _j < _physicalTraitList.length; _j++>> <<set _traitData = _physicalTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $physicalTraits.includes(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $physicalTraits)>> <<if !_hasTrait>> <<capture _trait, _conflict, _bonuses>> <<if _conflict>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span><br><span style='font-size: 10px;'>⚠️ Conflicts: " + _conflict + "</span></div>"`>> <<run $physicalTraits.delete(_conflict)>> <<run $physicalTraits.push(_trait)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <<else>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $physicalTraits.push(_trait)>> <<replace "#physicalTraitsSection">><<include "CheatMenuPhysicalTraits">><</replace>> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #da77f2; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #da77f2; margin: 0 0 15px 0;">🎤 Voice Trait</h2> <<set _currentVoiceTrait = null>> <<for _i = 0; _i < $physicalTraits.length; _i++>> <<if setup.exclusiveTraitGroups.voice.includes($physicalTraits[_i])>> <<set _currentVoiceTrait = $physicalTraits[_i]>> <<break>> <</if>> <</for>> <<if _currentVoiceTrait>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #da77f2; margin: 0 0 10px 0;">Current Voice:</h3> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #da77f2; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #da77f2; box-shadow: 0 0 5px #da77f244; cursor: pointer;'>" + _currentVoiceTrait + " ✕</span>"`>> <<run $physicalTraits.delete(_currentVoiceTrait)>> <<replace "#voiceTraitsSection">><<include "CheatMenuVoiceTraits">><</replace>> <</link>> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #da77f2; margin: 0 0 10px 0;"><<print _currentVoiceTrait ? "Change Voice:" : "Add Voice:">></h3> <p style="color: #ffd43b; font-size: 13px; margin: 0 0 10px 0;">⚠️ Only one voice trait allowed at a time</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _voiceTraitList = [ "Animated Tone|CHA +4", "Articulate Speech|CHA +4, INT +3", "Balanced Neutral Tone|None", "Bouncy Tone|CHA +3", "Breathy Voice|CHA +2", "Calm Voice|CHA +3", "Charming Tone|CHA +5", "Choppy Speech|CHA -2", "Clear Enunciation|CHA +3, INT +2", "Clear Pronunciation|CHA +3, INT +2", "Croaky Voice|CHA -2", "Deadpan Delivery|INT +2, CHA -2", "Deep Voice|CHA +2", "Detached Voice|CHA -3", "Eager Tone|CHA +3", "Emotionless Tone|CHA -4", "Even-Paced Voice|CHA +2", "Expressive Voice|CHA +5", "Fast Talker|DEX +2, CHA -1", "Flat Voice|CHA -2", "Friendly Tone|CHA +4", "Gentle Voice|CHA +3", "Gravelly Voice|CHA +1", "Grim Tone|CHA -2", "High-Pitched Tone|CHA -1", "Hushed Intimate Voice|CHA +4", "Interruptive Tone|CHA -3", "Lazy Drawl|CHA -2", "Lively Tone|CHA +4", "Measured Speech|INT +3", "Melodic Voice|CHA +5", "Monotone|CHA -3", "Mumbly Voice|CHA -4", "Nasally Tone|CHA -3", "Pleasant Cadence|CHA +4", "Rapid-Fire Speech|DEX +3, CHA -2", "Raspy Voice|None", "Robotic Tone|INT +2, CHA -3", "Shaky Voice|CHA -3", "Sharp Voice|CHA -1", "Silky Voice|CHA +5", "Sing-Songy Voice|CHA +3", "Slow Calm Voice|CHA +2", "Smooth Talker|CHA +6", "Smooth Voice|CHA +4", "Snappy Tone|CHA -2", "Soft Monologue Style|CHA +2", "Soft-Spoken|CHA +2", "Soothing Tone|CHA +4", "Steady Voice|CHA +3", "Stoic Tone|INT +2, CHA -1", "Stuttering Speech|CHA -3", "Understated Voice|CHA +1", "Warm Tone|CHA +5" ]>> <<for _j = 0; _j < _voiceTraitList.length; _j++>> <<set _traitData = _voiceTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $physicalTraits.includes(_trait)>> <<if !_hasTrait>> <<capture _trait, _bonuses>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<if _currentVoiceTrait>> <<run $physicalTraits.delete(_currentVoiceTrait)>> <</if>> <<run $physicalTraits.push(_trait)>> <<replace "#voiceTraitsSection">><<include "CheatMenuVoiceTraits">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">🧠 Mental Traits</h2> <<if $mentalTraits.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Current Traits:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $mentalTraits.length; _i++>> <<set _currentTrait = $mentalTraits[_i]>> <<capture _i, _currentTrait>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #9b59b6; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #9b59b6; box-shadow: 0 0 5px #9b59b644; cursor: pointer;'>" + _currentTrait + " ✕</span>"`>> <<run $mentalTraits.deleteAt(_i)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Add Trait:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _mentalTraitList = [ "Aggressive|STR +5, CHA -2", "Alluring|CHA +7", "Ambitious|INT +4, CHA +3", "Analytical|INT +5", "Arrogant|CHA -6, INT -2", "Awkward|CHA -4", "Bimbo|INT -40, CHA +10", "Bitchy|CHA -5, INT -2", "Blunt|CHA -2, INT +2", "Bookworm|INT +6", "Brave|STR +4, CHA +3", "Calm|INT +2, CHA +2", "Charming|CHA +6", "Chill|CHA +3, INT +2", "Clingy|CHA -3", "Cold|CHA -5", "Complacent|INT -4, STR -3", "Competitive|STR +3, INT +2", "Confident|CHA +6", "Considerate|CHA +5", "Corporate Drone|INT +2, CHA -2", "Corrupt|CHA +1", "Cowardly|STR -5, CHA -4", "Crafty|INT +4, DEX +3", "Creative|INT +5", "Cruel|CHA -8, INT -2", "Curious|INT +3", "Customer-Focused|CHA +4, INT +2", "Cynical|INT +2, CHA -3", "Deceitful|CHA -5, INT -2", "Delinquent|STR +7, DEX +4, CHA -3", "Determined|STR +4, INT +2", "Detail-Oriented|INT +5", "Diplomatic|CHA +5, INT +3", "Direct|CHA +2, INT +1", "Disciplined|STR +3, INT +3", "Disorganized|INT -4, DEX -2", "Diva|CHA +6, INT -3", "Dominant|CHA +4, STR +3", "Dull|INT -6, CHA -3", "Efficient|INT +4, DEX +2", "Empathetic|CHA +5, INT +2", "Energetic|DEX +2, CHA +2", "Erratic|CHA -4, INT -3", "Extroverted|CHA +5", "Femboy|CHA +4, DEX +3", "Flirty|CHA +5", "Focused|INT +4", "Foolish|INT -7, CHA -2", "Forgetful|INT -5", "Friendly|CHA +6", "Funny|CHA +5", "Gambling Addiction|CHA +2, INT -5", "Geek|INT +5, CHA -1", "Goth|CHA +2, INT +2", "Hardworking|STR +3, INT +3", "High Stamina|STR +6, DEX +3", "Honest|CHA +3, INT -2", "Humble|CHA +4", "Impatient|INT -3, CHA -4", "Impulsive|DEX +3, INT -3", "Insecure|CHA -5", "Insensitive|CHA -5", "Intelligent|INT +5", "Introverted|INT +3, CHA -3", "Jealous|CHA -5, INT -2", "Jock|STR +5, DEX +4, INT -2", "Kind|CHA +6", "Lazy|STR -5, INT -4", "Logical|INT +6", "Loyal|CHA +4", "Lucky|CHA +3, DEX +3", "Moody|CHA -3", "Negotiator|CHA +6, INT +3", "Nerd|INT +6, CHA -2", "Nonchalant|CHA +2", "Obsessive|INT -3, CHA -4", "Optimistic|CHA +4", "Organized|INT +4", "Outgoing|CHA +4", "Overthinker|INT +3, CHA -3", "Paranoid|INT +2, CHA -4", "Passive|CHA -2, INT +3", "Patient|INT +3, CHA +2", "Perceptive|INT +5", "Perfectionist|INT +4, CHA -2", "Perverted|None", "Pessimistic|INT +3, CHA -3", "Polite|CHA +4", "Prep|CHA +5, INT +2", "Punctual|INT +2", "Quiet|CHA -2, INT +2", "Quick Learner|INT +5", "Reassuring|CHA +4", "Reckless|INT -4, STR -3", "Resourceful|INT +5, DEX +2", "Risk Taker|STR +3, INT -2", "Rude|CHA -6", "Seductive|CHA +6", "Selfish|CHA -6", "Sensitive|CHA -2, INT +2", "Short Tempered|CHA -5, INT -2", "Shrewd|INT +5, CHA +2", "Shy|CHA -5, INT +2", "Slow Learner|INT -6", "Musky|CHA +2", "Sly|INT +4, CHA +2", "Steadfast|STR +3, INT +2", "Stubborn|STR +4, INT -2", "Submissive|CHA -3, DEX +2", "Supportive|CHA +5", "Talkative|CHA +3", "Tease|CHA +2", "Thoughtful|INT +3", "Tomboy|STR +3, DEX +3, CHA -2", "Tone Deaf|CHA -3", "Trusting|CHA +3", "Unskilled|DEX -5, INT -3", "Unlucky|CHA -3, DEX -3", "Unpredictable|CHA -2", "Unreliable|CHA -5, INT -3", "Warm|CHA +5", "Wise|INT +7", "Witty|CHA +3, INT +2", "Workaholic|INT +3, STR +2" ]>> <<for _j = 0; _j < _mentalTraitList.length; _j++>> <<set _traitData = _mentalTraitList[_j].split("|")>> <<set _trait = _traitData[0]>> <<set _bonuses = _traitData[1]>> <<set _hasTrait = $mentalTraits.includes(_trait)>> <<set _conflict = setup.getConflictingTrait(_trait, $mentalTraits)>> <<if !_hasTrait>> <<capture _trait, _conflict, _bonuses>> <<if _conflict>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span><br><span style='font-size: 10px;'>⚠️ Conflicts: " + _conflict + "</span></div>"`>> <<run $mentalTraits.delete(_conflict)>> <<run $mentalTraits.push(_trait)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <<else>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _trait + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $mentalTraits.push(_trait)>> <<replace "#mentalTraitsSection">><<include "CheatMenuMentalTraits">><</replace>> <</link>> <</if>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff922b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff922b; margin: 0 0 15px 0;">⚡ Skills</h2> <<if $skills.length > 0>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff922b; margin: 0 0 10px 0;">Current Skills:</h3> <div style="display: flex; flex-wrap: wrap; gap: 8px;"> <<for _i = 0; _i < $skills.length; _i++>> <<set _currentSkill = $skills[_i]>> <<if _currentSkill !== "Sunfish">> <<capture _i, _currentSkill>> <<link `"<span style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); color: #ff922b; padding: 6px 12px; border-radius: 15px; font-size: 13px; border: 1px solid #ff922b; box-shadow: 0 0 5px #ff922b44; cursor: pointer;'>" + _currentSkill + " ✕</span>"`>> <<run $skills.deleteAt(_i)>> <<replace "#skillsSection">><<include "CheatMenuSkills">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> <</if>> <!-- Add All Button --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333; text-align: center;"> <<link "<div style='background: linear-gradient(135deg, #ff922b 0%, #ff6b35 100%); border: 2px solid #ff922b; color: white; padding: 12px 30px; border-radius: 8px; display: inline-block; cursor: pointer; font-weight: bold; font-size: 14px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #ff922b44;'>✨ Add All Skills</div>">> <<set _skillList = [ "Accounting", "Acting", "Anal Expert", "Art", "Athletics", "Baking", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Cleaning", "Coding", "Combat", "Construction", "Cooking", "Criminal Deluxe", "Customer Service", "Dancing", "Dirty Talker", "Driving", "Exhibitionist", "First Aid", "Foreign Language", "Forklift Certified", "Gardening", "Guitar", "Hair Styling", "Heavy Lifting", "High Heels Proficient", "Inventory Management", "Languages", "Legal Knowledge", "Lock Picking", "Maid", "Makeup", "Management", "Martial Arts", "Math Skills", "Medicine", "Modeling", "Music", "Occult Expert", "Oral Expert", "Painting", "Persuasion", "Photography", "Piano", "Plumbing", "Product Knowledge", "Public Speaking", "Retail", "Roleplay Expert", "Rough Sex Enthusiast", "Sales", "Sensual Lover", "Serving", "Sexually Skilled", "Sexual Stamina Expert", "Singing", "Social Media", "Stealth", "Swimmer", "Swimming", "Tantric Master", "Teaching", "Tech-Savvy", "Tit Worship Expert", "Titfuck Master", "Animation", "Basketball", "Building PCs", "Business", "Combat Training", "Fashion Design", "Finance", "Gaming", "Investigation", "Leadership", "Magic Theory", "Mechanical Repair", "Meditation", "Navigation", "Quick Learner", "Social Skills", "Trading", "Troubleshooting", "Video Editing", "Writing", "Yoga" ]>> <<for _k = 0; _k < _skillList.length; _k++>> <<if !$skills.includes(_skillList[_k])>> <<run $skills.push(_skillList[_k])>> <</if>> <</for>> <<replace "#skillsSection">><<include "CheatMenuSkills">><</replace>> <</link>> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff922b; margin: 0 0 10px 0;">Add Skill:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; max-height: 400px; overflow-y: auto; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <<set _skillList = [ "Accounting|INT +6", "Acting|CHA +6, INT +2", "Anal Expert|CHA +6, DEX +6", "Animation|INT +3, DEX +4", "Art|DEX +4, INT +3", "Athletics|STR +5, DEX +4", "Baking|DEX +4, INT +2", "Basketball|STR +3, DEX +4", "BDSM Enthusiast - Dom|CHA +8, STR +4", "BDSM Enthusiast - Sub|CHA +6", "Building PCs|INT +4, DEX +2", "Business|INT +5, CHA +3", "Cleaning|DEX +3", "Coding|INT +6", "Combat|STR +6, DEX +3", "Combat Training|STR +5, DEX +3", "Construction|STR +5, INT +2", "Cooking|INT +3, DEX +2", "Criminal Deluxe|DEX +100, INT +100, CHA +100", "Customer Service|CHA +3, INT +1", "Dancing|DEX +5, CHA +3", "Dirty Talker|CHA +7", "Driving|DEX +4", "Exhibitionist|CHA +6", "Fashion Design|CHA +4, DEX +3", "Finance|INT +6", "First Aid|INT +4", "Foreign Language|INT +5", "Forklift Certified|DEX +3, STR +2", "Gaming|DEX +3, INT +2", "Gardening|INT +2, STR +2", "Guitar|DEX +4, CHA +2", "Hair Styling|DEX +5, CHA +2", "Heavy Lifting|STR +7", "High Heels Proficient|DEX +4, CHA +2", "Inventory Management|INT +3, DEX +1", "Investigation|INT +5, DEX +2", "Languages|INT +5", "Leadership|CHA +5, INT +3", "Legal Knowledge|INT +7", "Lock Picking|DEX +6, INT +2", "Magic Theory|INT +7", "Maid|DEX +4", "Makeup|DEX +3, CHA +3", "Management|INT +5, CHA +4", "Martial Arts|STR +5, DEX +5", "Math Skills|INT +5", "Mechanical Repair|STR +3, INT +3", "Medicine|INT +7", "Meditation|INT +4", "Modeling|CHA +6", "Music|DEX +3, CHA +4", "Navigation|INT +4", "Occult Expert|INT +30", "Oral Expert|CHA +8, DEX +4", "Painting|DEX +4, INT +3", "Persuasion|CHA +7", "Photography|INT +3, CHA +2", "Piano|DEX +5, INT +2", "Plumbing|STR +3, INT +2", "Product Knowledge|INT +2, CHA +1", "Public Speaking|CHA +6, INT +2", "Quick Learner|None", "Retail|CHA +3, INT +2", "Roleplay Expert|CHA +8, INT +4", "Rough Sex Enthusiast|STR +6, CHA +4", "Sales|CHA +6, INT +2", "Sensual Lover|CHA +10", "Serving|CHA +4, DEX +2", "Sexually Skilled|CHA +5, DEX +2", "Sexual Stamina Expert|STR +12, DEX +8", "Singing|CHA +5", "Social Media|CHA +5, INT +2", "Social Skills|CHA +5", "Stealth|DEX +6", "Swimmer|STR +4, DEX +3", "Swimming|STR +4, DEX +3", "Tantric Master|CHA +10, INT +6", "Teaching|INT +5, CHA +3", "Tech-Savvy|INT +3, DEX +1", "Tit Worship Expert|CHA +7, DEX +3", "Titfuck Master|CHA +8, DEX +5", "Trading|CHA +4, INT +3", "Troubleshooting|INT +3, DEX +2", "Video Editing|INT +3, DEX +2", "Writing|INT +5", "Yoga|DEX +5, INT +2" ]>> <<for _j = 0; _j < _skillList.length; _j++>> <<set _skillData = _skillList[_j].split("|")>> <<set _skill = _skillData[0]>> <<set _bonuses = _skillData[1]>> <<set _hasSkill = $skills.includes(_skill)>> <<if !_hasSkill>> <<capture _skill, _bonuses>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff922b; color: #ff922b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 11px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'><strong>" + _skill + "</strong><br><span style='font-size: 9px;'>" + _bonuses + "</span></div>"`>> <<run $skills.push(_skill)>> <<replace "#skillsSection">><<include "CheatMenuSkills">><</replace>> <</link>> <</capture>> <</if>> <</for>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIP">> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 30px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FFD700; box-shadow: 0 0 30px rgba(255, 215, 0, 0.5), inset 0 0 20px rgba(255, 165, 0, 0.2);"> <h1 style="color: #FFD700; text-align: center; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255, 215, 0, 0.8), 0 0 40px rgba(255, 165, 0, 0.6);">👑 VIP Lounge</h1> <p style="color: #FFE4B5; text-align: center; margin: 10px 0 0 0; font-size: 18px; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Elite Members Only </p> </div> <!-- Description --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 30px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, #9D00FF, #FFD700, transparent); opacity: 0.8;"></div> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Behind the velvet rope lies true luxury. The VIP lounge is bathed in soft purple and gold lighting, with plush leather booths and champagne on ice. Here, the club's most exclusive services are available—intimate performances by the best strippers, complete privacy, and absolute discretion. </p> </div> <!-- Available Strippers --> <<set _strippers = setup.getNPCsByJob("Stripper")>> <<if _strippers && _strippers.length > 0>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💃 Available Strippers</h2> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 25px; border-radius: 15px; margin-bottom: 30px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.3);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px;"> <<for _npc range _strippers>> <<capture _npc>> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 20px rgba(255, 20, 147, 0.3), 0 8px 16px rgba(0,0,0,0.6); position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 3px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h3 style="color: #FF1493; margin: 0 0 15px 0; font-size: 24px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);"><<= _npc.name>></h3> <!-- Service Options --> <div style="background: #0a0a0a; padding: 15px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #FFD700; box-shadow: 0 0 15px rgba(255, 215, 0, 0.2);"> <p style="color: #FFD700; font-size: 18px; font-weight: bold; margin: 0 0 8px 0; text-shadow: 0 0 10px rgba(255, 215, 0, 0.6);">💎 Private Dance: $500</p> <p style="color: #D8BFD8; font-size: 14px; margin: 0; line-height: 1.5;">An intimate, personal performance just for you. One-on-one in a private room.</p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<if $money >= 500>> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(255, 20, 147, 0.5); font-size: 14px;'>💃 Book Show</div>">> <<set $money -= 500>> <<set $currentVIPStriper = _npc>> <<goto "StripClubVIPPrivateDance">> <</link>> <<else>> <div style='background: #444; color: #666; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; cursor: not-allowed; font-size: 14px; border: 2px solid #666;'>💃 Book Show</div> <</if>> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 12px rgba(157, 0, 255, 0.4); font-size: 14px;'>💬 Chat</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💃 Available Strippers</h2> <div style="background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%); padding: 30px; border-radius: 15px; margin-bottom: 30px; border: 3px solid #666; box-shadow: 0 0 15px rgba(102, 102, 102, 0.2);"> <p style="text-align: center; color: #888; margin: 0; font-style: italic; font-size: 16px;"> No strippers are available in the VIP lounge right now. Check back later. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← Back to Main Floor</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e91e63; margin: 0 0 15px 0;">💕 NPC Relationships</h2> <!-- NPC List --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333; max-height: 500px; overflow-y: auto;"> <<if Object.keys($relationships).length === 0>> <p style="color: #999; font-style: italic; margin: 0; text-align: center; padding: 20px;">No NPC relationships initialized yet</p> <<else>> <<set _hasMetNPCs = false>> <<set _relationshipKeys = Object.keys($relationships)>> <<for _i = 0; _i < _relationshipKeys.length; _i++>> <<set _npcName = _relationshipKeys[_i]>> <<set _rel = $relationships[_npcName]>> <<if $metNPCs.includes(_npcName)>> <<set _hasMetNPCs = true>> <<capture _npcName, _rel>> <<set _relColor = setup.getRelationshipColor(_rel.level)>> <div @style="'background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 12px; border: 2px solid ' + _relColor + '; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'"> <!-- NPC Header --> <<set _levelData = setup.getRelationshipLevelData(_rel.level)>> <<set _levelName = _levelData ? _levelData.name : "Unknown">> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;"> <strong @style="'color: ' + _relColor + '; font-size: 18px;'"><<print _npcName>></strong> <span @style="'color: #fff; font-size: 14px; background: #0a0a0a; padding: 6px 12px; border-radius: 6px; border: 1px solid ' + _relColor + ';'"> <<print _levelName>> (<<print _rel.points>> points) </span> </div> <!-- XP Progress Bar --> <div style="margin-bottom: 12px;"> <<if _rel.level < 4>> <<if _rel.level === -1>> <<set _currentLevelMin = -50>> <<set _nextThreshold = 0>> <<elseif _rel.level === 0>> <<set _currentLevelMin = 0>> <<set _nextThreshold = 25>> <<elseif _rel.level === 1>> <<set _currentLevelMin = 25>> <<set _nextThreshold = 75>> <<elseif _rel.level === 2>> <<set _currentLevelMin = 75>> <<set _nextThreshold = 175>> <<else>> <<set _currentLevelMin = 175>> <<set _nextThreshold = 425>> <</if>> <<set _xpInLevel = _rel.points - _currentLevelMin>> <<set _xpNeededForLevel = _nextThreshold - _currentLevelMin>> <<set _xpPercent = Math.floor((_xpInLevel / _xpNeededForLevel) * 100)>> <<if _xpPercent < 0>><<set _xpPercent = 0>><</if>> <<if _xpPercent > 100>><<set _xpPercent = 100>><</if>> <div style="display: flex; justify-content: space-between; font-size: 13px; color: #e0e0e0; margin-bottom: 6px; font-weight: bold;"> <span>Points: <<print _rel.points>> / <<print _nextThreshold>></span> <span><<print _xpPercent>>%</span> </div> <div style="background: #0a0a0a; border-radius: 6px; height: 12px; overflow: hidden; border: 1px solid #444;"> <div @style="'background: ' + _relColor + '; height: 100%; width: ' + _xpPercent + '%; transition: width 0.3s;'"></div> </div> <<else>> <div style="text-align: center; font-size: 14px; color: #51cf66; font-weight: bold;"> MAX LEVEL REACHED </div> <</if>> </div> <!-- Points Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10 Points</div>">> <<run setup.addRelationshipPoints(_npcName, 10)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+50 Points</div>">> <<run setup.addRelationshipPoints(_npcName, 50)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Max Level</div>">> <<run setup.addRelationshipPoints(_npcName, 1000)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> <!-- Negative Points Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-10 Points</div>">> <<run setup.addRelationshipPoints(_npcName, -10)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-25 Points</div>">> <<run setup.addRelationshipPoints(_npcName, -25)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff4444 0%, #cc0000 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Min Level</div>">> <<run setup.addRelationshipPoints(_npcName, -1000)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> <!-- Control Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to Stranger</div>">> <<set $relationships[_npcName] = { level: 0, points: 0 }>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Complete Reset</div>">> <<set $relationships[_npcName] = { level: 0, points: 0 }>> <<run $metNPCs.delete(_npcName)>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> </div> </div> <</capture>> <</if>> <</for>> <<if !_hasMetNPCs>> <p style="color: #999; font-style: italic; margin: 0; text-align: center; padding: 20px;">No NPCs met yet. Explore the world to meet characters!</p> <</if>> <</if>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIPPrivateDance">> <!-- Initialize private dance variables --> <<set $privateDanceTips = 0>> <<set $privateDanceStage = 1>> <<set $privateDanceActions = []>> <<set $privateDanceMistreated = false>> <!-- Get NPC info --> <<set _stripper = $currentVIPStriper>> <<set _stripperGender = (_stripper.bodyParts && _stripper.bodyParts.gender) || _stripper.gender || "female">> <<set _playerGender = $bodyParts.gender || "male">> <!-- Check traits --> <<set _isSeductive = _stripper.physicalTraits && _stripper.physicalTraits.includes("Seductive")>> <<set _isConfident = _stripper.mentalTraits && _stripper.mentalTraits.includes("Confident")>> <<set _isShy = _stripper.mentalTraits && _stripper.mentalTraits.includes("Shy")>> <<set _isAlluring = _stripper.physicalTraits && _stripper.physicalTraits.includes("Alluring")>> <<set _isGraceful = _stripper.physicalTraits && _stripper.physicalTraits.includes("Graceful")>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.5), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <h1 style="color: #FF1493; text-align: center; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8), 0 0 40px rgba(157, 0, 255, 0.6);">💃 Private Dance</h1> <p style="color: #FFB6C1; text-align: center; margin: 10px 0 0 0; font-size: 18px; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> An Exclusive Performance by <<= _stripper.name>> </p> </div> <!-- Scene Setting --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 35px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9D00FF, #FF1493, #9D00FF, transparent); opacity: 0.8;"></div> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The VIP room door closes with a soft click, sealing you in privacy. Purple and pink lights pulse gently across velvet walls. A plush chair sits in the center of the room, positioned perfectly for the show. </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _isShy>> <<= _stripper.name>> gives you a nervous but genuine smile, fingers fidgeting slightly. "Make yourself comfortable," <<if _stripperGender === "female">>she<<else>>he<</if>> says softly. The shyness only makes <<if _stripperGender === "female">>her<<else>>him<</if>> more endearing. <<elseif _isConfident>> <<= _stripper.name>> locks eyes with you, a confident smirk playing on <<if _stripperGender === "female">>her<<else>>his<</if>> lips. "Sit back and enjoy the show," <<if _stripperGender === "female">>she<<else>>he<</if>> purrs, voice dripping with self-assurance. <<elseif _isSeductive>> <<= _stripper.name>> circles you slowly, one finger trailing along your shoulder. "I'm going to make this worth every penny," <<if _stripperGender === "female">>she<<else>>he<</if>> whispers close to your ear, breath hot against your skin. <<else>> <<= _stripper.name>> gives you a warm smile. "Ready for your private show?" <<if _stripperGender === "female">>she<<else>>he<</if>> asks, already beginning to move to the music. <</if>> </p> <p style="color: #D8BFD8; font-size: 16px; line-height: 1.7; margin: 0; font-style: italic; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The music starts—a slow, sensual beat that seems to pulse in time with your heartbeat. </p> </div> <!-- Performance Stage 1 --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 35px; border-radius: 15px; border: 3px solid #FF69B4; box-shadow: 0 0 25px rgba(255, 105, 180, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF69B4, transparent); opacity: 0.8;"></div> <h3 style="color: #FF69B4; margin: 0 0 20px 0; font-size: 24px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.8);">🎭 The Show Begins</h3> <p style="color: #fff; font-size: 17px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _isGraceful>> <<= _stripper.name>> moves with liquid grace, each motion flowing perfectly into the next. <<if _stripperGender === "female">>Her<<else>>His<</if>> body sways hypnotically, hands gliding over <<if _stripperGender === "female">>her<<else>>his<</if>> curves in time with the music. <<else>> <<= _stripper.name>> begins to strip, body moving sensually to the rhythm. <<if _stripperGender === "female">>Her<<else>>His<</if>> hips roll in slow circles as <<if _stripperGender === "female">>she<<else>>he<</if>> runs hands through <<if _stripperGender === "female">>her<<else>>his<</if>> hair. <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> She turns slowly, giving you a view of her ass as she bends forward, looking back over her shoulder with a teasing smile. Her hands slide up her thighs, pushing her skirt higher... <<else>> He turns, showing you his toned back and ass as he moves. His hands slide over his chest, fingers teasing at the buttons of his shirt... <</if>> </p> </div> <!-- Tip Options --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 30px; border: 3px solid #FFD700; box-shadow: 0 0 20px rgba(255, 215, 0, 0.3);"> <h3 style="color: #FFD700; margin: 0 0 20px 0; text-align: center; text-shadow: 0 0 10px rgba(255, 215, 0, 0.6);">💵 Show Your Appreciation</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Just Watch --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #666;"> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Keep enjoying the standard show</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>👀 Just Watch</div>">> <<goto "StripClubVIPPrivateDanceStage2">> <</link>> </div> <!-- Tip $50 --> <<if $money >= 50>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Show more skin, tease me</p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💵 Tip $50</div>">> <<set $money -= 50>> <<set $privateDanceTips += 50>> <<run $privateDanceActions.push("tipped_stage1")>> <<goto "StripClubVIPPrivateDanceStage2">> <</link>> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #444; opacity: 0.5;"> <p style="color: #666; font-size: 14px; margin: 0 0 10px 0;">Show more skin, tease me</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💵 Tip $50 (Broke)</div> </div> <</if>> <!-- Tip $100 --> <<if $money >= 100>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #FFD700;"> <p style="color: #FFD700; font-size: 14px; margin: 0 0 10px 0;">Get closer, let me touch</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💰 Tip $100</div>">> <<set $money -= 100>> <<set $privateDanceTips += 100>> <<run $privateDanceActions.push("touching_stage1")>> <<goto "StripClubVIPPrivateDanceStage2">> <</link>> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #444; opacity: 0.5;"> <p style="color: #666; font-size: 14px; margin: 0 0 10px 0;">Get closer, let me touch</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💰 Tip $100 (Broke)</div> </div> <</if>> </div> <p style="color: #888; font-size: 13px; margin: 15px 0 0 0; text-align: center; font-style: italic;"> Tips given: $<<print $privateDanceTips>> • Current balance: $<<print $money>> </p> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize dance progress if needed --> <<if !$danceProgress>> <<set $danceProgress = 0>> <</if>> <!-- Increment weekly group lesson counter --> <<if !$weeklyDanceGroupLessons>> <<set $weeklyDanceGroupLessons = {week: Math.floor($dayNumber / 7), count: 0}>> <</if>> <<set $weeklyDanceGroupLessons.count += 1>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b9d 0%, #f06595 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b9d; box-shadow: 0 0 20px #ff6b9d66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🩰 Group Dance Lesson</h1> </div> <!-- Lesson Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">💃</div> <h2 style="color: #ff6b9d; margin: 0 0 15px 0;">A Graceful Session</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> You spend an hour learning choreography and practicing your movements. The instructor guides the group through various steps and techniques, helping you develop your coordination and grace. </p> </div> <!-- Stat Gain --> <<set $stats.dexterity += 1>> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #51cf66; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> 💪 +1 Dexterity! </p> </div> <!-- Dancer Trait Progress --> <<if $skills.includes("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> ⭐ You already have the Dancing skill! </p> </div> <<else>> <<set _danceChance = random(1, 100)>> <<if _danceChance <= 3>> <<run $skills.push("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 Congratulations! You've learned the Dancing skill! </p> </div> <<else>> <<set $danceProgress += 1>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ff6b9d;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0; text-align: center;">🎯 Dancing Skill Progress</h3> <p style="color: #e0e0e0; text-align: center; margin: 0 0 15px 0;">Keep practicing! You're getting closer to mastering dance.</p> <div style="background: #0a0a0a; border-radius: 6px; padding: 10px; border: 1px solid #444;"> <p style="color: #aaa; font-size: 14px; margin: 0; text-align: center;"> Sessions completed: <span style="color: #ff6b9d; font-weight: bold;"><<= $danceProgress>></span> </p> <p style="color: #aaa; font-size: 13px; margin: 5px 0 0 0; text-align: center; font-style: italic;"> (3% chance per session with group lessons) </p> </div> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Studio</div>">> <<run advanceTime(60)>> <<goto "DanceStudio">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize coach sessions if needed --> <<if !$danceCoachSessions>> <<set $danceCoachSessions = 0>> <</if>> <!-- Increment weekly private lesson counter --> <<if !$weeklyDancePrivateLessons>> <<set $weeklyDancePrivateLessons = {week: Math.floor($dayNumber / 7), count: 0}>> <</if>> <<set $weeklyDancePrivateLessons.count += 1>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700; box-shadow: 0 0 20px #FFD70066;"> <h1 style="color: #000; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(255,255,255,0.3);">👥 Private Coaching Session</h1> </div> <!-- Lesson Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">🌟</div> <h2 style="color: #FFD700; margin: 0 0 15px 0;">Intensive One-on-One Training</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> Your private coach dedicates their full attention to refining your technique. Every movement is analyzed and perfected, pushing your abilities to new heights. The personalized instruction accelerates your progress dramatically. </p> </div> <!-- Stat Gain --> <<set $stats.dexterity += 5>> <div style="background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #51cf66; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> 💪 +5 Dexterity! </p> </div> <!-- Dancer Trait Progress --> <<if $skills.includes("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> ⭐ You've already mastered the Dancing skill! </p> </div> <<else>> <<set $danceCoachSessions += 1>> <<if $danceCoachSessions >= 3>> <<run $skills.push("Dancing")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 64px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 22px; font-weight: bold; margin: 0 0 10px 0;"> 🎉 Mastery Achieved! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 0;"> You've learned the Dancing skill through dedicated coaching! </p> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700;"> <h3 style="color: #FFD700; margin: 0 0 10px 0; text-align: center;">🎯 Coaching Progress</h3> <p style="color: #e0e0e0; text-align: center; margin: 0 0 15px 0;">Your coach is guiding you toward mastery!</p> <div style="background: #0a0a0a; border-radius: 6px; padding: 15px; border: 1px solid #444;"> <div style="margin-bottom: 10px;"> <p style="color: #aaa; font-size: 14px; margin: 0; text-align: center;"> Coaching sessions: <span style="color: #FFD700; font-weight: bold; font-size: 18px;"><<= $danceCoachSessions>> / 3</span> </p> </div> <div style="background: #000; border-radius: 6px; height: 12px; overflow: hidden; border: 1px solid #444;"> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); height: 100%; width: <<= Math.floor(($danceCoachSessions / 3) * 100)>>%; transition: width 0.3s;"></div> </div> <p style="color: #51cf66; font-size: 13px; margin: 10px 0 0 0; text-align: center; font-weight: bold;"> <<= 3 - $danceCoachSessions>> more session<<if 3 - $danceCoachSessions !== 1>>s<</if>> until mastery! </p> </div> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Studio</div>">> <<run advanceTime(60)>> <<goto "DanceStudio">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #8d6e63 0%, #6d4c41 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8d6e63; box-shadow: 0 0 20px #8d6e6366;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">☕ Premium Coffee</h1> </div> <!-- Coffee Description --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #8d6e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">☕</div> <h2 style="color: #8d6e63; margin: 0 0 15px 0;">A Perfect Cup</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> The barista hands you a perfectly crafted cup of coffee. The rich, smooth taste energizes you instantly. You feel ready to take on whatever comes next. </p> </div> <!-- Trait Chance --> <<set _traitRoll = random(1, 100)>> <<if _traitRoll <= 1>> <<if !$mentalTraits.includes("Energetic") && !$mentalTraits.includes("Fast")>> <<set _gainedTrait = either("Energetic", "Fast")>> <<if _gainedTrait === "Energetic">> <<run $mentalTraits.push("Energetic")>> <<else>> <<run $physicalTraits.push("Fast")>> <</if>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the <<= _gainedTrait>> trait! </p> </div> <<elseif $mentalTraits.includes("Energetic") && !$physicalTraits.includes("Fast")>> <<run $physicalTraits.push("Fast")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the Fast trait! </p> </div> <<elseif !$mentalTraits.includes("Energetic") && $physicalTraits.includes("Fast")>> <<run $mentalTraits.push("Energetic")>> <div style="background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #FFD700; text-align: center;"> <div style="font-size: 48px; margin-bottom: 10px;">✨</div> <p style="color: #000; font-size: 20px; font-weight: bold; margin: 0;"> 🎉 The coffee has awakened something in you! </p> <p style="color: #000; font-size: 18px; font-weight: bold; margin: 10px 0 0 0;"> You've gained the Energetic trait! </p> </div> <<else>> <div style="background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #4dabf7; text-align: center;"> <p style="color: white; font-size: 16px; font-weight: bold; margin: 0;"> ☕ You already have both the Energetic and Fast traits! </p> </div> <</if>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>← Back to Cafe</div>">> <<run advanceTime(15)>> <<goto "Cafe">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66; box-shadow: 0 0 20px #51cf6666;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🎉 Congratulations!</h1> </div> <!-- Hiring Message --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">☕</div> <h2 style="color: #51cf66; margin: 0 0 15px 0;">Welcome to Manta Ray Cafe!</h2> <p style="color: #e0e0e0; font-size: 18px; line-height: 1.6; max-width: 600px; margin: 0 auto 20px auto;"> The manager reviews your application and smiles. "Your skills are exactly what we're looking for! Welcome to the team. You'll be making $13 per hour. Come back during work hours to start your shift." </p> <p style="color: #ffd43b; font-size: 16px; font-weight: bold; margin: 0;"> 💰 Hourly Pay: $13 </p> </div> <!-- Job Details --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">📋 Job Information</h3> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; margin: 0 0 10px 0;"><strong style="color: #4dabf7;">Position:</strong> Barista</p> <p style="color: #e0e0e0; margin: 0 0 10px 0;"><strong style="color: #4dabf7;">Work Hours:</strong> 7:00 AM - 3:00 PM</p> <p style="color: #e0e0e0; margin: 0;"><strong style="color: #4dabf7;">Location:</strong> Manta Ray Cafe</p> </div> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.2); display: inline-block;'>Start Your New Job!</div>">> <<goto "Cafe">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">⚙️ Settings</h1> <!-- Achievement Carryover Section --> <<if typeof $achievementCarryover === "undefined">> <<set $achievementCarryover = false>> <</if>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $achievementCarryover>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $achievementCarryover>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $achievementCarryover>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $achievementCarryover>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 🏆 Achievement Point Carryover: <<if $achievementCarryover>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $achievementCarryover>> Achievement points will carry over when you restart the game. Your skill tree will reset but you'll keep all earned points. <<else>> Achievement points will NOT carry over on restart. Enable this for New Game+ style progression. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $achievementCarryover>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Carryover <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Carryover</div>">> <<set $achievementCarryover = true>> <<run localStorage.setItem('sunfishCity_achievementCarryover', 'true')>> <<run localStorage.setItem('sunfishCity_achievements', JSON.stringify($unlockedAchievements || []))>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$achievementCarryover>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Carryover <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Carryover</div>">> <<set $achievementCarryover = false>> <<run localStorage.setItem('sunfishCity_achievementCarryover', 'false')>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Time Format Section --> <<if typeof $use24HourTime === "undefined">> <<set $use24HourTime = false>> <</if>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $use24HourTime>>#4dabf7<<else>>#ffc107<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $use24HourTime>>#4dabf744<<else>>#ffc10744<</if>>;"> <h2 style="color: <<if $use24HourTime>>#4dabf7<<else>>#ffc107<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $use24HourTime>>#4dabf788<<else>>#ffc10788<</if>>;"> 🕐 Time Format: <<if $use24HourTime>>24-Hour<<else>>12-Hour (AM/PM)<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $use24HourTime>> Time is displayed in 24-hour format (e.g., 14:30 instead of 2:30 PM). <<else>> Time is displayed in 12-hour format with AM/PM (e.g., 2:30 PM). <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if !$use24HourTime>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffc107; color: #ffc107; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ffc10766, inset 0 0 20px #ffc10722;'> 12-Hour (AM/PM) <span style="color: #ffc107; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffc107; color: #ffc107; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>12-Hour (AM/PM)</div>">> <<set $use24HourTime = false>> <<goto "ImageSettings">> <</link>> <</if>> <<if $use24HourTime>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #4dabf766, inset 0 0 20px #4dabf722;'> 24-Hour <span style="color: #4dabf7; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>24-Hour</div>">> <<set $use24HourTime = true>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <h2 style="color: #667eea; text-align: center; margin-top: 30px;">🖼️ Image Settings</h2> <!-- Default Images Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.imagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.imagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <!-- Default Images Toggle --> <h2 style="color: <<if $imageSettings.imagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.imagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 📷 Default Images: <<if $imageSettings.imagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.imagesEnabled>> Default game images are currently shown. Disable them to use custom images instead. <<else>> Default images are hidden. You can now upload custom images below. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.imagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Default Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Default Images</div>">> <<set $imageSettings.imagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.imagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Default Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Default Images</div>">> <<set $imageSettings.imagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Location Images Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.locationImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.locationImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.locationImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.locationImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 🗺️ Location Images: <<if $imageSettings.locationImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.locationImagesEnabled>> Location images are displayed at the top of area passages. Disable them for a text-only experience. <<else>> Location images are hidden. Enable them to see visuals for each area you visit. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.locationImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Location Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Location Images</div>">> <<set $imageSettings.locationImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.locationImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Location Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Location Images</div>">> <<set $imageSettings.locationImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- NPC Images Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.npcImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.npcImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.npcImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.npcImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 👥 NPC Images: <<if $imageSettings.npcImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 20px;"> <<if $imageSettings.npcImagesEnabled>> NPC character images are displayed when interacting with characters. Disable them to hide all NPC portraits. <<else>> NPC images are hidden. Enable them to see character portraits during interactions. <</if>> </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.npcImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable NPC Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable NPC Images</div>">> <<set $imageSettings.npcImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.npcImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable NPC Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable NPC Images</div>">> <<set $imageSettings.npcImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Erotic Imagery Toggle --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $imageSettings.eroticImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px <<if $imageSettings.eroticImagesEnabled>>#51cf6644<<else>>#ff6b6b44<</if>>;"> <h2 style="color: <<if $imageSettings.eroticImagesEnabled>>#51cf66<<else>>#ff6b6b<</if>>; margin: 0 0 15px 0; text-shadow: 0 0 10px <<if $imageSettings.eroticImagesEnabled>>#51cf6688<<else>>#ff6b6b88<</if>>;"> 🔞 Erotic Imagery: <<if $imageSettings.eroticImagesEnabled>>Enabled<<else>>Disabled<</if>> </h2> <p style="color: #ccc; margin-bottom: 10px;"> Toggle explicit adult content images for jobs and activities like the Mayor's Secretary and Brothel work. </p> <p style="color: #ffc107; font-size: 14px; margin: 0 0 20px 0; font-style: italic;"> ⚠️ Warning: These images contain explicit adult sexual content. </p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <<if $imageSettings.eroticImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #51cf6666, inset 0 0 20px #51cf6622;'> ✓ Enable Erotic Images <span style="color: #51cf66; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✓ Enable Erotic Images</div>">> <<set $imageSettings.eroticImagesEnabled = true>> <<goto "ImageSettings">> <</link>> <</if>> <<if !$imageSettings.eroticImagesEnabled>> <div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; box-shadow: 0 0 15px #ff6b6b66, inset 0 0 20px #ff6b6b22;'> ✗ Disable Erotic Images <span style="color: #ff6b6b; font-size: 18px;">●</span> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✗ Disable Erotic Images</div>">> <<set $imageSettings.eroticImagesEnabled = false>> <<goto "ImageSettings">> <</link>> <</if>> </div> </div> <!-- Custom Image Upload Section --> <<if !$imageSettings.imagesEnabled>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44;"> <h2 style="color: #667eea; margin: 0 0 15px 0; text-shadow: 0 0 10px #667eea88;">📤 Upload Custom Images</h2> <p style="color: #4dabf7; background: #1f2a3a; padding: 15px; border-radius: 8px; border: 2px solid #4dabf7; margin-bottom: 20px;"> ℹ️ <strong>Note:</strong> Upload images from your device or enter a URL. Uploaded images are stored in your browser and will persist across sessions. </p> <!-- Face Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">😊 Face Image</h3> <<if $imageSettings.customImages.face>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.face" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #9b59b6;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #3a2a3a; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom face image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom face image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="faceImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #9b59b6; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="faceImageInput" placeholder="https://example.com/face.webp" @value="$imageSettings.customImages.face || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #9b59b6; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('faceImageFile'); var urlInput = document.getElementById('faceImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.face = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.face = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Face Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.face = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Chest Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">👕 Chest Image</h3> <<if $imageSettings.customImages.chest>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.chest" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #51cf66;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #2a3a2a; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom chest image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom chest image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="chestImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #51cf66; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="chestImageInput" placeholder="https://example.com/chest.webp" @value="$imageSettings.customImages.chest || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #51cf66; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('chestImageFile'); var urlInput = document.getElementById('chestImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.chest = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.chest = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Chest Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.chest = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Butt Image --> <div style="background: #1a1a1a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #ffc107;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🍑 Butt Image</h3> <<if $imageSettings.customImages.butt>> <div style="margin-bottom: 15px; text-align: center;"> <img @src="$imageSettings.customImages.butt" style="max-width: 300px; max-height: 300px; border-radius: 8px; border: 2px solid #ffc107;" onerror="this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; padding: 40px; background: #3a3020; border-radius: 8px; color: #ff6b6b;"> ❌ Failed to load image </div> </div> <p style="color: #51cf66; margin-bottom: 10px;">✓ Custom butt image set</p> <<else>> <p style="color: #aaa; margin-bottom: 10px; font-style: italic;">No custom butt image set</p> <</if>> <!-- File Upload --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Upload from Device:</strong></label> <input type="file" id="buttImageFile" accept="image/*" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #ffc107; border-radius: 6px; font-size: 14px; margin-bottom: 15px; cursor: pointer;"> <div style="text-align: center; margin: 15px 0; color: #666;">OR</div> <!-- URL Input --> <label style="display: block; color: #ccc; margin-bottom: 8px;"><strong>Image URL:</strong></label> <input type="text" id="buttImageInput" placeholder="https://example.com/butt.webp" @value="$imageSettings.customImages.butt || ''" style="width: 100%; padding: 10px; background: #1a1a1a; color: #fff; border: 2px solid #ffc107; border-radius: 6px; font-size: 14px; margin-bottom: 10px;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style='background: linear-gradient(135deg, #ffc107 0%, #ff9800 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;' onclick=" var fileInput = document.getElementById('buttImageFile'); var urlInput = document.getElementById('buttImageInput'); if (fileInput.files && fileInput.files[0]) { var reader = new FileReader(); reader.onload = function(e) { SugarCube.State.variables.imageSettings.customImages.butt = e.target.result; SugarCube.Engine.play('ImageSettings'); }; reader.readAsDataURL(fileInput.files[0]); } else if (urlInput.value && (urlInput.value.startsWith('http://') || urlInput.value.startsWith('https://'))) { SugarCube.State.variables.imageSettings.customImages.butt = urlInput.value.trim(); SugarCube.Engine.play('ImageSettings'); } "> 💾 Save Butt Image </div> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🗑️ Clear</div>">> <<set $imageSettings.customImages.butt = "">> <<goto "ImageSettings">> <</link>> </div> </div> <!-- Clear All Button --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🗑️ Clear All Custom Images</div>">> <<set $imageSettings.customImages.face = "">> <<set $imageSettings.customImages.chest = "">> <<set $imageSettings.customImages.butt = "">> <<goto "ImageSettings">> <</link>> </div> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; text-align: center; font-style: italic; margin: 0;"> Custom image uploads are only available when default images are disabled. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Casino")>> <<run $visitedLocations.push("Casino")>> <</if>> <<set $lastLocation = "Casino">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">🎰 Silver Marlin - Casino Staff</h1> <div style="padding: 20px; background: linear-gradient(135deg, #d4af37 0%, #8b7355 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Professional dealers in crisp uniforms manage the gaming tables with practiced efficiency. They shuffle cards with theatrical flair, spin roulette wheels with perfect timing, and maintain the house edge with unwavering precision. </p> </div> <<set _casinoNPCs = setup.getNPCsByJob("Casino Dealer")>> <<if _casinoNPCs.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-top: 20px;"> <<for _i, _npc range _casinoNPCs>> <<if setup.isNPCAvailable(_npc.name)>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🎲 <<print _npc.name>></h3> <p style="font-size: 14px; color: #ccc; margin-bottom: 10px;"> <strong style="color: #ffd700;">Job:</strong> <<if _npc.jobs && _npc.jobs.length > 0>> <<print _npc.jobs.join(", ")>> <<else>> No current position <</if>> </p> <<link "<div style='background: #ffd700; color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Approach</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</if>> <</for>> </div> <<else>> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); opacity: 0.6; text-align: center;"> <p style="color: #666; font-size: 16px;">No casino staff available at the moment.</p> </div> <</if>> <br> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SlotMachine")>> <<run $visitedLocations.push("SlotMachine")>> <</if>> <<set $lastLocation = "SlotMachine">> <!-- ===== SKILL TREE: Get gambling bonuses ===== --> <<set _slotsWinBonus = setup.skillTree.getEffect("slotsWinBonus")>> <<set _slotsPayoutBonus = setup.skillTree.getEffect("slotsPayoutBonus")>> <<set _slotCost = setup.getSlotCost()>> <<set _isCasinoStaff = $jobs && ($jobs.includes("Security Guard") || $jobs.includes("Cocktail Waitress"))>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center; text-shadow: 0 0 20px #ffd700;">🎰 Slot Machine</h1> <div style="padding: 20px; background: linear-gradient(135deg, #0f4c3a 0%, #1a5c4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(46, 204, 113, 0.3);"> <p style="color: #a8e6cf; font-size: 18px; margin: 0; text-align: center;"> Pull the lever and watch the reels spin! Three matching symbols means you win! </p> </div> <!-- Player Status --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <h3 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">Your Status</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="text-align: center;"> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Available Cash</p> </div> <div style="text-align: center;"> <p style="color: #4dabf7; font-size: 24px; font-weight: bold; margin: 0;">$slotMachineSystem.totalPlays</p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Total Plays</p> </div> <div style="text-align: center;"> <<if _isCasinoStaff>> <p style="color: #e91e63; font-size: 24px; font-weight: bold; margin: 0;"><span style="text-decoration: line-through; color: #666;">$50</span> $<<print _slotCost>></p> <<else>> <p style="color: #e91e63; font-size: 24px; font-weight: bold; margin: 0;">$50</p> <</if>> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Cost Per Spin</p> </div> </div> <!-- Trait/Artifact/Skill Tree Status --> <<set _hasLucky = ($mentalTraits && $mentalTraits.includes("Lucky")) || ($physicalTraits && $physicalTraits.includes("Hellhound"))>> <<set _hasUnlucky = $mentalTraits && $mentalTraits.includes("Unlucky")>> <<set _hasPearl = $currentArtifact === "The Pearl of Abundance">> <<set _hasAddiction = $mentalTraits && $mentalTraits.includes("Gambling Addiction")>> <<set _hasSkillTreeBonus = _slotsWinBonus > 0 || _slotsPayoutBonus > 0>> <<if _hasLucky || _hasUnlucky || _hasPearl || _hasAddiction || _hasSkillTreeBonus>> <div style="margin-top: 15px; padding-top: 15px; border-top: 2px solid #333;"> <!-- ===== SKILL TREE: Display bonuses ===== --> <<if _hasSkillTreeBonus>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #CE93D8; box-shadow: 0 0 10px rgba(156, 39, 176, 0.3);"> <p style="color: #CE93D8; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> ⭐ Skill Tree Bonuses Active </p> <<if _slotsWinBonus > 0>> <p style="color: #E1BEE7; font-size: 12px; margin: 5px 0 0 0; text-align: center;"> Win Chance: +<<print _slotsWinBonus>>% </p> <</if>> <<if _slotsPayoutBonus > 0>> <p style="color: #E1BEE7; font-size: 12px; margin: 5px 0 0 0; text-align: center;"> Payout Bonus: +<<print _slotsPayoutBonus>>% </p> <</if>> </div> <</if>> <<if _hasPearl>> <div style="background: linear-gradient(135deg, #f5f5f5 0%, #e0e0e0 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #f5f5f5; box-shadow: 0 0 10px rgba(245, 245, 245, 0.3);"> <p style="color: #333; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 🔮 Pearl of Abundance: +50% winnings! </p> </div> <</if>> <<if _hasLucky>> <div style="background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #ffd700; box-shadow: 0 0 10px rgba(255, 215, 0, 0.3);"> <p style="color: #000; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> ✨ Lucky: Better odds! </p> </div> <</if>> <<if _hasUnlucky>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #c62828; box-shadow: 0 0 10px rgba(198, 40, 40, 0.3);"> <p style="color: #ff6b6b; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 💀 Unlucky: Worse odds </p> </div> <</if>> <<if _hasAddiction>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 10px; border-radius: 6px; border: 2px solid #ff6b6b; box-shadow: 0 0 10px rgba(255, 107, 107, 0.3);"> <p style="color: #ff6b6b; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 🎲 Gambling Addiction: You're hooked... </p> </div> <</if>> <<if _isCasinoStaff>> <div style="background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); padding: 10px; border-radius: 6px; margin-top: 8px; border: 2px solid #51cf66; box-shadow: 0 0 10px rgba(46, 204, 113, 0.3);"> <p style="color: #fff; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 🎰 Casino Staff: 5% discount on spins! </p> </div> <</if>> </div> <</if>> </div> <!-- Slot Machine Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <div id="slotDisplay" style="display: flex; justify-content: center; gap: 20px; margin-bottom: 30px;"> <div style="background: #1a1a1a; border: 3px solid #667eea; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: inset 0 0 20px rgba(0,0,0,0.5);"> <span id="reel1">🎰</span> </div> <div style="background: #1a1a1a; border: 3px solid #667eea; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: inset 0 0 20px rgba(0,0,0,0.5);"> <span id="reel2">🎰</span> </div> <div style="background: #1a1a1a; border: 3px solid #667eea; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: inset 0 0 20px rgba(0,0,0,0.5);"> <span id="reel3">🎰</span> </div> </div> <!-- Spin Button --> <<if $money >= _slotCost>> <<capture _slotCost>> <div id='spinButton' style='background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 20px 40px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 24px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 215, 0, 0.5); margin: 0 auto; display: inline-block;'> <<link `"🎰 PULL LEVER ($" + _slotCost + ")"`>> <<goto "SlotMachineResult">> <</link>> </div> <</capture>> <<else>> <div style='background: #444; color: #888; padding: 20px 40px; border-radius: 10px; text-align: center; font-weight: bold; font-size: 24px; cursor: not-allowed; margin: 0 auto; display: inline-block;'>🎰 Not Enough Money</div> <</if>> </div> <!-- Payout Table --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">💰 Payout Table</h3> <!-- ===== SKILL TREE: Show boosted payouts if bonus active ===== --> <<if _slotsPayoutBonus > 0>> <p style="color: #CE93D8; font-size: 12px; text-align: center; margin: 0 0 10px 0;"> ⭐ Payouts boosted by +<<print _slotsPayoutBonus>>%! </p> <</if>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #333;"> <span style="font-size: 24px;">💎 💎 💎</span> <span style="color: #ffd700; font-weight: bold; float: right;"> <<if _slotsPayoutBonus > 0>> $<<print Math.floor(1000000 * (1 + _slotsPayoutBonus/100)).toLocaleString()>> <<else>> $1,000,000 <</if>> </span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #333;"> <span style="font-size: 24px;">👑 👑 👑</span> <span style="color: #ffd700; font-weight: bold; float: right;"> <<if _slotsPayoutBonus > 0>> $<<print Math.floor(10000 * (1 + _slotsPayoutBonus/100)).toLocaleString()>> <<else>> $10,000 <</if>> </span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #333;"> <span style="font-size: 24px;">🍀 🍀 🍀</span> <span style="color: #51cf66; font-weight: bold; float: right;"> <<if _slotsPayoutBonus > 0>> $<<print Math.floor(1000 * (1 + _slotsPayoutBonus/100)).toLocaleString()>> <<else>> $1,000 <</if>> </span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #333;"> <span style="font-size: 24px;">🎰 🎰 🎰</span> <span style="color: #51cf66; font-weight: bold; float: right;"> <<if _slotsPayoutBonus > 0>> $<<print Math.floor(250 * (1 + _slotsPayoutBonus/100)).toLocaleString()>> <<else>> $250 <</if>> </span> </div> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; border: 2px solid #333; grid-column: 1 / -1;"> <span style="font-size: 24px;">🍒 🍒 🍒</span> <span style="color: #51cf66; font-weight: bold; float: right;"> <<if _slotsPayoutBonus > 0>> $<<print Math.floor(100 * (1 + _slotsPayoutBonus/100)).toLocaleString()>> <<else>> $100 <</if>> </span> </div> </div> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44;'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("RouletteRoom")>> <<run $visitedLocations.push("RouletteRoom")>> <</if>> <<set $lastLocation = "RouletteRoom">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center; text-shadow: 0 0 20px #ffd700;">🎡 Roulette Room</h1> <div style="padding: 20px; background: linear-gradient(135deg, #0f4c3a 0%, #1a5c4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(46, 204, 113, 0.3);"> <p style="color: #a8e6cf; font-size: 18px; margin: 0; text-align: center;"> The roulette wheel spins under elegant lighting. Chips clatter on the felt table as other gamblers place their bets. The dealer watches with practiced indifference, ready to call the winning number. </p> </div> <!-- Player Status --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <h3 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">Your Status</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="text-align: center;"> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Available Cash</p> </div> <div style="text-align: center;"> <p style="color: <<if $rouletteSystem.periodWinnings >= 50000>>#c62828<<elseif $rouletteSystem.periodWinnings >= 25000>>#f39c12<<else>>#51cf66<</if>>; font-size: 24px; font-weight: bold; margin: 0;">$<<print $rouletteSystem.periodWinnings.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Period Winnings</p> </div> <div style="text-align: center;"> <p style="color: #ffd43b; font-size: 24px; font-weight: bold; margin: 0;">$<<print (50000 - $rouletteSystem.periodWinnings).toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Until 30-Day Ban</p> </div> </div> <!-- Trait Status --> <<set _hasLucky = ($mentalTraits && $mentalTraits.includes("Lucky")) || ($physicalTraits && $physicalTraits.includes("Hellhound"))>> <<set _hasUnlucky = $mentalTraits && $mentalTraits.includes("Unlucky")>> <<set _hasPearl = $currentArtifact === "The Pearl of Abundance">> <<if _hasLucky || _hasUnlucky || _hasPearl>> <div style="margin-top: 15px; padding-top: 15px; border-top: 2px solid #333;"> <<if _hasPearl>> <div style="background: linear-gradient(135deg, #f5f5f5 0%, #e0e0e0 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #f5f5f5; box-shadow: 0 0 10px rgba(245, 245, 245, 0.3);"> <p style="color: #333; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 🔮 Pearl of Abundance: +50% winnings (doesn't count toward limit)! </p> </div> <</if>> <<if _hasLucky>> <div style="background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); padding: 10px; border-radius: 6px; margin-bottom: 8px; border: 2px solid #ffd700; box-shadow: 0 0 10px rgba(255, 215, 0, 0.3);"> <p style="color: #000; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> ✨ Lucky Trait Active: +10% win chance! </p> </div> <</if>> <<if _hasUnlucky>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 10px; border-radius: 6px; border: 2px solid #c62828; box-shadow: 0 0 10px rgba(198, 40, 40, 0.3);"> <p style="color: #ff6b6b; font-size: 14px; font-weight: bold; margin: 0; text-align: center;"> 💀 Unlucky Trait Active: -10% win chance </p> </div> <</if>> </div> <</if>> </div> <!-- Betting Interface --> <h2 style="color: #ffd700; text-align: center;">Place Your Bet</h2> <!-- Bet Amount Selection --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0;">💰 Bet Amount</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Select how much you want to wager (Max: $50,000):</p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px;"> <!-- $100 --> <<if $money >= 100>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$100</div>">> <<set $currentBetAmount = 100>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$100</div> <</if>> <!-- $500 --> <<if $money >= 500>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$500</div>">> <<set $currentBetAmount = 500>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$500</div> <</if>> <!-- $1,000 --> <<if $money >= 1000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$1,000</div>">> <<set $currentBetAmount = 1000>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$1,000</div> <</if>> <!-- $2,500 --> <<if $money >= 2500>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$2,500</div>">> <<set $currentBetAmount = 2500>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$2,500</div> <</if>> <!-- $5,000 --> <<if $money >= 5000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$5,000</div>">> <<set $currentBetAmount = 5000>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$5,000</div> <</if>> <!-- $10,000 --> <<if $money >= 10000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$10,000</div>">> <<set $currentBetAmount = 10000>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$10,000</div> <</if>> <!-- $25,000 --> <<if $money >= 25000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$25,000</div>">> <<set $currentBetAmount = 25000>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$25,000</div> <</if>> <!-- $50,000 --> <<if $money >= 50000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; color: #e91e63; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>$50,000</div>">> <<set $currentBetAmount = 50000>> <<goto "RouletteRoom">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed;'>$50,000</div> <</if>> </div> <<if $currentBetAmount>> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 15px 0 0 0; text-align: center;"> Current Bet: $<<print $currentBetAmount.toLocaleString()>> </p> <<else>> <p style="color: #888; font-size: 14px; margin: 15px 0 0 0; text-align: center; font-style: italic;"> No bet selected yet </p> <</if>> </div> <<if $currentBetAmount>> <!-- Color Betting --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e91e6344;"> <h3 style="color: #e91e63; margin: 0 0 15px 0;">🎨 Bet on Color</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Payout: 2x your bet (1:1 odds)</p> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>🔴 Red</div>">> <<set $rouletteBetType = "color">> <<set $rouletteBetValue = "red">> <<goto "RouletteSpinResult">> <</link>> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #666;'>⚫ Black</div>">> <<set $rouletteBetType = "color">> <<set $rouletteBetValue = "black">> <<goto "RouletteSpinResult">> <</link>> </div> </div> <!-- Number Betting --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9775fa; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9775fa44;"> <h3 style="color: #9775fa; margin: 0 0 15px 0;">🔢 Bet on Number</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Payout: 35x your bet (35:1 odds)</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(60px, 1fr)); gap: 8px;"> <!-- 0 (Green) --> <<link "<div style='background: linear-gradient(135deg, #2ecc71 0%, #1b7943 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>0</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 0>> <<goto "RouletteSpinResult">> <</link>> <!-- 1 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>1</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 1>> <<goto "RouletteSpinResult">> <</link>> <!-- 2 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>2</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 2>> <<goto "RouletteSpinResult">> <</link>> <!-- 3 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>3</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 3>> <<goto "RouletteSpinResult">> <</link>> <!-- 4 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>4</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 4>> <<goto "RouletteSpinResult">> <</link>> <!-- 5 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>5</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 5>> <<goto "RouletteSpinResult">> <</link>> <!-- 6 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>6</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 6>> <<goto "RouletteSpinResult">> <</link>> <!-- 7 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>7</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 7>> <<goto "RouletteSpinResult">> <</link>> <!-- 8 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>8</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 8>> <<goto "RouletteSpinResult">> <</link>> <!-- 9 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>9</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 9>> <<goto "RouletteSpinResult">> <</link>> <!-- 10 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>10</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 10>> <<goto "RouletteSpinResult">> <</link>> <!-- 11 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>11</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 11>> <<goto "RouletteSpinResult">> <</link>> <!-- 12 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>12</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 12>> <<goto "RouletteSpinResult">> <</link>> <!-- 13 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>13</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 13>> <<goto "RouletteSpinResult">> <</link>> <!-- 14 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>14</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 14>> <<goto "RouletteSpinResult">> <</link>> <!-- 15 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>15</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 15>> <<goto "RouletteSpinResult">> <</link>> <!-- 16 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>16</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 16>> <<goto "RouletteSpinResult">> <</link>> <!-- 17 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>17</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 17>> <<goto "RouletteSpinResult">> <</link>> <!-- 18 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>18</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 18>> <<goto "RouletteSpinResult">> <</link>> <!-- 19 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>19</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 19>> <<goto "RouletteSpinResult">> <</link>> <!-- 20 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>20</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 20>> <<goto "RouletteSpinResult">> <</link>> <!-- 21 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>21</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 21>> <<goto "RouletteSpinResult">> <</link>> <!-- 22 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>22</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 22>> <<goto "RouletteSpinResult">> <</link>> <!-- 23 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>23</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 23>> <<goto "RouletteSpinResult">> <</link>> <!-- 24 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>24</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 24>> <<goto "RouletteSpinResult">> <</link>> <!-- 25 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>25</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 25>> <<goto "RouletteSpinResult">> <</link>> <!-- 26 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>26</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 26>> <<goto "RouletteSpinResult">> <</link>> <!-- 27 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>27</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 27>> <<goto "RouletteSpinResult">> <</link>> <!-- 28 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>28</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 28>> <<goto "RouletteSpinResult">> <</link>> <!-- 29 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>29</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 29>> <<goto "RouletteSpinResult">> <</link>> <!-- 30 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>30</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 30>> <<goto "RouletteSpinResult">> <</link>> <!-- 31 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>31</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 31>> <<goto "RouletteSpinResult">> <</link>> <!-- 32 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>32</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 32>> <<goto "RouletteSpinResult">> <</link>> <!-- 33 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>33</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 33>> <<goto "RouletteSpinResult">> <</link>> <!-- 34 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>34</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 34>> <<goto "RouletteSpinResult">> <</link>> <!-- 35 (Red) --> <<link "<div style='background: linear-gradient(135deg, #c62828 0%, #8b0000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4);'>35</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 35>> <<goto "RouletteSpinResult">> <</link>> <!-- 36 (Black) --> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #000000 100%); color: white; padding: 15px 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.4); border: 2px solid #666;'>36</div>">> <<set $rouletteBetType = "number">> <<set $rouletteBetValue = 36>> <<goto "RouletteSpinResult">> <</link>> </div> </div> <</if>> <div style="text-align: center; margin-top: 25px;"> <<if $forcedGambling>> <div style="display: inline-block; background: linear-gradient(135deg, #1a1a1a 0%, #0d0d0d 100%); border: 3px solid #666; color: #666; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; cursor: not-allowed;">🔒 You Can't Leave Yet...</div> <p style="color: #ff6b6b; font-size: 14px; margin-top: 10px; font-style: italic;">Your gambling addiction compels you to keep playing until you win big or lose everything.</p> <<else>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44;'>← Leave Roulette Table</div>">> <<set $currentBetAmount = null>> <<goto "Casino">> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SeabassPark")>> <<run $visitedLocations.push("SeabassPark")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "SeabassPark">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4a7c2c; text-align: center;">🌳 Seabass Park</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Park.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #4a7c2c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Seabass Park"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #2d5016 0%, #3d6b1f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4a7c2c;"> <p style="color: white; font-size: 18px; margin: 0;"> A sprawling green space in the heart of the business district. Tall trees provide shade over winding pathways, while joggers and dog walkers enjoy the fresh air. Park benches line the paths, and the distant sounds of the city seem muffled here. </p> </div> <h2 style="color: #4a7c2c;">What do you want to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Return to Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Return to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Park</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Go to Outskirts --> <div style="border: 3px solid #8b4513; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d2691e; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Head to the edge of the city.</p> <<link "<div style='background: #8b4513; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>To Outskirts</div>">> <<goto "Outskirts">> <</link>> </div> <!-- Residential District --> <div style="border: 3px solid #a3d9a5; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #a3d9a5; margin: 0 0 10px 0;">🏠 Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Quiet neighborhoods and housing areas.</p> <<link "<div style='background: #a3d9a5; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>To Residential District</div>">> <<goto "ResidentialDistrict">> <</link>> </div> <!-- Pond Fishing (requires parkEntrance skill or hiddenPondUnlocked) --> <<if $hiddenPondUnlocked || setup.skillTree.getEffect("parkEntrance")>> <div style="border: 3px solid #1e8449; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #1e8449; margin: 0 0 10px 0;">🎣 Pond Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Fish in the hidden pond.</p> <<link "<div style='background: #1e8449; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Fishing</div>">> <<set $fishingLocation = "pond">> <<goto "FishingPond">> <</link>> </div> <<else>> <div style="border: 3px solid #555; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #555; margin: 0 0 10px 0;">🔒 Pond Fishing</h3> <p style="font-size: 14px; color: #666; margin: 0 0 auto 0; line-height: 1.4;">A hidden pond is rumored to be somewhere in the park...</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; cursor: not-allowed; font-weight: bold; margin-top: 10px;'>Locked</div> </div> <</if>> </div> <!-- Add after the travel grid, before NPCs section --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "SeabassPark">> <<goto "CrimeHub">> <</link>> </div> <!-- ===== SKILL TREE: Secret Park Entrance ===== --> <<if setup.skillTree.getEffect("parkEntrance")>> <div style="background: linear-gradient(135deg, #0a2a2a 0%, #0a1a1a 100%); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #40E0D0; box-shadow: 0 0 20px rgba(64, 224, 208, 0.4);"> <h3 style="color: #40E0D0; margin: 0 0 15px 0; text-align: center;">🐟 Strange Pond 🐟</h3> <p style="color: #7dd3d3; font-size: 14px; text-align: center; margin: 0 0 15px 0; font-style: italic;"> A shimmering pond hidden behind the bushes catches your eye. The water glows with an unnatural turquoise light... </p> <div style="text-align: center;"> <<if ($skills && $skills.includes("Sunfish")) || ($physicalTraits && $physicalTraits.includes("Sunfish")) || ($mentalTraits && $mentalTraits.includes("Sunfish"))>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #40E0D0 0%, #20B2AA 100%); color: #000; padding: 12px 30px; border-radius: 8px; font-weight: bold; cursor: pointer; border: 2px solid #7FFFD4; box-shadow: 0 0 15px rgba(64, 224, 208, 0.5);'>🐟 Dive In</div>">> <<set $comingFromParkPond = true>> <<goto "TheAlter">> <</link>> <<else>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #1a3a3a 0%, #0a2020 100%); color: #5a9a9a; padding: 12px 30px; border-radius: 8px; font-weight: bold; cursor: pointer; border: 2px solid #2a5a5a; box-shadow: 0 0 10px rgba(64, 224, 208, 0.3);'>🐟 Dive In</div>">> <<run Dialog.setup("Strange Barrier", "park-barrier-dialog")>> <<run Dialog.wiki("<div style='text-align: center; padding: 20px;'><p style='font-size: 18px; color: #40E0D0; margin: 0 0 15px 0;'>🐟 You aren't fishy enough to enter. 🐟</p><p style='font-size: 14px; color: #888; margin: 0;'>The water seems to reject you...</p></div>")>> <<run Dialog.open()>> <</link>> <</if>> </div> </div> <</if>> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("SeabassPark")>> <h2 style="color: #4a7c2c;">🌳 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a7c2c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #4a7c2c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The park is peaceful and empty right now. Just you and the trees. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("LampreyTomes")>> <<run $visitedLocations.push("LampreyTomes")>> <</if>> <<set $lastLocation = "LampreyTomes">> <!-- Check if inventory needs to be refreshed (at noon) --> <<set _currentTomeBonus = setup.getSkillTreeTomeBonus()>> <<set _lastTomeBonus = $lampreyLastTomeBonus || 0>> <<set _bonusChanged = _currentTomeBonus !== _lastTomeBonus>> <<if !$lampreyInventory || setup.shouldRefreshLampreyInventory() || _bonusChanged>> <<set $lampreyInventory = setup.generateLampreyInventory()>> <<set $lampreyLastRefreshDay = $dayNumber>> <<set $lampreyLastRefreshAfterNoon = (Math.floor($timeInMinutes / 60) % 24) >= 12>> <<set $lampreyLastTomeBonus = _currentTomeBonus>> <</if>> <!-- ===== SKILL TREE: Get bonuses for display ===== --> <<set _skillTreeTomeDiscount = setup.getSkillTreeTomeDiscount()>> <<set _skillTreeTomeBonus = setup.getSkillTreeTomeBonus()>> <div style="background: linear-gradient(135deg, #0a0015 0%, #1a0a2e 50%, #16001e 100%); min-height: 100vh; padding: 20px; box-shadow: inset 0 0 100px rgba(139,0,255,0.3);"> <h1 style="color: #d4b3ff; text-align: center; text-shadow: 0 0 20px rgba(212,179,255,0.8), 0 0 40px rgba(139,0,255,0.5);">📚 Lamprey Tomes</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a0e4e 0%, #6b1e6b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b00ff; box-shadow: 0 0 30px rgba(139,0,255,0.5), inset 0 0 20px rgba(177,156,217,0.2);"> <p style="color: #f0e5ff; font-size: 18px; margin: 0; text-shadow: 0 0 10px rgba(240,229,255,0.5);"> The smell of old paper and incense fills the air. Violet light emanates from mysterious crystals placed throughout the shop. Ancient tomes line the walls. Behind the counter stands Revna McKraken, her pale skin almost luminous in the ethereal glow, watching you with eyes that seem to pierce through your very soul. Her smile reveals just a hint of unusually sharp canines. </p> </div> <!-- Money Display --> <div style="background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); padding: 15px; border-radius: 8px; border: 2px solid #8b00ff; margin-bottom: 20px; box-shadow: 0 0 20px rgba(139,0,255,0.4);"> <p style="color: #d4b3ff; margin: 0; text-align: center; font-size: 18px; text-shadow: 0 0 10px rgba(212,179,255,0.6);"> <strong>Your Money:</strong> <<print setup.formatMoney($money)>> </p> </div> <!-- Relationship Discount Display --> <<set _revnaRelationship = $relationships["Revna McKraken"] || {level: 1, points: 0}>> <<set _discount = setup.getLampreyDiscount()>> <<if _discount > 0>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #51cf66; margin-bottom: 20px; box-shadow: 0 0 15px rgba(81,207,102,0.4);"> <p style="color: #a3ff8f; margin: 0; text-align: center; font-size: 14px; font-weight: bold; text-shadow: 0 0 8px rgba(163,255,143,0.5);"> Relationship Discount: <<print Math.round(_discount * 100)>>% off all tomes </p> </div> <</if>> <!-- Living Doll Discount Display --> <<if $physicalTraits && $physicalTraits.includes("Living Doll")>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #e6c4ff; margin-bottom: 20px; box-shadow: 0 0 15px rgba(230,196,255,0.4);"> <p style="color: #e6c4ff; margin: 0; text-align: center; font-size: 14px; font-weight: bold; text-shadow: 0 0 8px rgba(230,196,255,0.5);"> ✓ Living Doll: 60% off all tomes </p> </div> <</if>> <!-- ===== SKILL TREE: Bonus Display ===== --> <<if _skillTreeTomeDiscount > 0 || _skillTreeTomeBonus > 0>> <div style="background: linear-gradient(135deg, #3a1a4a 0%, #2a0a3e 100%); padding: 10px; border-radius: 8px; border: 2px solid #9C27B0; margin-bottom: 20px; box-shadow: 0 0 15px rgba(156,39,176,0.4);"> <p style="color: #CE93D8; margin: 0; text-align: center; font-size: 14px; font-weight: bold;"> ⭐ Skill Tree Bonuses: <<if _skillTreeTomeDiscount > 0>> -<<print _skillTreeTomeDiscount>>% prices <</if>> <<if _skillTreeTomeDiscount > 0 && _skillTreeTomeBonus > 0>> | <</if>> <<if _skillTreeTomeBonus > 0>> +<<print _skillTreeTomeBonus>> extra tome<<if _skillTreeTomeBonus !== 1>>s<</if>> daily <</if>> </p> </div> <</if>> <!-- NPC Interaction --> <<set _revna = setup.findNPCByName("Revna McKraken")>> <<if _revna>> <h2 style="color: #d4b3ff; text-shadow: 0 0 15px rgba(212,179,255,0.7);">Shopkeeper</h2> <div style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 25px rgba(139,0,255,0.5); margin-bottom: 25px;"> <!-- NPC Image --> <<set _npcImage = setup.getNPCImage("Revna McKraken")>> <<if _npcImage>> <div style="text-align: center; margin-bottom: 20px;"> <img @src="_npcImage" style="max-width: 300px; max-height: 400px; border-radius: 10px; border: 3px solid #8b00ff; box-shadow: 0 0 20px rgba(139,0,255,0.6);" onerror="this.style.display='none';"> </div> <</if>> <h3 style="color: #d4b3ff; margin: 0 0 10px 0; text-shadow: 0 0 12px rgba(212,179,255,0.7);">Revna McKraken</h3> <p style="font-size: 14px; color: #e5d5ff; margin: 0 0 15px 0; line-height: 1.4;"> A hypnotic and cunning woman who pulls you in so naturally you don't even notice her pointy teeth. Her words and methods are strange, and she seems quite cagey about her past and personal life. You get the feeling she won't trade you anything of hers, but she might appreciate a donation. </p> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Talk to Revna</div>">> <<set $tradingWithNPC = _revna>> <<goto "NPCInteraction">> <</link>> </div> <</if>> <h2 style="color: #d4b3ff; text-shadow: 0 0 15px rgba(212,179,255,0.7);">Tomes for Sale</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin-bottom: 25px;"> <<for _i = 0; _i < $lampreyInventory.length; _i++>> <<set _item = $lampreyInventory[_i]>> <<set _rarityColor = setup.getRarityColor(_item.rarity)>> <<set _tomeName = setup.getTraitTomeName(_item.trait)>> <<set _discountedPrice = setup.calculateLampreyPrice(_item.price)>> <div style="border: 2px solid <<print _rarityColor>>; border-radius: 8px; padding: 12px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 20px <<print _rarityColor>>66, 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 140px;"> <h3 style="color: <<print _rarityColor>>; margin: 0 0 10px 0; font-size: 16px; text-shadow: 0 0 15px <<print _rarityColor>>, 0 0 25px <<print _rarityColor>>88;"><<print _tomeName>></h3> <div style="flex-grow: 1;"></div> <<if _discountedPrice < _item.price>> <p style="font-size: 14px; color: #888; margin: 0; text-align: center; text-decoration: line-through;"> <<print setup.formatMoney(_item.price)>> </p> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center; text-shadow: 0 0 10px rgba(81,207,102,0.6);"> <<print setup.formatMoney(_discountedPrice)>> </p> <<else>> <p style="font-size: 16px; color: #51cf66; margin: 0 0 10px 0; font-weight: bold; text-align: center; text-shadow: 0 0 10px rgba(81,207,102,0.6);"> <<print setup.formatMoney(_item.price)>> </p> <</if>> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && (setup.isTraitBlockedByTransformation(_item.trait, "physical") || setup.isTraitBlockedByTransformation(_item.trait, "mental"))>> <<if _blockedByTransform>> <div style='background: linear-gradient(135deg, #5a2a4a 0%, #4a1a3a 100%); color: #ff9999; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #7b4a6b;'>Blocked by Transformation</div> <<elseif setup.hasLampreyTrait(_item.trait)>> <div style='background: linear-gradient(135deg, #4a2a5a 0%, #3a1a4a 100%); color: #c9a8ff; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a7b;'>Already Owned</div> <<elseif $money >= _discountedPrice>> <<capture _item, _rarityColor, _discountedPrice>> <<link "Purchase Tome">> <<set $money -= _discountedPrice>> <<run setup.addLampreyTrait(_item.trait, _item.type)>> <!-- Random Revna dialogue --> <<set _revnaDialogue = [ "An excellent selection. The pages of this tome have been waiting for a reader such as yourself.", "How marvelous. I can see the words already weaving themselves into your essence.", "Yes... I suspected you would be drawn to this particular volume.", "A most discerning choice, dear patron. The knowledge within shall serve you exquisitely well.", "Ah, the wisdom contained in these pages is truly transformative. You shall find it most... enlightening.", "This manuscript has lingered on my shelves for some time, yearning for the right reader. How fortuitous.", "The binding itself seems to resonate with your presence. A perfect pairing, wouldn't you say?", "The ancient scribes would be pleased to know their words have found such a worthy inheritor.", "How delightful. Another soul enriched by the forbidden libraries of old.", "The illuminated script within holds secrets most profound. Use them as you see fit.", "A tome of considerable potency, that one. Its passages do not take kindly to careless readers.", "The vellum practically sings in your hands, does it not? A testament to its compatibility.", "Such refined taste. I do so appreciate a patron who recognizes quality literature.", "The ink upon those pages carries power most intoxicating. Savor each word carefully.", "These words have traveled through centuries to find you. Destiny, perhaps?" ].random()>> <<set $lampreyLastPurchaseDialogue = _revnaDialogue>> <<set $lampreyLastPurchasedTrait = _item.trait>> <<goto "LampreyTomesPurchase">> <</link>> <</capture>> <<else>> <div style='background: linear-gradient(135deg, #4a2a5a 0%, #3a1a4a 100%); color: #c9a8ff; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a7b;'>Not Enough Money</div> <</if>> </div> <</for>> </div> <!-- Leave --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <div style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); box-shadow: 0 0 25px rgba(139,0,255,0.5); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #d4b3ff; margin: 0 0 10px 0; text-shadow: 0 0 12px rgba(212,179,255,0.7);">🚪 Exit</h3> <p style="font-size: 14px; color: #e5d5ff; margin: 0 0 auto 0; line-height: 1.4;">Leave the mystical bookstore and return to the outskirts.</p> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Leave Bookstore</div>">> <<goto "Outskirts">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Outskirts")>> <<run $visitedLocations.push("Outskirts")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <<set $lastLocation = "Outskirts">> <!-- Check if player has bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #888; text-align: center;">🌾 Outskirts</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a4a4a 0%, #5a5a5a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #888;"> <p style="color: white; font-size: 18px; margin: 0;"> The city fades into rural landscape here. Scattered buildings line quieter roads, and open fields stretch beyond. The air feels fresher, the pace slower. This is where the urban sprawl meets the countryside. </p> </div> <h2 style="color: #888;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<goto "BusStop">> <</link>> </div> <!-- ATM --> <div style="border: 3px solid <<if _hasBankAccount>>#4dabf7<<else>>#555<</ if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<if _hasBankAccount>>#4dabf7<<else>>#888<</ if>>; margin: 0 0 10px 0;">🏧 ATM</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;"> <<if _hasBankAccount>> Quick cash withdrawals. FREE - no fees! $30,000/day limit. <<else>> Requires bank account. Open one at Sunfish City Bank for $250. <</if>> </p> <<if _hasBankAccount>> <<link "<div style='background: #4dabf7; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Use ATM</div>" "ATM">><</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed; border: 1px solid #555;'> No Account </div> <</if>> </div> <!-- Lamprey Tomes (Evening/Night Only) --> <<if getTimeOfDay() === "evening" || getTimeOfDay() === "night">> <style> @keyframes violetPulse { 0% { box-shadow: 0 0 10px rgba(139,0,255,0.3), 0 0 20px rgba(139,0,255,0.2); } 50% { box-shadow: 0 0 20px rgba(139,0,255,0.8), 0 0 30px rgba(139,0,255,0.5); } 100% { box-shadow: 0 0 10px rgba(139,0,255,0.3), 0 0 20px rgba(139,0,255,0.2); } } .lamprey-glow { animation: violetPulse 3s ease-in-out infinite; } </style> <div class="lamprey-glow" style="border: 3px solid #8b00ff; border-radius: 10px; padding: 15px; background: #2a2a2a; display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #b19cd9; margin: 0 0 10px 0;">📚 Lamprey Tomes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">A mysterious bookstore glowing with violet light.</p> <<link "<div style='background: #8b00ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Bookstore</div>">> <<goto "LampreyTomes">> <</link>> </div> <</if>> </div> <h2 style="color: #888;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Seabass Park --> <div style="border: 3px solid #2d5016; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #4a7c2c; margin: 0 0 10px 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Public park with green spaces.</p> <<link "<div style='background: #2d5016; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Park</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">🌃 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Neon-lit entertainment district.</p> <<link "<div style='background: #ff6b9d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Outskirts")>> <h2 style="color: #888;">🌾 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #888; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic;"> A few people wander the quiet edges of the city... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #888; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The outskirts are quiet and empty. Just open fields and distant buildings. </p> </div> <</if>> <!-- CRIME SECTION --> <div style="text-align: center; margin: 20px 0;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #666; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🦹 Criminal Activities</div>">> <<set $currentCrimeLocation = "Outskirts">> <<goto "CrimeHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Unlock buy tome achievement --> <<run setup.achievements.unlock("buy_tome")>> <!-- Check for Lucky trait achievement --> <<if $lampreyLastPurchasedTrait === "Lucky">> <<run setup.achievements.unlock("lucky_trait")>> <</if>> <!-- Check for Bimbo trait achievement --> <<if $lampreyLastPurchasedTrait === "Bimbo">> <<run setup.achievements.unlock("become_bimbo")>> <</if>> <!-- Check for gigantic proportions WITHOUT bimbo achievement --> <<if $bodyParts.chest === "gigantic" && $bodyParts.butt === "gigantic">> <<if !$mentalTraits || !$mentalTraits.includes("Bimbo")>> <<run setup.achievements.unlock("gigantic_no_bimbo")>> <</if>> <</if>> <<set $lastLocation = "LampreyTomesResult">> <!-- Determine trait type if not already set --> <<if !$lampreyLastPurchasedTraitType>> <<set _trait = $lampreyLastPurchasedTrait>> <<if $physicalTraits.includes(_trait)>> <<set $lampreyLastPurchasedTraitType = "physical">> <<elseif $mentalTraits.includes(_trait)>> <<set $lampreyLastPurchasedTraitType = "mental">> <<elseif $skills.includes(_trait)>> <<set $lampreyLastPurchasedTraitType = "skill">> <<else>> <<set $lampreyLastPurchasedTraitType = "unknown">> <</if>> <</if>> <div style="background: linear-gradient(135deg, #0a0015 0%, #1a0a2e 50%, #16001e 100%); min-height: 100vh; padding: 20px; box-shadow: inset 0 0 100px rgba(139,0,255,0.3);"> <h1 style="color: #d4b3ff; text-align: center; text-shadow: 0 0 20px rgba(212,179,255,0.8), 0 0 40px rgba(139,0,255,0.5);">📚 Lamprey Tomes</h1> <!-- Trait Acquired Display --> <div style="padding: 20px; background: linear-gradient(135deg, #1a4a1a 0%, #2d6b2d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66; box-shadow: 0 0 30px rgba(81,207,102,0.5), inset 0 0 20px rgba(81,207,102,0.2);"> <p style="color: #a3ff8f; font-size: 22px; margin: 0 0 15px 0; text-align: center; font-weight: bold; text-shadow: 0 0 15px rgba(163,255,143,0.8);"> ✨ Trait Acquired: <<print $lampreyLastPurchasedTrait>> ✨ </p> <p style="color: #e0ffe0; font-size: 16px; margin: 0; text-align: center;"> The ancient knowledge flows into your being, transforming you from within. </p> </div> <!-- Transformation Image Display --> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _traitKey = $lampreyLastPurchasedTrait.toLowerCase().replace(/\s+/g, "_")>> <<set _genderKey = $bodyParts.gender || "female">> <<set _ageKey = $appearance.age === "Mature Adult" ? "mature" : "adult">> <div style="text-align: center; margin-bottom: 25px;"> <img src="Images/Transformations/<<print _traitKey>>_result_<<print _genderKey>>_<<print _ageKey>>.webp" style="max-width: 600px; max-height: 600px; border-radius: 15px; border: 3px solid #8b00ff; box-shadow: 0 0 30px rgba(139,0,255,0.7);" onerror="this.onerror=null; this.style.display='none'; this.nextElementSibling.style.display='block';"> <div style="display: none; background: #2a2a2a; width: 400px; height: 300px; border-radius: 15px; border: 3px solid #8b00ff; margin: 0 auto; box-shadow: 0 0 30px rgba(139,0,255,0.3);"></div> </div> <</if>> <!-- Transformation Text Display --> <div style="padding: 20px; background: linear-gradient(135deg, #2a1a3a 0%, #1a0a2e 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #b19cd9; box-shadow: 0 0 25px rgba(177,156,217,0.5), inset 0 0 15px rgba(177,156,217,0.2);"> <h3 style="color: #d4b3ff; margin: 0 0 15px 0; text-align: center; text-shadow: 0 0 12px rgba(212,179,255,0.7);"> 🌟 Transformation </h3> <<set _trait = $lampreyLastPurchasedTrait>> <<set _traitType = $lampreyLastPurchasedTraitType>> <!-- Physical Trait Transformation --> <<if _traitType === "physical">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #28a745;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getPhysicalTraitChangeText(_trait, true)>> </p> </div> <!-- Special transformation text for specific traits --> <<if _trait === "Were-Creature">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #ffa500;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getWereCreatureTransformationText(true, "wolf")>> </p> </div> <<elseif _trait === "Definitely not a Vampire">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #8b0000;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getVampireTransformationText(true)>> </p> </div> <<elseif _trait === "Sunfish">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #4169e1;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSunfishTransformationText(true)>> </p> </div> <</if>> <!-- Mental Trait Transformation --> <<elseif _traitType === "mental">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #764ba2;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getMentalTraitChangeText(_trait, true)>> </p> </div> <!-- Special Bimbo transformation --> <<if _trait === "Bimbo">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #ff69b4;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(true)>> </p> </div> <</if>> <!-- Skill Gain --> <<elseif _traitType === "skill">> <div style="background: #1a1a1a; padding: 15px; margin: 10px 0; border-radius: 8px; border: 2px solid #ffc107;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSkillGainText(_trait)>> </p> </div> <!-- Fallback for unknown type --> <<else>> <p style="color: #e5d5ff; font-size: 16px; margin: 0; line-height: 1.6; text-align: center;"> You feel the mystical energy of the tome coursing through your veins as the trait "<strong>_trait</strong>" becomes part of your very essence. </p> <</if>> </div> <!-- Revna's Dialogue --> <div style="padding: 30px; background: linear-gradient(135deg, #4a0e4e 0%, #6b1e6b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b00ff; box-shadow: 0 0 30px rgba(139,0,255,0.5), inset 0 0 20px rgba(177,156,217,0.2);"> <p style="color: #f0e5ff; font-size: 20px; margin: 0 0 20px 0; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(240,229,255,0.5);"> "<<print $lampreyLastPurchaseDialogue>>" </p> <p style="color: #d4b3ff; font-size: 16px; margin: 0; text-align: center;"> The power flows through you as Revna's eyes gleam with mysterious satisfaction. </p> </div> <div style="text-align: center;"> <<link "<div style='background: linear-gradient(135deg, #8b00ff 0%, #6b1e6b 100%); color: white; padding: 15px 30px; border-radius: 8px; display: inline-block; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 0 15px rgba(139,0,255,0.6); text-shadow: 0 0 5px rgba(255,255,255,0.5);'>Continue Shopping</div>">> <<unset $lampreyLastPurchasedTraitType>> <<goto "LampreyTomes">> <</link>> </div> </div> <</nobr>>
A thank you to my patrons for your custom NPCs! Cerberus: Fen Ris, The Flying Duckman: Revna McKraken,
<<nobr>> <<set $lastLocation = "UseLaptop">> <!-- Initialize WiFi variables if not set --> <<if $wifiDaysRemaining === undefined>> <<set $wifiDaysRemaining = 0>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💻 Your Laptop</h1> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #138496 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> You sit at your desk and open your laptop. The screen glows softly as various applications and options become available. </p> </div> <!-- WiFi Status Display --> <<if $hasRouter>> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #51cf66; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0; font-size: 16px;">✅ WiFi Connected</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">Internet service active. Days remaining: <<print $wifiDaysRemaining>></p> </div> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Internet Connection</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">Your internet service has expired. Pay for service at Hammerhead Tech.</p> </div> <</if>> <!-- Pay for WiFi from Home (Bank Account Only) --> <<if $wifiDaysRemaining > 0>> <div style="border: 2px solid #28a745; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #28a745; margin: 0 0 10px 0; font-size: 16px;">💳 Pay for Internet Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0; line-height: 1.4;">Add 30 days of internet service for $40. Payment is automatically deducted from your bank account.</p> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<if _hasBankAccount && $bankAccount.balance >= 40>> <p style="font-size: 12px; color: #667eea; margin: 0 0 10px 0;">Bank Balance: $<<print $bankAccount.balance>></p> <<link "<div style='background: #28a745; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 14px;'>Pay $40 from Bank Account</div>">> <<set $bankAccount.balance -= 40>> <<set $wifiDaysRemaining += 30>> <<goto "UseLaptop">> <</link>> <<elseif !_hasBankAccount>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Requires Bank Account</div> <p style="font-size: 12px; color: #888; margin: 10px 0 0 0; text-align: center;">Visit Sunfish Bank to open an account.</p> <<else>> <p style="font-size: 12px; color: #667eea; margin: 0 0 10px 0;">Bank Balance: $<<print $bankAccount.balance>></p> <div style='background: #4a2a2a; color: #c9a8a8; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a;'>Insufficient Bank Funds</div> <</if>> </div> <</if>> <<else>> <div style="border: 2px solid #dc3545; border-radius: 8px; padding: 12px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h3 style="color: #dc3545; margin: 0 0 10px 0; font-size: 16px;">❌ No Router</h3> <p style="font-size: 14px; color: #aaa; margin: 0; text-align: center;">You need to buy a router and set up internet service at Hammerhead Tech.</p> </div> <</if>> <h2 style="color: #17a2b8;">What would you like to do?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Browse Internet --> <<set _internetColor = ($wifiDaysRemaining > 0) ? "#667eea" : "#666">> <<set _internetTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _internetColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _internetColor>>; margin: 0 0 10px 0;">🌐 Browse Internet</h3> <p style="font-size: 14px; color: <<print _internetTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Surf the web, check social media, and waste time online.</p> <<if $wifiDaysRemaining > 0>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Internet</div>">> <<goto "BrowseInternet">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> <!-- Check Email --> <<set _emailColor = ($wifiDaysRemaining > 0) ? "#ffc107" : "#666">> <<set _emailTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _emailColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _emailColor>>; margin: 0 0 10px 0;">📧 Check Email</h3> <p style="font-size: 14px; color: <<print _emailTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Read your emails and respond to messages.</p> <<if $wifiDaysRemaining > 0>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> <!-- Play Games --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🎮 Play Games</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Play some video games to relax and pass time.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Work from Home --> <<set _workColor = ($wifiDaysRemaining > 0) ? "#28a745" : "#666">> <<set _workTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _workColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _workColor>>; margin: 0 0 10px 0;">💼 Work from Home</h3> <p style="font-size: 14px; color: <<print _workTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Do some freelance work or remote tasks to earn money.</p> <<if $wifiDaysRemaining > 0>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Close Laptop</div>">> <<set $streamingFromStudio = false>> <<if $laptopReturnLocation>> <<goto $laptopReturnLocation>> <<else>> <<goto setup.getCurrentHome()>> <</if>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "WatchTV">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">📺 Watching TV</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> You settle onto the couch and turn on the TV. The screen flickers to life, offering various channels and streaming options. </p> </div> <h2 style="color: #667eea;">What would you like to watch?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Watch News --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">📰 Watch News</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Catch up on current events and local news.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Movies --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🎬 Watch Movies</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Browse streaming services for movies to watch.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Sports --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">⚽ Watch Sports</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Check out live games and sports highlights.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Watch Shows --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">📺 Watch Shows</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Binge some TV series and episodes.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Turn Off TV</div>">> <<goto setup.getCurrentHome()>> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">📡 WiFi Setup Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> <<if $jobs && $jobs.length > 0 && $jobs[0] === "Tech Store Clerk">> You successfully set up your WiFi router at home. Your internet connection is now ready to use! <<else>> The store clerk helped you set up your WiFi router at home. Your internet connection is now ready to use! <</if>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">✅ Setup Successful</h2> <p style="color: #aaa; margin: 0 0 10px 0; text-align: center;">Your router has been configured and is broadcasting WiFi.</p> <p style="color: #ccc; margin: 0; text-align: center; font-size: 14px;">Remember: You need to pay $40/month for internet service to keep it active.</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #17a2b8; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Store</div>">> <<goto "TechStore">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BrowseInternet">> <!-- Auto-register if not already registered --> <<if $streamingRegistered === undefined>> <<set $streamingRegistered = true>> <</if>> <<if $contentCreatorRegistered === undefined>> <<set $contentCreatorRegistered = true>> <</if>> <<if $prawnhubRegistered === undefined>> <<set $prawnhubRegistered = true>> <</if>> <!-- FIXED: Check for bank account using correct property --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <style> .internet-grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2, auto); gap: 15px; margin-bottom: 25px; } .internet-card { border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; } /* Explicit grid positions */ .grid-pos-1 { grid-column: 1; grid-row: 1; } .grid-pos-2 { grid-column: 2; grid-row: 1; } .grid-pos-3 { grid-column: 3; grid-row: 1; } .grid-pos-4 { grid-column: 1; grid-row: 2; } .grid-pos-5 { grid-column: 2; grid-row: 2; } .grid-pos-6 { grid-column: 3; grid-row: 2; } .card-title { margin: 0 0 10px 0; } .card-description { font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1; } .card-button { padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; color: white; } .card-button-disabled { background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px; } .card-button-coming-soon { background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; } </style> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🌐 Browsing the Internet</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> You're connected to the internet. Various websites and platforms are available for you to explore. </p> </div> <h2 style="color: #667eea;">What would you like to do?</h2> <div class="internet-grid"> <!-- Position 1: Social Media --> <div class="internet-card grid-pos-1" style="border: 3px solid #3498db;"> <h3 class="card-title" style="color: #3498db;">📱 Social Media</h3> <p class="card-description">Browse social media feeds and interact with posts.</p> <div class="card-button-coming-soon">Coming Soon</div> </div> <!-- Position 2: News & Articles --> <div class="internet-card grid-pos-2" style="border: 3px solid #f39c12;"> <h3 class="card-title" style="color: #f39c12;">📰 News & Articles</h3> <p class="card-description">Read the latest news and trending articles.</p> <div class="card-button-coming-soon">Coming Soon</div> </div> <!-- Position 3: Content Creation Platform --> <div class="internet-card grid-pos-3" style="border: 3px solid #e74c3c;"> <h3 class="card-title" style="color: #e74c3c;">🎬 Post Content</h3> <p class="card-description">Create and post videos or photos to earn money.</p> <<if $hasWebcam>> <<link "<div class='card-button' style='background: #e74c3c;'>Create Content</div>">> <<goto "PostContent">> <</link>> <<else>> <div class="card-button-disabled">Requires Webcam</div> <</if>> </div> <!-- Position 4: Streaming Platform --> <div class="internet-card grid-pos-4" style="border: 3px solid #9b59b6;"> <h3 class="card-title" style="color: #9b59b6;">📹 Streaming Platform</h3> <p class="card-description"> Followers: <strong style="color: #e74c3c;"><<= $streamingData ? $streamingData.followers : 0>></strong><br> Total Streams: <<= $streamingData ? $streamingData.totalStreams : 0>> </p> <<if !$hasWebcam>> <div class="card-button-disabled">Requires Webcam</div> <<elseif !_hasBankAccount>> <div class="card-button-disabled">Requires Bank Account</div> <<elseif $jobs && $jobs.includes("Criminal")>> <<link "<div class='card-button' style='background: #9b59b6;'>Go Live</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "streaming">> <<goto "CaughtByPolice">> <</link>> <<else>> <<link "<div class='card-button' style='background: #9b59b6;'>Go Live</div>">> <<goto "SelectStreamCategory">> <</link>> <</if>> </div> <!-- Position 5: Stream Analytics --> <div class="internet-card grid-pos-5" style="border: 3px solid #27ae60;"> <h3 class="card-title" style="color: #27ae60;">📊 Stream Analytics</h3> <p class="card-description">View your streaming statistics, growth trends, and performance metrics.</p> <<link "<div class='card-button' style='background: #27ae60;'>View Analytics</div>">> <<goto "StreamAnalytics">> <</link>> </div> <!-- Position 6: PrawnHub --> <div class="internet-card grid-pos-6" style="border: 3px solid #ff1493;"> <h3 class="card-title" style="color: #ff1493;">🔞 PrawnHub</h3> <p class="card-description">Adult entertainment platform for browsing and streaming adult content.</p> <<link "<div class='card-button' style='background: #ff1493;'>Enter Site</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <!-- Bank Account Requirement Notice (for streaming platforms) --> <<if !_hasBankAccount && $hasWebcam>> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #667eea; box-shadow: 0 4px 8px rgba(102,126,234,0.4);"> <h3 style="color: white; margin: 0 0 10px 0; text-align: center;">💳 Bank Account Required for Streaming</h3> <p style="color: white; margin: 0; text-align: center; font-size: 15px;"> Digital streaming platforms require a bank account to receive donations, tips, and revenue payments.<br><br> Open a bank account at the Sunfish City Bank in Downtown. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Laptop</div>">> <<goto "UseLaptop">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StreamingRegistration">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">📹 Streaming Registration Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> You've successfully registered for a streaming platform! You can now go live and broadcast content to viewers who can tip you or subscribe to your channel. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">✅ Account Created</h2> <p style="color: #aaa; margin: 0 0 10px 0; text-align: center;">Your streaming profile has been set up and verified.</p> <p style="color: #ccc; margin: 0; text-align: center; font-size: 14px;">You can now start streaming from the Browse Internet menu.</p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<!-- Browse Internet --> <<set _internetColor = ($wifiDaysRemaining > 0) ? "#667eea" : "#666">> <<set _internetTextColor = ($wifiDaysRemaining > 0) ? "#aaa" : "#888">> <div style="border: 3px solid <<print _internetColor>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<print _internetColor>>; margin: 0 0 10px 0;">🌐 Browse Internet</h3> <p style="font-size: 14px; color: <<print _internetTextColor>>; margin: 0 0 auto 0; line-height: 1.4;">Surf the web, check social media, and waste time online.</p> <<if $wifiDaysRemaining > 0>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Browse Internet</div>">> <<goto "BrowseInternet">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Internet</div> <</if>> </div>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e74c3c; text-align: center;">🎬 Content Creation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0;"> Create and upload photos or videos to your content platform. Your earnings depend on views, likes, and subscriber count. </p> </div> <h2 style="color: #e74c3c;">What type of content would you like to create?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">📸 Photo Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Take and upload photos for your followers.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎥 Video Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Record and upload videos for your audience.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">📹 Live Streaming</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> Go live and interact with your audience in real-time. Earn money through tips, subscriptions, and donations from viewers. </p> </div> <h2 style="color: #9b59b6;">What would you like to stream?</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">💬 Just Chatting</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Chat with your viewers and hang out.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎮 Gaming Stream</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Stream yourself playing games.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🎨 Creative Stream</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Stream art, music, or other creative work.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Check for exhaustion and force end stream --> <<if setup.hasDebuff("exhaustion") && $streamingData.currentStream>> <<goto "StreamResults">> <</if>> <<if !$streamingData.currentStream>> <<run setup.startStream("asmr")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header"> <h1> <span class="live-indicator"></span> ASMR Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Relaxing ASMR content for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("asmr")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartASMRStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartASMRStream">> <</link>> </div> </div> <</if>> <<include "StreamTrendingDisplay">> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <!-- Get trend info for this category --> <<set _trendInfo = (typeof setup.getTrendDisplay === "function") ? setup.getTrendDisplay("asmr") : { actions: {} }>> <div class="action-grid"> <<set _actions = setup.streamActions.asmr>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <!-- Check if this action is trending --> <<set _isTrending = _trendInfo.actions && _trendInfo.actions[_actionName]>> <<set _trendBoost = _isTrending ? Math.round((_trendInfo.actions[_actionName].boost - 1) * 100) : 0>> <<set _cardBorder = _isTrending ? "#e94560" : "#9b59b6">> <<set _cardGlow = _isTrending ? "box-shadow: 0 0 15px rgba(233, 69, 96, 0.4);" : "">> <div class="action-card" style="border: 3px solid <<= _cardBorder>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease; position: relative; <<= _cardGlow>>"> <<if _isTrending>> <div style="position: absolute; top: -10px; right: 10px; background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold; color: white;"> 🔥 +<<= _trendBoost>>% </div> <</if>> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<= _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">+<<print _actionData.baseViewerGain>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">~$<<print _actionData.baseMoney>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>"><<print _actionData.baseEngagement>>%<<if _isTrending>> ↑<</if>></span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</nobr>> <style> <<include "StreamingStyles">> </style>
<<nobr>> <<if setup.hasDebuff("exhaustion")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #ff6b6b;"> <div style="font-size: 64px; margin-bottom: 20px;">📺</div> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">Too Exhausted to Stream</h2> <p style="color: #aaa; margin: 0 0 20px 0;">You're too tired to focus on streaming. Get some sleep first!</p> <<link "<div style='background: #667eea; color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold;'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <h1 style="color: white; text-align: center; margin: 0;">🔹 Choose Stream Category</h1> <p style="color: #ffd; text-align: center; margin: 10px 0 0 0;"> Select what type of content you want to stream </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- ASMR --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">🎧 ASMR</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Relaxing content with whispers, tapping, and soothing sounds. Perfect for viewers seeking calm. </p> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start ASMR Stream</div>">> <<goto "StartASMRStream">> <</link>> </div> <!-- Styling & Makeup --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💄 Styling & Makeup</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Beauty tutorials and styling tips. Perfect for makeup artists and beauty enthusiasts. </p> <<link "<div style='background: #e91e63; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Beauty Stream</div>">> <<goto "StartStylingStream">> <</link>> </div> <!-- Gaming --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🎮 Gaming</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Video game streams and playthroughs. Perfect for gamers and entertaining personalities. </p> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Gaming Stream</div>">> <<goto "StartGamingStream">> <</link>> </div> <!-- Music --> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎵 Music</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Live musical performances. Perfect for musicians and singers. </p> <<link "<div style='background: #ff6347; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Music Stream</div>">> <<goto "StartMusicStream">> <</link>> </div> <!-- Cooking --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f39c12; margin: 0 0 10px 0;">🍳 Cooking</h3> <p style="color: #aaa; font-size: 14px; line-height: 1.4; margin: 0 0 15px 0;"> Culinary streams and recipe sharing. Perfect for chefs and food enthusiasts. </p> <<link "<div style='background: #f39c12; color: white; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold; cursor: pointer;'>Start Cooking Stream</div>">> <<goto "StartCookingStream">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _stream = $streamingData.currentStream>> <<set _result = $streamActionResult>> <!-- Safety check - if no result, show error and return option --> <<if !_result>> <div class="streaming-container"> <div style="background: #3a2020; padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; text-align: center;"> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">⚠️ Stream Error</h2> <p style="color: #aaa;">Something went wrong with this streaming hour.</p> <<link "<div class='stream-button'>← Return to Stream</div>">> <<if _stream && _stream.category === "asmr">> <<goto "StartASMRStream">> <<elseif _stream && _stream.category === "styling">> <<goto "StartStylingStream">> <<elseif _stream && _stream.category === "gaming">> <<goto "StartGamingStream">> <<elseif _stream && _stream.category === "music">> <<goto "StartMusicStream">> <<elseif _stream && _stream.category === "cooking">> <<goto "StartCookingStream">> <<else>> <<goto "BrowseInternet">> <</if>> <</link>> </div> </div> <<else>> <div class="streaming-container"> <!-- Trending Indicator --> <<if _result.wasTrending>> <div style="background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center; animation: pulse-trend 2s infinite;"> <span style="color: white; font-size: 18px; font-weight: bold;"> 🔥 TRENDING BONUS ACTIVE! +<<= Math.round((_result.trendBonus - 1) * 100)>>% boost </span> </div> <</if>> <!-- Result Summary --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(81, 207, 102, 0.3); margin-bottom: 25px;"> <h2 style="color: #51cf66; margin: 0 0 20px 0; text-align: center;"> 📊 Hour <<= _stream.hoursStreamed>> Complete! </h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<= _result.viewers>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<= _result.engagement>>%</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">EARNED</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<= _result.money>></div> </div> </div> <!-- Big Donation Alert --> <<if _result.donations && _result.donations.bigDonation>> <div style="margin-top: 20px; padding: 15px; background: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%); border-radius: 8px; border: 2px solid #ffd700; text-align: center; animation: glow-donation 1.5s infinite;"> <div style="color: #1a1a1a; font-weight: bold; font-size: 20px;"> <<= _result.donations.bigDonation.message>> </div> <div style="color: #333; font-size: 24px; font-weight: bold; margin-top: 5px;"> +$<<= _result.donations.bigDonation.amount>> </div> </div> <</if>> <!-- Tip Rain Alert --> <<if _result.donations && _result.donations.tipRain && _result.donations.tipRain.occurred>> <div style="margin-top: 15px; padding: 15px; background: linear-gradient(135deg, #74b9ff 0%, #0984e3 100%); border-radius: 8px; border: 2px solid #74b9ff; text-align: center;"> <div style="color: white; font-weight: bold; font-size: 18px;"> <<= _result.donations.tipRain.message>> </div> <div style="color: #ffd; font-size: 16px; margin-top: 5px;"> +$<<= _result.donations.tipRain.total>> total </div> </div> <</if>> <!-- Donation Summary --> <<if _result.donations && _result.donations.count > 0>> <div style="margin-top: 15px; padding: 12px; background: #0a0a0a; border-radius: 8px; border: 1px solid #333; text-align: center;"> <span style="color: #aaa;"><<= _result.donations.count>> donation<<if _result.donations.count !== 1>>s<</if>></span> <span style="color: #f39c12; margin-left: 10px;">Total: $<<= _result.donations.total>></span> <span style="color: #888; margin-left: 10px;">(avg $<<= _result.donations.avgDonation>>)</span> </div> <<else>> <div style="margin-top: 15px; padding: 12px; background: #0a0a0a; border-radius: 8px; border: 1px solid #333; text-align: center;"> <span style="color: #666; font-style: italic;">No donations this hour</span> </div> <</if>> <!-- Random Event --> <<if _result.randomEvent>> <div style="margin-top: 20px; padding: 15px; background: #ffd43b; border-radius: 8px; border: 2px solid #f39c12;"> <div style="color: #1a1a1a; font-weight: bold; font-size: 16px; margin-bottom: 5px;"> 🎉 <<= _result.randomEvent.name>> </div> <div style="color: #2d2d2d; font-size: 14px;"> <<= _result.randomEvent.description>> </div> </div> <</if>> </div> <!-- Continue/End Options --> <div style="text-align: center;"> <<if _stream.hoursStreamed < _stream.maxHours>> <<if _stream.category === "asmr">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartASMRStream">> <</link>> <<elseif _stream.category === "styling">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartStylingStream">> <</link>> <<elseif _stream.category === "gaming">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartGamingStream">> <</link>> <<elseif _stream.category === "music">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartMusicStream">> <</link>> <<elseif _stream.category === "cooking">> <<link "<div class='stream-button'>▶️ Continue Streaming</div>">> <<goto "StartCookingStream">> <</link>> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button end'>📴 End Stream Now</div>">> <<goto "StreamResults">> <</link>> </div> <<else>> <p style="color: #e74c3c; font-size: 18px; margin-bottom: 20px;"> ⏰ Maximum stream time reached! </p> <<link "<div class='stream-button'>📊 View Final Results</div>">> <<goto "StreamResults">> <</link>> <</if>> </div> </div> <</if>> <</nobr>> <style> .streaming-container { background: #1a1a1a; min-height: 100vh; padding: 20px; color: #e0e0e0; } .stream-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); cursor: pointer; transition: all 0.3s ease; } .stream-button:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0,0,0,0.4); } .stream-button.end { background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); } @keyframes pulse-trend { 0%, 100% { box-shadow: 0 0 10px rgba(233, 69, 96, 0.5); } 50% { box-shadow: 0 0 20px rgba(233, 69, 96, 0.8); } } @keyframes glow-donation { 0%, 100% { box-shadow: 0 0 10px rgba(255, 215, 0, 0.5); } 50% { box-shadow: 0 0 25px rgba(255, 215, 0, 0.9); } } </style>
<<if !$streamingData>> <<set $streamingData = { followers: 0, totalStreams: 0, categoryUnlocked: { asmr: true, stylingMakeup: false, music: false, cooking: false, gaming: false }, streamHistory: [], currentStream: null }>> <</if>> <<if !$adultStreamingData>> <<set $adultStreamingData = { followers: 0, totalStreams: 0, streamHistory: [], currentStream: null }>> <</if>> <<if !$adultStreamingRegistered>> <<set $adultStreamingRegistered = false>> <</if>>
<<nobr>> <!-- SAVE CASH TO PREVENT ACCIDENTAL ADDITIONS --> <<set _savedMoney = $money>> <<set _stream = $streamingData.currentStream>> <!-- Safety: ensure followers exists --> <<if typeof $streamingData.followers !== "number">> <<set $streamingData.followers = 0>> <</if>> <<set _followersBefore = $streamingData.followers>> <<set _endResults = setup.endStream()>> <!-- MANUALLY APPLY FOLLOWERS if endStream didn't work --> <<if $streamingData.followers === _followersBefore && _endResults.newFollowers > 0>> <<set $streamingData.followers += _endResults.newFollowers>> <</if>> <!-- Apply Crowd's Eye multiplier (2x followers gained) --> <<if $currentArtifact === "The Crowd's Eye">> <<set _bonusFollowers = _endResults.newFollowers>> <<set $streamingData.followers += _bonusFollowers>> <<set _stream.newFollowers = _endResults.newFollowers * 2>> <<else>> <<set _stream.newFollowers = _endResults.newFollowers>> <</if>> <!-- ===== SKILL TREE: Get streaming bonuses ===== --> <<set _streamingBonus = 0>> <<set _normalStreamBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _streamingBonus = setup.skillTree.getEffect("streamingBonus") || 0>> <<set _normalStreamBonus = setup.skillTree.getEffect("normalStreamBonus") || 0>> <</if>> <<set _totalStreamingBonus = _streamingBonus + _normalStreamBonus>> <!-- Calculate base net earnings --> <<set _baseNetEarnings = $streamingData.lastStream.netEarnings>> <!-- ===== SKILL TREE: Apply streaming bonuses ===== --> <<set _skillTreeBonus = 0>> <<if _totalStreamingBonus > 0>> <<set _skillTreeBonus = Math.round(_baseNetEarnings * (_totalStreamingBonus / 100))>> <<set _baseNetEarnings = _baseNetEarnings + _skillTreeBonus>> <<set $streamingData.lastStream.netEarnings = _baseNetEarnings>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) - AFTER skill tree --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_baseNetEarnings * 0.5)>> <<set $streamingData.lastStream.netEarnings = _baseNetEarnings + _pearlBonus>> <<if _stream && _stream.incomeData>> <<set _stream.incomeData.total = _stream.incomeData.total + _skillTreeBonus + _pearlBonus>> <</if>> <</if>> <!-- Deposit to bank account (streaming revenue is digital - BANK ONLY, NO CASH) --> <<set $money = _savedMoney>> <<set _finalEarnings = $streamingData.lastStream.netEarnings>> <<set $bankAccount.balance += _finalEarnings>> <!-- ========== ACHIEVEMENT TRACKING ========== --> <!-- Track total regular streaming hours --> <<if !$regularStreamTotalHours>> <<set $regularStreamTotalHours = 0>> <</if>> <<if _stream>> <<set $regularStreamTotalHours += _stream.hoursStreamed>> <</if>> <!-- Check for 8 hour regular stream achievement --> <<if _stream && _stream.hoursStreamed >= 8>> <<run setup.achievements.unlock("stream_8_hours")>> <</if>> <!-- Track regular streaming categories for Category Master achievement --> <<if !$regularCategoriesStreamed>> <<set $regularCategoriesStreamed = []>> <</if>> <<if _stream && _stream.category>> <<if !$regularCategoriesStreamed.includes(_stream.category)>> <<run $regularCategoriesStreamed.push(_stream.category)>> <</if>> <</if>> <!-- Check for Category Master achievement (all categories on both platforms) --> <!-- Regular categories: asmr, styling, gaming, music, cooking (5 total) --> <!-- PrawnHub actions: STRIP_CLOTHING, SIMULATE_SEX, BREASTS_CLAP, ASS_CLAP, MASSAGE_BREASTS, MASTURBATE, SIMULATE_ORAL, POSE_NUDE, MOAN (9 total) --> <<set _allRegularCategories = ["asmr", "styling", "gaming", "music", "cooking"]>> <<set _allPrawnhubActions = ["STRIP_CLOTHING", "SIMULATE_SEX", "BREASTS_CLAP", "ASS_CLAP", "MASSAGE_BREASTS", "MASTURBATE", "SIMULATE_ORAL", "POSE_NUDE", "MOAN"]>> <<set _hasAllRegular = true>> <<for _cat range _allRegularCategories>> <<if !$regularCategoriesStreamed || !$regularCategoriesStreamed.includes(_cat)>> <<set _hasAllRegular = false>> <<break>> <</if>> <</for>> <<set _hasAllPrawnhub = true>> <<for _action range _allPrawnhubActions>> <<if !$prawnhubActionsEverPerformed || !$prawnhubActionsEverPerformed.includes(_action)>> <<set _hasAllPrawnhub = false>> <<break>> <</if>> <</for>> <<if _hasAllRegular && _hasAllPrawnhub>> <<run setup.achievements.unlock("all_stream_categories")>> <</if>> <!-- Check for follower milestone achievements --> <<if $streamingData.followers >= 500>> <<run setup.achievements.unlock("regular_500_followers")>> <</if>> <<if $streamingData.followers >= 10000>> <<run setup.achievements.unlock("regular_10k_followers")>> <</if>> <!-- Track Streamer job for work_every_job achievement --> <!-- Only counts if player has Streamer job (0% platform cut = 100% earnings) --> <<if $streamingData.lastStream.platformCut === 0>> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Streamer")>> <<run $jobsWorked.push("Streamer")>> <</if>> <</if>> <!-- ========== END ACHIEVEMENT TRACKING ========== --> <div class="streaming-container"> <!-- Header --> <div class="stream-header"> <h1>📊 Stream Complete!</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Great work! Here are your results. </p> </div> <!-- Big Donations Alert --> <<if _stream && _stream.incomeData && _stream.incomeData.bigDonations && _stream.incomeData.bigDonations.length > 0>> <div style="background: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd700; box-shadow: 0 0 25px rgba(255, 215, 0, 0.5); margin-bottom: 25px; animation: glow-donation 2s infinite;"> <h2 style="color: #1a1a1a; margin: 0 0 15px 0; text-align: center;">💎 BIG DONATIONS THIS STREAM! 💎</h2> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<for _i = 0; _i < _stream.incomeData.bigDonations.length; _i++>> <<set _bigDono = _stream.incomeData.bigDonations[_i]>> <div style="background: rgba(0,0,0,0.2); padding: 12px 20px; border-radius: 8px; text-align: center;"> <div style="color: #1a1a1a; font-weight: bold; font-size: 14px;">Hour <<= _bigDono.hour>></div> <div style="color: #1a1a1a; font-size: 24px; font-weight: bold;">$<<= _bigDono.amount>></div> <<if _bigDono.type === "whale">> <div style="color: #4a0080; font-size: 12px; font-weight: bold;">🐋 WHALE</div> <</if>> </div> <</for>> </div> </div> <style> @keyframes glow-donation { 0%, 100% { box-shadow: 0 0 25px rgba(255, 215, 0, 0.5); } 50% { box-shadow: 0 0 40px rgba(255, 215, 0, 0.8); } } </style> <</if>> <!-- Trending Performance --> <<if _stream && _stream.trendingActionsUsed && _stream.trendingActionsUsed > 0>> <div style="background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 20px; border-radius: 12px; border: 3px solid #e94560; box-shadow: 0 0 20px rgba(233, 69, 96, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 10px 0;">🔥 You Rode the Trends!</h2> <p style="color: white; margin: 0; font-size: 18px;"> You performed <strong><<= _stream.trendingActionsUsed>></strong> trending action<<if _stream.trendingActionsUsed !== 1>>s<</if>> for bonus followers! </p> </div> <</if>> <!-- ===== STREAMING STUDIO: Display bonus notification ===== --> <<if $streamingData.lastStream && $streamingData.lastStream.studioBonus>> <div style="background: linear-gradient(135deg, #9146ff 0%, #7c3aed 100%); padding: 20px; border-radius: 12px; border: 3px solid #a78bfa; box-shadow: 0 0 20px rgba(145, 70, 255, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: #a78bfa; margin: 0 0 10px 0;">📺 Streaming Studio Bonus Active 📺</h2> <p style="color: #ddd6fe; margin: 0; font-size: 16px;"> +15% to all stream results (viewers, engagement, earnings, followers) </p> </div> <</if>> <!-- ===== SKILL TREE: Display bonus notification ===== --> <<if _totalStreamingBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 20px; border-radius: 12px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: #CE93D8; margin: 0 0 10px 0;">⭐ Skill Tree Bonuses Active ⭐</h2> <p style="color: #E1BEE7; margin: 0; font-size: 16px;"> <<if _streamingBonus > 0>> Streaming Bonus: +<<print _streamingBonus>>% <</if>> <<if _streamingBonus > 0 && _normalStreamBonus > 0>> | <</if>> <<if _normalStreamBonus > 0>> Regular Stream Bonus: +<<print _normalStreamBonus>>% <</if>> </p> <p style="color: #CE93D8; margin: 10px 0 0 0; font-size: 18px; font-weight: bold;"> Extra Earnings: +$<<print _skillTreeBonus>> </p> </div> <</if>> <!-- Overall Summary --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(243, 156, 18, 0.3); margin-bottom: 25px;"> <h2 style="color: #f39c12; margin: 0 0 20px 0;">📈 Stream Summary</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Hours Streamed</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<= _stream ? _stream.hoursStreamed : 0>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #e74c3c;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">New Followers</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<= _stream ? _stream.newFollowers : _endResults.newFollowers>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #f39c12;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Total Earnings</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<= _finalEarnings>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #9b59b6;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Avg Engagement</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<= _stream && _stream.engagementData ? _stream.engagementData.average : 0>>%</div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #3498db;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Peak Viewers</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<= _stream && _stream.viewerData ? _stream.viewerData.peak : 0>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #e74c3c;"> <div style="color: #aaa; font-size: 13px; margin-bottom: 5px;">Total Followers</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;"><<= $streamingData.followers>></div> </div> </div> </div> <!-- Job Update Messages --> <<if _endResults.becameStreamer>> <div style="background: linear-gradient(135deg, #27ae60 0%, #229954 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(39, 174, 96, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🎉 Congratulations!</h2> <p style="color: #ffd; font-size: 18px; margin: 0;"> You've reached 500 followers! Your job is now <strong>Streamer</strong>!<br> You can now stream for up to 8 hours per day and keep 100% of your earnings! </p> </div> <<elseif _endResults.hasOtherJob && $streamingData.followers >= 500>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: white; margin: 0 0 15px 0;">💼 Job Opportunity</h2> <p style="color: #ffd; font-size: 16px; margin: 0 0 15px 0;"> You've reached 500 followers! Would you like to quit your current job and become a full-time Streamer? </p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='display: inline-block; background: #27ae60; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✓ Become Streamer (8 hrs/day, 100% earnings)</div>">> <<set $jobs = ["Streamer"]>> <<goto "UseLaptop">> <</link>> <<link "<div style='display: inline-block; background: #7f8c8d; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✗ Keep Current Job (4 hrs/day, 45% earnings)</div>">> <<goto "UseLaptop">> <</link>> </div> </div> <</if>> <!-- Milestone Progress (for under 500 followers) --> <<if $streamingData.followers < 500>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; margin-bottom: 25px;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">🎯 Progress to Streamer Status</h3> <<set _progress = Math.round(($streamingData.followers / 500) * 100)>> <div style="background: #0a0a0a; border-radius: 10px; height: 30px; overflow: hidden; border: 2px solid #333;"> <div style="background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); height: 100%; width: <<= _progress>>%; transition: width 0.5s;"></div> </div> <p style="color: #aaa; text-align: center; margin: 10px 0 0 0;"> <<= $streamingData.followers>> / 500 followers (<<= _progress>>%) </p> <p style="color: #888; text-align: center; margin: 5px 0 0 0; font-size: 14px;"> Reach 500 followers to unlock: Full earnings, special requests, big donations, and tip rain! </p> </div> <</if>> <!-- Crowd's Eye Notification --> <<if $currentArtifact === "The Crowd's Eye">> <div style="background: linear-gradient(135deg, #a78bfa 0%, #7c3aed 100%); padding: 20px; border-radius: 12px; border: 3px solid #a78bfa; box-shadow: 0 0 20px rgba(167, 139, 250, 0.4); margin-bottom: 25px; text-align: center; animation: pulse-eye 2s infinite;"> <h2 style="color: white; margin: 0 0 10px 0;">👁️ The Crowd's Eye 👁️</h2> <p style="color: white; margin: 0; font-size: 16px; font-weight: bold;"> Your magnetic presence has doubled your follower gains! </p> </div> <style> @keyframes pulse-eye { 0%, 100% { box-shadow: 0 0 20px rgba(167, 139, 250, 0.4); } 50% { box-shadow: 0 0 30px rgba(167, 139, 250, 0.7); } } </style> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 20px; border-radius: 12px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); margin-bottom: 25px; text-align: center; animation: pulse-pearl 2s infinite;"> <h2 style="color: white; margin: 0 0 10px 0;">🐚 The Pearl of Abundance 🐚</h2> <p style="color: white; margin: 0; font-size: 16px; font-weight: bold;"> Your streaming earnings have been increased by 50%! </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Hourly Breakdown --> <<if _stream && _stream.actions && _stream.actions.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">⏱️ Hourly Breakdown</h2> <<for _i = 0; _i < _stream.actions.length; _i++>> <<set _action = _stream.actions[_i]>> <<set _trendBorder = _action.wasTrending ? "border-left: 4px solid #e94560;" : "">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 10px; border: 2px solid #333; <<= _trendBorder>>"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;"> <div> <strong style="color: #4dabf7;">Hour <<= _action.hour>>:</strong> <span style="color: #aaa; margin-left: 10px;"><<= _action.action>></span> <<if _action.wasTrending>> <span style="background: #e94560; color: white; padding: 2px 8px; border-radius: 10px; font-size: 11px; margin-left: 8px;">🔥 TRENDING</span> <</if>> </div> <div style="display: flex; gap: 15px; font-size: 14px;"> <span style="color: #3498db;">👁️ <<= _action.viewers>></span> <span style="color: #9b59b6;">📊 <<= _action.engagement>>%</span> <span style="color: #f39c12;">💰 $<<= _action.money>></span> </div> </div> </div> <</for>> </div> <</if>> <!-- Earnings Breakdown --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #f39c12;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">💰 Earnings Breakdown</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;"><strong>Gross Earnings:</strong> <span style="color: #51cf66;">$<<= $streamingData.lastStream.grossEarnings>></span></p> <<if $streamingData.lastStream.platformCut > 0>> <<set _platformPercent = Math.round(($streamingData.lastStream.platformCut / Math.max(1, $streamingData.lastStream.grossEarnings)) * 100)>> <p style="margin: 5px 0;"><strong>Platform Cut (<<= _platformPercent>>%):</strong> <span style="color: #e74c3c;">-$<<= $streamingData.lastStream.platformCut>></span></p> <<else>> <p style="margin: 5px 0;"><strong>Platform Cut:</strong> <span style="color: #51cf66;">$0 (Streamer Perk!)</span></p> <</if>> <!-- ===== SKILL TREE: Show bonus in breakdown ===== --> <<if _skillTreeBonus > 0>> <p style="margin: 5px 0;"><strong>Skill Tree Bonus (+<<print _totalStreamingBonus>>%):</strong> <span style="color: #CE93D8;">+$<<= _skillTreeBonus>></span></p> <</if>> <<if _pearlActive>> <p style="margin: 5px 0;"><strong>Pearl Bonus (+50%):</strong> <span style="color: #7dd3fc;">+$<<= _pearlBonus>></span></p> <</if>> <p style="margin: 5px 0; padding-top: 10px; border-top: 2px solid #444;"><strong>Net Earnings:</strong> <span style="color: #ffd43b; font-size: 18px;">$<<= _finalEarnings>></span> <<if _pearlActive || _skillTreeBonus > 0>> <span style="color: <<if _pearlActive>>#7dd3fc<<else>>#CE93D8<</if>>; font-size: 14px;"> ✨</span> <</if>> </p> </div> <!-- Bank Deposit Notice --> <div style="background: #2a2a4a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #667eea;"> <p style="color: #667eea; margin: 0; text-align: center; font-size: 14px; font-weight: bold;"> 💳 All earnings deposited directly to your bank account </p> </div> <<if !$jobs || !$jobs.includes("Streamer")>> <div style="background: #3a2020; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #e74c3c;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> ⚠️ <strong>High Platform Fee!</strong> Get the Streamer job (500 followers) to keep 100% of your earnings instead of 45%. </p> </div> <</if>> </div> <!-- Current Balance Display --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #667eea;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">💼 Account Summary</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Cash on Hand:</p> <p style="color: #51cf66; margin: 0; font-size: 20px; font-weight: bold;"><<print setup.formatMoney ? setup.formatMoney($money) : "$" + $money>></p> </div> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Bank Balance:</p> <p style="color: #667eea; margin: 0; font-size: 20px; font-weight: bold;"><<print setup.formatMoney ? setup.formatMoney($bankAccount.balance) : "$" + $bankAccount.balance>></p> </div> </div> <div style="text-align: center; margin-top: 10px; padding-top: 10px; border-top: 1px solid #666;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Funds:</p> <p style="color: #ffd43b; margin: 0; font-size: 24px; font-weight: bold;"><<print setup.formatMoney ? setup.formatMoney($money + $bankAccount.balance) : "$" + ($money + $bankAccount.balance)>></p> </div> </div> <!-- Notable Events --> <<if _stream && _stream.events && _stream.events.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0;">🎬 Notable Events</h2> <div style="display: flex; flex-direction: column; gap: 12px;"> <<for _i = 0; _i < _stream.events.length; _i++>> <<set _event = _stream.events[_i]>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ffd43b;"> <div style="color: white; font-weight: bold; margin-bottom: 5px;"> Hour <<= _event.hour>>: <<= _event.event>> </div> <div style="color: #aaa; font-size: 14px;"> <<= _event.description>> </div> </div> <</for>> </div> </div> <</if>> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div class='stream-button'>← Return to Internet</div>">> <<set $streamingData.currentStream = null>> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>> <style> .streaming-container { background: #1a1a1a; min-height: 100vh; padding: 20px; color: #e0e0e0; } .stream-header { padding: 25px; background: linear-gradient(135deg, #9b59b6 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 0 30px rgba(155, 89, 182, 0.4); text-align: center; } .stream-header h1 { color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px; } .stream-button { display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); cursor: pointer; transition: all 0.3s ease; } .stream-button:hover { transform: translateY(-2px); box-shadow: 0 5px 10px rgba(0,0,0,0.4); } </style>
<<nobr>> <<set $lastLocation = "BrowseInternet">> <!-- Initialize streaming data if needed --> <<if !$streamingData>> <<set $streamingData = { followers: 0, totalStreams: 0, streamHistory: [] }>> <</if>> <<if typeof $streamingData.totalStreams === "undefined">> <<set $streamingData.totalStreams = 0>> <</if>> <<if !$streamingData.streamHistory>> <<set $streamingData.streamHistory = []>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #27ae60 0%, #229954 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #27ae60; box-shadow: 0 0 30px rgba(39, 174, 96, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">📊 Stream Analytics Dashboard</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Track your streaming performance and growth </p> </div> <!-- Overall Stats --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #27ae60; margin: 0 0 20px 0;">🎯 Channel Overview</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL FOLLOWERS</div> <div style="font-size: 32px; font-weight: bold; color: #e74c3c;"><<= $streamingData.followers || 0>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL STREAMS</div> <div style="font-size: 32px; font-weight: bold; color: #3498db;"><<= $streamingData.totalStreams || 0>></div> </div> <<if $streamingData.streamHistory && $streamingData.streamHistory.length > 0>> <<set _totalHours = 0>> <<set _totalIncome = 0>> <<for _i = 0; _i < $streamingData.streamHistory.length; _i++>> <<set _totalHours += $streamingData.streamHistory[_i].hours || 0>> <<set _totalIncome += $streamingData.streamHistory[_i].income || 0>> <</for>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">HOURS STREAMED</div> <div style="font-size: 32px; font-weight: bold; color: #9b59b6;"><<= _totalHours>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 32px; font-weight: bold; color: #f39c12;">$<<= _totalIncome>></div> </div> <<else>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">HOURS STREAMED</div> <div style="font-size: 32px; font-weight: bold; color: #9b59b6;">0</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 32px; font-weight: bold; color: #f39c12;">$0</div> </div> <</if>> </div> </div> <!-- Milestone Progress (for under 500 followers) --> <<if $streamingData.followers < 500>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; margin-bottom: 25px;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">🎯 Progress to Streamer Status</h3> <<set _progress = Math.round(($streamingData.followers / 500) * 100)>> <div style="background: #0a0a0a; border-radius: 10px; height: 30px; overflow: hidden; border: 2px solid #333;"> <div style="background: linear-gradient(90deg, #667eea 0%, #764ba2 100%); height: 100%; width: <<= _progress>>%; transition: width 0.5s;"></div> </div> <p style="color: #aaa; text-align: center; margin: 10px 0 0 0;"> <<= $streamingData.followers>> / 500 followers (<<= _progress>>%) </p> <p style="color: #888; text-align: center; margin: 5px 0 0 0; font-size: 14px;"> Reach 500 followers to unlock: Full earnings (100%), special requests, big donations, and tip rain! </p> </div> <</if>> <!-- Stream History --> <<if $streamingData.streamHistory && $streamingData.streamHistory.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 20px 0;">📅 Recent Stream History (Last 7)</h2> <<set _historyLength = $streamingData.streamHistory.length>> <<set _displayCount = Math.min(7, _historyLength)>> <<for _i = 0; _i < _displayCount; _i++>> <<set _stream = $streamingData.streamHistory[_i]>> <<if _stream>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; flex-wrap: wrap; gap: 10px;"> <div> <strong style="color: #4dabf7; font-size: 18px;"><<= _stream.date || "Unknown">></strong> <span style="color: #aaa; margin-left: 15px;"><<= _stream.category ? _stream.category.toUpperCase() : "STREAM">></span> </div> <div style="color: #aaa;"><<= _stream.hours || 0>> hour<<if _stream.hours !== 1>>s<</if>></div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 15px;"> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NEW FOLLOWERS</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<= _stream.newFollowers || 0>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">PEAK VIEWERS</div> <<if _stream.viewers && typeof _stream.viewers === "object">> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<= _stream.viewers.peak || 0>></div> <<elseif typeof _stream.viewers === "number">> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<= _stream.viewers>></div> <<else>> <div style="color: #3498db; font-size: 20px; font-weight: bold;">0</div> <</if>> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">AVG ENGAGEMENT</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<= _stream.engagement || 0>>%</div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">EARNED</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<= _stream.income || 0>></div> </div> </div> </div> <</if>> <</for>> </div> <!-- Last 7 Streams Statistics --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #e74c3c; margin: 0 0 20px 0;">📈 Recent Performance Summary</h2> <<set _historyLength = $streamingData.streamHistory.length>> <<set _statsCount = Math.min(7, _historyLength)>> <<set _last7TotalFollowers = 0>> <<set _last7TotalIncome = 0>> <<set _last7TotalHours = 0>> <<set _last7TotalViewers = 0>> <<set _last7TotalEngagement = 0>> <<for _j = 0; _j < _statsCount; _j++>> <<set _histStream = $streamingData.streamHistory[_j]>> <<if _histStream>> <<set _last7TotalFollowers += _histStream.newFollowers || 0>> <<set _last7TotalIncome += _histStream.income || 0>> <<set _last7TotalHours += _histStream.hours || 0>> <<if _histStream.viewers && typeof _histStream.viewers === "object">> <<set _last7TotalViewers += _histStream.viewers.peak || 0>> <<elseif typeof _histStream.viewers === "number">> <<set _last7TotalViewers += _histStream.viewers>> <</if>> <<set _last7TotalEngagement += _histStream.engagement || 0>> <</if>> <</for>> <<set _avgViewers = _statsCount > 0 ? Math.round(_last7TotalViewers / _statsCount) : 0>> <<set _avgEngagement = _statsCount > 0 ? Math.round(_last7TotalEngagement / _statsCount) : 0>> <<set _avgIncomePerStream = _statsCount > 0 ? Math.round(_last7TotalIncome / _statsCount) : 0>> <<set _avgFollowersPerStream = _statsCount > 0 ? Math.round(_last7TotalFollowers / _statsCount) : 0>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL NEW FOLLOWERS</div> <div style="font-size: 28px; font-weight: bold; color: #e74c3c;">+<<= _last7TotalFollowers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: <<= _avgFollowersPerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<= _last7TotalIncome>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: $<<= _avgIncomePerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG PEAK VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<= _avgViewers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<= _statsCount>> streams</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<= _avgEngagement>>%</div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<= _statsCount>> streams</div> </div> </div> </div> <<else>> <!-- No Stream History --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center; margin-bottom: 25px;"> <div style="font-size: 48px; margin-bottom: 20px;">📊</div> <h2 style="color: #aaa; margin: 0 0 15px 0;">No Stream Data Yet</h2> <p style="color: #888; font-size: 16px; margin: 0;"> Start streaming to see your analytics and performance metrics here! </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Check for exhaustion and force end stream --> <<if setup.hasDebuff("exhaustion") && $streamingData.currentStream>> <<goto "StreamResults">> <</if>> <!-- Check if player has Makeup skill --> <<if !$skills.includes("Makeup")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need the <strong style="color: #e91e63;">Makeup</strong> skill to stream Styling & Makeup content. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without professional makeup skills, you won't be able to create quality beauty tutorials. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("styling")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 0 30px rgba(233, 30, 99, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> <span class="live-indicator"></span> Styling & Makeup Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Beauty tutorials and styling tips for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("styling")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartStylingStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartStylingStream">> <</link>> </div> </div> <</if>> <<include "StreamTrendingDisplay">> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <<set _trendInfo = (typeof setup.getTrendDisplay === "function") ? setup.getTrendDisplay("styling") : { actions: {} }>> <div class="action-grid"> <<set _actions = setup.streamActions.styling>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <<set _isTrending = _trendInfo.actions && _trendInfo.actions[_actionName]>> <<set _trendBoost = _isTrending ? Math.round((_trendInfo.actions[_actionName].boost - 1) * 100) : 0>> <<set _cardBorder = _isTrending ? "#e94560" : "#e91e63">> <<set _cardGlow = _isTrending ? "box-shadow: 0 0 15px rgba(233, 69, 96, 0.4);" : "">> <div class="action-card" style="border: 3px solid <<= _cardBorder>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease; position: relative; <<= _cardGlow>>"> <<if _isTrending>> <div style="position: absolute; top: -10px; right: 10px; background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold; color: white;"> 🔥 +<<= _trendBoost>>% </div> <</if>> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<print _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">+<<print _actionData.baseViewerGain>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">~$<<print _actionData.baseMoney>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>"><<print _actionData.baseEngagement>>%<<if _isTrending>> ↑<</if>></span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> <<include "StreamingStyles">> </style>
<<nobr>> <!-- Check for exhaustion and force end stream --> <<if setup.hasDebuff("exhaustion") && $streamingData.currentStream>> <<goto "StreamResults">> <</if>> <<if !$streamingData.currentStream>> <<run setup.startStream("gaming")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #3498db; box-shadow: 0 0 30px rgba(52, 152, 219, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> <span class="live-indicator"></span> Gaming Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Epic gameplay and entertainment for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <!-- Random special request (20% chance if 2+ hours streamed) --> <<if _stream.hoursStreamed >= 2 && Math.random() < 0.20 && !_stream.pendingRequest>> <<set _stream.pendingRequest = setup.streamSpecialRequests("gaming")>> <</if>> <<if _stream.pendingRequest>> <div class="special-request"> <h3>💵 Special Request!</h3> <p><<= _stream.pendingRequest.description>></p> <p style="color: white; font-weight: bold; margin-top: 10px;"> Payment: $<<= _stream.pendingRequest.payment>> </p> <div class="request-buttons"> <<link "<div class='request-button accept'>✓ Accept Request</div>">> <<set $money += _stream.pendingRequest.payment>> <<set _stream.incomeData.total += _stream.pendingRequest.payment>> <<set _stream.viewerData.current += _stream.pendingRequest.viewers>> <<run _stream.events.push({ event: "Special Request Completed", hour: _stream.hoursStreamed + 1, description: "You fulfilled a special viewer request for $" + _stream.pendingRequest.payment + "!" })>> <<set _stream.pendingRequest = null>> <<goto "StartGamingStream">> <</link>> <<link "<div class='request-button decline'>✗ Decline</div>">> <<set _stream.pendingRequest = null>> <<goto "StartGamingStream">> <</link>> </div> </div> <</if>> <<include "StreamTrendingDisplay">> <!-- Action Selection --> <div class="action-selection"> <h2>🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <<set _trendInfo = (typeof setup.getTrendDisplay === "function") ? setup.getTrendDisplay("gaming") : { actions: {} }>> <div class="action-grid"> <<set _actions = setup.streamActions.gaming>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <<set _isTrending = _trendInfo.actions && _trendInfo.actions[_actionName]>> <<set _trendBoost = _isTrending ? Math.round((_trendInfo.actions[_actionName].boost - 1) * 100) : 0>> <<set _cardBorder = _isTrending ? "#e94560" : "#3498db">> <<set _cardGlow = _isTrending ? "box-shadow: 0 0 15px rgba(233, 69, 96, 0.4);" : "">> <div class="action-card" style="border: 3px solid <<= _cardBorder>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease; position: relative; <<= _cardGlow>>"> <<if _isTrending>> <div style="position: absolute; top: -10px; right: 10px; background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold; color: white;"> 🔥 +<<= _trendBoost>>% </div> <</if>> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<print _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">+<<print _actionData.baseViewerGain>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">~$<<print _actionData.baseMoney>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>"><<print _actionData.baseEngagement>>%<<if _isTrending>> ↑<</if>></span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</nobr>> <style> <<include "StreamingStyles">> </style>
<<nobr>> <!-- Check for exhaustion and force end stream --> <<if setup.hasDebuff("exhaustion") && $streamingData.currentStream>> <<goto "StreamResults">> <</if>> <!-- Check if player has required music skills (Siren transformation includes Singing) --> <<set _hasSinging = $skills.includes("Singing") || $physicalTraits.includes("Siren")>> <<set _hasGuitar = $skills.includes("Guitar")>> <<set _hasPiano = $skills.includes("Piano")>> <<if !_hasSinging && !_hasGuitar && !_hasPiano>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need at least one of these skills to stream music: <strong style="color: #ff6347;">Singing</strong>, <strong style="color: #ff6347;">Guitar</strong>, or <strong style="color: #ff6347;">Piano</strong>. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without musical skills, you won't be able to create quality music content. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("music")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header" style="background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%);"> <h1> <span class="live-indicator"></span> Music Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Live musical performance for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <<include "StreamTrendingDisplay">> <!-- Action Selection --> <div class="action-selection"> <h2 style="color: #ff6347;">🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to do for the next hour of your stream. </p> <<set _trendInfo = (typeof setup.getTrendDisplay === "function") ? setup.getTrendDisplay("music") : { actions: {} }>> <div class="action-grid"> <<set _actions = setup.streamActions.music>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <<set _isTrending = _trendInfo.actions && _trendInfo.actions[_actionName]>> <<set _trendBoost = _isTrending ? Math.round((_trendInfo.actions[_actionName].boost - 1) * 100) : 0>> <<set _cardBorder = _isTrending ? "#e94560" : "#ff6347">> <<set _cardGlow = _isTrending ? "box-shadow: 0 0 15px rgba(233, 69, 96, 0.4);" : "">> <div class="action-card" style="border: 3px solid <<= _cardBorder>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease; position: relative; <<= _cardGlow>>"> <<if _isTrending>> <div style="position: absolute; top: -10px; right: 10px; background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold; color: white;"> 🔥 +<<= _trendBoost>>% </div> <</if>> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<print _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">+<<print _actionData.baseViewerGain>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">~$<<print _actionData.baseMoney>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>"><<print _actionData.baseEngagement>>%<<if _isTrending>> ↑<</if>></span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> <<include "StreamingStyles">> </style>
<<nobr>> <!-- Check for exhaustion and force end stream --> <<if setup.hasDebuff("exhaustion") && $streamingData.currentStream>> <<goto "StreamResults">> <</if>> <!-- Check if player has required cooking skills --> <<set _hasCooking = $skills.includes("Cooking")>> <<set _hasBaking = $skills.includes("Baking")>> <<if !_hasCooking && !_hasBaking>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="padding: 25px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e74c3c; box-shadow: 0 0 30px rgba(231, 76, 60, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5); font-size: 32px;"> 🚫 Skill Required </h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; border: 2px solid #e74c3c; text-align: center;"> <p style="color: #aaa; font-size: 18px; line-height: 1.6; margin: 0 0 25px 0;"> You need at least one of these skills to stream cooking: <strong style="color: #f39c12;">Cooking</strong> or <strong style="color: #f39c12;">Baking</strong>. </p> <p style="color: #888; font-size: 16px; margin: 0 0 25px 0;"> Without culinary skills, you won't be able to create quality cooking content. </p> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Categories</div>">> <<goto "SelectStreamCategory">> <</link>> </div> </div> <<else>> <<if !$streamingData.currentStream>> <<run setup.startStream("cooking")>> <</if>> <<set _stream = $streamingData.currentStream>> <<set _canContinue = _stream.hoursStreamed < _stream.maxHours>> <div class="streaming-container"> <!-- Header --> <div class="stream-header" style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%);"> <h1> <span class="live-indicator"></span> Cooking Stream - LIVE </h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Delicious cooking content for your viewers </p> </div> <!-- Stats Bar --> <div class="stream-stats-bar"> <div class="stat-card followers"> <div class="stat-icon">👥</div> <div class="stat-label">Followers</div> <div class="stat-value"><<= $streamingData.followers>></div> </div> <div class="stat-card viewers"> <div class="stat-icon">👁️</div> <div class="stat-label">Current Viewers</div> <div class="stat-value"><<= _stream.viewerData.current>></div> <div style="font-size: 12px; color: #aaa; margin-top: 5px;"> Peak: <<= _stream.viewerData.peak>> </div> </div> <div class="stat-card money"> <div class="stat-icon">💰</div> <div class="stat-label">Earnings</div> <div class="stat-value">$<<= _stream.incomeData.total>></div> </div> <div class="stat-card time"> <div class="stat-icon">⏱️</div> <div class="stat-label">Stream Time</div> <div class="stat-value"><<= _stream.hoursStreamed>> / <<= _stream.maxHours>> hrs</div> </div> </div> <!-- Show recent event if any --> <<if _stream.events.length > 0>> <<set _lastEvent = _stream.events[_stream.events.length - 1]>> <div class="event-notification"> <h3>🎉 <<= _lastEvent.event>></h3> <p><<= _lastEvent.description>></p> </div> <</if>> <!-- Trait Effects Display (Collapsible) --> <<if _stream.modifiers.traits.length > 0>> <<if !$hideTraitEffects>><<set $hideTraitEffects = false>><</if>> <div class="trait-effects"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="margin: 0;">✨ Active Trait Effects</h2> <<link "<<if $hideTraitEffects>>▼ Show<<else>>▲ Hide<</if>>">> <<set $hideTraitEffects = !$hideTraitEffects>> <<replace "#traitEffectsSection">> <<include "StreamTraitEffectsDisplay">> <</replace>> <</link>> </div> <span id="traitEffectsSection"> <<include "StreamTraitEffectsDisplay">> </span> </div> <</if>> <<if _canContinue>> <<include "StreamTrendingDisplay">> <!-- Action Selection --> <div class="action-selection"> <h2 style="color: #f39c12;">🎬 Choose Your Next Action (Hour <<= _stream.hoursStreamed + 1>>)</h2> <p style="color: #aaa; margin-bottom: 20px;"> Select what you want to cook for the next hour of your stream. </p> <<set _trendInfo = (typeof setup.getTrendDisplay === "function") ? setup.getTrendDisplay("cooking") : { actions: {} }>> <div class="action-grid"> <<set _actions = setup.streamActions.cooking>> <<for _actionName, _actionData range _actions>> <<capture _actionName, _actionData>> <<set _isTrending = _trendInfo.actions && _trendInfo.actions[_actionName]>> <<set _trendBoost = _isTrending ? Math.round((_trendInfo.actions[_actionName].boost - 1) * 100) : 0>> <<set _cardBorder = _isTrending ? "#e94560" : "#f39c12">> <<set _cardGlow = _isTrending ? "box-shadow: 0 0 15px rgba(233, 69, 96, 0.4);" : "">> <div class="action-card" style="border: 3px solid <<= _cardBorder>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); cursor: pointer; transition: all 0.3s ease; position: relative; <<= _cardGlow>>"> <<if _isTrending>> <div style="position: absolute; top: -10px; right: 10px; background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 4px 12px; border-radius: 12px; font-size: 11px; font-weight: bold; color: white;"> 🔥 +<<= _trendBoost>>% </div> <</if>> <<link _actionName>> <<set $streamActionResult = setup.processStreamHour(_actionName)>> <<advancetime 60>> <<goto "StreamActionResult">> <</link>> <p style="color: #aaa; font-size: 14px; margin: 10px 0;"><<print _actionData.description>></p> <div style="display: flex; justify-content: space-between; font-size: 12px; color: #888; margin-top: 10px;"> <div style="display: flex; align-items: center; gap: 5px;"> <span>👁️</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">+<<print _actionData.baseViewerGain>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>💰</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>">~$<<print _actionData.baseMoney>><<if _isTrending>> ↑<</if>></span> </div> <div style="display: flex; align-items: center; gap: 5px;"> <span>📊</span> <span style="<<if _isTrending>>color: #e94560; font-weight: bold;<</if>>"><<print _actionData.baseEngagement>>%<<if _isTrending>> ↑<</if>></span> </div> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <!-- Stream time limit reached --> <div style="text-align: center; padding: 40px;"> <h2 style="color: #e74c3c;"> ⏰ Stream Time Limit Reached </h2> <p style="color: #aaa; font-size: 16px; margin: 20px 0;"> You've reached your maximum stream time for today. <<if _stream.maxHours === 4>> (Limited to 4 hours due to having another job) <</if>> </p> </div> <</if>> <!-- Stream Controls --> <div style="text-align: center; margin-top: 30px; padding-top: 20px; border-top: 2px solid #333;"> <<if _stream.hoursStreamed >= 1>> <<link "<div class='stream-button end'>📴 End Stream</div>">> <<goto "StreamResults">> <</link>> <<else>> <p style="color: #888; font-style: italic;"> Must stream for at least 1 hour before ending </p> <</if>> <div style="margin-top: 15px;"> <<link "<div class='stream-button' style='background: #7f8c8d;'>← Back to Laptop</div>">> <<if _stream.hoursStreamed >= 1>> <<goto "StreamResults">> <<else>> <<set $streamingData.currentStream = null>> <<goto "UseLaptop">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>> <style> <<include "StreamingStyles">> </style>
<<nobr>> <<if !setup.isMallOpen()>> <<goto "MallClosed">> <</if>> <<set $lastLocation = "MallFloor2">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("MallFloor2")>> <<run $visitedLocations.push("MallFloor2")>> <</if>> <!-- Check if player has bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">🛍️ Sunfish City Mall - Floor 2</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> The second floor features specialty shops and music stores. The sound of distant music drifts through the corridors. </p> </div> <h2 style="color: #9b59b6;">Floor 2 Directory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Turbo Tuna Athletics --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚡ Turbo Tuna Athletics</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">High-performance sportswear and athletic gear.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Neon Tetra Temptations --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">💋 Neon Tetra Temptations</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Seductive lingerie and intimate apparel.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Puffers and Pockets --> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #95a5a6; margin: 0 0 10px 0;">👕 Puffers and Pockets</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Comfortable everyday wear and casual fashion.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Koi Crown --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px; opacity: 0.6;"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">👑 Koi Crown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Premium designer fashion and luxury apparel.</p> <div style='background: #555; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Chromis Tunes --> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎸 Chromis Tunes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Musical instruments, gear, and recording equipment.</p> <<link "<div style='background: #ff6347; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "ChromisTunes">> <</link>> </div> <!-- Coral Furnishings --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🏠 Coral Furnishings</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Affordable home decor and furnishings to make your space feel like home.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<goto "MallCoralFurnishings">> <</link>> </div> <!-- ATM - 6th Slot --> <div style="border: 3px solid <<if _hasBankAccount>>#4dabf7<<else>>#555<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: <<if _hasBankAccount>>#4dabf7<<else>>#888<</if>>; margin: 0 0 10px 0;">🏧 ATM</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;"> <<if _hasBankAccount>> Quick cash withdrawals. FREE - no fees! $30,000/day limit. <<else>> Requires bank account. Open one at Sunfish City Bank for $250. <</if>> </p> <<if _hasBankAccount>> <<link "<div style='background: #4dabf7; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Use ATM</div>" "ATM">><</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed; border: 1px solid #555;'> No Account </div> <</if>> </div> </div> <br> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Go to Floor 1 ⬇️</div>">> <<goto "Mall">> <</link>> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Mall</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ChromisTunes">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ChromisTunes")>> <<run $visitedLocations.push("ChromisTunes")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6347; text-align: center;">🎸 Chromis Tunes</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6347 0%, #ff4500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6347;"> <p style="color: white; font-size: 18px; margin: 0;"> The walls are lined with guitars, keyboards, and audio equipment. The faint hum of amplifiers fills the air, and you can hear someone testing a drum kit in the back room. </p> </div> <h2 style="color: #ff6347;">Available Equipment</h2> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Guitar --> <<set _canAffordGuitar = setup.canAffordTotal(500)>> <div style="border: 3px solid <<if $ownsGuitar>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎸 Guitar</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A quality acoustic-electric guitar perfect for streaming.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $500</p> <<if $ownsGuitar>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif _canAffordGuitar>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set _payment = setup.payAmount(500)>> <<if _payment.success>> <<set $ownsGuitar = true>> <</if>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Electric Piano --> <<set _canAffordPiano = setup.canAffordTotal(800)>> <div style="border: 3px solid <<if $ownsElectricPiano>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎹 Electric Piano</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A professional 88-key digital piano with weighted keys.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $800</p> <<if $ownsElectricPiano>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif _canAffordPiano>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set _payment = setup.payAmount(800)>> <<if _payment.success>> <<set $ownsElectricPiano = true>> <</if>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Microphone --> <<set _canAffordMic = setup.canAffordTotal(300)>> <div style="border: 3px solid <<if $ownsMicrophone>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🎤 Microphone</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">A studio-quality condenser microphone with stand.</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $300</p> <<if $ownsMicrophone>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif _canAffordMic>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set _payment = setup.payAmount(300)>> <<if _payment.success>> <<set $ownsMicrophone = true>> <</if>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> <!-- Speakers --> <<set _canAffordSpeakers = setup.canAffordTotal(600)>> <div style="border: 3px solid <<if $ownsSpeakers>>#2ecc71<<else>>#ff6347<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">🔊 Speakers</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">High-quality studio monitor speakers (pair).</p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 10px 0;">Price: $600</p> <<if $ownsSpeakers>> <div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>✓ Owned</div> <<elseif _canAffordSpeakers>> <<link "<div style='background: #ff6347; color: white; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Purchase</div>">> <<set _payment = setup.payAmount(600)>> <<if _payment.success>> <<set $ownsSpeakers = true>> <</if>> <<goto "ChromisTunes">> <</link>> <<else>> <div style='background: #555; color: #aaa; padding: 8px; border-radius: 6px; text-align: center; font-weight: bold;'>Not Enough Money</div> <</if>> </div> </div> <br> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Back to Floor 2</div>">> <<goto "MallFloor2">> <</link>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("ChromisTunes")>> <h2 style="color: #ff6347;">🎸 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #ff6347; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The music store is quiet right now. Just the hum of amplifiers in the background. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$hideTraitEffects>> <div class="trait-list"> <<for _i = 0; _i < _stream.modifiers.traits.length; _i++>> <<set _trait = _stream.modifiers.traits[_i]>> <div @class="'trait-item ' + _trait.type"> <div class="trait-icon"><<if _trait.type === "positive">>✅<<else>>❌<</if>></div> <div class="trait-info"> <div class="trait-name"><<= _trait.name>></div> <div class="trait-description"><<= _trait.description>></div> </div> </div> <</for>> </div> <div style="margin-top: 15px; padding: 12px; background: #0a0a0a; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #51cf66;">Total Modifiers:</strong> <span style="color: white; margin-left: 10px;"> Viewers: <<if _stream.modifiers.viewerMultiplier > 1>>+<</if>><<= Math.floor((_stream.modifiers.viewerMultiplier - 1) * 100)>>% </span> <span style="color: white; margin-left: 20px;"> Engagement: <<if _stream.modifiers.engagementMultiplier > 1>>+<</if>><<= Math.floor((_stream.modifiers.engagementMultiplier - 1) * 100)>>% </span> </div> <</if>> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">📺 Streaming System</h2> <!-- Follower Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">Follower Count</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #9b59b6;">Current Followers:</strong> <span id="followerCount" style="color: #ffd43b; font-size: 18px; font-weight: bold; margin-left: 10px;"><<print $streamingData.followers || 0>></span> </div> <!-- Increase Followers --> <div style="margin-bottom: 15px;"> <p style="color: #51cf66; margin: 0 0 10px 0; font-weight: bold;">⬆️ Increase Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1</div>">> <<set $streamingData.followers += 1>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10</div>">> <<set $streamingData.followers += 10>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+100</div>">> <<set $streamingData.followers += 100>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1,000</div>">> <<set $streamingData.followers += 1000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10,000</div>">> <<set $streamingData.followers += 10000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+100,000</div>">> <<set $streamingData.followers += 100000>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> <!-- Decrease Followers --> <div style="margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0 0 10px 0; font-weight: bold;">⬇️ Decrease Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-1</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 1)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-10</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 10)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-100</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 100)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-1,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 1000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-10,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 10000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-100,000</div>">> <<set $streamingData.followers = Math.max(0, $streamingData.followers - 100000)>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> <!-- Reset/Set Specific Amount --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 500 (Streamer Job)</div>">> <<set $streamingData.followers = 500>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to 0</div>">> <<set $streamingData.followers = 0>> <<replace "#followerCount">><<print $streamingData.followers || 0>><</replace>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("MeetNeighbors")>> <<run $visitedLocations.push("MeetNeighbors")>> <</if>> <<set $lastLocation = "MeetNeighbors">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">👥 Apartment Common Area</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> A cozy common area with comfortable seating and a large TV. Several of your neighbors are here, chatting and relaxing. </p> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("MeetNeighbors")>> <h2 style="color: #9b59b6;">Lounge</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 20px 0;">Some of your neighbors are also content creators!</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<if setup.isNPCAvailable(_npc.name)>> <<capture _npc>> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</if>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin: 0; text-align: center; font-style: italic;"> The common area is empty right now. No streamers are around. </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Apartments</div>">> <<goto "Apartments">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub">> <!-- Check for bank account using correct property --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔞 PrawnHub</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <p style="color: white; font-size: 18px; margin: 0;"> Welcome to PrawnHub - the internet's premier adult entertainment platform. Browse content or stream your own. </p> </div> <h2 style="color: #ff1493;">Adult Entertainment Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Browse Content --> <div style="border: 3px solid #ff69b4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff69b4; margin: 0 0 10px 0;">👀 Browse Content</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Watch adult videos and explore various categories.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Coming Soon</div> </div> <!-- Stream Yourself --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">📹 Stream Yourself</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">Go live and earn money from viewers watching your stream.</p> <<if !$hasWebcam>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Webcam</div> <<elseif !_hasBankAccount>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 14px; border: 1px solid #6b4a4a; margin-top: 10px;'>Requires Bank Account</div> <<elseif $jobs && $jobs.includes("Criminal")>> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Go Live</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "adultStreaming">> <<goto "CaughtByPolice">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px;'>Go Live</div>">> <<goto "PrawnHubStream">> <</link>> <</if>> </div> <!-- Adult Stream Analytics --> <<if $prawnhubRegistered>> <div style="border: 3px solid #ff6347; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h3 style="color: #ff6347; margin: 0 0 10px 0;">📊 PrawnHub Analytics</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4;">View your adult streaming statistics, earnings, and viewer metrics.</p> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>View Analytics</div>">> <<goto "PrawnHubAnalytics">> <</link>> </div> <</if>> </div> <!-- Bank Account Requirement Notice (for adult streaming) --> <<if !_hasBankAccount && $hasWebcam>> <div style="background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ff1493; box-shadow: 0 4px 8px rgba(255,20,147,0.4);"> <h3 style="color: white; margin: 0 0 10px 0; text-align: center;">💳 Bank Account Required for Adult Streaming</h3> <p style="color: white; margin: 0; text-align: center; font-size: 15px;"> Adult streaming platforms require a bank account to receive tips, donations, and revenue payments from viewers.<br><br> Open a bank account at the Sunfish City Bank in Downtown. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Internet</div>">> <<goto "BrowseInternet">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubStream">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔞 PrawnHub Streaming</h1> <!-- Registration Check --> <<if !$prawnhubRegistered>> <div style="padding: 30px; background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493; text-align: center;"> <h2 style="color: #ff1493; margin-bottom: 20px;">Welcome to PrawnHub Streaming!</h2> <p style="color: #ccc; font-size: 16px; margin-bottom: 25px;"> Ready to start your adult streaming career? Create your performer profile to begin earning from live streams. </p> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #ff69b4; margin-bottom: 20px;"> <h3 style="color: #ff69b4; margin-top: 0;">How It Works:</h3> <ul style="color: #aaa; text-align: left; line-height: 1.8;"> <li>Go live and perform for viewers</li> <li>Earn tips and donations during streams</li> <li>Build your follower base</li> <li>70% revenue share (you keep $0.70 per dollar earned)</li> <li>Stream up to 8 hours per session</li> </ul> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Register as Performer</div>">> <<set $prawnhubRegistered = true>> <<goto "PrawnHubStream">> <</link>> </div> <<else>> <!-- Check for bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <!-- Streaming Interface --> <div style="padding: 20px; background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <!-- Stats Display --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 14px; margin-bottom: 5px;">👥 Followers</div> <div style="color: white; font-size: 24px; font-weight: bold;"><<print $prawnhubFollowers.toLocaleString()>></div> </div> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #4ade80;"> <div style="color: #4ade80; font-size: 14px; margin-bottom: 5px;">💰 Total Earnings</div> <div style="color: white; font-size: 24px; font-weight: bold;">$<<print $prawnhubTotalEarnings.toFixed(2)>></div> </div> <div style="background: #333; padding: 15px; border-radius: 8px; border: 1px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 14px; margin-bottom: 5px;">⏱️ Session Limit</div> <div style="color: white; font-size: 24px; font-weight: bold;">8 Hours</div> </div> </div> <!-- Bank Account Requirement Notice --> <<if !_hasBankAccount>> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #dc3545; box-shadow: 0 4px 8px rgba(220,53,69,0.4);"> <h3 style="color: white; margin: 0 0 10px 0; text-align: center;">🏦 Bank Account Required</h3> <p style="color: white; margin: 0 0 15px 0; text-align: center; font-size: 15px;"> PrawnHub requires all performers to have a bank account for receiving digital payments and tips. </p> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: white; color: #dc3545; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>Open Bank Account</div>">> <<goto "Bank">> <</link>> </div> </div> <</if>> <!-- Go Live Button --> <div style="text-align: center; margin: 30px 0;"> <<if _hasBankAccount>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 20px 50px; border-radius: 10px; font-weight: bold; font-size: 20px; box-shadow: 0 6px 12px rgba(255,20,147,0.4);'>🔴 GO LIVE</div>">> <<goto "PrawnHubLiveStream">> <</link>> <<else>> <div style='display: inline-block; background: #4a2a2a; color: #c9a8a8; padding: 20px 50px; border-radius: 10px; font-weight: bold; font-size: 20px; border: 2px solid #6b4a4a; cursor: not-allowed;'>🔴 GO LIVE (Bank Account Required)</div> <</if>> </div> <!-- Recent Streams --> <<if $prawnhubStreamHistory.length > 0>> <h3 style="color: #ff1493; margin-top: 30px;">Recent Streams</h3> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 1px solid #444;"> <<for _i = 0; _i < Math.min(5, $prawnhubStreamHistory.length); _i++>> <<set _stream = $prawnhubStreamHistory[$prawnhubStreamHistory.length - 1 - _i]>> <div style="padding: 10px; background: #333; margin-bottom: 10px; border-radius: 6px; border-left: 3px solid #ff1493;"> <div style="color: #ff69b4; font-weight: bold;">Day <<print _stream.day>></div> <div style="color: #aaa; font-size: 14px;"> Viewers: <<print _stream.viewers || 0>> | Earnings: $<<print (_stream.netEarnings || 0).toFixed(2)>> | New Followers: +<<print _stream.newFollowers>> </div> </div> <</for>> </div> <</if>> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubLiveStream">> <!-- Initialize streaming session if not already started --> <<if !$currentPrawnStream>> <!-- Calculate base viewers --> <<set _baseViewers = Math.max(10, Math.floor($prawnhubFollowers * 0.15) + random(5, 20))>> <<set $currentPrawnStream = { active: true, startTime: $gameTime, totalMinutes: 0, maxMinutes: 480, viewers: _baseViewers, peakViewers: 0, baseEngagement: 45, currentEngagement: 45, earnings: 0, tips: 0, currentAction: null, actionTimeLeft: 0, actionsPerformed: [], clothingLayers: 3, specialAccessoryActive: false, startingFollowers: $prawnhubFollowers }>> <<set $currentPrawnStream.peakViewers = $currentPrawnStream.viewers>> <</if>> <!-- Action is running - advance time by 30 minutes --> <<if $currentPrawnStream.actionTimeLeft > 0>> <<set $currentPrawnStream.actionTimeLeft -= 30>> <<set $currentPrawnStream.totalMinutes += 30>> <<advancetime 30>> <!-- Calculate earnings for this 30-minute segment --> <<set _engagementMultiplier = $currentPrawnStream.currentEngagement / 100>> <<set _viewerTips = $currentPrawnStream.viewers * random(0.5, 2.5) * _engagementMultiplier>> <<set _playerShare = _viewerTips * 0.70>> <<set $currentPrawnStream.earnings += _playerShare>> <<set $currentPrawnStream.tips += Math.floor(random(1, 4))>> <!-- Viewer fluctuation --> <<set _viewerChange = random(-3, 8)>> <<set $currentPrawnStream.viewers = Math.max(5, $currentPrawnStream.viewers + _viewerChange)>> <<if $currentPrawnStream.viewers > $currentPrawnStream.peakViewers>> <<set $currentPrawnStream.peakViewers = $currentPrawnStream.viewers>> <</if>> <!-- Reset action if time is up --> <<if $currentPrawnStream.actionTimeLeft <= 0>> <<set $currentPrawnStream.currentAction = null>> <</if>> <</if>> <!-- Check chest and butt sizes --> <<set _hasChestSize = false>> <<if $bodyParts && $bodyParts.chest>> <<if ["medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.chest)>> <<set _hasChestSize = true>> <</if>> <</if>> <<set _hasButtSize = false>> <<if $bodyParts && $bodyParts.butt>> <<if ["medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.butt)>> <<set _hasButtSize = true>> <</if>> <</if>> <<set _hasBreasts = false>> <<if $bodyParts && $bodyParts.chest>> <<if ["small", "medium", "large", "huge", "giant", "gigantic"].includes($bodyParts.chest)>> <<set _hasBreasts = true>> <</if>> <</if>> <!-- Check for adult toys --> <<set _hasToy = false>> <<if $ownsFleshlight || $ownsDildo>> <<set _hasToy = true>> <</if>> <<set _hasOralToy = false>> <<if $ownsFleshlight || $ownsDildo>> <<set _hasOralToy = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 LIVE on PrawnHub</h1> <!-- Stream Stats Bar --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-bottom: 20px;"> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 12px;">👥 VIEWERS</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<print $currentPrawnStream.viewers>></div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #4ade80;"> <div style="color: #4ade80; font-size: 12px;">📊 ENGAGEMENT</div> <div style="color: white; font-size: 20px; font-weight: bold;"><<print Math.round($currentPrawnStream.currentEngagement)>>%</div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 12px;">💰 EARNINGS</div> <div style="color: white; font-size: 20px; font-weight: bold;">$<<print $currentPrawnStream.earnings.toFixed(2)>></div> </div> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border: 2px solid #c71585;"> <div style="color: #c71585; font-size: 12px;">⏱️ TIME LEFT</div> <div style="color: white; font-size: 20px; font-weight: bold;"> <<print Math.floor(($currentPrawnStream.maxMinutes - $currentPrawnStream.totalMinutes) / 60)>>h <<print ($currentPrawnStream.maxMinutes - $currentPrawnStream.totalMinutes) % 60>>m </div> </div> </div> <!-- Current Action Display --> <<if $currentPrawnStream.currentAction !== null>> <div style="background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); padding: 20px; border-radius: 10px; margin-bottom: 20px; text-align: center; border: 2px solid #ff69b4;"> <div style="color: white; font-size: 18px; font-weight: bold; margin-bottom: 10px;"> <<print $currentPrawnStream.currentAction.message>> </div> <div style="color: #ffe6f0; font-size: 16px;"> ⏰ Time Remaining: <<print $currentPrawnStream.actionTimeLeft>> minutes </div> </div> <</if>> <!-- Performance Actions Grid --> <<if $currentPrawnStream.totalMinutes < $currentPrawnStream.maxMinutes>> <h2 style="color: #ff1493; margin-bottom: 15px;">Performance Actions</h2> <div class="prawn-actions-grid"> <!-- STRIP CLOTHING --> <<set _hasStripped = $currentPrawnStream.actionsPerformed.includes("STRIP_CLOTHING")>> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && !_hasStripped>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING</div><div style='color: #aaa; font-size: 13px;'>Slowly remove each piece</div></div>">> <<goto "PrawnHub_Action01">> <</link>> <<elseif _hasStripped>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING ✓</div><div style='color: #8a6a6a; font-size: 13px;'>Already Used</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>STRIP CLOTHING</div><div style='color: #555; font-size: 13px;'>Slowly remove each piece</div></div> <</if>> </div> <!-- SIMULATE SEX --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasToy>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX</div><div style='color: #aaa; font-size: 13px;'>Simulate sex with an adult toy</div></div>">> <<goto "PrawnHub_Action02">> <</link>> <<elseif !_hasToy>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Fleshlight or Dildo</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>SIMULATE SEX</div><div style='color: #555; font-size: 13px;'>Simulate sex with an adult toy</div></div> <</if>> </div> <!-- BREASTS CLAP --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasChestSize>> <<link "<div class='prawn-action-chest'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP</div><div style='color: #aaa; font-size: 13px;'>Bounce them rhythmically</div></div>">> <<goto "PrawnHub_Action03">> <</link>> <<elseif !_hasChestSize>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Medium+ Chest</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>BREASTS CLAP</div><div style='color: #555; font-size: 13px;'>Bounce them rhythmically</div></div> <</if>> </div> <!-- ASS CLAP --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasButtSize>> <<link "<div class='prawn-action-butt'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>ASS CLAP</div><div style='color: #aaa; font-size: 13px;'>Make those cheeks jiggle</div></div>">> <<goto "PrawnHub_Action04">> <</link>> <<elseif !_hasButtSize>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>ASS CLAP 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Medium+ Butt</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>ASS CLAP</div><div style='color: #555; font-size: 13px;'>Make those cheeks jiggle</div></div> <</if>> </div> <!-- MASSAGE BREASTS --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasBreasts>> <<link "<div class='prawn-action-chest'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS</div><div style='color: #aaa; font-size: 13px;'>Squeeze and caress them</div></div>">> <<goto "PrawnHub_Action05">> <</link>> <<elseif !_hasBreasts>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Small+ Chest</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MASSAGE BREASTS</div><div style='color: #555; font-size: 13px;'>Squeeze and caress them</div></div> <</if>> </div> <!-- MASTURBATE --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MASTURBATE</div><div style='color: #aaa; font-size: 13px;'>Touch yourself intimately</div></div>">> <<goto "PrawnHub_Action06">> <</link>> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MASTURBATE</div><div style='color: #555; font-size: 13px;'>Touch yourself intimately</div></div> <</if>> </div> <!-- SIMULATE ORAL --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasOralToy>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL</div><div style='color: #aaa; font-size: 13px;'>Lick or suck a toy</div></div>">> <<goto "PrawnHub_Action07">> <</link>> <<elseif !_hasOralToy>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Fleshlight or Dildo</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>SIMULATE ORAL</div><div style='color: #555; font-size: 13px;'>Lick or suck a toy</div></div> <</if>> </div> <!-- POSE NUDE --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null && _hasStripped>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>POSE NUDE</div><div style='color: #aaa; font-size: 13px;'>Display your naked body</div></div>">> <<goto "PrawnHub_Action08">> <</link>> <<elseif !_hasStripped>> <div class='prawn-action-locked'><div style='color: #c9a8a8; font-weight: bold; margin-bottom: 5px;'>POSE NUDE 🔒</div><div style='color: #8a6a6a; font-size: 13px;'>Requires: Strip First</div></div> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>POSE NUDE</div><div style='color: #555; font-size: 13px;'>Display your naked body</div></div> <</if>> </div> <!-- MOAN --> <div class="prawn-action-container"> <<if $currentPrawnStream.currentAction === null>> <<link "<div class='prawn-action-btn'><div style='color: #ff1493; font-weight: bold; margin-bottom: 5px;'>MOAN</div><div style='color: #aaa; font-size: 13px;'>Let out sexy sounds</div></div>">> <<goto "PrawnHub_Action11">> <</link>> <<else>> <div class='prawn-action-disabled'><div style='color: #666; font-weight: bold; margin-bottom: 5px;'>MOAN</div><div style='color: #555; font-size: 13px;'>Let out sexy sounds</div></div> <</if>> </div> <!-- Empty slot for alignment --> <div class="prawn-action-container"></div> </div> <</if>> <!-- End Stream Button --> <div style="text-align: center; margin-top: 80px;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 15px 40px; border-radius: 8px; border: 3px solid #dc2626; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>❌ End Stream</div>">> <<goto "PrawnHubStreamEnd">> <</link>> </div> </div> <<timed 50ms>> <<script>> setupPrawnActionButtons(); <</script>> <</timed>> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHubStreamEnd">> <!-- ONLY PROCESS STREAM DATA IF WE HAVE AN ACTIVE STREAM --> <<if $currentPrawnStream !== null>> <!-- SAVE CASH TO PREVENT ACCIDENTAL ADDITIONS --> <<set _savedMoney = $money>> <!-- Track total PrawnHub hours streamed --> <<if !$prawnhubTotalMinutesStreamed>> <<set $prawnhubTotalMinutesStreamed = 0>> <</if>> <<set $prawnhubTotalMinutesStreamed += $currentPrawnStream.totalMinutes>> <!-- Check for 8 hour PrawnHub stream achievement (480 minutes in one session) --> <<if $currentPrawnStream.totalMinutes >= 480>> <<run setup.achievements.unlock("prawnhub_8_hours")>> <</if>> <!-- Track PrawnHub actions for Category Master achievement --> <<if !$prawnhubActionsEverPerformed>> <<set $prawnhubActionsEverPerformed = []>> <</if>> <<for _action range $currentPrawnStream.actionsPerformed>> <<if !$prawnhubActionsEverPerformed.includes(_action)>> <<run $prawnhubActionsEverPerformed.push(_action)>> <</if>> <</for>> <!-- Calculate final stats and STORE IN STORY VARIABLES for persistence --> <!-- Apply streaming studio bonus (15%) if applicable --> <<set _studioBonus = $streamingFromStudio ? 1.15 : 1.0>> <<set _hasStudioBonus = $streamingFromStudio || false>> <<set $lastStreamResults = {}>> <<set $lastStreamResults.sessionEarnings = Math.floor($currentPrawnStream.earnings * _studioBonus)>> <<set $lastStreamResults.avgEngagement = Math.floor($currentPrawnStream.currentEngagement * _studioBonus)>> <<set $lastStreamResults.peakViewers = Math.floor($currentPrawnStream.peakViewers * _studioBonus)>> <<set $lastStreamResults.actionsPerformed = $currentPrawnStream.actionsPerformed.slice()>> <<set $lastStreamResults.actionScores = $currentPrawnStream.actionScores || {}>> <<set $lastStreamResults.totalActions = $lastStreamResults.actionsPerformed.length>> <<set $lastStreamResults.totalMinutes = $currentPrawnStream.totalMinutes>> <<set $lastStreamResults.studioBonus = _hasStudioBonus>> <!-- Initialize sexual skills if needed --> <<if ($skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")) && !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Sexual Skill XP Gain System --> <<set $lastStreamResults.sexualXPGains = []>> <<if $skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")>> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <!-- Check for small or bigger chest --> <<set _hasBreasts = false>> <<set _chestSizes = ["small", "medium", "large", "huge", "gigantic"]>> <<for _size range _chestSizes>> <<if $bodyParts.chest.includes(_size)>> <<set _hasBreasts = true>> <<break>> <</if>> <</for>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set $lastStreamResults.sexSkillXPBonus = _sexSkillXPBonus>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<set _finalXP = _baseXP>> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <</if>> <!-- Process each action with score >= 85 --> <<for _action range $lastStreamResults.actionsPerformed>> <<set _score = $lastStreamResults.actionScores[_action] || 0>> <<if _score >= 85>> <<if _action === "STRIP_CLOTHING">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<elseif _action === "SIMULATE_SEX">> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <<run setup.addSexualSkillExp("anal", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Anal", amount: _finalXP})>> <<elseif _action === "BREASTS_CLAP">> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<elseif _action === "ASS_CLAP">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<elseif _action === "MASSAGE_BREASTS">> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Sensual", amount: _finalXP})>> <<elseif _action === "MASTURBATE">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<if _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <<elseif _hasPenis>> <<run setup.addSexualSkillExp("handjobs", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Handjobs", amount: _finalXP})>> <</if>> <<elseif _action === "SIMULATE_ORAL">> <<run setup.addSexualSkillExp("oralGiving", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Oral (Giving)", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<elseif _action === "POSE_NUDE">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<elseif _action === "MOAN">> <<run setup.addSexualSkillExp("dirtyTalk", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Dirty Talk", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run $lastStreamResults.sexualXPGains.push({skill: "Sensual", amount: _finalXP})>> <</if>> <</if>> <</for>> <</if>> <!-- Calculate new followers gained this session --> <<set $lastStreamResults.newFollowersThisSession = ($prawnhubFollowers || 0) - ($currentPrawnStream.startingFollowers || 0)>> <!-- Apply streaming studio bonus to followers (15%) --> <<if _hasStudioBonus>> <<set _studioFollowerBonus = Math.floor($lastStreamResults.newFollowersThisSession * 0.15)>> <<set $prawnhubFollowers += _studioFollowerBonus>> <<set $lastStreamResults.newFollowersThisSession += _studioFollowerBonus>> <</if>> <!-- Apply Crowd's Eye multiplier (2x followers gained) --> <<if $currentArtifact === "The Crowd's Eye">> <<set _bonusFollowers = $lastStreamResults.newFollowersThisSession>> <<set $prawnhubFollowers += _bonusFollowers>> <<set $lastStreamResults.newFollowersThisSession = $lastStreamResults.newFollowersThisSession * 2>> <</if>> <!-- Check for follower milestone achievements --> <<if $prawnhubFollowers >= 500>> <<run setup.achievements.unlock("prawnhub_500_followers")>> <</if>> <<if $prawnhubFollowers >= 10000>> <<run setup.achievements.unlock("prawnhub_10k_followers")>> <</if>> <!-- Calculate platform cut based on job --> <<set _hasAdultStreamerJob = $jobs && $jobs.includes("Adult Streamer")>> <<set $lastStreamResults.platformCutPercent = _hasAdultStreamerJob ? 0.30 : 0.70>> <<set $lastStreamResults.grossEarnings = $lastStreamResults.sessionEarnings>> <<set $lastStreamResults.platformCut = Math.round($lastStreamResults.grossEarnings * $lastStreamResults.platformCutPercent * 100) / 100>> <<set $lastStreamResults.netEarnings = Math.round(($lastStreamResults.grossEarnings - $lastStreamResults.platformCut) * 100) / 100>> <!-- ===== SKILL TREE: Get streaming bonuses ===== --> <<set _streamingBonus = setup.skillTree.getEffect("streamingBonus")>> <<set _prawnhubStreamBonus = setup.skillTree.getEffect("prawnhubStreamBonus")>> <<set $lastStreamResults.totalStreamingBonus = _streamingBonus + _prawnhubStreamBonus>> <!-- ===== SKILL TREE: Apply streaming bonuses (after platform cut, before Pearl) ===== --> <<set $lastStreamResults.skillTreeBonus = 0>> <<set _baseNetEarnings = $lastStreamResults.netEarnings>> <<if $lastStreamResults.totalStreamingBonus > 0>> <<set $lastStreamResults.skillTreeBonus = Math.round($lastStreamResults.netEarnings * ($lastStreamResults.totalStreamingBonus / 100) * 100) / 100>> <<set $lastStreamResults.netEarnings = Math.round(($lastStreamResults.netEarnings + $lastStreamResults.skillTreeBonus) * 100) / 100>> <<set _baseNetEarnings = $lastStreamResults.netEarnings>> <</if>> <!-- Slut 2x cash bonus for PrawnHub --> <<set $lastStreamResults.slutActive = $physicalTraits.includes("Slut")>> <<set $lastStreamResults.slutBonus = 0>> <<if $lastStreamResults.slutActive>> <<set $lastStreamResults.slutBonus = Math.round(_baseNetEarnings * 100) / 100>> <<set $lastStreamResults.netEarnings = Math.round((_baseNetEarnings + $lastStreamResults.slutBonus) * 100) / 100>> <<set _baseNetEarnings = $lastStreamResults.netEarnings>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) - AFTER skill tree --> <<set $lastStreamResults.pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set $lastStreamResults.pearlBonus = 0>> <<if $lastStreamResults.pearlActive>> <<set $lastStreamResults.pearlBonus = Math.round(_baseNetEarnings * 0.5 * 100) / 100>> <<set $lastStreamResults.netEarnings = Math.round((_baseNetEarnings + $lastStreamResults.pearlBonus) * 100) / 100>> <</if>> <!-- Deposit to bank account (streaming revenue is digital - BANK ONLY, NO CASH) --> <<set $money = _savedMoney>> <<set $bankAccount.balance += $lastStreamResults.netEarnings>> <!-- Update streaming stats --> <<set $prawnhubTotalEarnings += $lastStreamResults.netEarnings>> <<set $prawnhubSessionsToday += 1>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <!-- Track Adult Streamer job for work_every_job achievement --> <<if $lastStreamResults.platformCutPercent === 0.30>> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Adult Streamer")>> <<run $jobsWorked.push("Adult Streamer")>> <</if>> <</if>> <!-- Save to history --> <<if !$prawnhubStreamHistory>> <<set $prawnhubStreamHistory = []>> <</if>> <<set $prawnhubStreamHistory.push({ day: $dayNumber, viewers: $lastStreamResults.peakViewers, grossEarnings: $lastStreamResults.grossEarnings, platformCut: $lastStreamResults.platformCut, netEarnings: $lastStreamResults.netEarnings, newFollowers: $lastStreamResults.newFollowersThisSession, engagement: $lastStreamResults.avgEngagement, duration: $lastStreamResults.totalMinutes, actionsPerformed: $lastStreamResults.actionsPerformed })>> <!-- Clean up stream - but KEEP lastStreamResults for display --> <<set $currentPrawnStream = null>> <</if>> <!-- END OF STREAM PROCESSING - Now we use $lastStreamResults for display --> <!-- Check for job transition (runs every time, uses current state) --> <<set _hasAdultStreamerJob = $jobs && $jobs.includes("Adult Streamer")>> <<set _becameAdultStreamer = false>> <<set _canBecomeAdultStreamer = false>> <<set _hasOtherJob = $jobs && $jobs.length > 0 && !$jobs.includes("Unemployed") && !$jobs.includes("Adult Streamer")>> <<if $prawnhubFollowers >= 500 && !_hasAdultStreamerJob>> <<if !$jobs || $jobs.length === 0 || $jobs.includes("Unemployed")>> <!-- Auto-assign Adult Streamer job if unemployed --> <<set $jobs = ["Adult Streamer"]>> <<set _becameAdultStreamer = true>> <<else>> <!-- Has other job, give choice --> <<set _canBecomeAdultStreamer = true>> <</if>> <</if>> <!-- Safety check: make sure we have lastStreamResults --> <<if !$lastStreamResults>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">⚠️ Stream Data Error</h1> <p style="color: white; text-align: center;">No stream data found. Please return to PrawnHub.</p> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px;'>Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">📊 Stream Summary</h1> <div style="max-width: 800px; margin: 0 auto;"> <!-- Job Transition Messages --> <<if _becameAdultStreamer>> <div style="background: linear-gradient(135deg, #27ae60 0%, #229954 100%); padding: 25px; border-radius: 12px; border: 3px solid #27ae60; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(39, 174, 96, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🎉 Congratulations!</h2> <p style="color: #ffd; font-size: 18px; margin: 0;"> You've reached 500 followers! Your job is now <strong>Adult Streamer</strong>!<br> Platform cut reduced from 70% to 30%! </p> </div> <<elseif _canBecomeAdultStreamer>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: white; margin: 0 0 15px 0;">💼 Job Opportunity</h2> <p style="color: #ffd; font-size: 16px; margin: 0 0 15px 0;"> You've reached 500 followers! Would you like to quit your current job (<<print $jobs.join(", ")>>) and become a full-time Adult Streamer?<br> <span style="font-size: 14px;">(Platform cut will be reduced from 70% to 30%)</span> </p> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='display: inline-block; background: #27ae60; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✓ Become Adult Streamer</div>">> <<set $jobs = ["Adult Streamer"]>> <<goto "PrawnHubStreamEnd">> <</link>> <<link "<div style='display: inline-block; background: #7f8c8d; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold;'>✗ Keep Current Job</div>">> <<goto "PrawnHubStreamEnd">> <</link>> </div> </div> <</if>> <!-- ===== STREAMING STUDIO: Display bonus notification ===== --> <<if $lastStreamResults.studioBonus>> <div style="background: linear-gradient(135deg, #9146ff 0%, #7c3aed 100%); padding: 20px; border-radius: 12px; border: 3px solid #a78bfa; box-shadow: 0 0 20px rgba(145, 70, 255, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: #a78bfa; margin: 0 0 10px 0;">📺 Streaming Studio Bonus Active 📺</h2> <p style="color: #ddd6fe; margin: 0; font-size: 16px;"> +15% to all stream results (viewers, engagement, earnings, followers) </p> </div> <</if>> <!-- ===== SKILL TREE: Display bonus notification ===== --> <<if $lastStreamResults.totalStreamingBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 20px; border-radius: 12px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: #CE93D8; margin: 0 0 10px 0;">⭐ Skill Tree Bonuses Active ⭐</h2> <p style="color: #E1BEE7; margin: 0; font-size: 16px;"> <<set _streamingBonus = setup.skillTree.getEffect("streamingBonus")>> <<set _prawnhubStreamBonus = setup.skillTree.getEffect("prawnhubStreamBonus")>> <<if _streamingBonus > 0>> Streaming Bonus: +<<print _streamingBonus>>% <</if>> <<if _streamingBonus > 0 && _prawnhubStreamBonus > 0>> | <</if>> <<if _prawnhubStreamBonus > 0>> PrawnHub Bonus: +<<print _prawnhubStreamBonus>>% <</if>> </p> <p style="color: #CE93D8; margin: 10px 0 0 0; font-size: 18px; font-weight: bold;"> Extra Earnings: +$<<print $lastStreamResults.skillTreeBonus.toFixed(2)>> </p> </div> <</if>> <!-- Crowd's Eye Notification --> <<if $currentArtifact === "The Crowd's Eye">> <div style="background: linear-gradient(135deg, #a78bfa 0%, #7c3aed 100%); padding: 20px; border-radius: 12px; border: 3px solid #a78bfa; box-shadow: 0 0 20px rgba(167, 139, 250, 0.4); margin-bottom: 25px; text-align: center; animation: pulse-eye 2s infinite;"> <h2 style="color: white; margin: 0 0 10px 0;">👁️ The Crowd's Eye 👁️</h2> <p style="color: white; margin: 0; font-size: 16px; font-weight: bold;"> Your magnetic presence has doubled your follower gains! </p> </div> <style> @keyframes pulse-eye { 0%, 100% { box-shadow: 0 0 20px rgba(167, 139, 250, 0.4); } 50% { box-shadow: 0 0 30px rgba(167, 139, 250, 0.7); } } </style> <</if>> <!-- Pearl of Abundance Notification --> <<if $lastStreamResults.pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 20px; border-radius: 12px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); margin-bottom: 25px; text-align: center; animation: pulse-pearl 2s infinite;"> <h2 style="color: white; margin: 0 0 10px 0;">🐚 The Pearl of Abundance 🐚</h2> <p style="color: white; margin: 0; font-size: 16px; font-weight: bold;"> Your streaming earnings have been increased by 50%! </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Sexual XP Gained Event --> <<if $lastStreamResults.sexualXPGains && $lastStreamResults.sexualXPGains.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h2 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $lastStreamResults.sexSkillXPBonus > 0>> <span style="color: #CE93D8;">⭐ +<<print $lastStreamResults.sexSkillXPBonus>></span> <</if>> <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <<for _i, _xp range $lastStreamResults.sexualXPGains>> <span style="color: #ff69b4; font-weight: bold;"><<print _xp.skill>></span> <span style="color: #51cf66;">+<<print _xp.amount>> XP</span><<if _i < $lastStreamResults.sexualXPGains.length - 1>> | <</if>> <</for>> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- Summary Card --> <div style="background: linear-gradient(135deg, #2a2a2a 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; border: 2px solid #ff1493; margin-bottom: 25px;"> <h2 style="color: #ff1493; text-align: center; margin-bottom: 25px;">Stream Complete!</h2> <!-- Stats Grid --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #4ade80;"> <div style="color: #4ade80; font-size: 14px; margin-bottom: 8px;">💰 NET EARNINGS</div> <div style="color: white; font-size: 28px; font-weight: bold;">$<<print $lastStreamResults.netEarnings.toFixed(2)>></div> <div style="color: #aaa; font-size: 12px; margin-top: 5px;">(Deposited to bank)</div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #ff69b4;"> <div style="color: #ff69b4; font-size: 14px; margin-bottom: 8px;">👥 PEAK VIEWERS</div> <div style="color: white; font-size: 28px; font-weight: bold;"><<print $lastStreamResults.peakViewers>></div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #fbbf24;"> <div style="color: #fbbf24; font-size: 14px; margin-bottom: 8px;">📊 AVG ENGAGEMENT</div> <div style="color: white; font-size: 28px; font-weight: bold;"><<print Math.round($lastStreamResults.avgEngagement)>>%</div> </div> <div style="background: #333; padding: 20px; border-radius: 10px; text-align: center; border: 2px solid #60a5fa;"> <div style="color: #60a5fa; font-size: 14px; margin-bottom: 8px;">➕ NEW FOLLOWERS</div> <div style="color: white; font-size: 28px; font-weight: bold;">+<<print $lastStreamResults.newFollowersThisSession>></div> </div> </div> <!-- Earnings Breakdown --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #444; margin-bottom: 20px;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">💰 Earnings Breakdown</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;"><strong>Gross Tips:</strong> <span style="color: #51cf66;">$<<print $lastStreamResults.grossEarnings.toFixed(2)>></span></p> <p style="margin: 5px 0;"><strong>Platform Cut (<<print Math.round($lastStreamResults.platformCutPercent * 100)>>%):</strong> <span style="color: #e74c3c;">-$<<print $lastStreamResults.platformCut.toFixed(2)>></span></p> <!-- ===== SKILL TREE: Show bonus in breakdown ===== --> <<if $lastStreamResults.skillTreeBonus > 0>> <p style="margin: 5px 0;"><strong>Skill Tree Bonus (+<<print $lastStreamResults.totalStreamingBonus>>%):</strong> <span style="color: #CE93D8;">+$<<print $lastStreamResults.skillTreeBonus.toFixed(2)>></span></p> <</if>> <<if $lastStreamResults.pearlActive>> <p style="margin: 5px 0;"><strong>Pearl Bonus (+50%):</strong> <span style="color: #7dd3fc;">+$<<print $lastStreamResults.pearlBonus.toFixed(2)>></span></p> <</if>> <p style="margin: 5px 0; padding-top: 10px; border-top: 2px solid #444;"><strong>Net Earnings:</strong> <span style="color: #ffd43b; font-size: 18px;">$<<print $lastStreamResults.netEarnings.toFixed(2)>></span> <<if $lastStreamResults.pearlActive || $lastStreamResults.skillTreeBonus > 0>> <span style="color: <<if $lastStreamResults.pearlActive>>#7dd3fc<<else>>#CE93D8<</if>>; font-size: 14px;"> ✨</span> <</if>> </p> </div> <!-- Bank Deposit Notice --> <div style="background: #2a2a4a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #667eea;"> <p style="color: #667eea; margin: 0; text-align: center; font-size: 14px; font-weight: bold;"> 💳 All earnings deposited directly to your bank account </p> </div> <<set _hasAdultStreamerJob = $jobs && $jobs.includes("Adult Streamer")>> <<if !_hasAdultStreamerJob>> <div style="background: #3a2020; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #e74c3c;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> ⚠️ <strong>High Platform Fee!</strong> Get the Adult Streamer job to reduce the platform cut from 70% to 30%. </p> </div> <</if>> </div> <!-- Actions Performed --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #444;"> <h3 style="color: #ff69b4; margin-top: 0;">Actions Performed: <<print $lastStreamResults.totalActions>></h3> <div style="color: #aaa; line-height: 1.8;"> <<if $lastStreamResults.totalActions > 0>> <<for _i = 0; _i < $lastStreamResults.totalActions; _i++>> <<set _actionName = $lastStreamResults.actionsPerformed[_i]>> <<set _actionScore = $lastStreamResults.actionScores[_actionName] || 0>> <<set _displayName = _actionName.replace(/_/g, " ")>> <<set _scoreColor = _actionScore >= 85 ? "#FFD700" : (_actionScore >= 50 ? "#51cf66" : "#ff6b6b")>> <span style="background: #333; padding: 5px 10px; border-radius: 5px; margin: 3px; display: inline-block; border: 1px solid <<print _scoreColor>>;"> <<print _displayName>> <span style="color: <<print _scoreColor>>; font-size: 12px;">(<<print Math.round(_actionScore)>>)</span> </span> <</for>> <<else>> <span style="color: #666;">No actions performed</span> <</if>> </div> <<if $lastStreamResults.totalActions > 0>> <p style="color: #888; font-size: 13px; margin: 15px 0 0 0; font-style: italic;"> 💡 Scores of 85+ earn Sexual Expertise XP (requires Sexually Skilled trait) </p> <</if>> </div> </div> <!-- Career Progress --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 1px solid #ff69b4; margin-bottom: 25px;"> <h3 style="color: #ff69b4; margin-top: 0;">Career Stats</h3> <div style="color: #aaa;"> <p>💰 Total Career Earnings: <span style="color: #4ade80; font-weight: bold;">$<<print $prawnhubTotalEarnings.toFixed(2)>></span></p> <p>👥 Total Followers: <span style="color: #ff69b4; font-weight: bold;"><<print ($prawnhubFollowers || 0).toLocaleString()>></span></p> <p>📹 Streams Today: <span style="color: #fbbf24; font-weight: bold;"><<print $prawnhubSessionsToday>> / <<print $prawnhubMaxSessions>></span></p> <p>🏦 Bank Balance: <span style="color: #667eea; font-weight: bold;"><<print setup.formatMoney($bankAccount.balance)>></span></p> <<set _hasAdultStreamerJob = $jobs && $jobs.includes("Adult Streamer")>> <<if _hasAdultStreamerJob>> <p>💼 Current Job: <span style="color: #27ae60; font-weight: bold;">Adult Streamer</span> (30% platform cut)</p> <<else>> <p>💼 Current Job: <span style="color: #e74c3c; font-weight: bold;"><<if $jobs && $jobs.length > 0>><<print $jobs.join(", ")>><<else>>Unemployed<</if>></span> (70% platform cut)</p> <</if>> </div> </div> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin: 0 10px;'>Back to Streaming</div>">> <<goto "PrawnHubStream">> <</link>> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin: 0 10px;'>Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action02">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 20, strength: 20}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<if !$action02Choice>> <<set $action02Choice = null>> <<set $action02Result = null>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 SIMULATE SEX: Use Handheld Prop</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 20>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 20 Required </div> <div class="stat-requirement <<if _effectiveStr >= 20>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 20 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action02Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Timing Game</div>">> <<set $action02Choice = "game">> <<goto "PrawnHub_Action02">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action02Choice = "roll">> <<set $action02Result = random(1, 100) + _bonus>> <<goto "PrawnHub_Action02">> <</link>> </div> <<elseif $action02Choice == "game" && !$action02Result>> <!-- Oscillating Bar Game --> <<set _meetsRequirements = _effectiveDex >= 20 && _effectiveStr >= 20>> <<set _traitCount = 0>> <<for _i = 0; _i < _positiveTraits.positive.length; _i++>> <<set _trait = _positiveTraits.positive[_i]>> <<if ($physicalTraits && $physicalTraits.includes(_trait)) || ($mentalTraits && $mentalTraits.includes(_trait)) || ($skills && $skills.includes(_trait))>> <<set _traitCount++>> <</if>> <</for>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 10.0>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;">Click when the bar reaches the top! (3 attempts)</p> <p style="color: #aaa; font-size: 14px; margin-bottom: 20px;">Score 75+ on each attempt for maximum effect!</p> <!-- Inline styled game container --> <div id="oscillatingGame" style="width: 300px; max-width: 300px; height: 600px; position: relative; margin: 20px auto; cursor: pointer;"> <!-- Inner game area with background --> <div style="position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 150px; height: 400px; background: #2a2a2a; border: 2px solid #ff1493; border-radius: 8px;"></div> <!-- Track --> <div class="oscillating-track" style="position: absolute; left: 50%; top: 110px; bottom: 110px; width: 30px; background: #444; transform: translateX(-50%); border-radius: 15px;"></div> <!-- Fill Bar --> <div class="oscillating-fill" style="position: absolute; left: 50%; bottom: 110px; width: 30px; height: 0px; max-height: 380px; background: rgba(255, 255, 255, 0.9); transform: translateX(-50%); transition: height 0.3s ease; border-radius: 15px; z-index: 1;"></div> <!-- Target Zone --> <div class="target-zone" style="position: absolute; left: 50%; top: 110px; width: 30px; height: 50px; background: rgba(74, 222, 128, 0.3); transform: translateX(-50%); border: 2px solid #4ade80; border-radius: 15px 15px 0 0; z-index: 2;"></div> <!-- Moving Bar --> <div class="oscillating-bar" style="position: absolute; left: 50%; bottom: 110px; width: 30px; height: 40px; background: #e8a5bc; transform: translateX(-50%); box-shadow: 0 0 10px rgba(232, 165, 188, 0.7); border-radius: 20px; z-index: 3;"></div> <!-- Particle Container --> <div class="particle-container" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; z-index: 10;"></div> </div> </div> <<timed 100ms>> <<script>> console.log("Timed script running!"); console.log("initOscillatingBar function exists?", typeof initOscillatingBar); console.log("Bar speed:", State.variables.barSpeed); if (typeof initOscillatingBar === 'function') { console.log("Calling initOscillatingBar now..."); initOscillatingBar('oscillatingGame', State.variables.barSpeed, function(score) { console.log("Callback received with score:", score); State.variables.action02Result = score; Engine.play(passage()); }); } else { console.error("initOscillatingBar function not found!"); } <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action02Choice == "roll">> <<set _success = $action02Result >= 50>> <<set _score = Math.min(100, $action02Result)>> <<else>> <<set _success = $action02Result >= 80>> <<set _score = $action02Result>> <</if>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if _score < 50>><<set _score = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <<if $action02Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> d100 Roll: <<print $action02Result>> (Modified) </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Excellent use of the toy! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((80 - _score) / 10)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ A bit clumsy with the prop... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _viewers = $currentPrawnStream ? $currentPrawnStream.viewers : 0>> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, _viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, _viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<if $currentPrawnStream>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <</if>> <!-- Store score for XP calculation --> <<if $currentPrawnStream && !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<if $currentPrawnStream>> <<set $currentPrawnStream.actionScores["SIMULATE_SEX"] = _score>> <</if>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer02" class="prawn-chat-container"></div> <<if (_tipResult && _tipResult.count > 0) || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult && _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.temporary.score || 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'SIMULATE_SEX', viewers); window.displayPrawnChat('prawnChatContainer02', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "SIMULATE_SEX", message: "Simulating sex…" }>> <<set $currentPrawnStream.actionTimeLeft = 15>> <<set $currentPrawnStream.actionsPerformed.push("SIMULATE_SEX")>> <</if>> <<set $action02Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action03">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for bar speed --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _meetsRequirements = _effectiveDex >= 15 && _effectiveStr >= 15>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 8.0>> <<if !$action03Choice>> <<set $action03Choice = null>> <<set $action03Result = null>> <<set $action03Scores = []>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 BREASTS CLAP: Upper Rhythm Display</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Bar Speed: <<print $barSpeed.toFixed(1)>>x) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action03Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Rhythm Game (3 attempts)</div>">> <<set $action03Choice = "game">> <<goto "PrawnHub_Action03">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action03Choice = "roll">> <<set _rollResult = random(1, 100) + _bonus>> <<set $action03Result = {roll: random(1, 100), bonus: _bonus, total: _rollResult}>> <<goto "PrawnHub_Action03">> <</link>> </div> <<elseif $action03Choice == "game" && !$action03Result>> <!-- Moving Bar Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Click when the bar is in the green zone! (3 attempts in one round) </p> <div id="movingBarGame" class="bar-game-container"> <div class="bar-track"></div> <div class="bar-indicator"></div> <div class="moving-bar"></div> </div> </div> <<timed 250ms>> <<script>> initMovingBar('movingBarGame', State.variables.barSpeed, function(avgScore) { State.variables.action03Result = {total: avgScore}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action03Choice == "roll">> <<set _score = $action03Result.total>> <<set _success = _score >= 50>> <<else>> <<set _score = $action03Result.total>> <<set _success = _score >= 50>> <</if>> <!-- Trophy Wife / Slut guaranteed clapping success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if _score < 50>><<set _score = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <<if $action03Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action03Result.roll>> + Bonus: <<print $action03Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Average Score from 3 attempts </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 6)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Perfect rhythm! Viewers are captivated! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - _score) / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The rhythm was off... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["BREASTS_CLAP"] = _score>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer03" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'BREASTS_CLAP', viewers); window.displayPrawnChat('prawnChatContainer03', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "BREASTS_CLAP", message: "Performing breast clapping motion!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("BREASTS_CLAP")>> <</if>> <<set $action03Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action04">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for bar speed --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _meetsRequirements = _effectiveDex >= 15 && _effectiveStr >= 15>> <<set $barSpeed = _meetsRequirements ? Math.max(2.0, 3.0 - (_traitCount * 0.1)) : 8.0>> <<set $action04Choice = $action04Choice || null>> <<set $action04Result = $action04Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ASS CLAP: Lower Rhythm Display</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Bar Speed: <<print $barSpeed.toFixed(1)>>x) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action04Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎮 Play Rhythm Game (3 attempts)</div>">> <<set $action04Choice = "game">> <<goto "PrawnHub_Action04">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action04Choice = "roll">> <<set _rollValue = random(1, 100)>> <<set $action04Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<goto "PrawnHub_Action04">> <</link>> </div> <<elseif $action04Choice == "game" && !$action04Result>> <!-- Moving Bar Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Click when the bar is in the green zone! (3 attempts in one round) </p> <div id="movingBarGame04" class="bar-game-container"> <div class="bar-track"></div> <div class="bar-indicator"></div> <div class="moving-bar"></div> </div> </div> <<timed 250ms>> <<script>> initMovingBar('movingBarGame04', State.variables.barSpeed, function(avgScore) { State.variables.action04Result = {total: avgScore}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action04Choice == "roll">> <<set _score = $action04Result.total>> <<set _success = _score >= 50>> <<else>> <<set _score = $action04Result.total>> <<set _success = _score >= 50>> <</if>> <!-- Trophy Wife / Slut guaranteed clapping success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if _score < 50>><<set _score = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <<if $action04Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action04Result.roll>> + Bonus: <<print $action04Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Average Score from 3 attempts </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 6)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <</if>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Amazing movement! Viewers can't look away! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - _score) / 8)>> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <</if>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The movement wasn't quite right... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["ASS_CLAP"] = _score>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer04" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'ASS_CLAP', viewers); window.displayPrawnChat('prawnChatContainer04', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "ASS_CLAP", message: "Performing ass clapping motion!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("ASS_CLAP")>> <</if>> <<set $action04Choice = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action05">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 15, strength: 15}>> <<set _positiveTraits = { positive: ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <!-- Count positive traits for required score reduction --> <<set _traitCount = 0>> <<if $traits>> <<for _trait range ["Curvy", "Soft", "Smooth Skin", "Attractive", "Graceful", "Voluptuous", "Sexually Skilled", "Alluring", "Seductive", "High Stamina"]>> <<if $traits[_trait]>> <<set _traitCount++>> <</if>> <</for>> <</if>> <<set _requiredScore = Math.max(50, 80 - (_traitCount * 3))>> <<set $action05Choice = $action05Choice || null>> <<set $action05Result = $action05Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_05: Upper Body Focus</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 15>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 15 Required </div> <div class="stat-requirement <<if _effectiveStr >= 15>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 15 Required </div> <div style="color: #aaa; margin-top: 10px;"> Positive Traits: <<print _traitCount>> (Required Score: <<print _requiredScore>>) </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action05Choice>> <div class="action-choice-container"> <<link "<div class='action-choice-btn'>🎨 Draw a Circle</div>">> <<set $action05Choice = "draw">> <<goto "PrawnHub_Action05">> <</link>> <<link "<div class='action-choice-btn'>🎲 Roll d100</div>">> <<set $action05Choice = "roll">> <<set _rollValue = random(1, 100)>> <<set $action05Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<goto "PrawnHub_Action05">> <</link>> </div> <<elseif $action05Choice == "draw" && !$action05Result>> <!-- Circle Drawing Game --> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; margin-bottom: 20px;"> Draw a smooth circle with your mouse! (Required Score: <<print _requiredScore>>) </p> <canvas id="circleCanvas" class="circle-canvas" width="400" height="400"></canvas> </div> <<timed 250ms>> <<script>> initCircleDrawing('circleCanvas', function(score) { State.variables.action05Result = {total: score}; Engine.play(passage()); }); <</script>> <</timed>> <<else>> <!-- Show Result --> <<if $action05Choice == "roll">> <<set _score = $action05Result.total>> <<else>> <<set _score = $action05Result.total>> <</if>> <<set _success = _score >= _requiredScore>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if _score < _requiredScore>><<set _score = _requiredScore>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <<if $action05Choice == "roll">> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action05Result.roll>> + Bonus: <<print $action05Result.bonus>> </div> <<else>> <div style="color: #aaa; margin: 10px 0;"> Circle Quality Score </div> <</if>> <div class="result-score <<if !_success>>failure<</if>>"> <<print Math.round(_score)>> </div> <<if _success>> <<set _engagementGain = Math.floor(_score / 7)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Beautiful movement! So graceful! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((_requiredScore - _score) / 10)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ A bit shaky... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain(_score, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["MASSAGE_BREASTS"] = _score>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer05" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = Math.round(State.temporary.score || 0); var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MASSAGE_BREASTS', viewers); window.displayPrawnChat('prawnChatContainer05', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MASSAGE_BREASTS", message: "Sensually massaging and caressing breasts for viewers!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MASSAGE_BREASTS")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action05Choice = null>> <<set $action05Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action06">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 10, strength: 10}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action06Performed = $action06Performed || false>> <<set $action06Result = $action06Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_06: Personal Expression Pose</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 10>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 10 Required </div> <div class="stat-requirement <<if _effectiveStr >= 10>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 10 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action06Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Express yourself in your own unique way! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action06Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action06Performed = true>> <<goto "PrawnHub_Action06">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action06Result.total >= 50>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if $action06Result.total < 50>><<set $action06Result.total = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action06Result.roll>> + Bonus: <<print $action06Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action06Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action06Result.total / 7)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Your personal touch is captivating! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action06Result.total) / 8)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The expression felt forced... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action06Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action06Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["MASTURBATE"] = $action06Result.total>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer06" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action06Result ? State.variables.action06Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MASTURBATE', viewers); window.displayPrawnChat('prawnChatContainer06', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MASTURBATE", message: "Pleasuring myself intimately for the audience!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MASTURBATE")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action06Performed = false>> <<set $action06Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action07">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {strength: 20}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action07Performed = $action07Performed || false>> <<set $action07Result = $action07Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_07: Prop Interaction</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveStr >= 20>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 20 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action07Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Show the viewers how you handle your prop! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action07Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action07Performed = true>> <<goto "PrawnHub_Action07">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action07Result.total >= 50>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if $action07Result.total < 50>><<set $action07Result.total = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action07Result.roll>> + Bonus: <<print $action07Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action07Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action07Result.total / 6)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Masterful prop work! Incredible! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action07Result.total) / 7)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The prop handling was awkward... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action07Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action07Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["SIMULATE_ORAL"] = $action07Result.total>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer07" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action07Result ? State.variables.action07Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'SIMULATE_ORAL', viewers); window.displayPrawnChat('prawnChatContainer07', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "SIMULATE_ORAL", message: "Demonstrating skilled oral techniques with prop!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("SIMULATE_ORAL")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action07Performed = false>> <<set $action07Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action08">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {charisma: 30}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set $action08Performed = $action08Performed || false>> <<set $action08Result = $action08Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_08: Front Presentation</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveCha >= 30>>met<<else>>not-met<</if>>"> Charisma: <<print _effectiveCha>> / 30 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action08Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Face the camera and show your charm! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action08Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action08Performed = true>> <<goto "PrawnHub_Action08">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action08Result.total >= 50>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if $action08Result.total < 50>><<set $action08Result.total = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action08Result.roll>> + Bonus: <<print $action08Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action08Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action08Result.total / 8)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Your charisma shines through! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action08Result.total) / 10)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ You seemed a bit stiff... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action08Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action08Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["POSE_NUDE"] = $action08Result.total>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer08" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action08Result ? State.variables.action08Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'POSE_NUDE', viewers); window.displayPrawnChat('prawnChatContainer08', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "POSE_NUDE", message: "Displaying nude body in provocative poses!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("POSE_NUDE")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action08Performed = false>> <<set $action08Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action11">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {charisma: 10, dexterity: 10, strength: 10}>> <!-- Check for all voice traits --> <<set _voiceBonus = 0>> <<if $traits>> <!-- Positive voice traits --> <<if $traits["Smooth Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Deep Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Melodic Voice"]>><<set _voiceBonus += 5>><</if>> <<if $traits["Sultry Voice"]>><<set _voiceBonus += 7>><</if>> <<if $traits["Commanding Voice"]>><<set _voiceBonus += 5>><</if>> <!-- Negative voice traits --> <<if $traits["Raspy Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Nasally Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Squeaky Voice"]>><<set _voiceBonus -= 5>><</if>> <<if $traits["Monotone Voice"]>><<set _voiceBonus -= 5>><</if>> <</if>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits) + _voiceBonus>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $action11Performed = $action11Performed || false>> <<set $action11Result = $action11Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 ACTION_11: Voice + Movement Combo</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if $stats.charisma >= 10>>met<<else>>not-met<</if>>"> Charisma: <<print $stats.charisma>> / 10 Required </div> <div class="stat-requirement <<if _effectiveDex >= 10>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 10 Required </div> <div class="stat-requirement <<if _effectiveStr >= 10>>met<<else>>not-met<</if>>"> Strength: <<print _effectiveStr>> / 10 Required </div> <<if _voiceBonus != 0>> <div style="color: <<if _voiceBonus > 0>>#4ade80<<else>>#ff6b6b<</if>>; margin-top: 10px;"> Voice Traits: <<if _voiceBonus > 0>>+<</if>><<print _voiceBonus>> </div> <</if>> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action11Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Combine your voice and movement for maximum effect! </p> <<link "<div class='action-choice-btn'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action11Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action11Performed = true>> <<goto "PrawnHub_Action11">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action11Result.total >= 50>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action11Result.roll>> + Bonus: <<print $action11Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action11Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action11Result.total / 5)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ The perfect combination! Viewers are mesmerized! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action11Result.total) / 8)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The coordination was off... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action11Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action11Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["MOAN"] = $action11Result.total>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer11" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action11Result ? State.variables.action11Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'MOAN', viewers); window.displayPrawnChat('prawnChatContainer11', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<if $currentPrawnStream>> <<set $currentPrawnStream.currentAction = { id: "MOAN", message: "Moaning seductively with sensual movements!" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("MOAN")>> <</if>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<set $action11Performed = false>> <<set $action11Result = null>> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PrawnHub_Action01">> <!-- Calculate bonus/penalty --> <<set _requiredStats = {dexterity: 30}>> <<set _positiveTraits = { positive: ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"] }>> <<set _bonus = calculateActionBonus(_requiredStats, _positiveTraits)>> <!-- Calculate effective dexterity for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set $action01Performed = $action01Performed || false>> <<set $action01Result = $action01Result || null>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 STRIP CLOTHING: Change Outfit State</h1> <!-- Stat Check Display --> <div class="stat-check-display"> <h3 style="color: #fbbf24; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 30>>met<<else>>not-met<</if>>"> Dexterity: <<print _effectiveDex>> / 30 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice --> <<if !$action01Performed>> <div style="text-align: center; margin: 30px 0;"> <p style="color: #ccc; font-size: 16px; margin-bottom: 20px;"> Time to change your outfit and show the viewers something new! </p> <<link "<div class='action-choice-btn'>🎲 Roll Performance Check (d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $action01Result = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $action01Performed = true>> <<goto "PrawnHub_Action01">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $action01Result.total >= 50>> <!-- Trophy Wife / Slut guaranteed prawnhub success --> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <<set _success = true>> <<if $action01Result.total < 50>><<set $action01Result.total = 50>><</if>> <</if>> <div class="result-display <<if !_success>>failure<</if>>"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <<if $physicalTraits.includes("Trophy Wife") || $physicalTraits.includes("Slut")>> <div style="color: #51cf66; font-size: 14px; margin: 5px 0;">✓ <<if $physicalTraits.includes("Trophy Wife")>>Trophy Wife<<else>>Slut<</if>>: Guaranteed Success</div> <</if>> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $action01Result.roll>> + Bonus: <<print $action01Result.bonus>> </div> <div class="result-score <<if !_success>>failure<</if>>"> <<print $action01Result.total>> </div> <<if _success>> <<set _engagementGain = Math.floor($action01Result.total / 10)>> <<set _earningsMultiplier = 1 + ($action01Result.total / 200)>> <<set $currentPrawnStream.currentEngagement = Math.min(100, $currentPrawnStream.currentEngagement + _engagementGain)>> <div style="color: #4ade80; font-size: 18px; margin: 15px 0;"> ✓ Success! The viewers love your new look! </div> <div style="color: #aaa;"> Engagement +<<print _engagementGain>>% | Earning Multiplier: x<<print _earningsMultiplier.toFixed(2)>> </div> <<else>> <<set _engagementLoss = Math.floor((50 - $action01Result.total) / 5)>> <<set $currentPrawnStream.currentEngagement = Math.max(0, $currentPrawnStream.currentEngagement - _engagementLoss)>> <div style="color: #ff6b6b; font-size: 18px; margin: 15px 0;"> ⚠ The outfit change was awkward... </div> <div style="color: #aaa;"> Engagement -<<print _engagementLoss>>% </div> <</if>> </div> <!-- Calculate tips and follower gain --> <<set _tipResult = calculatePrawnTips($action01Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<set _followerGain = calculatePrawnFollowerGain($action01Result.total, $prawnhubFollowers || 0, $currentPrawnStream.viewers)>> <<if $physicalTraits.includes("E-Girl")>><<set _followerGain = _followerGain * 2>><</if>> <<if $physicalTraits.includes("Gyaru")>><<set _followerGain = Math.floor(_followerGain * 1.5)>><</if>> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + _followerGain>> <<set $currentPrawnStream.earnings += _tipResult.amount>> <!-- Store score for XP calculation --> <<if !$currentPrawnStream.actionScores>> <<set $currentPrawnStream.actionScores = {}>> <</if>> <<set $currentPrawnStream.actionScores["STRIP_CLOTHING"] = $action01Result.total>> <!-- Viewer Response --> <div style="background: #0a0a0a; padding: 20px; border-radius: 10px; border: 2px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; margin: 20px 0;"> <div style="color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; font-weight: bold; margin-bottom: 15px; font-size: 18px;">💬 Live Chat</div> <div id="prawnChatContainer" class="prawn-chat-container"></div> <<if _tipResult.count > 0 || _followerGain > 0>> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #333;"> <<if _tipResult.count > 0>> <div style="color: #fbbf24; font-size: 16px; margin: 5px 0;"> 💰 +$<<print _tipResult.amount>> in tips! (<<print _tipResult.count>> viewers tipped) </div> <</if>> <<if _followerGain > 0>> <div style="color: #a78bfa; font-size: 16px; margin: 5px 0;"> ⭐ +<<print _followerGain>> new followers! <<if $physicalTraits.includes("E-Girl")>><span style="color: #ff69b4;"> (✓ E-Girl 2x)</span><</if>> <<if $physicalTraits.includes("Gyaru")>><span style="color: #fbbf24;"> (✓ Gyaru 1.5x)</span><</if>> </div> <</if>> </div> <</if>> </div> <<timed 100ms>> <<script>> var score = State.variables.action01Result ? State.variables.action01Result.total : 0; var viewers = State.variables.currentPrawnStream ? State.variables.currentPrawnStream.viewers : 0; var messages = window.generatePrawnChat(score, 'STRIP_CLOTHING', viewers); window.displayPrawnChat('prawnChatContainer', messages); <</script>> <</timed>> <!-- Set action and advance time --> <<set $currentPrawnStream.currentAction = { id: "STRIP_CLOTHING", message: "Stripping clothing…" }>> <<set $currentPrawnStream.actionTimeLeft = 30>> <<set $currentPrawnStream.actionsPerformed.push("STRIP_CLOTHING")>> <<set $action01Performed = false>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Continue Streaming</div>">> <<goto "PrawnHubLiveStream">> <</link>> </div> <</if>> </div> <</nobr>>
<<script>> // Prawn Chat Usernames with colors window.prawnChatUsers = [ {name: "HornyHousewife88", color: "#ff69b4"}, {name: "OneHandDad69", color: "#4169e1"}, {name: "CuriousBiWife", color: "#ff1493"}, {name: "BrokeButStroking", color: "#32cd32"}, {name: "MilfLovesYoungCock", color: "#ff4500"}, {name: "WifeAsleepAgain", color: "#9370db"}, {name: "TouchingMyselfQuietly", color: "#ff69b4"}, {name: "SilentLurkerXX", color: "#808080"}, {name: "HubbyDoesntKnow99", color: "#ff1493"}, {name: "JustHereForGirls", color: "#da70d6"}, {name: "SneakyMomOf3", color: "#ff6347"}, {name: "EdgingInBedroom", color: "#4682b4"}, {name: "ShowFeetPrettyPls", color: "#ffa500"}, {name: "MarriedButBiCurious", color: "#ba55d3"}, {name: "CantCumButWet", color: "#ff69b4"}, {name: "OneHandTypingF", color: "#ff1493"}, {name: "HotelRoomHorny", color: "#4169e1"}, {name: "MoanForMeBaby", color: "#ff4500"}, {name: "ParentsDownstairs24F", color: "#ff69b4"}, {name: "FreeUserFapperM", color: "#696969"}, {name: "WatchingWithHubby", color: "#9370db"}, {name: "PmMeYourPussy", color: "#ff1493"}, {name: "InBathroomAtWorkF", color: "#ff6347"}, {name: "GirlfriendAsleepNextToMe", color: "#4682b4"}, {name: "TouchingUnderBlanket", color: "#ff69b4"}, {name: "BiWifeWatchingAlone", color: "#da70d6"}, {name: "OnTheToiletStroking", color: "#32cd32"}, {name: "HornyAndBoredWife", color: "#ff1493"}, {name: "ShowAssholeQueen", color: "#ff4500"}, {name: "LurkingWithVibrator", color: "#ff69b4"}, {name: "SneakyCollegeGirl", color: "#ff1493"}, {name: "WifeThinksImSleeping", color: "#4169e1"}, {name: "FingeringInDark", color: "#9370db"}, {name: "CuriousStraightGirl", color: "#ff69b4"}, {name: "EarbudsInMaxF", color: "#ff6347"}, {name: "JustWokeUpHardM", color: "#4682b4"}, {name: "PmYourSnapPretty", color: "#ff1493"}, {name: "CoupleLookingForGirl", color: "#ba55d3"}, {name: "Volume0Vibes100F", color: "#ff69b4"}, {name: "CantCumYetEdging", color: "#4169e1"}, {name: "MomMightWalkInM", color: "#32cd32"}, {name: "SecretlyBiHubby", color: "#4682b4"}, {name: "TouchingMyselfToYou", color: "#ff69b4"}, {name: "InCarWaitingForKids", color: "#ff1493"}, {name: "HornyStepMomVibes", color: "#ff4500"}, {name: "OneHandChallengeM", color: "#4169e1"}, {name: "WatchingWithGFAsleep", color: "#9370db"}, {name: "FreeAccountGangM", color: "#696969"}, {name: "BiGirlLovesTits", color: "#da70d6"}, {name: "HotelWifiWanker", color: "#4682b4"}, {name: "SneakyWifeTouching", color: "#ff69b4"}, {name: "CuriousAboutGirls19", color: "#ff1493"}, {name: "RoommateInNextRoomM", color: "#32cd32"}, {name: "FingeringToYourVoice", color: "#ff69b4"}, {name: "BrokeButLoyalM", color: "#696969"}, {name: "MarriedButWatchingF", color: "#ff6347"}, {name: "ShowToesOrBye", color: "#ffa500"}, {name: "CoupleLookingForUnicorn", color: "#ba55d3"}, {name: "OnCompanyWifiM", color: "#4682b4"}, {name: "HornyAndSingleMom", color: "#ff1493"}, {name: "TypingWithLeftHandM", color: "#4169e1"}, {name: "BiWifePmMe", color: "#da70d6"}, {name: "BananaBananaBananaBanana", color: "#f0f24e"}, {name: "SilentButSoaked", color: "#9370db"}, {name: "InPublicLibraryM", color: "#32cd32"}, {name: "PillowOverFaceF", color: "#ff69b4"}, {name: "CouplePmUs", color: "#ba55d3"}, {name: "EarbudsSavingMeM", color: "#4682b4"}, {name: "SneakyMasturbatorF", color: "#ff69b4"}, {name: "JustAnotherLurkerM", color: "#808080"}, {name: "HornyTeacherAfterClass", color: "#ff1493"}, {name: "WatchingWithBoyfriend", color: "#9370db"}, {name: "NormalGuy", color: "#696969"}, {name: "BiAndBoredTonight", color: "#da70d6"}, {name: "5MinTillHubbyHome", color: "#ff4500"}, {name: "LurkingHardM", color: "#4169e1"}, {name: "TouchingInBedF", color: "#ff69b4"}, {name: "CantCumButHardM", color: "#4682b4"}, {name: "CuriousLesbianFirstTime", color: "#ff1493"}, {name: "OnMomsPhoneM", color: "#32cd32"}, {name: "WifeWatchingWithMe", color: "#9370db"}, {name: "SneakyVibesOn", color: "#ff69b4"}, {name: "InTheDarkStrokingM", color: "#4169e1"}, {name: "HornyAndNeglectedWife", color: "#ff1493"}, {name: "ShowBobsPlsM", color: "#ffa500"}, {name: "BiGirlInLingerie", color: "#da70d6"}, {name: "HeadphonesInClassF", color: "#ff69b4"}, {name: "OneHandLegendM", color: "#4682b4"}, {name: "WatchingWhileHeSleeps", color: "#ff6347"}, {name: "FreeUserEnergyM", color: "#696969"}, {name: "SecretlyWatchingGirls", color: "#9370db"}, {name: "VibratorOnLow", color: "#ff69b4"}, {name: "MarriedButCuriousF", color: "#ff1493"}, {name: "LurkerSince2019M", color: "#808080"}, {name: "SneakyClitRubs", color: "#ff69b4"}, {name: "CantTalkTypingM", color: "#4682b4"}, {name: "HornyAuntieVibes", color: "#ff4500"}, {name: "BiWifeNeedsFriends", color: "#da70d6"}, {name: "OnLunchBreakFapM", color: "#32cd32"}, {name: "TouchingToYourCam", color: "#ff69b4"}, {name: "BrokeCollegeGirlWet", color: "#ff1493"}, {name: "SilentStrokerM", color: "#808080"}, {name: "WatchingWithWife", color: "#9370db"}, {name: "CuriousAndSingleF", color: "#ff69b4"}, {name: "EarbudsInBedM", color: "#4682b4"}, {name: "PillowHumpingTonight", color: "#ff1493"}, {name: "HornyAndHomeAloneF", color: "#ff69b4"}, {name: "FreeLoaderGang", color: "#696969"}, {name: "CoupleWatchingTogether", color: "#ba55d3"}, {name: "SneakyFingerInPanties", color: "#ff69b4"}, {name: "BiAndTipsyTonight", color: "#da70d6"}, {name: "OneHandedViewerM", color: "#4169e1"}, {name: "WatchingOnSilentF", color: "#ff69b4"}, {name: "CantCumButThrobM", color: "#4682b4"}, {name: "HornyMilfNextDoor", color: "#ff1493"}, {name: "CoupleLookingForFun", color: "#ba55d3"}, {name: "LurkingWithToy", color: "#9370db"}, {name: "InBedWithHeadphonesF", color: "#ff69b4"}, {name: "SecretBiHubby", color: "#4682b4"}, {name: "TouchingMyselfSoftly", color: "#ff69b4"}, {name: "CuriousFirstTimerF", color: "#ff1493"}, {name: "OnTheBusHornyM", color: "#32cd32"}, {name: "WifeDoesntKnowIFap", color: "#4169e1"}, {name: "VibratorUnderBlanket", color: "#ff69b4"}, {name: "FreeUserButWet", color: "#696969"}, {name: "CoupleWatchingHot", color: "#ba55d3"}, {name: "JustAnotherHornySoul", color: "#9370db"}, {name: "SneakyOfficeWankM", color: "#4682b4"}, {name: "BiGirlCravingAttention", color: "#da70d6"}, {name: "WatchingFromWorkF", color: "#ff69b4"}, {name: "MomHomeAloneHorny", color: "#ff1493"}, {name: "OneHandBathroomBreak", color: "#4169e1"}, {name: "CuriousNeighborGirl", color: "#ff69b4"}, {name: "HusbandAsleepWatching", color: "#9370db"}, {name: "FingeringInShowerF", color: "#ff69b4"}, {name: "BrokeStudentStroking", color: "#696969"}, {name: "LurkingInShadowsM", color: "#808080"}, {name: "TouchingToYourMoans", color: "#ff69b4"}, {name: "MarriedCoupleCurious", color: "#ba55d3"}, {name: "SilentVibeSessionF", color: "#9370db"}, {name: "OnBreakAtGymHorny", color: "#32cd32"}, {name: "WifeWatchingSecretly", color: "#ff1493"}, {name: "BiAndHornyTonight", color: "#da70d6"}, {name: "PillowRidingHard", color: "#ff69b4"}, {name: "FreeViewerForeverM", color: "#696969"}, {name: "SneakySisterVibes", color: "#ff69b4"}, {name: "EarbudsInPublicF", color: "#ff69b4"}, {name: "CantStopStrokingM", color: "#4682b4"}, {name: "HornyAndBoredMom", color: "#ff1493"}, {name: "CoupleGoalWatchers", color: "#ba55d3"} ]; // Chat messages organized by action and score tier window.prawnChatMessages = { STRIP_CLOTHING: { tier1: [ // 95+ "omg yesss", "fuck ur so good at this", "im so hard rn", "best strip ive ever seen", "holy shit dont stop", "FUCK YES", "im gonna cum watching", "this is perfect", "god damn that tease", "ur making me so wet", "i need more", "so fucking sexy", "youre incredible", "best stripper on here", "cant stop watching", "holy fuck yes", "take it all off baby", "so hot baby", "dont fucking stop", "i wish i was there", "fucking perfect body", "best strip ever", "im edging so hard", "need to see everything", "god yes strip for me", "so good at teasing", "making me throb", "cant handle this", "stroking so hard rn", "youre a goddess", "im so turned on", "fuck me please", "please show more", "best tease ever", "losing my mind", "so fucking hot", "im about to finish", "that body is perfect", "cant look away", "god tier stripper", "soaking wet watching", "touching myself hard", "need you naked", "im obsessed", "fuck that tease", "youre driving me crazy", "best show tonight", "take it off slow", "im gonna explode", "such a good tease", "youre so sexy", "loving every second" ], tier2: [ // 85-94 "so fucking hot", "god i wish i was there", "youre amazing", "fuck keep going", "im so turned on", "damn thats hot", "really good strip", "love watching this", "youre doing great", "god damn that reveal", "perfect tease", "i need more of this", "incredible tease", "so sexy baby", "cant get enough", "youre so skilled at this", "this is hot af", "love your body", "making me hard", "so beautiful", "youre perfect", "damn baby", "im getting close", "love the slow reveal", "so good rn", "youre a natural stripper", "fuck thats nice", "such a tease", "im here for this", "youre gorgeous", "love every curve", "so talented", "this is amazing", "youre killing it", "im hooked", "need more strips like this", "damn youre good", "loving every second", "youre so hot", "fuck yes baby", "great tease", "love the confidence", "youre stunning", "cant wait to see more" ], tier3: [ // 70-84 "nice strip", "looking good", "pretty hot", "keep going", "love it", "really good", "great moves", "not bad at all", "youre hot", "nice work", "great tease", "enjoying this", "looks great", "very nice strip", "good stuff", "keep it up", "doing well", "hot strip", "nice reveal", "pretty sexy", "good performance", "liking this", "solid strip", "looking sexy", "nice job", "decent strip", "enjoying the view", "not bad", "pretty good tease", "this is nice", "good work", "looks hot", "doing good", "nice body" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent strip", "alright", "okay tease", "its fine", "not terrible", "average strip", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "bit awkward ngl", "maybe try again?", "youll get it", "keep practicing", "timing was off", "almost had it", "keep trying", "youll improve", "not quite there", "needs work", "bit rough", "try again", "almost", "needs improvement", "practice the tease more", "getting there", "awkward strip", "could be smoother", "keep working on it", "not your best" ], tier6: [ // <35 "lol wat", "u ok?", "that was bad lmao", "bruh...", "yikes", "wtf was that strip", "lmaooo", "bruh really?", "nah this aint it", "💀💀💀", "lol so awkward", "bruh that was ass", "💀", "cant even strip lmao", "yikes dude", "lmaooo wtf", "nah fam", "what even is that", "lmao nah", "so stiff", "bruh those moves 💀", "nah this cringe", "lol no", "awkward af", "oof", "this aint it chief", "💀💀", "yikes bro", "lmaoooo", "wtf was that" ] }, SIMULATE_SEX: { tier1: [ // 95+ "FUCK YES", "im gonna cum", "holy shit this is perfect", "best ive ever seen", "dont fucking stop", "omg that rhythm", "im cumming watching this", "so fucking hot", "god i wish that was me", "ride it baby", "fuck yes like that", "im so hard rn", "best simulation ever", "youre amazing at this", "fuck keep going", "im about to finish", "that looks so real", "god damn", "im stroking so hard", "cant handle this", "youre incredible", "im losing it", "so turned on rn", "dont stop baby", "fuck that toy", "perfect rhythm", "im edging hard", "need to see more", "god yes faster", "youre so good", "making me throb", "this is everything", "im gonna explode", "best ride ever", "holy fuck", "youre a pro", "soaking wet watching", "touching myself hard", "need you so bad", "im obsessed", "fuck me like that", "youre driving me wild", "best show tonight", "go deeper baby", "im cumming with you", "such good technique", "youre so sexy", "loving every thrust", "harder baby", "fuck yes that angle", "youre perfect", "im gonna lose it" ], tier2: [ // 85-94 "so fucking hot", "god that looks good", "youre amazing", "fuck keep riding", "im so turned on", "damn thats hot", "really good", "love watching this", "youre doing great", "god damn that motion", "perfect technique", "i need more", "incredible", "so sexy baby", "cant get enough", "youre so skilled", "this is hot af", "love your rhythm", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every movement", "so good rn", "youre a natural", "fuck thats nice", "great simulation", "im here for it", "youre gorgeous", "love your moves", "so talented", "this is amazing", "youre killing it", "im hooked", "need more of this", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great technique", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice rhythm", "looking good", "pretty hot", "keep going", "love it", "really good", "great moves", "not bad at all", "youre hot", "nice work", "great show", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot show", "nice technique", "pretty sexy", "good performance", "liking this", "solid show", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice motion" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent show", "alright", "okay", "its fine", "not terrible", "average show", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "bit awkward ngl", "maybe try again?", "youll get it", "keep practicing", "rhythm was off", "almost had it", "keep trying", "youll improve", "not quite there", "needs work", "bit rough", "try again", "almost", "needs improvement", "practice more", "getting there", "off rhythm", "could be smoother", "keep working on it", "not your best" ], tier6: [ // <35 "wtf was that", "lmaooo", "bruh really?", "nah this aint it", "💀💀💀", "lol so fake", "bruh that was ass", "💀", "cant even lmao", "yikes dude", "lmaooo wtf", "nah fam", "what even is that", "lmao nah", "so awkward", "bruh those moves 💀", "nah this cringe", "lol no", "looks fake af", "oof", "this aint it chief", "💀💀", "yikes bro", "lmaoooo", "wtf" ] }, BREASTS_CLAP: { tier1: [ // 95+ "FUCK those tits", "im so hard watching this", "best clapping ever", "holy shit yes", "dont stop baby", "omg that bounce", "im cumming", "so fucking hot", "god damn those tits", "perfect rhythm", "fuck yes", "im stroking to this", "best tits on here", "youre incredible", "cant stop watching", "im about to cum", "that bounce is perfect", "god yes", "im so hard rn", "this is amazing", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "clap those tits baby", "hypnotizing", "im edging hard", "need more", "god those are perfect", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best bounce ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love your tits", "youre driving me crazy", "best show", "keep bouncing", "im cumming with you", "such perfect tits", "youre so sexy", "loving every clap", "bounce harder", "fuck yes that jiggle", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god damn those moves", "so fucking hot", "perfect rhythm", "i need more of this", "youre incredible", "damn thats hot", "really good clapping", "love watching", "youre doing great", "god damn that bounce", "perfect technique", "cant get enough", "this is hot af", "love your tits", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the bounce", "so good rn", "youre a natural", "fuck thats nice", "great clapping", "im here for it", "youre gorgeous", "love the jiggle", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great rhythm", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice rhythm", "looking good", "pretty hot", "keep going", "love it", "really good", "great clapping", "not bad at all", "nice tits", "nice work", "great bounce", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice technique", "pretty sexy", "good show", "liking this", "solid clapping", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice bounce" ], tier4: [ // 50-69 "decent effort", "its alright", "could be better", "okay i guess", "not bad", "pretty good", "decent clapping", "alright", "okay", "its fine", "not terrible", "average", "meh its okay", "decent", "could be hotter", "needs work but ok", "fine i guess", "eh alright" ], tier5: [ // 35-49 "timing was off", "almost had it", "keep trying", "youll get it", "rhythm off", "almost", "keep practicing", "youll improve", "not quite there", "needs work", "bit rough", "try again", "off timing", "needs improvement", "practice more", "getting there" ], tier6: [ // <35 "lol no rhythm", "bruh that was ass", "💀", "cant even clap lmao", "yikes dude", "lmaooo wtf", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "💀", "bruh really", "yikes", "cant even lol", "nah this aint it", "lmao nah", "awkward af", "oof" ] }, ASS_CLAP: { tier1: [ // 95+ "THAT ASS FUCK", "im gonna lose it", "best ass clapping ever", "holy shit yes", "dont stop please", "omg that ass", "im cumming", "so fucking hot", "god damn that ass", "perfect clapping", "fuck yes", "im stroking hard", "best ass on here", "youre incredible", "cant stop watching", "im about to cum", "that jiggle is perfect", "god yes", "im so hard rn", "this is amazing", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "clap that ass baby", "hypnotizing", "im edging hard", "need more", "god that ass is perfect", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best ass ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love your ass", "youre driving me crazy", "best show", "keep clapping", "im cumming with you", "such a perfect ass", "youre so sexy", "loving every clap", "clap harder", "fuck yes that bounce", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god damn that ass", "so fucking hot", "perfect clapping", "i cant handle this", "youre amazing", "damn thats hot", "really good", "love watching", "youre doing great", "god damn that bounce", "perfect technique", "cant get enough", "this is hot af", "love your ass", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the jiggle", "so good rn", "youre a natural", "fuck thats nice", "great clapping", "im here for it", "youre gorgeous", "love that ass", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great rhythm", "love the bounce", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice clapping", "great moves", "really hot", "keep it up", "love it", "really good", "great ass", "not bad at all", "nice", "nice work", "great bounce", "enjoying this", "looks great", "very nice", "good stuff", "keep going", "doing well", "hot", "nice technique", "pretty sexy", "good show", "liking this", "solid clapping", "looking sexy", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice jiggle" ], tier4: [ // 50-69 "decent show", "not bad", "its okay", "alright", "pretty good", "decent clapping", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "timing off", "almost there", "keep trying", "youll improve", "not quite", "almost", "needs work", "try again", "off rhythm", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo wtf", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "💀", "bruh really", "yikes", "cant even lol", "nah this aint it", "lmao nah", "awkward af", "oof" ] }, MASSAGE_BREASTS: { tier1: [ // 95+ "FUCK those circles", "so perfect", "im losing my mind", "best technique ever", "dont stop baby", "omg so smooth", "im cumming", "so fucking hot", "god those are perfect", "hypnotic movement", "fuck yes", "im stroking to this", "best massage ever", "youre incredible", "cant stop watching", "im about to cum", "so smooth baby", "god yes", "im so hard rn", "this is perfect", "youre a goddess", "im losing it", "so turned on", "dont fucking stop", "massage them baby", "hypnotizing", "im edging hard", "need more", "god your technique", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best hands ever", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need to see more", "im obsessed", "fuck i love watching", "youre driving me crazy", "best show", "keep going", "im cumming with you", "such perfect technique", "youre so sexy", "loving every second", "go slower baby", "fuck yes those circles", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god those are perfect", "so fucking hot", "i love watching this", "youre so good", "more please", "damn thats hot", "really smooth", "love watching", "youre doing great", "god damn that technique", "perfect circles", "cant get enough", "this is hot af", "love your hands", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love the motion", "so good rn", "youre a natural", "fuck thats nice", "great technique", "im here for it", "youre gorgeous", "love watching this", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great circles", "love the smoothness", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice technique", "pretty smooth", "looks good", "keep going", "hot", "really good", "great circles", "not bad", "nice", "nice work", "great movement", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid technique", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice motion" ], tier4: [ // 50-69 "decent effort", "not bad", "its alright", "okay", "pretty good", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit shaky", "almost there", "keep trying", "youll improve", "not quite", "almost", "needs work", "try again", "circles off", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "bruh those circles lol", "💀", "what even is that", "lmao nah", "yikes", "lol so shaky", "bruh...", "that aint it", "💀💀", "nah fam", "lol what", "so awkward", "cant even lol", "bruh really", "oof" ] }, MASTURBATE: { tier1: [ // 95+ "FUCK YES", "im cumming watching this", "so fucking hot", "best show ever", "dont stop baby please", "omg yes", "im cumming too", "this is perfect", "holy shit youre hot", "god i wish i was there", "fuck keep going", "im stroking hard", "best masturbation ever", "youre amazing", "cant stop watching", "im about to finish", "so turned on rn", "god yes", "im so hard rn", "this is everything", "youre incredible", "im losing it", "so fucking sexy", "dont fucking stop", "touch yourself baby", "so hot", "im edging hard", "need to see you cum", "god your technique", "youre so good", "making me throb", "cant handle this", "im gonna explode", "best show tonight", "holy fuck", "youre perfect", "soaking wet watching", "touching with you", "need more", "im obsessed", "fuck i love this", "youre driving me crazy", "cum for me", "keep going baby", "im cumming with you", "so fucking hot", "youre so sexy", "loving every second", "faster baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "holy shit youre hot", "god i wish i was there", "so turned on rn", "youre amazing", "fuck keep going", "damn thats hot", "really good", "love watching you", "youre doing great", "god damn", "perfect technique", "cant get enough", "this is hot af", "love watching this", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every move", "so good rn", "youre a natural", "fuck thats nice", "great show", "im here for it", "youre gorgeous", "love your body", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great technique", "love watching you", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "really hot", "loving this", "great show", "keep it up", "so good", "really good", "great moves", "not bad", "nice", "nice work", "hot show", "enjoying this", "looks great", "very nice", "good stuff", "keep going", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice" ], tier4: [ // 50-69 "pretty good", "not bad", "decent show", "alright", "okay", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "seems forced", "try to relax", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "bit stiff", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lol fake af", "bruh really?", "💀💀💀", "nah this aint it", "yikes", "lol so fake", "bruh...", "that aint it", "💀💀", "nah fam", "looks fake", "so awkward", "cant even lol", "bruh really", "oof" ] }, SIMULATE_ORAL: { tier1: [ // 95+ "HOLY FUCK", "im so hard rn", "best technique ive seen", "god yes", "i need this so bad", "omg that looks good", "im cumming", "so fucking hot", "god i wish that was me", "perfect technique", "fuck yes", "im stroking hard", "best oral ever", "youre so skilled", "cant stop watching", "im about to finish", "that looks so real", "god yes", "im so hard", "this is perfect", "youre incredible", "im losing it", "so turned on", "dont fucking stop", "suck it baby", "so hot", "im edging hard", "need to see more", "god your mouth", "youre amazing", "making me throb", "cant handle this", "im gonna explode", "best bj simulation", "holy fuck", "youre perfect", "soaking wet watching", "touching to this", "need you so bad", "im obsessed", "fuck that looks good", "youre driving me wild", "best show", "keep sucking baby", "im cumming with you", "such good technique", "youre so sexy", "loving every second", "deeper baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "fuck that looks good", "youre so skilled", "i wish that was me", "so hot", "dont stop", "damn thats hot", "really good technique", "love watching", "youre doing great", "god damn", "perfect motion", "cant get enough", "this is hot af", "love your technique", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every movement", "so good rn", "youre a natural", "fuck thats nice", "great technique", "im here for it", "youre gorgeous", "love watching this", "so talented", "this is amazing", "youre killing it", "im hooked", "need more shows", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great motion", "love the speed", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "really good", "nice technique", "pretty hot", "keep going", "love it", "really good", "great motion", "not bad", "nice", "nice work", "hot show", "enjoying this", "looks great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice" ], tier4: [ // 50-69 "decent work", "not bad", "its alright", "okay", "pretty good", "decent", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit awkward", "needs practice", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "off motion", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo bruh", "wtf was that", "💀", "nah fam", "yikes dude", "lol so fake", "bruh...", "that aint it", "💀💀", "nah", "looks fake af", "so awkward", "cant even lol", "bruh really", "oof" ] }, POSE_NUDE: { tier1: [ // 95+ "FUCK youre gorgeous", "perfect body", "im so turned on", "goddess", "i cant stop staring", "omg that body", "im cumming", "so fucking hot", "god youre beautiful", "perfect curves", "fuck yes", "im stroking hard", "best body on here", "youre stunning", "cant stop watching", "im about to cum", "so beautiful", "god yes", "im so hard rn", "this is perfect", "youre a goddess", "im losing it", "so turned on", "dont move", "pose for me baby", "so hot", "im edging hard", "need more poses", "god your body", "youre perfect", "making me throb", "cant handle this", "im gonna explode", "best pose ever", "holy fuck", "youre flawless", "soaking wet watching", "touching to you", "need to see more", "im obsessed", "fuck that body", "youre driving me crazy", "best view", "stay like that", "im cumming to you", "such a perfect body", "youre so sexy", "loving every curve", "turn around baby", "fuck yes that angle", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god youre beautiful", "so fucking hot", "amazing body", "youre perfect", "i need more", "damn thats hot", "really gorgeous", "love your body", "youre doing great", "god damn", "perfect figure", "cant get enough", "this is hot af", "love your curves", "making me hard", "so beautiful", "youre perfect", "damn baby", "im getting close", "love every angle", "so good rn", "youre stunning", "fuck thats nice", "great pose", "im here for it", "youre gorgeous", "love your body", "so hot", "this is amazing", "youre killing it", "im hooked", "need more poses", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great pose", "love the confidence", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "looking great", "really hot", "nice body", "beautiful", "keep it up", "really good", "great pose", "not bad", "nice", "nice work", "hot", "enjoying this", "looks great", "very nice", "good stuff", "keep posing", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "looking good", "nice job", "decent show", "enjoying the view", "not bad", "pretty good", "this is nice", "good work", "looks hot", "doing good", "nice body" ], tier4: [ // 50-69 "pretty good", "not bad", "decent", "alright", "okay", "decent pose", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "bit stiff", "try to relax", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "awkward pose", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "bruh u look stiff af", "lol awkward", "💀💀", "nah man", "yikes", "lol so stiff", "bruh...", "that aint it", "💀💀", "nah fam", "looks awkward", "so stiff", "cant even lol", "bruh really", "oof" ] }, MOAN: { tier1: [ // 95+ "THOSE SOUNDS FUCK", "im cumming", "holy shit your voice", "best moans ever", "dont stop baby", "omg that voice", "im cumming to this", "so fucking hot", "god your moans", "perfect sounds", "fuck yes", "im stroking to this", "best moans on here", "youre incredible", "cant stop listening", "im about to finish", "so sexy", "god yes", "im so hard rn", "this is perfect", "youre amazing", "im losing it", "so turned on", "dont fucking stop", "moan for me baby", "so hot", "im edging hard", "need to hear more", "god your voice", "youre perfect", "making me throb", "cant handle this", "im gonna explode", "best sounds ever", "holy fuck", "youre perfect", "soaking wet listening", "touching to your moans", "need more", "im obsessed", "fuck those moans", "youre driving me wild", "best audio", "keep moaning baby", "im cumming with you", "such sexy sounds", "youre so hot", "loving every moan", "louder baby", "fuck yes like that", "youre amazing", "im gonna lose it" ], tier2: [ // 85-94 "god your moans", "so fucking sexy", "i love your voice", "youre amazing", "keep making those sounds", "damn thats hot", "really sexy", "love listening", "youre doing great", "god damn", "perfect sounds", "cant get enough", "this is hot af", "love your moans", "making me hard", "so good", "youre perfect", "damn baby", "im getting close", "love every sound", "so good rn", "youre a natural", "fuck thats nice", "great moans", "im here for it", "youre gorgeous", "love your voice", "so talented", "this is amazing", "youre killing it", "im hooked", "need more audio", "damn youre good", "loving every second", "youre so hot", "fuck yes", "great sounds", "love the moaning", "youre stunning", "cant wait for more" ], tier3: [ // 70-84 "nice sounds", "really hot", "love your voice", "keep going", "great", "really good", "great moans", "not bad", "nice", "nice work", "hot sounds", "enjoying this", "sounds great", "very nice", "good stuff", "keep it up", "doing well", "hot", "nice", "pretty sexy", "good show", "liking this", "solid", "sounding good", "nice job", "decent show", "enjoying this", "not bad", "pretty good", "this is nice", "good work", "sounds hot", "doing good", "nice voice" ], tier4: [ // 50-69 "not bad", "decent", "its alright", "okay", "pretty good", "decent moans", "fine", "okay i guess", "its fine", "not terrible", "average", "meh", "decent" ], tier5: [ // 35-49 "seems forced", "try to be natural", "almost there", "keep trying", "not quite", "almost", "needs work", "try again", "sounds fake", "getting there", "practice more", "keep at it" ], tier6: [ // <35 "lmaooo so fake", "bruh those sounds 💀", "nah this cringe", "yikes dude", "lol no", "lol so fake", "bruh...", "that aint it", "💀💀", "nah fam", "sounds fake af", "so cringe", "cant even lol", "bruh really", "oof" ] } }; // Generate prawn chat based on score and action type window.generatePrawnChat = function(score, actionType, viewers) { let messages = []; let messagePool; // Get action-specific messages let actionMessages = window.prawnChatMessages[actionType] || window.prawnChatMessages.STRIP_CLOTHING; // Determine message pool based on score if (score >= 95) { messagePool = actionMessages.tier1; } else if (score >= 85) { messagePool = actionMessages.tier2; } else if (score >= 70) { messagePool = actionMessages.tier3; } else if (score >= 50) { messagePool = actionMessages.tier4; } else if (score >= 35) { messagePool = actionMessages.tier5; } else { messagePool = actionMessages.tier6; } // Calculate number of messages based on viewers // Min 3 messages, max 15 at 1000+ viewers let minMessages = 3; let maxMessages = 15; let viewerCount = viewers || 0; // Scale messages: 3 at 0 viewers, 15 at 1000+ viewers let scaledMax = Math.min(maxMessages, minMessages + Math.floor((viewerCount / 1000) * (maxMessages - minMessages))); let numMessages = Math.floor(Math.random() * (scaledMax - minMessages + 1)) + minMessages; let usedIndices = new Set(); for (let i = 0; i < numMessages; i++) { let userIndex, msgIndex; // Get unique user do { userIndex = Math.floor(Math.random() * window.prawnChatUsers.length); } while (usedIndices.has(userIndex) && usedIndices.size < window.prawnChatUsers.length); usedIndices.add(userIndex); // Get random message msgIndex = Math.floor(Math.random() * messagePool.length); let user = window.prawnChatUsers[userIndex]; messages.push({ username: user.name, color: user.color, message: messagePool[msgIndex] }); } return messages; }; // Display chat with scrolling animation window.displayPrawnChat = function(containerId, messages) { let container = document.getElementById(containerId); if (!container) return; container.innerHTML = ''; container.style.opacity = '0'; let delay = 0; messages.forEach((msg, index) => { setTimeout(() => { let chatLine = document.createElement('div'); chatLine.className = 'prawn-chat-line'; chatLine.innerHTML = `<span class="prawn-chat-username" style="color: ${msg.color};">${msg.username}:</span> <span class="prawn-chat-message">${msg.message}</span>`; container.appendChild(chatLine); // Fade in container on first message if (index === 0) { container.style.opacity = '1'; } // Scroll to bottom container.scrollTop = container.scrollHeight; }, delay); delay += 150 + Math.random() * 200; // 150-350ms between messages }); }; <</script>>
<<nobr>> <<set $lastLocation = "PrawnHubAnalytics">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 25px; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #ff1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.4); text-align: center;"> <h1 style="color: white; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">📊 PrawnHub Analytics Dashboard</h1> <p style="color: #ffd; margin: 10px 0 0 0; font-size: 16px;"> Track your adult streaming performance and growth </p> </div> <!-- Overall Stats --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #ff1493; margin: 0 0 20px 0;">🎯 Channel Overview</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL FOLLOWERS</div> <div style="font-size: 32px; font-weight: bold; color: #e74c3c;"><<print ($prawnhubFollowers || 0).toLocaleString()>></div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL STREAMS</div> <div style="font-size: 32px; font-weight: bold; color: #3498db;"><<print ($prawnhubStreamHistory ? $prawnhubStreamHistory.length : 0)>></div> </div> <<if $prawnhubStreamHistory && $prawnhubStreamHistory.length > 0>> <<set _totalMinutes = 0>> <<set _totalIncome = 0>> <<for _i = 0; _i < $prawnhubStreamHistory.length; _i++>> <<set _totalMinutes += $prawnhubStreamHistory[_i].duration>> <<set _totalIncome += $prawnhubStreamHistory[_i].netEarnings>> <</for>> <<set _totalHours = Math.floor(_totalMinutes / 60)>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TIME STREAMED</div> <div style="font-size: 32px; font-weight: bold; color: #9b59b6;"><<print _totalMinutes>> min</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 32px; font-weight: bold; color: #f39c12;">$<<print _totalIncome.toFixed(2)>></div> </div> <</if>> </div> </div> <!-- Stream History --> <<if $prawnhubStreamHistory && $prawnhubStreamHistory.length > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 20px 0;">📅 Recent Stream History (Last 7)</h2> <<set _historyLength = $prawnhubStreamHistory.length>> <<set _startIdx = Math.max(0, _historyLength - 7)>> <<for _i = _historyLength - 1; _i >= _startIdx; _i-->> <<set _stream = $prawnhubStreamHistory[_i]>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; flex-wrap: wrap;"> <div> <strong style="color: #ff1493; font-size: 18px;">Day <<print _stream.day>></strong> <span style="color: #aaa; margin-left: 15px;"><<print _stream.duration>> minutes</span> </div> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin-bottom: 15px;"> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NEW FOLLOWERS</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">+<<print _stream.newFollowers>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">PEAK VIEWERS</div> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<print _stream.viewers>></div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">AVG ENGAGEMENT</div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print Math.round(_stream.engagement)>>%</div> </div> <div style="text-align: center; padding: 10px; background: #0a0a0a; border-radius: 6px;"> <div style="color: #aaa; font-size: 12px; margin-bottom: 5px;">NET EARNED</div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;">$<<print _stream.netEarnings.toFixed(2)>></div> </div> </div> <!-- Actions Performed --> <<if _stream.actionsPerformed && _stream.actionsPerformed.length > 0>> <div style="background: #0a0a0a; padding: 15px; border-radius: 6px;"> <div style="color: #ff69b4; font-size: 12px; margin-bottom: 8px; font-weight: bold;">ACTIONS PERFORMED:</div> <div style="display: flex; flex-wrap: wrap; gap: 5px;"> <<for _j = 0; _j < _stream.actionsPerformed.length; _j++>> <<set _actionName = _stream.actionsPerformed[_j].replace(/_/g, " ")>> <span style="background: #333; padding: 4px 8px; border-radius: 4px; font-size: 11px; color: #aaa; border: 1px solid #ff1493;"> <<print _actionName>> </span> <</for>> </div> </div> <</if>> </div> <</for>> </div> <!-- Last 7 Streams Statistics --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px;"> <h2 style="color: #e74c3c; margin: 0 0 20px 0;">📈 Last 7 Streams Statistics</h2> <<set _historyLength = $prawnhubStreamHistory.length>> <<set _statsStartIdx = Math.max(0, _historyLength - 7)>> <<set _last7TotalFollowers = 0>> <<set _last7TotalIncome = 0>> <<set _last7TotalMinutes = 0>> <<set _last7TotalViewers = 0>> <<set _last7TotalEngagement = 0>> <<set _last7Count = 0>> <<for _j = _statsStartIdx; _j < _historyLength; _j++>> <<set _last7TotalFollowers += $prawnhubStreamHistory[_j].newFollowers>> <<set _last7TotalIncome += $prawnhubStreamHistory[_j].netEarnings>> <<set _last7TotalMinutes += $prawnhubStreamHistory[_j].duration>> <<set _last7TotalViewers += $prawnhubStreamHistory[_j].viewers>> <<set _last7TotalEngagement += $prawnhubStreamHistory[_j].engagement>> <<set _last7Count++>> <</for>> <<set _avgViewers = Math.round(_last7TotalViewers / _last7Count)>> <<set _avgEngagement = Math.round(_last7TotalEngagement / _last7Count)>> <<set _avgIncomePerStream = Math.round((_last7TotalIncome / _last7Count) * 100) / 100>> <<set _avgFollowersPerStream = Math.round(_last7TotalFollowers / _last7Count)>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #e74c3c; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL NEW FOLLOWERS</div> <div style="font-size: 28px; font-weight: bold; color: #e74c3c;">+<<print _last7TotalFollowers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: <<print _avgFollowersPerStream>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #f39c12; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">TOTAL EARNINGS</div> <div style="font-size: 28px; font-weight: bold; color: #f39c12;">$<<print _last7TotalIncome.toFixed(2)>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Avg: $<<print _avgIncomePerStream.toFixed(2)>> per stream</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #3498db; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG PEAK VIEWERS</div> <div style="font-size: 28px; font-weight: bold; color: #3498db;"><<print _avgViewers>></div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<print _last7Count>> streams</div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #9b59b6; text-align: center;"> <div style="font-size: 14px; color: #aaa; margin-bottom: 8px;">AVG ENGAGEMENT</div> <div style="font-size: 28px; font-weight: bold; color: #9b59b6;"><<print _avgEngagement>>%</div> <div style="font-size: 12px; color: #666; margin-top: 5px;">Across <<print _last7Count>> streams</div> </div> </div> </div> <<else>> <!-- No Stream History --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px; border-radius: 12px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <div style="font-size: 48px; margin-bottom: 20px;">📊</div> <h2 style="color: #aaa; margin: 0 0 15px 0;">No Stream Data Yet</h2> <p style="color: #888; font-size: 16px; margin: 0;"> Start streaming on PrawnHub to see your analytics and performance metrics here! </p> </div> <</if>> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to PrawnHub</div>">> <<goto "PrawnHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff1493; margin: 0 0 15px 0;">🔞 PrawnHub System</h2> <!-- Follower Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">Follower Count</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff1493;">Current Followers:</strong> <span id="prawnFollowerCount" style="color: #ffd43b; font-size: 18px; font-weight: bold; margin-left: 10px;"><<print $prawnhubFollowers || 0>></span> </div> <!-- Increase Followers --> <div style="margin-bottom: 15px;"> <p style="color: #51cf66; margin: 0 0 10px 0; font-weight: bold;">⬆️ Increase Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+1</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 1>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+10</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 10>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+100</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 100>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+1,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 1000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+10,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 10000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>+100,000</div>">> <<set $prawnhubFollowers = ($prawnhubFollowers || 0) + 100000>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Decrease Followers --> <div style="margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0 0 10px 0; font-weight: bold;">⬇️ Decrease Followers:</p> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-1</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 1)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-10</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 10)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-100</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 100)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-1,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 1000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-10,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 10000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px; font-weight: bold;'>-100,000</div>">> <<set $prawnhubFollowers = Math.max(0, ($prawnhubFollowers || 0) - 100000)>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Reset/Set Specific Amount --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set to 500 (Adult Streamer Job)</div>">> <<set $prawnhubFollowers = 500>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset to 0</div>">> <<set $prawnhubFollowers = 0>> <<replace "#prawnFollowerCount">><<print $prawnhubFollowers || 0>><</replace>> <</link>> </div> </div> <!-- Adult Toys --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">🍆 Adult Toys</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<if $ownsDildo>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Dildo</div>">> <<set $ownsDildo = false>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Dildo</div>">> <<set $ownsDildo = true>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> <<if $ownsFleshlight>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Fleshlight</div>">> <<set $ownsFleshlight = false>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Fleshlight</div>">> <<set $ownsFleshlight = true>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> </div> </div> <!-- Job Management --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff1493; margin: 0 0 10px 0;">💼 Adult Streamer Job</h3> <<if $jobs && $jobs.includes("Adult Streamer")>> <div style="background: #2a2a2a; padding: 12px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #51cf66;"> <span style="color: #51cf66; font-weight: bold;">✓ Currently: Adult Streamer</span> <div style="color: #aaa; font-size: 13px; margin-top: 5px;">Platform cut: 30% (better revenue)</div> </div> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Adult Streamer Job</div>">> <<set $jobs = $jobs.filter(job => job !== "Adult Streamer")>> <<if $jobs.length === 0>><<set $jobs = ["Unemployed"]>><</if>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <<else>> <div style="background: #2a2a2a; padding: 12px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #666;"> <span style="color: #aaa; font-weight: bold;">Current Job: <<if $jobs && $jobs.length > 0>><<print $jobs.join(", ")>><<else>>Unemployed<</if>></span> <div style="color: #ff6b6b; font-size: 13px; margin-top: 5px;">Platform cut: 70% (high fees)</div> </div> <<link "<div style='background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Job to Adult Streamer</div>">> <<set $jobs = ["Adult Streamer"]>> <<replace "#prawnhubSection">><<include "CheatMenuPrawnHub">><</replace>> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <<silently>> <<if !$prawnhubRegistered>> <<set $prawnhubRegistered = false>> <</if>> <<if !$prawnhubFollowers>> <<set $prawnhubFollowers = 0>> <</if>> <<if !$prawnhubTotalEarnings>> <<set $prawnhubTotalEarnings = 0>> <</if>> <<if !$prawnhubSessionsToday>> <<set $prawnhubSessionsToday = 0>> <</if>> <<if !$prawnhubMaxSessions>> <<set $prawnhubMaxSessions = 3>> <</if>> <<if !$prawnhubStreamHistory>> <<set $prawnhubStreamHistory = []>> <</if>> <</silently>> <</nobr>> <<script>> window.savePrawnStream = function() { if (!State.variables.currentPrawnStream) return; var stream = State.variables.currentPrawnStream; // Calculate followers gained (current followers - starting followers) var followersGained = stream.followersGained || 0; if (stream.startingFollowers !== undefined) { followersGained = (State.variables.prawnhubFollowers || 0) - stream.startingFollowers; } var streamRecord = { day: State.variables.dayNumber || 1, viewers: stream.peakViewers || stream.viewers || 0, engagement: stream.currentEngagement || 0, earnings: stream.earnings || 0, netEarnings: stream.earnings || 0, newFollowers: followersGained, duration: stream.totalMinutes || 0, actionsPerformed: stream.actionsPerformed || [] }; State.variables.prawnhubStreamHistory.push(streamRecord); State.variables.prawnhubTotalEarnings += (stream.earnings || 0); State.variables.prawnhubSessionsToday++; State.variables.currentPrawnStream = null; }; <</script>>
/* ---------------------------------- */ /* --- TRAIT BONUSES SYSTEM (MUST BE FIRST) --- */ /* ---------------------------------- */ <<set setup.traitBonuses = { /* ================================== */ /* SPECIAL PHYSICAL TRAITS */ /* ================================== */ "Definitely not a Vampire": {strength: 50, charisma: 50, dexterity: 50}, "Were-Creature": {strength: 60, dexterity: 60}, "Quill": {strength: 26, charisma: 26, dexterity: 26, intelligence: 26}, "Werewolf": {strength: 7, dexterity: 4, charisma: 2, intelligence: 3}, "Hellhound": {strength: 57, dexterity: 59, charisma: 7, intelligence: 3}, /* ================================== */ /* PHYSICAL TRAITS - POSITIVE */ /* ================================== */ "Artistic": {intelligence: 2, dexterity: 2}, "Athletic Build": {strength: 5, dexterity: 5}, "Attractive": {charisma: 8}, "Broad-shouldered": {strength: 4}, "Curvy": {charisma: 5}, "Customer-Focused": {charisma: 3, intelligence: 1}, "Dark Skin": {}, "Deep Thinker": {intelligence: 4}, "Detail-Oriented": {intelligence: 3, dexterity: 2}, "Fashionable": {charisma: 5}, "Fast": {dexterity: 6}, "Fit": {strength: 5, dexterity: 4}, "Flexible": {dexterity: 6}, "Freckled": {charisma: 2}, "Graceful": {dexterity: 6, charisma: 3}, "High Energy": {dexterity: 3, charisma: 4}, "Humorous": {charisma: 2}, "Lean": {dexterity: 4, strength: 2}, "Long Hair": {}, "Mature": {intelligence: 4, charisma: 2}, "Monotone Expression": {intelligence: 1}, "Muscular": {strength: 8}, "Pale Skin": {}, "Perceptive": {intelligence: 3, charisma: 1}, "Petite": {dexterity: 4}, "Pierced": {charisma: 2}, "Punctual": {intelligence: 1, charisma: 1}, "Quick": {dexterity: 5}, "Quick Reflexes": {dexterity: 6}, "Relaxed": {charisma: 2}, "Sarcastic": {charisma: 2, intelligence: 1}, "Sharp Features": {charisma: 4}, "Short Hair": {}, "Smooth Skin": {charisma: 3}, "Soft": {charisma: 3}, "Strong": {strength: 7}, "Sturdy": {strength: 4}, "Tall": {}, "Tan Skin": {}, "Tattooed": {charisma: 3}, "Tech Savvy": {intelligence: 5, dexterity: 2}, "Voluptuous": {charisma: 6}, "Youthful": {charisma: 3, dexterity: 2}, /* ================================== */ /* PHYSICAL TRAITS - MIXED */ /* ================================== */ "Scarred": {strength: 2, charisma: -3}, "Short": {}, /* ================================== */ /* PHYSICAL TRAITS - NEGATIVE */ /* ================================== */ "Blemished": {charisma: -4}, "Clumsy": {dexterity: -6}, "Overweight": {strength: -4, dexterity: -4, charisma: -3}, "Plain": {charisma: -3}, "Slow": {dexterity: -5, strength: -2}, "Stiff": {dexterity: -5}, "Ugly": {charisma: -8}, "Underweight": {strength: -5, charisma: -2}, "Weak": {strength: -7}, /* ================================== */ /* VOICE TRAITS - POSITIVE */ /* ================================== */ "Animated Tone": {charisma: 4}, "Articulate Speech": {charisma: 4, intelligence: 3}, "Balanced Neutral Tone": {}, "Bouncy Tone": {charisma: 3}, "Breathy Voice": {charisma: 2}, "Calm Voice": {charisma: 3}, "Charming Tone": {charisma: 5}, "Charismatic Voice": {charisma: 7}, "Clear Enunciation": {charisma: 3, intelligence: 2}, "Clear Pronunciation": {charisma: 3, intelligence: 2}, "Deep Voice": {charisma: 2}, "Eager Tone": {charisma: 3}, "Even-Paced Voice": {charisma: 2}, "Expressive Voice": {charisma: 5}, "Friendly Tone": {charisma: 4}, "Gentle Voice": {charisma: 3}, "Gravelly Voice": {charisma: 1}, "Hushed Intimate Voice": {charisma: 4}, "Lively Tone": {charisma: 4}, "Measured Speech": {intelligence: 3}, "Melodic Voice": {charisma: 5}, "Pleasant Cadence": {charisma: 4}, "Silky Voice": {charisma: 5}, "Sing-Songy Voice": {charisma: 3}, "Slow Calm Voice": {charisma: 2}, "Smooth Talker": {charisma: 6}, "Smooth Voice": {charisma: 4}, "Soft Monologue Style": {charisma: 2}, "Soft-Spoken": {charisma: 2}, "Soothing Tone": {charisma: 4}, "Steady Voice": {charisma: 3}, "Understated Voice": {charisma: 1}, "Warm Tone": {charisma: 5}, "Gaelic Accent": {charisma: 1}, /* ================================== */ /* VOICE TRAITS - MIXED/NEGATIVE */ /* ================================== */ "Choppy Speech": {charisma: -2}, "Croaky Voice": {charisma: -2}, "Deadpan Delivery": {intelligence: 2, charisma: -2}, "Detached Voice": {charisma: -3}, "Emotionless Tone": {charisma: -4}, "Fast Talker": {dexterity: 2, charisma: -1}, "Flat Voice": {charisma: -2}, "Grim Tone": {charisma: -2}, "High-Pitched Tone": {charisma: -1}, "Interruptive Tone": {charisma: -3}, "Lazy Drawl": {charisma: -2}, "Monotone": {charisma: -3}, "Mumbly Voice": {charisma: -4}, "Nasally Tone": {charisma: -3}, "Rapid-Fire Speech": {dexterity: 3, charisma: -2}, "Raspy Voice": {}, "Robotic Tone": {intelligence: 2, charisma: -3}, "Shaky Voice": {charisma: -3}, "Sharp Voice": {charisma: -1}, "Snappy Tone": {charisma: -2}, "Stoic Tone": {intelligence: 2, charisma: -1}, "Stuttering Speech": {charisma: -3}, /* ================================== */ /* MENTAL TRAITS - POSITIVE */ /* ================================== */ "Alluring": {charisma: 7}, "Ambitious": {intelligence: 4, charisma: 3}, "Analytical": {intelligence: 5}, "Bookworm": {intelligence: 6}, "Brave": {strength: 4, charisma: 3}, "Calm": {intelligence: 2, charisma: 2}, "Charming": {charisma: 6}, "Chill": {charisma: 3, intelligence: 2}, "Competitive": {strength: 3, intelligence: 2}, "Confident": {charisma: 6}, "Considerate": {charisma: 5}, "Crafty": {intelligence: 4, dexterity: 3}, "Creative": {intelligence: 5}, "Curious": {intelligence: 3}, "Determined": {strength: 4, intelligence: 2}, "Diplomatic": {charisma: 5, intelligence: 3}, "Direct": {charisma: 2, intelligence: 1}, "Disciplined": {strength: 3, intelligence: 3}, "Efficient": {intelligence: 4, dexterity: 2}, "Empathetic": {charisma: 5, intelligence: 2}, "Energetic": {dexterity: 2, charisma: 2}, "Extroverted": {charisma: 5}, "Flirty": {charisma: 5}, "Focused": {intelligence: 4}, "Friendly": {charisma: 6}, "Funny": {charisma: 5}, "Hardworking": {strength: 3, intelligence: 3}, "High Stamina": {strength: 6, dexterity: 3}, "Humble": {charisma: 4}, "Intelligent": {intelligence: 5}, "Kind": {charisma: 6}, "Logical": {intelligence: 6}, "Loyal": {charisma: 4}, "Lucky": {charisma: 3, dexterity: 3}, "Negotiator": {charisma: 6, intelligence: 3}, "Nonchalant": {charisma: 2}, "Optimistic": {charisma: 4}, "Organized": {intelligence: 4}, "Outgoing": {charisma: 4}, "Patient": {intelligence: 3, charisma: 2}, "Polite": {charisma: 4}, "Reassuring": {charisma: 4}, "Resourceful": {intelligence: 5, dexterity: 2}, "Seductive": {charisma: 6}, "Shrewd": {intelligence: 5, charisma: 2}, "Sly": {intelligence: 4, charisma: 2}, "Steadfast": {strength: 3, intelligence: 2}, "Supportive": {charisma: 5}, "Talkative": {charisma: 3}, "Thoughtful": {intelligence: 3}, "Trusting": {charisma: 3}, "Warm": {charisma: 5}, "Wise": {intelligence: 7}, "Witty": {charisma: 3, intelligence: 2}, "Workaholic": {intelligence: 3, strength: 2}, /* ================================== */ /* MENTAL TRAITS - MIXED */ /* ================================== */ "Aggressive": {strength: 5, charisma: -2}, "Awkward": {charisma: -4}, "Bimbo": {intelligence: -40, charisma: 10}, "Blunt": {charisma: -2, intelligence: 2}, "Clingy": {charisma: -3}, "Corporate Drone": {intelligence: 2, charisma: -2}, "Corrupt": {charisma: 1}, "Cynical": {intelligence: 2, charisma: -3}, "Dominant": {charisma: 4, strength: 3}, "Honest": {charisma: 3, intelligence: -2}, "Impulsive": {dexterity: 3, intelligence: -3}, "Introverted": {intelligence: 3, charisma: -3}, "Moody": {charisma: -3}, "Overthinker": {intelligence: 3, charisma: -3}, "Paranoid": {intelligence: 2, charisma: -4}, "Passive": {charisma: -2, intelligence: 3}, "Perfectionist": {intelligence: 4, charisma: -2}, "Perverted": {}, "Pessimistic": {intelligence: 3, charisma: -3}, "Quiet": {charisma: -2, intelligence: 2}, "Risk Taker": {strength: 3, intelligence: -2}, "Sensitive": {charisma: -2, intelligence: 2}, "Shy": {charisma: -5, intelligence: 2}, "Stubborn": {strength: 4, intelligence: -2}, "Submissive": {charisma: -3, dexterity: 2}, "Tease": {charisma: 2}, "Tone Deaf": {charisma: -3}, "Unpredictable": {charisma: -2}, "Musky": {}, "Gambling Addiction": {charisma: +1, intelligence: -5}, /* ================================== */ /* MENTAL TRAITS - NEGATIVE */ /* ================================== */ "Arrogant": {charisma: -6, intelligence: -2}, "Bitchy": {charisma: -5, intelligence: -2}, "Cold": {charisma: -5}, "Complacent": {intelligence: -4, strength: -3}, "Cowardly": {strength: -5, charisma: -4}, "Cruel": {charisma: -8, intelligence: -2}, "Deceitful": {charisma: -5, intelligence: -2}, "Disorganized": {intelligence: -4, dexterity: -2}, "Dull": {intelligence: -6, charisma: -3}, "Erratic": {charisma: -4, intelligence: -3}, "Foolish": {intelligence: -7, charisma: -2}, "Forgetful": {intelligence: -5}, "Impatient": {intelligence: -3, charisma: -4}, "Insecure": {charisma: -5}, "Insensitive": {charisma: -5}, "Jealous": {charisma: -5, intelligence: -2}, "Lazy": {strength: -5, intelligence: -4}, "Obsessive": {intelligence: -3, charisma: -4}, "Reckless": {intelligence: -4, strength: -3}, "Rude": {charisma: -6}, "Selfish": {charisma: -6}, "Short Tempered": {charisma: -5, intelligence: -2}, "Slow Learner": {intelligence: -6}, "Unlucky": {charisma: -3, dexterity: -3}, "Unreliable": {charisma: -5, intelligence: -3}, "Unskilled": {dexterity: -5, intelligence: -3}, /* ================================== */ /* STEREOTYPE TRAITS */ /* ================================== */ "Diva": {charisma: 6, intelligence: -3}, "Femboy": {charisma: 4, dexterity: 3}, "Geek": {intelligence: 5, charisma: -1}, "Goth": {charisma: 2, intelligence: 2}, "Jock": {strength: 5, dexterity: 4, intelligence: -2}, "Nerd": {intelligence: 6, charisma: -2}, "Prep": {charisma: 5, intelligence: 2}, "Tomboy": {strength: 3, dexterity: 3, charisma: -2}, "Delinquent": {strength: 7, dexterity: 4, charisma: -3}, /* ================================== */ /* FISHING MILESTONE TRAITS */ /* ================================== */ "Fishing": {}, "Advanced Angler": {}, "Master Angler": {}, "Fishimon Master": {}, /* ================================== */ /* SPECIAL TRAITS (ADDITIONAL) */ /* ================================== */ "Totally not a Vampire": {strength: 50, charisma: 50, dexterity: 50}, "Sunfish": {charisma: 50, dexterity: 50, strength: 50, intelligence: 50}, "Soul": {}, /* ================================== */ /* CHARACTER CREATION TRAITS */ /* ================================== */ "Naturally Gifted": {strength: 2, charisma: 2, dexterity: 2, intelligence: 2}, "Pensive": {intelligence: 4}, "Silver-Tongued": {charisma: 5}, "Swift": {dexterity: 5}, /* ================================== */ /* MISCELLANEOUS */ /* ================================== */ "Cuntboy": {}, "Futanari": {}, /* ================================== */ /* NPC / SHARED TRAITS */ /* ================================== */ "Nervous": {charisma: -4, dexterity: -2}, "Scared": {strength: -3, charisma: -4}, "Assertive": {charisma: 4, strength: 2}, "Serious": {intelligence: 3, charisma: -1}, "Reserved": {charisma: -3, intelligence: 2}, "Demanding": {charisma: -3, intelligence: 1}, "Stocky": {strength: 4}, "Slim": {dexterity: 3}, "Prudish": {charisma: -2}, "Timid": {charisma: -3, dexterity: -1}, "Antisocial": {charisma: -5}, "Busy": {}, "Cautious": {intelligence: 3}, "Reliable": {charisma: 3, intelligence: 2}, "Careful": {intelligence: 3}, /* ================================== */ /* NPC MENTAL TRAITS (ADDITIONAL) */ /* ================================== */ "Anxious": {charisma: -4, dexterity: -2}, "Bold": {strength: 3, charisma: 3}, "Bubbly": {charisma: 4}, "By-the-Book": {intelligence: 3, charisma: -1}, "Clever": {intelligence: 4}, "Crazy": {strength: 3, charisma: -5}, "Eccentric": {intelligence: 3, charisma: -1}, "Gentle": {charisma: 3, strength: -1}, "Hot-Headed": {strength: 3, charisma: -3}, "Intimidating": {strength: 4, charisma: -2}, "Manipulative": {charisma: 3, intelligence: 2}, "Naive": {charisma: 2, intelligence: -3}, "Nurturing": {charisma: 4}, "Passionate": {charisma: 3, strength: 2}, "Playful": {charisma: 3, dexterity: 2}, "Protective": {strength: 4, charisma: 2}, "Romantic": {charisma: 4}, "Sassy": {charisma: 3}, "Simple": {intelligence: -2}, "Spiritual": {intelligence: 3}, "Street Smart": {intelligence: 4, dexterity: 2}, "Vain": {charisma: 2, intelligence: -2}, /* ================================== */ /* NPC VOICE TRAITS */ /* ================================== */ "Flat Uninterested Voice": {}, "Slurred Speech": {charisma: -2}, "Whiny Voice": {charisma: -2}, /* ================================== */ /* TRANSFORMATION BASE TRAITS */ /* ================================== */ "Catperson": {dexterity: 4, charisma: 2}, "Wolfperson": {strength: 3, dexterity: 2}, "Horns": {charisma: 2}, "Fangs": {strength: 2}, "Pointed Ears": {charisma: 2}, "Glowing Eyes": {charisma: 3}, "Claws": {strength: 2, dexterity: 2}, "Wings": {dexterity: 3, charisma: 2}, "Tail": {dexterity: 2}, "Lactating": {}, "Mischievous": {dexterity: 3, charisma: 2}, "Docile": {charisma: 2, intelligence: -2}, "Feral": {strength: 5, intelligence: -4}, "Predatory": {strength: 3, dexterity: 3}, "Maternal": {charisma: 4}, "Paternal": {charisma: 3, strength: 2}, "Breeding Obsessed": {charisma: 2, intelligence: -3}, "Heat Cycles": {charisma: 3}, "Pack Minded": {charisma: 2, strength: 2}, "Nocturnal": {dexterity: 3, intelligence: 2}, "Territorial": {strength: 3}, "Shameless": {charisma: 4, intelligence: -2}, "Insatiable": {charisma: 3, intelligence: -2}, "Praise Seeking": {charisma: 2}, "Obedient": {charisma: 2, intelligence: -2}, "Collar Loving": {charisma: 2}, "Rebellious": {strength: 2, charisma: -2}, "Corrupted": {charisma: 3, intelligence: 2}, "Cunning": {intelligence: 4, charisma: 2}, /* ================================== */ /* INTERMEDIATE COMBINATION TRAITS */ /* ================================== */ "Temptress": {charisma: 8}, "Sadist": {strength: 3, charisma: 5}, "Masochist": {dexterity: 3, charisma: 5}, "Milky": {charisma: 5}, "Neko": {dexterity: 6, charisma: 4}, "Inu": {strength: 4, dexterity: 4}, "Imp-Touched": {charisma: 6, intelligence: -3}, "Mommy Energy": {charisma: 6}, "Devoted": {charisma: 4, intelligence: -2}, "Exhibitionist": {charisma: 7, intelligence: -2}, "Savage": {strength: 8, intelligence: -5}, "Genius": {intelligence: 10, charisma: -3}, /* ================================== */ /* FULL TRANSFORMATION TRAITS */ /* ================================== */ "Succubus": {charisma: 30, dexterity: 12}, "Incubus": {charisma: 15, strength: 5, intelligence: 3}, "Imp": {charisma: 5, dexterity: 10, intelligence: 10}, "Hellhound": {strength: 57, dexterity: 59, charisma: 7, intelligence: 3}, "Werecat": {strength: 3, dexterity: 20, charisma: 10, intelligence: 13}, "Werewolf": {strength: 7, dexterity: 4, charisma: 2, intelligence: 3}, "Werebunny": {dexterity: 20}, "Werefox": {intelligence: 4, charisma: 10}, "Weresheep": {charisma: 16}, "Hucow": {charisma: 16, intelligence: -15}, "Trophy Wife": {charisma: 15, intelligence: -10}, "Gym Bunny": {strength: 45, dexterity: 20}, "E-Girl": {charisma: 25, intelligence: 15}, "Punk": {strength: 5, charisma: 5}, "Siren": {charisma: 165, strength: 4, dexterity: 3}, "Living Doll": {intelligence: 32, charisma: 10}, "Dominatrix": {charisma: 42, strength: 43, intelligence: -2}, "Slut": {charisma: 30, strength: 6, dexterity: 5, intelligence: -10}, "Gyaru": {charisma: 45}, "Himbo": {strength: 55, intelligence: -25} }>> <<set setup.skillBonuses = { /* ================================== */ /* SPECIAL SKILLS */ /* ================================== */ "Occult Expert": {intelligence: 30}, "Sunfish": {charisma: 50, dexterity: 50, strength: 50, intelligence: 50}, "Criminal Deluxe": {dexterity: 100, intelligence: 100, charisma: 100}, /* ================================== */ /* REGULAR SKILLS */ /* ================================== */ "Accounting": {intelligence: 6}, "Acting": {charisma: 6, intelligence: 2}, "Art": {dexterity: 4, intelligence: 3}, "Athletics": {strength: 5, dexterity: 4}, "Baking": {dexterity: 4, intelligence: 2}, "Cleaning": {dexterity: 3}, "Coding": {intelligence: 6}, "Combat": {strength: 6, dexterity: 3}, "Construction": {strength: 5, intelligence: 2}, "Cooking": {intelligence: 3, dexterity: 2}, "Customer Service": {charisma: 3, intelligence: 1}, "Dancing": {dexterity: 5, charisma: 3}, "Driving": {dexterity: 4}, "First Aid": {intelligence: 4}, "Foreign Language": {intelligence: 5}, "Forklift Certified": {dexterity: 3, strength: 2}, "Gardening": {intelligence: 2, strength: 2}, "Guitar": {dexterity: 4, charisma: 2}, "Hair Styling": {dexterity: 5, charisma: 2}, "Heavy Lifting": {strength: 7}, "High Heels Proficient": {dexterity: 4, charisma: 2}, "Inventory Management": {intelligence: 3, dexterity: 1}, "Languages": {intelligence: 5}, "Legal Knowledge": {intelligence: 7}, "Lock Picking": {dexterity: 6, intelligence: 2}, "Maid": {dexterity: 4}, "Makeup": {dexterity: 3, charisma: 3}, "Management": {intelligence: 5, charisma: 4}, "Martial Arts": {strength: 5, dexterity: 5}, "Math Skills": {intelligence: 5}, "Medicine": {intelligence: 7}, "Modeling": {charisma: 6}, "Music": {dexterity: 3, charisma: 4}, "Painting": {dexterity: 4, intelligence: 3}, "Persuasion": {charisma: 7}, "Photography": {intelligence: 3, charisma: 2}, "Piano": {dexterity: 5, intelligence: 2}, "Plumbing": {strength: 3, intelligence: 2}, "Product Knowledge": {intelligence: 2, charisma: 1}, "Public Speaking": {charisma: 6, intelligence: 2}, "Quick Learner": {}, "Retail": {charisma: 3, intelligence: 2}, "Sales": {charisma: 6, intelligence: 2}, "Serving": {charisma: 4, dexterity: 2}, "Sexually Skilled": {charisma: 5, dexterity: 2}, "Singing": {charisma: 5}, "Social Media": {charisma: 5, intelligence: 2}, "Stealth": {dexterity: 6}, "Swimmer": {strength: 4, dexterity: 3}, "Swimming": {strength: 4, dexterity: 3}, "Teaching": {intelligence: 5, charisma: 3}, "Tech-Savvy": {intelligence: 3, dexterity: 1}, "Trading": {charisma: 4, intelligence: 3}, "Troubleshooting": {intelligence: 3, dexterity: 2}, "Writing": {intelligence: 5}, "Yoga": {dexterity: 5, intelligence: 2}, /* ================================== */ /* SEXUAL EXPERTISE TRAITS */ /* ================================== */ "Oral Expert": {charisma: 8, dexterity: 4}, "Anal Expert": {charisma: 6, dexterity: 6}, "Rough Sex Enthusiast": {strength: 6, charisma: 4}, "Sensual Lover": {charisma: 10}, "BDSM Enthusiast - Dom": {charisma: 8, strength: 4}, "BDSM Enthusiast - Sub": {charisma: 6}, "Roleplay Expert": {charisma: 8, intelligence: 4}, "Dirty Talker": {charisma: 7}, "Tantric Master": {charisma: 10, intelligence: 6}, "Exhibitionist": {charisma: 6}, "Sexual Stamina Expert": {strength: 12, dexterity: 8}, "Tit Worship Expert": {charisma: 7, dexterity: 3}, "Titfuck Master": {charisma: 8, dexterity: 5}, /* ================================== */ /* NPC SKILLS (ADDITIONAL) */ /* ================================== */ "Building PCs": {intelligence: 4, dexterity: 2}, "Animation": {intelligence: 3, dexterity: 4}, "Fashion Design": {charisma: 4, dexterity: 3}, "Finance": {intelligence: 6}, "Investigation": {intelligence: 5, dexterity: 2}, "Leadership": {charisma: 5, intelligence: 3}, "Social Skills": {charisma: 5}, "Video Editing": {intelligence: 3, dexterity: 2}, "Combat Training": {strength: 5, dexterity: 3}, "Gaming": {dexterity: 3, intelligence: 2}, "Basketball": {strength: 3, dexterity: 4}, "Business": {intelligence: 5, charisma: 3}, "Mechanical Repair": {strength: 3, intelligence: 3}, "Navigation": {intelligence: 4}, "Magic Theory": {intelligence: 7}, "Meditation": {intelligence: 4} }>> /* Function to calculate total stat bonuses from traits and skills */ <<set setup.calculateStatBonuses = function() { var v = State.variables; var bonuses = { charisma: 0, dexterity: 0, strength: 0, intelligence: 0 }; // Add bonuses from physical traits if (v.physicalTraits) { v.physicalTraits.forEach(function(trait) { var traitBonus = setup.traitBonuses[trait]; if (traitBonus) { for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } }); } // Add bonuses from mental traits if (v.mentalTraits) { v.mentalTraits.forEach(function(trait) { var traitBonus = setup.traitBonuses[trait]; if (traitBonus) { for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } }); } // Add bonuses from character creation trait if (v.characterCreationTrait && setup.traitBonuses[v.characterCreationTrait]) { var traitBonus = setup.traitBonuses[v.characterCreationTrait]; for (var stat in traitBonus) { bonuses[stat] += traitBonus[stat]; } } // Add bonuses from skills if (v.skills) { v.skills.forEach(function(skill) { var skillBonus = setup.skillBonuses[skill]; if (skillBonus) { for (var stat in skillBonus) { bonuses[stat] += skillBonus[stat]; } } }); } return bonuses; }>> /* Function to get total stat (base + bonuses) */ <<set setup.getTotalStat = function(statName) { var v = State.variables; var bonuses = setup.calculateStatBonuses(); var total = v.stats[statName] + bonuses[statName]; // Cap at max if (total > v.statMaxCaps[statName]) { total = v.statMaxCaps[statName]; } return total; }>> /* Function to sync current traits into discoveredTraits for the encyclopedia */ <<set setup.syncDiscoveredTraits = function() { var v = State.variables; if (!v.discoveredTraits) { v.discoveredTraits = {physical: [], mental: [], skills: [], voice: [], jobs: [], body: []}; } if (!v.discoveredTraits.jobs) { v.discoveredTraits.jobs = []; } if (!v.discoveredTraits.body) { v.discoveredTraits.body = []; } var excluded = ["Criminal Deluxe", "Long Hair", "Short Hair", "Quill"]; var voiceList = setup.availableVoiceTraits ? Object.keys(setup.availableVoiceTraits) : []; voiceList = voiceList.concat(["Flat Uninterested Voice", "Slurred Speech", "Whiny Voice", "Gaelic Accent"]); if (v.physicalTraits) { v.physicalTraits.forEach(function(t) { if (excluded.indexOf(t) === -1 && v.discoveredTraits.physical.indexOf(t) === -1) { v.discoveredTraits.physical.push(t); } }); } if (v.mentalTraits) { v.mentalTraits.forEach(function(t) { if (excluded.indexOf(t) === -1) { if (voiceList.indexOf(t) !== -1) { if (v.discoveredTraits.voice.indexOf(t) === -1) { v.discoveredTraits.voice.push(t); } } else { if (v.discoveredTraits.mental.indexOf(t) === -1) { v.discoveredTraits.mental.push(t); } } } }); } if (v.skills) { v.skills.forEach(function(t) { if (excluded.indexOf(t) === -1 && v.discoveredTraits.skills.indexOf(t) === -1) { v.discoveredTraits.skills.push(t); } }); } if (v.jobs) { v.jobs.forEach(function(t) { if (v.discoveredTraits.jobs.indexOf(t) === -1) { v.discoveredTraits.jobs.push(t); } }); } if (v.bodyParts) { var bpKeys = ["gender", "chest", "butt", "genitals"]; var bpLabels = {gender: "Gender", chest: "Chest", butt: "Butt", genitals: "Genitals"}; bpKeys.forEach(function(key) { if (v.bodyParts[key]) { var already = v.discoveredTraits.body.some(function(b) { return b.label === bpLabels[key] && b.value === v.bodyParts[key]; }); if (!already) { v.discoveredTraits.body.push({label: bpLabels[key], value: v.bodyParts[key]}); } } }); } /* Check for trait discovery achievements */ var totalDiscovered = v.discoveredTraits.physical.length + v.discoveredTraits.mental.length + v.discoveredTraits.skills.length + v.discoveredTraits.voice.length + v.discoveredTraits.jobs.length + v.discoveredTraits.body.length; if (totalDiscovered >= 5 && setup.achievements) { setup.achievements.unlock("trait_novice"); } if (totalDiscovered >= 30 && setup.achievements) { setup.achievements.unlock("trait_collector"); } if (totalDiscovered >= 75 && setup.achievements) { setup.achievements.unlock("trait_connoisseur"); } if (totalDiscovered >= 180 && setup.achievements) { setup.achievements.unlock("trait_expert"); } if (totalDiscovered >= 301 && setup.achievements) { setup.achievements.unlock("trait_encyclopedist"); } }>> /* Function to get trait description for encyclopedia */ <<set setup.getTraitDescription = function(traitName) { if (setup.availablePhysicalTraits && setup.availablePhysicalTraits[traitName]) return setup.availablePhysicalTraits[traitName]; if (setup.availableMentalTraits && setup.availableMentalTraits[traitName]) return setup.availableMentalTraits[traitName]; if (setup.availableVoiceTraits && setup.availableVoiceTraits[traitName]) return setup.availableVoiceTraits[traitName]; if (setup.availableSkills && setup.availableSkills[traitName]) return setup.availableSkills[traitName]; if (setup.stereotypeTraits && setup.stereotypeTraits[traitName]) return setup.stereotypeTraits[traitName]; return ""; }>> /* ---------------------------------- */ /* --- TRAIT COMBINATION FUNCTIONS --- */ /* ---------------------------------- */ /* Check if a trait combination is valid - supports 2 or 3+ traits */ /* Returns combo data or null. Traits are sorted alphabetically for key lookup */ <<set setup.isValidTraitCombination = function(traits) { /* Convert to array if 2 args passed */ if (!Array.isArray(traits)) { traits = Array.prototype.slice.call(arguments); } /* Sort alphabetically to create consistent key */ var sortedTraits = traits.slice().sort(); var key = sortedTraits.join("|"); return setup.traitCombinations[key] || null; }>> /* Check if a combination was already tried and failed (blacklisted) */ /* Supports arrays of any length */ <<set setup.hasFailedCombination = function(traits) { if (!Array.isArray(traits)) { traits = Array.prototype.slice.call(arguments); } var v = State.variables; if (!v.failedTraitCombinations) return false; var sortedKey = traits.slice().sort().join("|"); return v.failedTraitCombinations.indexOf(sortedKey) !== -1; }>> /* Add a combination to the failed/blacklist array */ <<set setup.addFailedCombination = function(traits) { if (!Array.isArray(traits)) { traits = Array.prototype.slice.call(arguments); } var v = State.variables; if (!v.failedTraitCombinations) v.failedTraitCombinations = []; var sortedKey = traits.slice().sort().join("|"); if (v.failedTraitCombinations.indexOf(sortedKey) === -1) { v.failedTraitCombinations.push(sortedKey); } }>> /* Check if a trait appears in any recipe */ <<set setup.isTraitInAnyRecipe = function(traitName) { for (var key in setup.traitCombinations) { var traits = key.split("|"); if (traits.indexOf(traitName) !== -1) { return true; } } return false; }>> /* Get all recipes that contain a specific trait */ <<set setup.getRecipesContainingTrait = function(traitName) { var recipes = []; for (var key in setup.traitCombinations) { var traits = key.split("|"); if (traits.indexOf(traitName) !== -1) { recipes.push({ key: key, traits: traits, result: setup.traitCombinations[key].result }); } } return recipes; }>> /* Get trait recipe status for coloring - returns: 'none', 'inRecipe', 'partialMatch', 'twoMatch', 'complete' */ <<set setup.getTraitRecipeStatus = function(traitName, selectedTraits) { selectedTraits = selectedTraits || []; /* Check if this trait is in any recipe at all */ var inAnyRecipe = setup.isTraitInAnyRecipe(traitName); if (!inAnyRecipe) return 'none'; /* If no traits selected yet, just show it's in a recipe (orange) */ if (selectedTraits.length === 0) return 'inRecipe'; /* Get all recipes containing this trait */ var recipesWithTrait = setup.getRecipesContainingTrait(traitName); /* Check each recipe to see how many selected traits match */ var bestMatch = 0; for (var i = 0; i < recipesWithTrait.length; i++) { var recipe = recipesWithTrait[i]; var matchCount = 0; for (var j = 0; j < selectedTraits.length; j++) { if (recipe.traits.indexOf(selectedTraits[j]) !== -1) { matchCount++; } } /* Also count this trait itself if it would complete a match */ if (recipe.traits.indexOf(traitName) !== -1) { matchCount++; } if (matchCount > bestMatch) { bestMatch = matchCount; } } if (bestMatch >= 3) return 'complete'; if (bestMatch === 2) return 'twoMatch'; if (bestMatch === 1) return 'partialMatch'; return 'inRecipe'; }>> /* Check if selected traits form a complete recipe */ <<set setup.isCompleteRecipe = function(selectedTraits) { if (!selectedTraits || selectedTraits.length !== 3) return null; var sortedTraits = selectedTraits.slice().sort(); var key = sortedTraits.join("|"); return setup.traitCombinations[key] || null; }>> /* Get discovered recipes (successful combinations) */ <<set setup.getDiscoveredRecipes = function() { var v = State.variables; if (!v.discoveredRecipes) v.discoveredRecipes = []; return v.discoveredRecipes; }>> /* Add a recipe to discovered list */ <<set setup.addDiscoveredRecipe = function(recipeKey, resultName) { var v = State.variables; if (!v.discoveredRecipes) v.discoveredRecipes = []; /* Check if already discovered */ for (var i = 0; i < v.discoveredRecipes.length; i++) { if (v.discoveredRecipes[i].key === recipeKey) return; } v.discoveredRecipes.push({ key: recipeKey, traits: recipeKey.split("|"), result: resultName }); }>> /* Main trait combination attempt function - supports 2 or 3+ traits */ <<set setup.attemptTraitCombination = function(traits) { if (!Array.isArray(traits)) { traits = Array.prototype.slice.call(arguments); } var result = { success: false, message: "", newTrait: null, consumed: false, isFullTransformation: false }; /* Check if already tried this invalid combo (don't consume use) */ if (setup.hasFailedCombination(traits)) { result.message = "You've already determined these traits cannot be combined."; result.consumed = false; return result; } /* This attempt will consume a daily trade */ result.consumed = true; /* Get valid combination */ var combo = setup.isValidTraitCombination(traits); if (!combo) { /* Invalid combination - auto fail, add to blacklist */ setup.addFailedCombination(traits); result.message = "The experiment failed! These traits are fundamentally incompatible. This combination has been recorded in your research notes."; return result; } /* Check for special requirements */ if (combo.requiresTier4Rod) { var v = State.variables; var hasTier4Rod = (v.fishingPole && v.fishingPole >= 4) || (v.hasSunfishRod === true); if (!hasTier4Rod) { result.message = "You sense these traits could combine into something powerful, but you don't meet the requirements yet... maybe try more fishing?"; result.consumed = false; return result; } } /* Valid combination - 100% success */ result.success = true; result.newTrait = combo.result; result.isFullTransformation = combo.isFullTransformation || false; result.message = "Success! The traits have been combined."; /* Add to discovered recipes */ var sortedTraits = traits.slice().sort(); var recipeKey = sortedTraits.join("|"); setup.addDiscoveredRecipe(recipeKey, combo.result); return result; }>> /* Apply a full transformation - grants traits and handles appearance override */ <<set setup.applyFullTransformation = function(transformationName) { var v = State.variables; var transform = setup.fullTransformations[transformationName]; if (!transform) return false; /* Initialize tracking if needed */ if (!v.transformationGrantedTraits) v.transformationGrantedTraits = {}; if (!v.transformationGrantedTraits[transformationName]) { v.transformationGrantedTraits[transformationName] = { physical: [], mental: [] }; } /* Remove ALL previous laboratory transformation traits before applying new one */ var allLabTransforms = [ "Succubus", "Imp", "Hellhound", // "Incubus", - temporarily disabled "Werecat", "Werewolf", "Werebunny", "Werefox", "Weresheep", "Hucow", "Trophy Wife", "Gym Bunny", "E-Girl", "Punk", "Gyaru", "Siren", "Living Doll", "Dominatrix", "Slut", "Himbo" ]; allLabTransforms.forEach(function(oldTransform) { if (oldTransform !== transformationName) { if (v.physicalTraits) { var pIdx = v.physicalTraits.indexOf(oldTransform); if (pIdx !== -1) v.physicalTraits.splice(pIdx, 1); } if (v.mentalTraits) { var mIdx = v.mentalTraits.indexOf(oldTransform); if (mIdx !== -1) v.mentalTraits.splice(mIdx, 1); } } }); /* Check gender lock - change gender if needed */ if (transform.genderLock) { var currentGender = v.bodyParts && v.bodyParts.gender ? v.bodyParts.gender.toLowerCase() : ""; if (transform.genderLock === "female" && currentGender !== "female") { if (!v.bodyParts) v.bodyParts = {}; v.bodyParts.gender = "female"; v.bodyParts.genitals = "vagina"; /* Update appearance for feminine body */ if (!v.appearance) v.appearance = {}; } if (transform.genderLock === "male" && currentGender !== "male") { if (!v.bodyParts) v.bodyParts = {}; v.bodyParts.gender = "male"; v.bodyParts.genitals = "penis"; /* Update appearance for masculine body */ if (!v.appearance) v.appearance = {}; } } /* Apply body part changes from transformation */ if (!v.bodyParts) v.bodyParts = {}; if (transform.setsChest) { v.bodyParts.chest = transform.setsChest; } if (transform.setsButt) { v.bodyParts.butt = transform.setsButt; } if (transform.setsGenitals) { v.bodyParts.genitals = transform.setsGenitals; } /* Remove conflicting traits */ if (transform.removesOnGain && transform.removesOnGain.length > 0) { transform.removesOnGain.forEach(function(trait) { if (v.physicalTraits) { var pIdx = v.physicalTraits.indexOf(trait); if (pIdx !== -1) v.physicalTraits.splice(pIdx, 1); } if (v.mentalTraits) { var mIdx = v.mentalTraits.indexOf(trait); if (mIdx !== -1) v.mentalTraits.splice(mIdx, 1); } }); } /* Grant physical traits */ if (transform.grantsPhysical && transform.grantsPhysical.length > 0) { transform.grantsPhysical.forEach(function(trait) { if (!v.physicalTraits) v.physicalTraits = []; if (v.physicalTraits.indexOf(trait) === -1) { v.physicalTraits.push(trait); v.transformationGrantedTraits[transformationName].physical.push(trait); } }); } /* Grant mental traits */ if (transform.grantsMental && transform.grantsMental.length > 0) { transform.grantsMental.forEach(function(trait) { if (!v.mentalTraits) v.mentalTraits = []; if (v.mentalTraits.indexOf(trait) === -1) { v.mentalTraits.push(trait); v.transformationGrantedTraits[transformationName].mental.push(trait); } }); } /* Add the transformation trait itself */ if (transform.category === "physical") { if (!v.physicalTraits) v.physicalTraits = []; if (v.physicalTraits.indexOf(transformationName) === -1) { v.physicalTraits.push(transformationName); } } else { if (!v.mentalTraits) v.mentalTraits = []; if (v.mentalTraits.indexOf(transformationName) === -1) { v.mentalTraits.push(transformationName); } } /* Track active transformation for appearance override */ v.activeTransformation = transformationName; return true; }>> /* Revert a full transformation - removes granted traits */ <<set setup.revertFullTransformation = function(transformationName) { var v = State.variables; var transform = setup.fullTransformations[transformationName]; if (!transform) return false; /* Remove the transformation trait itself */ if (transform.category === "physical" && v.physicalTraits) { var pIdx = v.physicalTraits.indexOf(transformationName); if (pIdx !== -1) v.physicalTraits.splice(pIdx, 1); } else if (v.mentalTraits) { var mIdx = v.mentalTraits.indexOf(transformationName); if (mIdx !== -1) v.mentalTraits.splice(mIdx, 1); } /* Remove traits that were granted by this transformation */ if (v.transformationGrantedTraits && v.transformationGrantedTraits[transformationName]) { var granted = v.transformationGrantedTraits[transformationName]; /* Remove granted physical traits */ if (granted.physical && v.physicalTraits) { granted.physical.forEach(function(trait) { var idx = v.physicalTraits.indexOf(trait); if (idx !== -1) v.physicalTraits.splice(idx, 1); }); } /* Remove granted mental traits */ if (granted.mental && v.mentalTraits) { granted.mental.forEach(function(trait) { var idx = v.mentalTraits.indexOf(trait); if (idx !== -1) v.mentalTraits.splice(idx, 1); }); } /* Clear the tracking */ delete v.transformationGrantedTraits[transformationName]; } /* Clear active transformation if this was it */ if (v.activeTransformation === transformationName) { v.activeTransformation = null; } return true; }>> /* Check if player has an active full transformation */ <<set setup.hasActiveTransformation = function() { var v = State.variables; return v.activeTransformation && setup.fullTransformations[v.activeTransformation]; }>> /* Get current transformation data */ <<set setup.getActiveTransformation = function() { var v = State.variables; if (!v.activeTransformation) return null; return setup.fullTransformations[v.activeTransformation] || null; }>> /* Get all traits that are blocked from being acquired due to current transformation */ <<set setup.getTransformationBlockedTraits = function() { var v = State.variables; var blocked = { physical: [], mental: [] }; if (!v.activeTransformation) return blocked; var transform = setup.fullTransformations[v.activeTransformation]; if (!transform) return blocked; /* Block all traits granted by the current transformation */ if (transform.grantsPhysical) { blocked.physical = blocked.physical.concat(transform.grantsPhysical); } if (transform.grantsMental) { blocked.mental = blocked.mental.concat(transform.grantsMental); } /* Also block traits that are removed/blocked by the transformation */ if (transform.removesOnGain) { blocked.mental = blocked.mental.concat(transform.removesOnGain); } if (transform.removesPhysicalOnGain) { blocked.physical = blocked.physical.concat(transform.removesPhysicalOnGain); } if (transform.blocksTraits) { blocked.mental = blocked.mental.concat(transform.blocksTraits); } if (transform.blocksPhysical) { blocked.physical = blocked.physical.concat(transform.blocksPhysical); } return blocked; }>> /* Check if a trait is blocked due to current transformation */ <<set setup.isTraitBlockedByTransformation = function(traitName, traitType) { var blocked = setup.getTransformationBlockedTraits(); if (traitType === "physical") { return blocked.physical.includes(traitName); } else if (traitType === "mental") { return blocked.mental.includes(traitName); } return false; }>> /* Check if a trait is a transformation trait (main trait that defines the transformation) */ <<set setup.isTransformationTrait = function(traitName) { return setup.fullTransformations && setup.fullTransformations[traitName] !== undefined; }>> /* Apply transformation silently (no cutscene) - used when receiving trait via trade */ <<set setup.applyTransformationSilent = function(transformationName) { var v = State.variables; var transform = setup.fullTransformations[transformationName]; if (!transform) return false; /* If already have an active transformation, revert it first */ if (v.activeTransformation && v.activeTransformation !== transformationName) { setup.revertFullTransformation(v.activeTransformation); } /* Initialize tracking object if needed */ if (!v.transformationGrantedTraits) { v.transformationGrantedTraits = {}; } v.transformationGrantedTraits[transformationName] = { physical: [], mental: [] }; /* The main trait is already added via trade, so don't add it again */ /* But we need to set up the body changes and other effects */ /* Apply body changes if transformation has them */ if (transform.setsChest && v.bodyParts) { v.bodyParts.chest = transform.setsChest; } if (transform.setsButt && v.bodyParts) { v.bodyParts.butt = transform.setsButt; } if (transform.setsGenitals && v.bodyParts) { v.bodyParts.genitals = transform.setsGenitals; } if (transform.genderLock && v.bodyParts) { v.bodyParts.gender = transform.genderLock; } /* Remove blocked traits */ if (transform.removesOnGain && v.mentalTraits) { transform.removesOnGain.forEach(function(trait) { var idx = v.mentalTraits.indexOf(trait); if (idx !== -1) v.mentalTraits.splice(idx, 1); }); } if (transform.removesPhysicalOnGain && v.physicalTraits) { transform.removesPhysicalOnGain.forEach(function(trait) { var idx = v.physicalTraits.indexOf(trait); if (idx !== -1) v.physicalTraits.splice(idx, 1); }); } if (transform.removesSkillsOnGain && v.skills) { transform.removesSkillsOnGain.forEach(function(skill) { var idx = v.skills.indexOf(skill); if (idx !== -1) v.skills.splice(idx, 1); }); } /* Track active transformation */ v.activeTransformation = transformationName; return true; }>> /* Helper function to check if a skill is blocked by current transformation */ <<set setup.isSkillBlocked = function(skillName) { var v = State.variables; if (!v.physicalTraits) return false; /* Check all transformations for blocksSkills */ for (var transName in setup.fullTransformations) { var transform = setup.fullTransformations[transName]; if (transform.blocksSkills && v.physicalTraits.includes(transName)) { if (transform.blocksSkills.includes(skillName)) { return true; } } } return false; }>> /* Safe function to add a skill (respects transformation blocks) */ <<set setup.addSkill = function(skillName) { var v = State.variables; if (!v.skills) v.skills = []; /* Check if already has skill */ if (v.skills.includes(skillName)) return false; /* Check if skill is blocked by transformation */ if (setup.isSkillBlocked(skillName)) return false; v.skills.push(skillName); return true; }>> /* Function to get trait effects across jobs, theft, and trading for the encyclopedia */ <<set setup.getTraitJobEffects = function(traitName) { var effects = []; var isSunfish = (traitName === "Sunfish"); var s = isSunfish; /* Check hourly job bonuses */ if (setup.jobWorkConfig) { var jobNames = Object.keys(setup.jobWorkConfig); for (var i = 0; i < jobNames.length; i++) { var job = jobNames[i]; var config = setup.jobWorkConfig[job]; if (!config || !config.bonuses) continue; if (config.bonuses.big && config.bonuses.big.indexOf(traitName) !== -1) { effects.push(s ? job + ": ???" : job + ": +15% wage"); } else if (config.bonuses.medium && config.bonuses.medium.indexOf(traitName) !== -1) { effects.push(s ? job + ": ???" : job + ": +5% wage"); } else if (config.bonuses.small && config.bonuses.small.indexOf(traitName) !== -1) { effects.push(s ? job + ": ???" : job + ": +2% wage"); } if (config.negativeRemovable && config.negativeRemovable.indexOf(traitName) !== -1) { effects.push(s ? job + ": ???" : job + ": -10% wage"); } if (config.negativePermanent && config.negativePermanent.indexOf(traitName) !== -1) { effects.push(s ? job + ": ???" : job + ": -5% wage"); } } } /* Receptionist/Secretary job bonuses */ var recPhonePlus = {"Polite": 3, "Friendly": 3, "Patient": 3, "Calm": 2, "Customer Service": 5, "Clear Enunciation": 4, "Articulate Speech": 4, "Smooth Voice": 3, "Friendly Tone": 3, "Warm Tone": 3}; var recPhoneMinus = {"Rude": 5, "Impatient": 4, "Short Tempered": 4, "Mumbly Voice": 5, "Stuttering Speech": 5, "Monotone": 3, "Flat Voice": 3}; var recWalkPlus = {"Polite": 3, "Friendly": 3, "Patient": 4, "Empathetic": 4, "Diplomatic": 3, "Customer Service": 5}; var recWalkMinus = {"Rude": 6, "Bitchy": 5, "Cold": 4, "Insensitive": 4, "Short Tempered": 4}; var recFilePlus = {"Organized": 6, "Detail-Oriented": 4, "Efficient": 3, "Focused": 3, "Punctual": 2}; var recFileMinus = {"Disorganized": 6, "Forgetful": 4, "Lazy": 4, "Slow": 3, "Clumsy": 3}; var recBadgePlus = {"Organized": 4, "Detail-Oriented": 5, "Perceptive": 4, "Focused": 3}; var recBadgeMinus = {"Disorganized": 5, "Forgetful": 5, "Reckless": 4, "Careless": 4}; var recEffects = []; if (recPhonePlus[traitName]) recEffects.push("Phone Calls: +" + recPhonePlus[traitName] + "%"); if (recPhoneMinus[traitName]) recEffects.push("Phone Calls: -" + recPhoneMinus[traitName] + "%"); if (recWalkPlus[traitName]) recEffects.push("Walk-ins: +" + recWalkPlus[traitName] + "%"); if (recWalkMinus[traitName]) recEffects.push("Walk-ins: -" + recWalkMinus[traitName] + "%"); if (recFilePlus[traitName]) recEffects.push("Filing: +" + recFilePlus[traitName] + "%"); if (recFileMinus[traitName]) recEffects.push("Filing: -" + recFileMinus[traitName] + "%"); if (recBadgePlus[traitName]) recEffects.push("Badges: +" + recBadgePlus[traitName] + "%"); if (recBadgeMinus[traitName]) recEffects.push("Badges: -" + recBadgeMinus[traitName] + "%"); if (traitName === "Organized") recEffects.push("Missing: -5% filing penalty"); if (traitName === "Customer Service") recEffects.push("Missing: -5% overall penalty"); if (recEffects.length > 0) { for (var r = 0; r < recEffects.length; r++) { effects.push(s ? "Receptionist: ???" : "Receptionist: " + recEffects[r]); } } /* Janitor job bonuses */ var janitorEffects = []; if (traitName === "Punctual") janitorEffects.push("Missing: -5% penalty"); if (traitName === "Cleaning") janitorEffects.push("Missing: -5% penalty"); if (traitName === "Slow Learner") janitorEffects.push("-5% penalty"); if (traitName === "Forgetful") janitorEffects.push("-5% penalty"); if (janitorEffects.length > 0) { for (var j = 0; j < janitorEffects.length; j++) { effects.push(s ? "Janitor: ???" : "Janitor: " + janitorEffects[j]); } } /* Stripping job bonuses */ var stripEffects = []; if (traitName === "Attractive") { stripEffects.push("Topless Tease: +20% tips"); stripEffects.push("Full Strip: +30% tips"); stripEffects.push("Freestyle: +25% tips"); } if (traitName === "Alluring") { stripEffects.push("Topless Tease: +15% tips"); stripEffects.push("Full Strip: +25% tips"); stripEffects.push("Freestyle: +30% tips"); } if (traitName === "Seductive") { stripEffects.push("Full Strip: +20% tips"); stripEffects.push("Freestyle: +25% tips"); } if (traitName === "Athletic") stripEffects.push("Pole Dance: +30% tips"); if (traitName === "Graceful") stripEffects.push("Pole Dance: +25% tips"); if (traitName === "Flexible") stripEffects.push("Pole Dance: +20% tips"); if (stripEffects.length > 0) { for (var st = 0; st < stripEffects.length; st++) { effects.push(s ? "Stripping: ???" : "Stripping: " + stripEffects[st]); } } /* Scanner theft bonuses */ var scannerEffects = []; if (traitName === "Lock Picking") scannerEffects.push("+10% success"); if (traitName === "Stealth") scannerEffects.push("+10% success"); if (traitName === "Sly") scannerEffects.push("+5% success"); if (traitName === "Quick Reflexes") scannerEffects.push("+8% success"); if (scannerEffects.length > 0) { for (var sc = 0; sc < scannerEffects.length; sc++) { effects.push(s ? "Scanner Theft: ???" : "Scanner Theft: " + scannerEffects[sc]); } } /* Check trait theft bonuses */ if (setup.theftBonusTraits && setup.theftBonusTraits[traitName] !== undefined) { var val = setup.theftBonusTraits[traitName]; effects.push(s ? "Trait Theft: ???" : "Trait Theft: +" + (val * 2) + "% success"); } if (setup.theftBonusSkills && setup.theftBonusSkills[traitName] !== undefined) { var val2 = setup.theftBonusSkills[traitName]; effects.push(s ? "Trait Theft: ???" : "Trait Theft: +" + (val2 * 2) + "% success"); } if (setup.moralTraitsBlockingTheft && setup.moralTraitsBlockingTheft.indexOf(traitName) !== -1) { effects.push(s ? "Trait Theft: ???" : "Trait Theft: Blocks stealing"); } if (setup.moralTraitsPenalty && setup.moralTraitsPenalty.indexOf(traitName) !== -1) { effects.push(s ? "Trait Theft: ???" : "Trait Theft: -6% success"); } /* Special theft one-offs */ if (!s) { if (traitName === "Clumsy") effects.push("Trait Theft: -7.5% success"); if (traitName === "Lucky") { effects.push("Trait Theft: +20% success"); effects.push("Scanner Theft: +10% success"); } if (traitName === "Unlucky") { effects.push("Trait Theft: -20% success"); effects.push("Scanner Theft: -10% success"); } } else { if (traitName === "Clumsy" || traitName === "Lucky" || traitName === "Unlucky") { effects.push("Trait Theft: ???"); effects.push("Scanner Theft: ???"); } } /* Trading success bonuses */ if (traitName === "Trading") effects.push(s ? "Trading: ???" : "Trading: +2 success chance"); if (traitName === "Persuasion") effects.push(s ? "Trading: ???" : "Trading: +3 success chance"); var beneficialTrade = ["Honest", "Confident", "Friendly", "Trusting", "Patient", "Intelligent", "Analytical", "Chill", "Nonchalant", "Charming", "Diplomatic", "Polite", "Reassuring", "Efficient", "Warm", "Lucky", "Hellhound", "Werecat", "Weresheep", "Himbo", "Werefox", "Trophy Wife", "Werebunny", "Punk", "Gym Bunny"]; var detrimentalTrade = ["Aggressive", "Awkward", "Blunt", "Corrupt", "Moody", "Pessimistic", "Sensitive", "Shy", "Stubborn", "Arrogant", "Cold", "Deceitful", "Foolish", "Forgetful", "Impatient", "Insecure", "Reckless", "Rude", "Selfish", "Short Tempered", "Unlucky", "Unreliable", "Bitchy"]; if (beneficialTrade.indexOf(traitName) !== -1) effects.push(s ? "Trading: ???" : "Trading: +2 success chance"); if (detrimentalTrade.indexOf(traitName) !== -1) effects.push(s ? "Trading: ???" : "Trading: -3 success chance"); if (traitName === "Sunfish") effects.push(s ? "Trading: ???" : "Trading: +10 success chance"); /* Streaming bonuses - check all 5 categories dynamically */ var streamCats = { "ASMR": setup.asmrTraitEffects, "Styling/Makeup": setup.stylingMakeupTraitEffects, "Music": setup.musicTraitEffects, "Cooking": setup.cookingTraitEffects, "Gaming": setup.gamingTraitEffects }; var streamCatNames = Object.keys(streamCats); for (var si = 0; si < streamCatNames.length; si++) { var catName = streamCatNames[si]; var catEffects = streamCats[catName]; if (catEffects && catEffects.positive && catEffects.positive[traitName]) { var pe = catEffects.positive[traitName]; effects.push(s ? "Stream " + catName + ": ???" : "Stream " + catName + ": +" + pe.viewerBonus + "% viewers, +" + pe.engagementBonus + "% engagement"); } if (catEffects && catEffects.negative && catEffects.negative[traitName]) { var ne = catEffects.negative[traitName]; effects.push(s ? "Stream " + catName + ": ???" : "Stream " + catName + ": -" + ne.viewerPenalty + "% viewers, -" + ne.engagementPenalty + "% engagement"); } } /* PrawnHub bonuses - each positive trait gives +5 to action roll */ var prawnSet1 = ["Sexually Skilled", "Alluring", "Attractive", "Seductive", "High Stamina"]; var prawnSet2 = ["Curvy", "Soft", "Smooth Skin", "Graceful", "Voluptuous"]; if (prawnSet1.indexOf(traitName) !== -1) { effects.push(s ? "PrawnHub: ???" : "PrawnHub: +5 action bonus (most scenes)"); } if (prawnSet2.indexOf(traitName) !== -1) { effects.push(s ? "PrawnHub: ???" : "PrawnHub: +5 action bonus (body scenes)"); } /* Brothel bonus traits - each gives +$15 per session */ var brothelBonusTraits = ["Dominant", "Submissive", "Sly", "Hardworking", "Ambitious", "Bitchy", "Arrogant", "Dancing", "High Heels Proficient", "Sexually Skilled", "Serving", "Persuasion", "Oral Expert", "Anal Expert", "Rough Sex Enthusiast", "Sensual Lover", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Roleplay Expert", "Dirty Talker", "Tantric Master", "Exhibitionist", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]; if (brothelBonusTraits.indexOf(traitName) !== -1) { effects.push(s ? "Brothel: ???" : "Brothel: +$15 per session"); } /* Patrol Officer requirement */ if (traitName === "Driving") effects.push(s ? "Patrol Officer: ???" : "Patrol Officer: Required to patrol"); /* Brothel requirement */ if (traitName === "Sexually Skilled") effects.push(s ? "Brothel: ???" : "Brothel: Required to work"); /* Swimming / Underwater Cave discovery */ if (traitName === "Swimmer" || traitName === "Swimming") { effects.push(s ? "Exploration: ???" : "Exploration: 5% chance to discover Underwater Cave while swimming"); } if (traitName === "Sunfish") { effects.push(s ? "Exploration: ???" : "Exploration: 50% chance to discover Underwater Cave while swimming"); } /* Gambling effects */ if (traitName === "Lucky") { effects.push(s ? "Slots: ???" : "Slots: -10% lose chance, +10% $100 win chance"); effects.push(s ? "Roulette: ???" : "Roulette: +10% forced win chance"); } if (traitName === "Unlucky") { effects.push(s ? "Slots: ???" : "Slots: Much worse odds across all tiers"); effects.push(s ? "Roulette: ???" : "Roulette: 10% forced loss chance"); } if (traitName === "Gambling Addiction") { effects.push(s ? "Casino: ???" : "Casino: 50% chance of forced gambling on entry"); } return effects; }>> /* Function to apply trait bonus */ <<set setup.applyTraitBonus = function(traitName, character) { var bonuses = setup.traitBonuses[traitName] || setup.skillBonuses[traitName]; if (!bonuses) return; for (var stat in bonuses) { if (character.stats && character.stats[stat] !== undefined) { character.stats[stat] += bonuses[stat]; // Also increase max cap if it exists if (character.statMaxCaps && character.statMaxCaps[stat] !== undefined) { character.statMaxCaps[stat] += bonuses[stat]; } } } }>> /* Function to remove trait bonus */ <<set setup.removeTraitBonus = function(traitName, character) { var bonuses = setup.traitBonuses[traitName] || setup.skillBonuses[traitName]; if (!bonuses) return; for (var stat in bonuses) { if (character.stats && character.stats[stat] !== undefined) { character.stats[stat] -= bonuses[stat]; // Also decrease max cap if it exists if (character.statMaxCaps && character.statMaxCaps[stat] !== undefined) { character.statMaxCaps[stat] -= bonuses[stat]; } } } }>>
/* ---------------------------------- */ /* --- MUTUALLY EXCLUSIVE TRAITS --- */ /* ---------------------------------- */ <<set setup.exclusiveTraitGroups = { // Height traits (Imp includes Short, Succubus includes Imp) "height": ["Tall", "Short", "Imp", "Succubus"], // Hair length traits "hairLength": ["Short Hair", "Long Hair"], // Body type traits with chest/butt requirements (Succubus includes Curvy, Hucow includes Voluptuous) "bodyType": ["Curvy", "Voluptuous", "Petite", "Slim", "Muscular", "Stocky", "Lean", "Succubus", "Hucow"], // Voice traits - only one voice trait allowed (format: [Adjective] Voice) "voice": ["Smooth Voice", "Soft Voice", "Warm Voice", "Gentle Voice", "Deep Voice", "Raspy Voice", "Gravelly Voice", "Breathy Voice", "High-Pitched Voice", "Sharp Voice", "Clear Voice", "Monotone Voice", "Flat Voice", "Deadpan Voice", "Energetic Voice", "Calm Voice", "Sultry Voice", "Silky Voice", "Melodic Voice", "Husky Voice", "Nasal Voice", "Whispery Voice", "Booming Voice", "Squeaky Voice", "Gruff Voice", "Shrill Voice", "Velvety Voice", "Croaky Voice", "Rich Voice"], // Accent traits - optional (format: [Regional] Accent) "accent": ["Southern Accent", "British Accent", "French Accent", "Russian Accent", "German Accent", "Italian Accent", "Spanish Accent", "Irish Accent", "Scottish Accent", "Australian Accent", "Japanese Accent", "Indian Accent", "New York Accent", "Texan Accent", "Caribbean Accent", "Eastern European Accent", "Scandinavian Accent", "Middle Eastern Accent", "Brazilian Accent", "Chinese Accent"], // Sexual orientation traits - only one allowed "orientation": ["Straight", "Gay", "Lesbian", "Bisexual", "Pansexual", "Asexual", "Demisexual", "Questioning", "Fluid"], // Personality opposites "dominance": ["Dominant", "Submissive"], "kindness": ["Bitchy", "Kind"], "confidence": ["Confident", "Shy"], "energy": ["Energetic", "Lazy"], "social": ["Introverted", "Extroverted"], "optimism": ["Optimistic", "Pessimistic"], "morality": ["Cruel", "Kind"], "arrogance": ["Arrogant", "Humble"], "paranoia": ["Paranoid", "Trusting"], "bravery": ["Brave", "Cowardly"], "patience": ["Patient", "Impatient"], "wisdom": ["Wise", "Foolish"], "work": ["Hardworking", "Lazy"], "aggression": ["Aggressive", "Passive"], "attraction": ["Attractive", "Ugly", "Imp", "Succubus"], "organization": ["Organized", "Disorganized"], "reliability": ["Reliable", "Unreliable"], "temperament": ["Calm", "Short Tempered", "Moody"], "sociability": ["Talkative", "Quiet"], "manners": ["Polite", "Rude"], "warmth": ["Warm", "Cold"], "sensitivity": ["Sensitive", "Insensitive"], "charm": ["Charming", "Awkward"], "honesty": ["Honest", "Deceitful"], "selflessness": ["Considerate", "Selfish"], "speed": ["Fast", "Slow", "Quick"], "learning": ["Quick Learner", "Slow Learner"], "luck": ["Lucky", "Unlucky"], "impulsiveness": ["Disciplined", "Impulsive", "Reckless"], "stability": ["Steadfast", "Erratic", "Unpredictable"], "security": ["Confident", "Insecure"], "stereotypes": ["Nerd", "Geek", "Jock", "Prep", "Tomboy", "Femboy", "Diva", "Goth"], // Age appearance traits (physical) - cannot have both "ageAppearance": ["Youthful", "Mature"], // Gender-mismatch traits (auto-assigned, untradable) "genderMismatch": ["Cuntboy", "Futanari"], // Laboratory Transformation Traits - Base animal types (mutually exclusive) "animalBase": ["Catperson", "Wolfperson"], // Laboratory Transformation Traits - Were-Creature forms (mutually exclusive - only one full form) "wereCreature": ["Werecat", "Werewolf", "Werebunny", "Werefox", "Weresheep"], // Laboratory Transformation Traits - Advanced Neko/Inu forms "advancedAnimal": ["Neko", "Inu"], // Laboratory Transformation Traits - Demonic forms (mutually exclusive) // "Incubus" temporarily disabled from demonicForm "demonicForm": ["Succubus", "Imp", "Hellhound", "Imp-Touched"], // Laboratory Transformation Traits - Lifestyle transformations (mutually exclusive) "lifestyleTransform": ["Hucow", "Trophy Wife", "Gym Bunny", "E-Girl", "Punk", "Siren", "Living Doll", "Dominatrix"], // Laboratory Transformation Traits - Dominance mentality (mutually exclusive with personality) "transformDominance": ["Sadist", "Masochist"], // Laboratory Transformation Traits - Parental instincts (mutually exclusive) "parentalInstinct": ["Maternal", "Paternal", "Mommy Energy"], // Laboratory Transformation Traits - Obedience vs Rebellion (mutually exclusive) "obedienceSpectrum": ["Obedient", "Rebellious", "Docile", "Feral"] }>> <<set setup.bodyTypeRequirements = { "Curvy": { minChest: "medium", minButt: "medium" }, "Voluptuous": { minChest: "medium", minButt: "medium" }, "Petite": { maxChest: "medium", maxButt: "medium" }, "Slim": { maxChest: "small", maxButt: "small" } }>> <<set setup.chestSizeOrder = ["flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> <<set setup.buttSizeOrder = ["flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> /* Check if a trait is exclusive with any existing traits - FIXED VERSION */ <<set setup.getConflictingTrait = function(newTrait, existingTraits) { // Ensure existingTraits is an array if (!Array.isArray(existingTraits)) { existingTraits = []; } for (var groupName in setup.exclusiveTraitGroups) { var group = setup.exclusiveTraitGroups[groupName]; // If the new trait is in this group if (group.includes(newTrait)) { // Check if any existing trait is also in this SAME group for (var i = 0; i < existingTraits.length; i++) { var existingTrait = existingTraits[i]; if (group.includes(existingTrait) && existingTrait !== newTrait) { // Found a conflict in the same group return existingTrait; } } } } // No conflict found return null; }>> /* Check if body type is compatible with current chest/butt size */ <<set setup.isBodyTypeCompatible = function(bodyType, chest, butt) { var requirements = setup.bodyTypeRequirements[bodyType]; if (!requirements) return true; var chestIndex = setup.chestSizeOrder.indexOf(chest.toLowerCase()); var buttIndex = setup.buttSizeOrder.indexOf(butt.toLowerCase()); if (requirements.minChest) { var minChestIndex = setup.chestSizeOrder.indexOf(requirements.minChest); if (chestIndex < minChestIndex) return false; } if (requirements.maxChest) { var maxChestIndex = setup.chestSizeOrder.indexOf(requirements.maxChest); if (chestIndex > maxChestIndex) return false; } if (requirements.minButt) { var minButtIndex = setup.buttSizeOrder.indexOf(requirements.minButt); if (buttIndex < minButtIndex) return false; } if (requirements.maxButt) { var maxButtIndex = setup.buttSizeOrder.indexOf(requirements.maxButt); if (buttIndex > maxButtIndex) return false; } return true; }>> /* Auto-adjust body parts when body type trait is gained */ <<set setup.adjustBodyPartsForTrait = function(bodyType, isPlayer) { var requirements = setup.bodyTypeRequirements[bodyType]; if (!requirements) return; var v = State.variables; var target = isPlayer ? v : arguments[2]; // Third argument is NPC object if not player var chest = isPlayer ? v.bodyParts.chest : target.bodyParts.chest; var butt = isPlayer ? v.bodyParts.butt : target.bodyParts.butt; var chestIndex = setup.chestSizeOrder.indexOf(chest.toLowerCase()); var buttIndex = setup.buttSizeOrder.indexOf(butt.toLowerCase()); var changed = false; // Adjust chest if needed if (requirements.minChest) { var minChestIndex = setup.chestSizeOrder.indexOf(requirements.minChest); if (chestIndex < minChestIndex) { if (isPlayer) { v.bodyParts.chest = requirements.minChest; } else { target.bodyParts.chest = requirements.minChest; } changed = true; } } if (requirements.maxChest) { var maxChestIndex = setup.chestSizeOrder.indexOf(requirements.maxChest); if (chestIndex > maxChestIndex) { if (isPlayer) { v.bodyParts.chest = requirements.maxChest; } else { target.bodyParts.chest = requirements.maxChest; } changed = true; } } // Adjust butt if needed if (requirements.minButt) { var minButtIndex = setup.buttSizeOrder.indexOf(requirements.minButt); if (buttIndex < minButtIndex) { if (isPlayer) { v.bodyParts.butt = requirements.minButt; } else { target.bodyParts.butt = requirements.minButt; } changed = true; } } if (requirements.maxButt) { var maxButtIndex = setup.buttSizeOrder.indexOf(requirements.maxButt); if (buttIndex > maxButtIndex) { if (isPlayer) { v.bodyParts.butt = requirements.maxButt; } else { target.bodyParts.butt = requirements.maxButt; } changed = true; } } return changed; }>> /* Update gender-mismatch traits based on current body configuration */ <<set setup.updateGenderMismatchTraits = function(target) { var v = State.variables; var isPlayer = !target; // Get the relevant object var obj = isPlayer ? v : target; // Remove both gender-mismatch traits first if (isPlayer) { v.physicalTraits.delete("Cuntboy"); v.physicalTraits.delete("Futanari"); } else { target.physicalTraits.delete("Cuntboy"); target.physicalTraits.delete("Futanari"); } // Check for gender-mismatch situations and add appropriate trait var genitals = obj.bodyParts.genitals; var hasVagina = genitals === "tight vagina" || genitals === "vagina" || genitals === "loose vagina"; var hasPenis = genitals === "small penis" || genitals === "penis" || genitals === "big penis"; if (obj.bodyParts.gender === "male" && hasVagina) { // Male body with vagina = Cuntboy if (isPlayer) { if (!v.physicalTraits.includes("Cuntboy")) { v.physicalTraits.push("Cuntboy"); } } else { if (!target.physicalTraits.includes("Cuntboy")) { target.physicalTraits.push("Cuntboy"); } } } else if (obj.bodyParts.gender === "female" && hasPenis) { // Female body with penis = Futanari if (isPlayer) { if (!v.physicalTraits.includes("Futanari")) { v.physicalTraits.push("Futanari"); } } else { if (!target.physicalTraits.includes("Futanari")) { target.physicalTraits.push("Futanari"); } } } }>>
/* ---------------------------------- */ /* --- JOB STAT REQUIREMENTS (NO LONGER USED FOR TRADING) --- */ /* ---------------------------------- */ <<set setup.jobRequirements = { "Adult Store Clerk": {charisma: 20}, "Adult Streamer": {charisma: 20, dexterity: 15, strength: 5}, "Amateur Musician": {charisma: 20, dexterity: 10}, "Baker": {dexterity: 10}, "Barista": {charisma: 10, dexterity: 10}, "Beauty Salon Stylist": {dexterity: 20}, "Black Market Dealer": {charisma: 45}, "Bouncer": {strength: 40}, "Brothel Owner": {charisma: 90, intelligence: 85}, "Brothel Worker": {charisma: 90}, "Bus Driver": {strength: 15, dexterity: 20}, "City Mayor": {charisma: 70, intelligence: 50}, "Clinic Assistant": {intelligence: 40}, "Cocktail Waitress": {charisma: 35, dexterity: 20}, "Construction Worker": {strength: 15}, "Criminal": {}, "Dancing Instructor": {strength: 45, dexterity: 50}, "Data Analyst": {intelligence: 50}, "Detective": {intelligence: 45, strength: 35}, "Dock Worker": {strength: 20}, "Donuts Deliverer": {dexterity: 15}, "Ecentric Shop Worker": {charisma: 20}, "Enforcer": {strength: 50}, "Fitness Shop Clerk": {strength: 25}, "Fitness Trainer": {strength: 70}, "Hooker": {charisma: 30}, "Maid": {dexterity: 10}, "Mayor's Secretary": {intelligence: 85}, "Model": {charisma: 35}, "Mysterious Book Shop owner": {charisma: 100, intelligence: 50}, "Negotiator": {charisma: 50}, "Package Courier": {dexterity: 10}, "Patrol Officer": {strength: 80}, "Police Officer": {strength: 45}, "Police Station Janitor": {strength: 10}, "Police Station Receptionist": {charisma: 25}, "Porn Star": {charisma: 50}, "Prostitute": {charisma: 30}, "Security Guard": {strength: 15}, "Sheriff": {strength: 50, charisma: 45}, "Social Media Influencer": {charisma: 45}, "Streamer": {charisma: 5, intelligence: 5, dexterity: 5, strength: 5}, "Street Performer": {charisma: 10}, "Stripper": {charisma: 100}, "Tech Store Clerk": {intelligence: 20}, "Unemployed": {} }>> <<set setup.meetsJobRequirements = function(stats, jobName) { var requirements = setup.jobRequirements[jobName]; if (!requirements) return true; for (var stat in requirements) { if (stats[stat] < requirements[stat]) { return false; } } return true; }>> <<set setup.canTradeJob = function(playerJob, npcJob) { // Jobs can always be traded regardless of stats return true; }>>
/* ---------------------------------- */ /* --- TRAIT VALUE FUNCTION --- */ /* ---------------------------------- */ <<set setup.getTraitValue = function(type, name, size) { // Were-Creature - DON'T CHANGE if (name === "Were-Creature") { return 480; } // Soul trait - worth 0 value, cannot be traded if (name === "Soul") { return 0; } // Fishing milestone traits if (name === "Fishing") { return 50; } if (name === "Advanced Angler") { return 75; } if (name === "Master Angler") { return 100; } if (name === "Fishimon Master") { return 200; } // Special handling for jobs - value = total stat requirements if (type === "job") { if (name === "Unemployed") { return -5; } if (name === "Criminal") { return -150; } var jobReqs = setup.jobRequirements[name]; if (jobReqs) { var totalReqs = 0; for (var stat in jobReqs) { totalReqs += jobReqs[stat]; } return totalReqs; } return 15; // Default job value } // Body parts - DON'T CHANGE if (type === "bodyPart") { if (name === "chest" || name === "butt") { var sizeValues = { "flat masculine": 10, "flat": 10, "small": 20, "medium": 50, "large": 70, "huge": 100, "giant": 150, "gigantic": 300 // NEW SIZE VALUE }; return sizeValues[size.toLowerCase()] || 12; } // Genital values if (name === "genitals") { var genitalValues = { "small penis": 15, "penis": 25, "big penis": 40, "tight vagina": 15, "vagina": 25, "loose vagina": 40 }; return genitalValues[size.toLowerCase()] || 20; } // Other body parts (gender, skin, hair, age) if (name === "gender") return 20; if (name === "skinTone") return 10; if (name === "hairColor") return 8; if (name === "hairLength") return 8; if (name === "age") return 12; return 12; } // INDIVIDUAL TRAIT VALUES var traitValues = { /* ================================== */ /* SPECIAL TRAITS */ /* ================================== */ "Definitely not a Vampire": 480, "Sunfish": 999, "Totally not a Vampire": 480, "Quill": 604, /* ================================== */ /* CHARACTER CREATION TRAITS */ /* ================================== */ "Jock": 30, "Naturally Gifted": 50, "Pensive": 30, "Quick Learner": 50, "Silver-Tongued": 30, "Swift": 30, /* ================================== */ /* PHYSICAL TRAITS - POSITIVE */ /* ================================== */ "Artistic": 36, "Athletic Build": 70, "Attractive": 70, "Broad-shouldered": 35, "Curvy": 150, "Customer-Focused": 40, "Dark Skin": 10, "Deep Thinker": 50, "Detail-Oriented": 35, "Fashionable": 40, "Fast": 35, "Fit": 70, "Flexible": 50, "Freckled": 20, "Graceful": 55, "High Energy": 35, "Humorous": 20, "Lean": 45, "Long Hair": 10, "Mature": 35, "Monotone Expression": 10, "Muscular": 95, "Pale Skin": 10, "Perceptive": 40, "Petite": 30, "Pierced": 15, "Punctual": 20, "Quick": 55, "Quick Reflexes": 35, "Relaxed": 25, "Sarcastic": 15, "Sharp Features": 35, "Short Hair": 5, "Smooth Skin": 50, "Soft": 30, "Strong": 55, "Sturdy": 25, "Tall": 35, "Tan Skin": 10, "Tattooed": 15, "Tech Savvy": 32, "Voluptuous": 105, "Youthful": 69, "Lactating": 83, /* ================================== */ /* PHYSICAL TRAITS - MIXED */ /* ================================== */ "Scarred": 5, "Short": 10, /* ================================== */ /* PHYSICAL TRAITS - NEGATIVE */ /* (Values halved from original) */ /* ================================== */ "Blemished": -10, "Clumsy": -15, "Overweight": -15, "Plain": -8, "Slow": -14, "Stiff": -13, "Ugly": -20, "Underweight": -14, "Weak": -18, /* ================================== */ /* VOICE TRAITS - POSITIVE */ /* ================================== */ "Animated Tone": 25, "Articulate Speech": 32, "Balanced Neutral Tone": 10, "Bouncy Tone": 20, "Breathy Voice": 15, "Calm Voice": 20, "Charming Tone": 28, "Charismatic Voice": 38, "Clear Enunciation": 28, "Clear Pronunciation": 28, "Deep Voice": 15, "Eager Tone": 20, "Even-Paced Voice": 18, "Expressive Voice": 28, "Friendly Tone": 25, "Gentle Voice": 20, "Gravelly Voice": 12, "Hushed Intimate Voice": 25, "Lively Tone": 25, "Measured Speech": 18, "Melodic Voice": 28, "Pleasant Cadence": 25, "Silky Voice": 50, "Sing-Songy Voice": 20, "Slow Calm Voice": 15, "Smooth Talker": 35, "Smooth Voice": 39, "Soft Monologue Style": 18, "Soft-Spoken": 18, "Soothing Tone": 25, "Steady Voice": 20, "Understated Voice": 12, "Warm Tone": 28, /* ================================== */ /* VOICE TRAITS - MIXED/NEGATIVE */ /* ================================== */ "Choppy Speech": -5, "Croaky Voice": 5, "Deadpan Delivery": 5, "Detached Voice": -8, "Emotionless Tone": -10, "Fast Talker": 8, "Flat Voice": -5, "Grim Tone": -5, "High-Pitched Tone": 5, "Interruptive Tone": -8, "Lazy Drawl": -5, "Monotone": -8, "Mumbly Voice": -10, "Nasally Tone": -8, "Rapid-Fire Speech": 10, "Raspy Voice": 10, "Robotic Tone": -5, "Shaky Voice": -8, "Sharp Voice": 5, "Snappy Tone": -5, "Stoic Tone": 8, "Stuttering Speech": -8, /* ================================== */ /* MENTAL TRAITS - POSITIVE */ /* ================================== */ "Alluring": 90, "Ambitious": 32, "Analytical": 28, "Bookworm": 30, "Brave": 32, "Calm": 25, "Charming": 45, "Chill": 28, "Competitive": 28, "Confident": 35, "Considerate": 28, "Crafty": 30, "Creative": 28, "Curious": 20, "Determined": 60, "Diplomatic": 45, "Direct": 10, "Disciplined": 32, "Efficient": 60, "Empathetic": 32, "Energetic": 25, "Extroverted": 28, "Flirty": 30, "Focused": 25, "Friendly": 35, "Funny": 28, "Hardworking": 32, "High Stamina": 90, "Humble": 25, "Intelligent": 28, "Kind": 35, "Logical": 35, "Loyal": 30, "Lucky": 777, "Negotiator": 40, "Nonchalant": 18, "Optimistic": 25, "Organized": 25, "Outgoing": 25, "Patient": 28, "Polite": 25, "Reassuring": 25, "Resourceful": 32, "Seductive": 95, "Shrewd": 32, "Sly": 50, "Steadfast": 28, "Supportive": 28, "Talkative": 20, "Thoughtful": 20, "Trusting": 20, "Warm": 30, "Wise": 40, "Witty": 28, "Workaholic": 30, /* ================================== */ /* MENTAL TRAITS - MIXED */ /* ================================== */ "Aggressive": 18, "Awkward": -5, "Blunt": 10, "Clingy": -4, "Corporate Drone": 5, "Cynical": -3, "Dominant": 70, "Honest": 12, "Impulsive": 5, "Introverted": 8, "Moody": -4, "Overthinker": 8, "Paranoid": -3, "Passive": 5, "Perfectionist": 15, "Perverted": 0, "Pessimistic": 5, "Quiet": 5, "Risk Taker": 8, "Sensitive": 5, "Shy": -5, "Stubborn": 15, "Submissive": 8, "Tease": 15, "Tone Deaf": -4, "Unpredictable": -3, "Gambling Addiction": -666, /* ================================== */ /* MENTAL TRAITS - NEGATIVE */ /* (Values halved, except Unlucky and Unskilled) */ /* ================================== */ "Arrogant": -18, "Bitchy": -15, "Cold": -13, "Complacent": -15, "Corrupt": -3, "Cowardly": -19, "Cruel": -23, "Deceitful": -14, "Disorganized": -11, "Dull": -19, "Erratic": -14, "Foolish": -20, "Forgetful": -13, "Impatient": -14, "Insecure": -13, "Insensitive": -13, "Jealous": -14, "Lazy": -19, "Obsessive": -14, "Reckless": -14, "Rude": -15, "Selfish": -15, "Short Tempered": -14, "Slow Learner": -15, "Unlucky": -70, "Unreliable": -16, "Unskilled": -50, /* ================================== */ /* STEREOTYPE TRAITS */ /* ================================== */ "Diva": 20, "Femboy": 32, "Geek": 23, "Goth": 35, "Nerd": 25, "Prep": 32, "Tomboy": 22, /* ================================== */ /* SKILLS - SPECIAL */ /* ================================== */ "Criminal Deluxe": 600, "Occult Expert": 160, /* ================================== */ /* SKILLS - REGULAR */ /* ================================== */ "Accounting": 35, "Acting": 38, "Art": 32, "Athletics": 40, "Baking": 30, "Cleaning": 20, "Coding": 35, "Combat": 40, "Construction": 32, "Cooking": 28, "Customer Service": 25, "Dancing": 38, "Driving": 25, "First Aid": 25, "Foreign Language": 28, "Forklift Certified": 68, "Gardening": 22, "Guitar": 30, "Hair Styling": 32, "Heavy Lifting": 58, "High Heels Proficient": 30, "Inventory Management": 22, "Languages": 28, "Legal Knowledge": 42, "Lock Picking": 48, "Maid": 25, "Makeup": 30, "Management": 42, "Martial Arts": 45, "Math Skills": 28, "Medicine": 42, "Modeling": 55, "Music": 32, "Painting": 32, "Persuasion": 50, "Photography": 28, "Piano": 32, "Plumbing": 28, "Product Knowledge": 18, "Public Speaking": 38, "Retail": 28, "Sales": 38, "Serving": 30, "Sexually Skilled": 100, "Singing": 28, "Social Media": 32, "Stealth": 35, "Swimmer": 32, "Swimming": 32, "Teaching": 38, "Tech-Savvy": 22, "Trading": 43, "Troubleshooting": 28, "Writing": 28, "Yoga": 32, /* ================================== */ /* SEXUAL EXPERTISE TRAITS */ /* ================================== */ "Oral Expert": 85, "Anal Expert": 80, "Rough Sex Enthusiast": 75, "Sensual Lover": 85, "BDSM Enthusiast - Dom": 90, "BDSM Enthusiast - Sub": 80, "Roleplay Expert": 95, "Dirty Talker": 70, "Tantric Master": 110, "Exhibitionist": 65, "Sexual Stamina Expert": 100, "Tit Worship Expert": 75, "Titfuck Master": 85, /* ================================== */ /* MISCELLANEOUS */ /* ================================== */ "Cuntboy": 0, "Futanari": 0, /* ================================== */ /* MENTAL TRAITS - MIXED (ADDITIONAL) */ /* ================================== */ "Bimbo": 30, "Musky": 5, /* ================================== */ /* STEREOTYPE TRAITS (ADDITIONAL) */ /* ================================== */ "Delinquent": 25, /* ================================== */ /* VOICE TRAITS (ADDITIONAL) */ /* ================================== */ "Gaelic Accent": 10, /* ================================== */ /* NPC / SHARED TRAITS */ /* ================================== */ "Nervous": -10, "Scared": -15, "Assertive": 30, "Serious": 15, "Reserved": 10, "Demanding": -10, "Stocky": 20, "Slim": 20, "Prudish": 5, "Timid": -8, "Antisocial": -12, "Busy": 5, "Cautious": 15, "Reliable": 25, "Careful": 15, /* ================================== */ /* NPC SKILLS (ADDITIONAL) */ /* ================================== */ "Building PCs": 28, "Animation": 32, "Fashion Design": 32, "Finance": 38, "Investigation": 35, "Leadership": 38, "Social Skills": 30, "Video Editing": 28, "Combat Training": 35, "Gaming": 22, "Basketball": 30, "Business": 38, "Mechanical Repair": 28, "Navigation": 25, "Magic Theory": 40, "Meditation": 30, /* ================================== */ /* NPC MENTAL TRAITS (ADDITIONAL) */ /* ================================== */ "Anxious": -12, "Bold": 25, "Bubbly": 15, "By-the-Book": 10, "Clever": 20, "Crazy": -20, "Eccentric": 10, "Gentle": 15, "Hot-Headed": -5, "Intimidating": 20, "Manipulative": -15, "Naive": -10, "Nurturing": 20, "Passionate": 20, "Playful": 15, "Protective": 25, "Romantic": 15, "Sassy": 10, "Simple": -5, "Spiritual": 15, "Street Smart": 25, "Vain": -10, /* ================================== */ /* NPC VOICE TRAITS (ADDITIONAL) */ /* ================================== */ "Flat Uninterested Voice": 0, "Slurred Speech": -5, "Whiny Voice": -5, /* ================================== */ /* TRANSFORMATION TRAITS */ /* ================================== */ "Imp": 87, "Succubus": 347, "Hucow": 179, "Living Doll": 242, "Werewolf": 123, "Hellhound": 935, "Werecat": 32, "Weresheep": 225, "Himbo": 191, "E-Girl": 112, "Werefox": 180, "Trophy Wife": 153, "Werebunny": 123, "Punk": 75, "Gym Bunny": 178 }; // Return the defined value or default if (traitValues[name] !== undefined) { return traitValues[name]; } // Default values if not found if (type === "physical") return 15; if (type === "mental") return 15; if (type === "skill") return 25; return 10; }>>
/* ---------------------------------- */ /* --- NPC LOOKUP FUNCTIONS --- */ /* ---------------------------------- */ <<set setup.getNPCsByJob = function(jobName) { var npcs = State.variables.npcs; var result = []; for (var i = 0; i < npcs.length; i++) { var npc = npcs[i]; // Handle unemployed specifically - NPCs with no jobs array or empty jobs array if (jobName === "Unemployed") { if (!npc.jobs || npc.jobs.length === 0) { result.push(npc); } } else { // Regular job matching - only include if they have this specific job if (npc.jobs && npc.jobs.length > 0 && npc.jobs.includes(jobName)) { result.push(npc); } } } return result; }>> <<set setup.getNPCByName = function(npcName) { var npcs = State.variables.npcs; for (var i = 0; i < npcs.length; i++) { if (npcs[i].name === npcName) { var npc = npcs[i]; // Ensure NPC has hair length (for backwards compatibility) if (!npc.appearance.hairLength) { npc.appearance.hairLength = Math.random() < 0.5 ? "short" : "long"; // Add corresponding physical trait var hairLengthTrait = npc.appearance.hairLength === "short" ? "Short Hair" : "Long Hair"; if (!npc.physicalTraits.includes(hairLengthTrait)) { npc.physicalTraits.push(hairLengthTrait); } } return npc; } } return null; }>> /* Compatibility function - always returns true since getNPCsAtLocation handles filtering */ <<set setup.isNPCAvailable = function(npcName) { return true; }>>
/* ---------------------------------- */ /* --- INITIALIZE CORE VARIABLES --- */ /* ---------------------------------- */ /* Initialize NPC array BEFORE loading data passages */ <<set $npcs = []>> <<set $metNPCs = []>> <<set $currentTradeNPC = null>> <<set $tradeHistory = []>> /* Function to calculate relationship bonus to trade chance */ <<set setup.getRelationshipTradeBonus = function(npcName) { var v = State.variables; if (!v.relationships[npcName]) return 0; var level = v.relationships[npcName].level; // Level 1 (Stranger) = 0%, each level after gives +3% if (level <= 1) return 0; return (level - 1) * 3; }>>
/* ---------------------------------- */ /* --- TRADE CALCULATION FUNCTIONS --- */ /* ---------------------------------- */ <<set setup.calculateTradeValue = function(tradePackage, isPlayer) { var totalValue = 0; // Add physical traits if (tradePackage.physical && tradePackage.physical.length > 0) { for (var i = 0; i < tradePackage.physical.length; i++) { totalValue += setup.getTraitValue("physical", tradePackage.physical[i]); } } // Add mental traits if (tradePackage.mental && tradePackage.mental.length > 0) { for (var i = 0; i < tradePackage.mental.length; i++) { totalValue += setup.getTraitValue("mental", tradePackage.mental[i]); } } // Add skills if (tradePackage.skills && tradePackage.skills.length > 0) { for (var i = 0; i < tradePackage.skills.length; i++) { totalValue += setup.getTraitValue("skill", tradePackage.skills[i]); } } // Add body parts if (tradePackage.bodyParts && tradePackage.bodyParts.length > 0) { for (var i = 0; i < tradePackage.bodyParts.length; i++) { var part = tradePackage.bodyParts[i]; var v = State.variables; var actualValue; if (isPlayer) { actualValue = (part.name === "chest" || part.name === "butt" || part.name === "genitals") ? v.bodyParts[part.name] : v.appearance[part.name]; } else { var npc = part.npc; actualValue = (part.name === "chest" || part.name === "butt" || part.name === "genitals") ? npc.bodyParts[part.name] : npc.appearance[part.name]; } totalValue += setup.getTraitValue("bodyPart", part.name, actualValue); } } // Add gender value (standalone property) if (tradePackage.gender !== null && tradePackage.gender !== undefined) { var v = State.variables; var genderValue; if (isPlayer) { // For player package, use player's gender genderValue = v.bodyParts.gender; } else { // For NPC package, use NPC's gender var tradingNPC = v.tradingWithNPC; if (tradingNPC && tradingNPC.bodyParts && tradingNPC.bodyParts.gender) { genderValue = tradingNPC.bodyParts.gender; } } if (genderValue) { var genderTraitValue = setup.getTraitValue("bodyPart", "gender", genderValue); totalValue += genderTraitValue; } } // Add job value if (tradePackage.job !== null && tradePackage.job !== undefined) { totalValue += setup.getTraitValue("job", tradePackage.job); } // Add name value if (tradePackage.name && tradePackage.name.length > 0) { totalValue += tradePackage.name.length * 5; } // Add stats if (tradePackage.stats && tradePackage.stats.length > 0) { for (var i = 0; i < tradePackage.stats.length; i++) { totalValue += tradePackage.stats[i].amount; } } // Ensure value cannot be negative - this prevents dumping negative traits return Math.max(0, totalValue); }>> <<set setup.calculateTradeValueDEBUG = function(tradePackage, isPlayer) { console.log("=== DEBUG calculateTradeValue ==="); console.log("isPlayer:", isPlayer); console.log("tradePackage:", tradePackage); console.log("tradePackage.gender:", tradePackage.gender); console.log("tradePackage.gender !== null:", tradePackage.gender !== null); console.log("tradePackage.gender !== undefined:", tradePackage.gender !== undefined); var totalValue = 0; // Skip to gender section if (tradePackage.gender !== null && tradePackage.gender !== undefined) { console.log("✓ INSIDE GENDER CONDITION"); var v = State.variables; var genderValue; if (isPlayer) { console.log("→ PLAYER BRANCH"); genderValue = v.bodyParts.gender; console.log(" genderValue from v.bodyParts.gender:", genderValue); } else { console.log("→ NPC BRANCH"); var tradingNPC = v.tradingWithNPC; console.log(" tradingNPC:", tradingNPC); console.log(" tradingNPC exists?", !!tradingNPC); if (tradingNPC) { console.log(" tradingNPC.bodyParts:", tradingNPC.bodyParts); console.log(" tradingNPC.bodyParts.gender:", tradingNPC.bodyParts.gender); } if (tradingNPC && tradingNPC.bodyParts && tradingNPC.bodyParts.gender) { genderValue = tradingNPC.bodyParts.gender; console.log(" ✓ genderValue set to:", genderValue); } else { console.log(" ✗ Failed to get NPC gender value"); } } console.log("genderValue (final):", genderValue); console.log("genderValue is truthy?", !!genderValue); if (genderValue) { console.log("→ CALLING setup.getTraitValue('bodyPart', 'gender', '" + genderValue + "')"); var genderTraitValue = setup.getTraitValue("bodyPart", "gender", genderValue); console.log(" ✓ Returned value:", genderTraitValue); console.log(" Type:", typeof genderTraitValue); totalValue += genderTraitValue; console.log(" ✓ totalValue after adding:", totalValue); } else { console.log("✗ SKIPPED - genderValue was falsy"); } } else { console.log("✗ SKIPPED GENDER CONDITION - gender is null or undefined"); } console.log("=== FINAL TOTAL:", totalValue, "==="); return totalValue; }>> <<set setup.calculatePreferenceValueAdjustment = function(npc, playerPackage, npcPackage, baseNpcValue) { var preferences = setup.getNPCPreferences(npc.name); if (!preferences) return baseNpcValue; var adjustedValue = 0; // Skills - check each skill's preference if (npcPackage.skills && npcPackage.skills.length > 0) { for (var i = 0; i < npcPackage.skills.length; i++) { var skill = npcPackage.skills[i]; var skillValue = setup.getTraitValue("skill", skill); // Add base value adjustedValue += skillValue; // Add reluctant penalty (flat 30% more points needed) if (preferences.reluctantToTrade && preferences.reluctantToTrade.skills && preferences.reluctantToTrade.skills.includes(skill)) { adjustedValue += Math.ceil(skillValue * 0.3); } // Apply willing discount (20% discount) else if (preferences.willingToTrade && preferences.willingToTrade.skills && preferences.willingToTrade.skills.includes(skill)) { adjustedValue -= Math.ceil(skillValue * 0.2); } } } // Mental traits - check each trait's preference if (npcPackage.mental && npcPackage.mental.length > 0) { for (var i = 0; i < npcPackage.mental.length; i++) { var trait = npcPackage.mental[i]; var traitValue = setup.getTraitValue("mental", trait); // Add base value adjustedValue += traitValue; // Add reluctant penalty (flat 30% more points needed) if (preferences.reluctantToTrade && preferences.reluctantToTrade.mental && preferences.reluctantToTrade.mental.includes(trait)) { adjustedValue += Math.ceil(traitValue * 0.3); } // Apply willing discount (20% discount) else if (preferences.willingToTrade && preferences.willingToTrade.mental && preferences.willingToTrade.mental.includes(trait)) { adjustedValue -= Math.ceil(traitValue * 0.2); } } } // Physical traits - check each trait's preference if (npcPackage.physical && npcPackage.physical.length > 0) { for (var i = 0; i < npcPackage.physical.length; i++) { var trait = npcPackage.physical[i]; var traitValue = setup.getTraitValue("physical", trait); // Add base value adjustedValue += traitValue; // Add reluctant penalty (flat 30% more points needed) if (preferences.reluctantToTrade && preferences.reluctantToTrade.physical && preferences.reluctantToTrade.physical.includes(trait)) { adjustedValue += Math.ceil(traitValue * 0.3); } // Apply willing discount (20% discount) else if (preferences.willingToTrade && preferences.willingToTrade.physical && preferences.willingToTrade.physical.includes(trait)) { adjustedValue -= Math.ceil(traitValue * 0.2); } } } // Body parts - check each body part's preference if (npcPackage.bodyParts && npcPackage.bodyParts.length > 0) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { var part = npcPackage.bodyParts[i]; // Get the actual value from the correct location var actualValue; if (part.name === "chest" || part.name === "butt" || part.name === "genitals") { actualValue = npc.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = npc.appearance[part.name]; } var partValue = setup.getTraitValue("bodyPart", part.name, actualValue); // Add base value adjustedValue += partValue; // Add reluctant penalty (flat 30% more points needed) if (preferences.reluctantToTrade && preferences.reluctantToTrade.bodyParts && preferences.reluctantToTrade.bodyParts.includes(part.name)) { adjustedValue += Math.ceil(partValue * 0.3); } // Apply willing discount (20% discount) else if (preferences.willingToTrade && preferences.willingToTrade.bodyParts && preferences.willingToTrade.bodyParts.includes(part.name)) { adjustedValue -= Math.ceil(partValue * 0.2); } } } // Gender - check gender preference (standalone property) if (npcPackage.gender !== null && npcPackage.gender !== undefined) { var genderValue = 0; // Get the NPC's actual gender value if (npc && npc.bodyParts && npc.bodyParts.gender) { genderValue = setup.getTraitValue("bodyPart", "gender", npc.bodyParts.gender); } // Add base value adjustedValue += genderValue; // Check if NPC has gender preferences if (preferences.neverTrade && preferences.neverTrade.gender) { // Extreme cost to make trade essentially impossible adjustedValue += genderValue * 9; // 10x total cost } else if (preferences.reluctantToTrade && preferences.reluctantToTrade.gender) { // Add 30% more points needed adjustedValue += Math.ceil(genderValue * 0.3); } else if (preferences.willingToTrade && preferences.willingToTrade.gender) { // 20% discount adjustedValue -= Math.ceil(genderValue * 0.2); } } // Job - check job preference if (npcPackage.job !== null && npcPackage.job !== undefined) { var jobValue = setup.getTraitValue("job", npcPackage.job || "Unemployed"); // Add base value adjustedValue += jobValue; // Add reluctant penalty (flat 30% more points needed) if (preferences.reluctantToTrade && preferences.reluctantToTrade.job) { adjustedValue += Math.ceil(jobValue * 0.3); } // Apply willing discount (20% discount) else if (preferences.willingToTrade && preferences.willingToTrade.job) { adjustedValue -= Math.ceil(jobValue * 0.2); } } // Name parts - no preference modifiers, just add base value if (npcPackage.name && npcPackage.name.length > 0) { adjustedValue += npcPackage.name.length * 5; } // Stats - no preference modifiers, just add base value if (npcPackage.stats && npcPackage.stats.length > 0) { for (var i = 0; i < npcPackage.stats.length; i++) { adjustedValue += npcPackage.stats[i].amount; } } return Math.max(0, adjustedValue); }>> <<set setup.calculateTradeChance = function(playerValue, npcValue, npc, playerPackage, npcPackage) { // If player is offering negative or zero value, automatic fail if (playerValue <= 0) { return 0; } if (npcValue === 0) return 100; var v = State.variables; var ratio = playerValue / npcValue; var chance; // Need at least equal value for any chance if (playerValue < npcValue) { return 0; } // Equal value = 1% base chance if (ratio === 1.0) { chance = 1; } // 1.7x or more = 100% chance else if (ratio >= 1.7) { chance = 100; } // Calculate chance between 1% and 100% based on ratio else { // At 1.0x = 1%, at 1.7x = 100% // Range is 0.7 (from 1.0 to 1.7), giving us 99% spread (from 1% to 100%) var normalizedRatio = (ratio - 1.0) / 0.7; // Normalize to 0-1 range chance = 1 + (normalizedRatio * 99); // Map to 1-100% range chance = Math.round(chance); } // Apply charisma bonus: 1% per 3.75 charisma (including bonus charisma) // Capped at 40% (achieved at 150 charisma) var totalCharisma = setup.getTotalStat("charisma"); var charismaBonus = 0; if (totalCharisma > 0) { charismaBonus = Math.min(40, Math.floor(totalCharisma / 3.75)); } chance += charismaBonus; // Apply Trading skill bonus: +2% if (v.skills.includes("Trading")) { chance += 2; } // Apply Persuasion skill bonus: +3% if (v.skills.includes("Persuasion")) { chance += 3; } // Apply Sunfish trait bonus: +10% if (v.mentalTraits.includes("Sunfish")) { chance += 10; } // Werefox +10% trade bonus if (v.physicalTraits && v.physicalTraits.includes("Werefox")) { chance += 10; } // Siren +30% trade bonus - Siren is a physical trait if (v.physicalTraits && v.physicalTraits.includes("Siren")) { chance += 30; } // ===== SKILL TREE: Trade Success Bonus ===== var skillTreeTradeBonus = setup.skillTree.getEffect("tradeSuccessBonus"); if (skillTreeTradeBonus > 0) { chance += skillTreeTradeBonus; } // ===== BUFF SYSTEM: Apply tradeChance buffs (e.g., shower_fresh, well_rested, food buffs) ===== var buffTradeBonus = setup.getBuffEffect("tradeChance"); if (buffTradeBonus > 0) { chance += buffTradeBonus; } // ===== DEBUFF SYSTEM: Apply tradeChance debuffs (e.g., exhaustion) ===== var debuffTradePenalty = setup.getDebuffEffect("tradeChance"); if (debuffTradePenalty !== 0) { chance += debuffTradePenalty; } // Define beneficial mental traits that improve trading (+2% each) var beneficialTraits = [ "Honest", "Confident", "Friendly", "Trusting", "Patient", "Intelligent", "Analytical", "Chill", "Nonchalant", "Charming", "Diplomatic", "Polite", "Reassuring", "Efficient", "Warm", "Lucky", "Hellhound", "Werecat", "Weresheep", "Himbo", "Werefox", "Trophy Wife", "Werebunny", "Punk", "Gym Bunny", "Siren" ]; // Define detrimental mental traits that hurt trading (-3% each) var detrimentalTraits = [ "Aggressive", "Awkward", "Blunt", "Corrupt", "Moody", "Pessimistic", "Sensitive", "Shy", "Stubborn", "Arrogant", "Cold", "Deceitful", "Foolish", "Forgetful", "Impatient", "Insecure", "Reckless", "Rude", "Selfish", "Short Tempered", "Unlucky", "Unreliable", "Bitchy" ]; // Count beneficial traits var beneficialCount = 0; for (var i = 0; i < beneficialTraits.length; i++) { if (v.mentalTraits.includes(beneficialTraits[i])) { beneficialCount++; } } var beneficialBonus = Math.ceil(beneficialCount * 2); // +2% per trait, round up chance += beneficialBonus; // Count detrimental traits var detrimentalCount = 0; for (var i = 0; i < detrimentalTraits.length; i++) { if (v.mentalTraits.includes(detrimentalTraits[i])) { detrimentalCount++; } } var detrimentalPenalty = Math.ceil(detrimentalCount * 3); // -3% per trait, round up chance -= detrimentalPenalty; // Apply NPC preference modifier var preferenceModifier = setup.calculatePreferenceModifier(npc, playerPackage, npcPackage); chance += preferenceModifier; // Apply relationship bonus var relationshipBonus = setup.getRelationshipTradeBonus(npc.name); chance += relationshipBonus; // Apply Criminal job penalty: Multiplicative 75% reduction (keep only 25% of chance) // This is applied AFTER all additive bonuses but BEFORE Drifter's Coin if (v.jobs && v.jobs.includes("Criminal")) { chance = Math.floor(chance * 0.25); // 75% penalty = multiply by 0.25 } // Apply Drifter's Coin multiplier (2x) BEFORE final clamping if (v.currentArtifact === "The Drifter's Coin") { chance = chance * 2; } // Clamp between 0 and 100 return Math.max(0, Math.min(100, Math.round(chance))); }>> /* ---------------------------------- */ /* --- TRADE RELATIONSHIP BONUS --- */ /* ---------------------------------- */ <<set setup.addTradeRelationshipBonus = function(npc, playerPackage, npcPackage) { var v = State.variables; var preferences = setup.getNPCPreferences(npc.name); var baseBonus = 5; // Base relationship bonus for successful trade var desiredBonus = 0; // Check if the NPC received something they desired if (preferences && preferences.desires) { // Check physical traits the NPC received (from player package) if (playerPackage.physical && preferences.desires.physical) { for (var i = 0; i < playerPackage.physical.length; i++) { if (preferences.desires.physical.includes(playerPackage.physical[i])) { desiredBonus += 10; // +10 per desired trait received } } } // Check mental traits the NPC received if (playerPackage.mental && preferences.desires.mental) { for (var i = 0; i < playerPackage.mental.length; i++) { if (preferences.desires.mental.includes(playerPackage.mental[i])) { desiredBonus += 10; } } } // Check skills the NPC received if (playerPackage.skills && preferences.desires.skills) { for (var i = 0; i < playerPackage.skills.length; i++) { if (preferences.desires.skills.includes(playerPackage.skills[i])) { desiredBonus += 10; } } } } // ===== SKILL TREE: Trade Relationship Bonus ===== // Add bonus relationship points when NPC received desired items if (desiredBonus > 0) { var skillTreeRelBonus = setup.skillTree.getEffect("tradeRelationshipBonus"); if (skillTreeRelBonus > 0) { desiredBonus += skillTreeRelBonus; } } return baseBonus + desiredBonus; }>> /* ---------------------------------- */ /* --- APPLY SKILL TREE VALUE REDUCTION --- */ /* ---------------------------------- */ <<set setup.applyTradeValueReduction = function(adjustedValue) { // Get skill tree trade value reduction bonus var reduction = setup.skillTree.getEffect("tradeValueReduction"); if (reduction > 0) { adjustedValue = Math.max(0, adjustedValue - reduction); } return adjustedValue; }>>
/* ---------------------------------- */ /* --- NPC MEETING & RELATIONSHIP UPDATE --- */ /* ---------------------------------- */ <<set setup.meetNPC = function(npc) { var v = State.variables; var npcName = typeof npc === 'string' ? npc : npc.name; // Check if already met if (v.metNPCs.includes(npcName)) { return; // Already met, do nothing } // Add to met NPCs v.metNPCs.push(npcName); // Initialize relationship if it doesn't exist if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 0, points: 0 }; } }>> <<set setup.addRelationshipPoints = function(npcName, points) { var v = State.variables; // Initialize relationship if it doesn't exist if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 0, points: 0 }; } // Weresheep 2x relationship bonus (only for positive gains) if (points > 0 && v.physicalTraits && v.physicalTraits.includes("Weresheep")) { points = points * 2; } // Himbo 2x relationship bonus with male NPCs (only for positive gains) if (points > 0 && v.physicalTraits && v.physicalTraits.includes("Himbo")) { var npc = setup.getNPCByName(npcName); if (npc && npc.bodyParts && npc.bodyParts.gender === "male") { points = points * 2; } } // Gyaru 2x relationship bonus with male NPCs (only for positive gains) if (points > 0 && v.physicalTraits && v.physicalTraits.includes("Gyaru")) { var npc = setup.getNPCByName(npcName); if (npc && npc.bodyParts && npc.bodyParts.gender === "male") { points = points * 2; } } // Store old level for achievement checking var oldLevel = v.relationships[npcName].level; // Add points (can be negative) v.relationships[npcName].points += points; // Clamp to minimum -50 (Disliked floor) if (v.relationships[npcName].points < -50) { v.relationships[npcName].points = -50; } // Calculate new level based on points using the new system // Level -1: Disliked (-50 to -1) // Level 0: Stranger (0 to 24) // Level 1: Acquaintance (25 to 74) // Level 2: Friend (75 to 174) // Level 3: Close Friend (175 to 424) // Level 4: Best Friend (425+) var currentPoints = v.relationships[npcName].points; var newLevel = setup.calculateRelationshipLevel(currentPoints); v.relationships[npcName].level = newLevel; // Relationship level achievements - check both $relationships and $npcRelationships var npcRelLevel = (v.npcRelationships && v.npcRelationships[npcName]) ? v.npcRelationships[npcName].level : -99; var maxLevel = Math.max(newLevel, npcRelLevel); if ((newLevel >= 2 && oldLevel < 2) || maxLevel >= 2) { setup.achievements.unlock("relationship_2"); } if ((newLevel >= 4 && oldLevel < 4) || maxLevel >= 4) { setup.achievements.unlock("relationship_4"); } // Return the updated relationship for verification return v.relationships[npcName]; }>> <<set setup.updateNPCRelationshipKey = function(oldName, newName) { var v = State.variables; // Update metNPCs array var metIndex = v.metNPCs.indexOf(oldName); if (metIndex !== -1) { v.metNPCs[metIndex] = newName; } // Transfer relationship data to new name if (v.relationships[oldName]) { v.relationships[newName] = v.relationships[oldName]; delete v.relationships[oldName]; } }>> <<set setup.updateRelationshipFromTrade = function(npc, playerPackage, npcPackage, tradeSucceeded) { var v = State.variables; var npcName = npc.name; // Ensure relationship exists if (!v.relationships[npcName]) { v.relationships[npcName] = { level: 1, points: 0 }; } var prefs = setup.getNPCPreferences(npcName); if (!prefs) return; // No preferences set var pointsChange = 0; // Check what player OFFERED (things NPC receives) // DESIRES - NPC wants these (+2 points per desired item) if (prefs.desires) { if (prefs.desires.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsChange += 2; } }); } if (prefs.desires.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsChange += 2; } }); } if (prefs.desires.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsChange += 2; } }); } if (prefs.desires.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsChange += 2; } }); } } // Check what player TOOK from NPC (things NPC loses) // RELUCTANT - NPC doesn't want to give these (-1 point per reluctant item) if (prefs.reluctantToTrade && tradeSucceeded) { if (prefs.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsChange -= 1; } }); } if (prefs.reluctantToTrade.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsChange -= 1; } }); } } // Apply points change if (pointsChange !== 0) { setup.addRelationshipPoints(npcName, pointsChange); } }>> <<set setup.calculateTradeValue = function(tradePackage, isPlayer) { var v = State.variables; var totalValue = 0; // Calculate value from skills if (tradePackage.skills && tradePackage.skills.length > 0) { for (var i = 0; i < tradePackage.skills.length; i++) { totalValue += setup.getTraitValue("skill", tradePackage.skills[i]); } } // Calculate value from mental traits if (tradePackage.mental && tradePackage.mental.length > 0) { for (var i = 0; i < tradePackage.mental.length; i++) { totalValue += setup.getTraitValue("mental", tradePackage.mental[i]); } } // Calculate value from physical traits if (tradePackage.physical && tradePackage.physical.length > 0) { for (var i = 0; i < tradePackage.physical.length; i++) { totalValue += setup.getTraitValue("physical", tradePackage.physical[i]); } } // Calculate value from body parts if (tradePackage.bodyParts && tradePackage.bodyParts.length > 0) { for (var i = 0; i < tradePackage.bodyParts.length; i++) { var part = tradePackage.bodyParts[i]; var actualValue; // Get the actual value from the correct location if (isPlayer) { if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { actualValue = v.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = v.appearance[part.name]; } } else { // For NPC, need to get from tradingWithNPC var npc = v.tradingWithNPC; if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { actualValue = npc.bodyParts[part.name]; } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "hairLength" || part.name === "age") { actualValue = npc.appearance[part.name]; } } if (actualValue && actualValue !== "") { var partValue = setup.getTraitValue("bodyPart", part.name, actualValue); totalValue += partValue; } } } // Calculate value from job if (tradePackage.job !== null && tradePackage.job !== undefined) { totalValue += setup.getTraitValue("job", tradePackage.job); } // Calculate value from name parts if (tradePackage.name && tradePackage.name.length > 0) { totalValue += tradePackage.name.length * 5; // 5 points per name part } // Calculate value from stats if (tradePackage.stats && tradePackage.stats.length > 0) { for (var i = 0; i < tradePackage.stats.length; i++) { totalValue += tradePackage.stats[i].amount; } } return Math.max(0, totalValue); }>>
/* ---------------------------------- */ /* --- NPC TRADING PREFERENCES --- */ /* ---------------------------------- */ <<set setup.npcTradingPreferences = { "Marcus Carter": { desires: { skills: ["Medicine", "Coding"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Combat", "Athletics", "Public Speaking", "Acting"], mental: ["Confident", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Guitar"], mental: ["Outgoing"], physical: ["Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Cowardly"], physical: ["Weak", "Underweight", "Ugly"], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] } }, "Elena Romero": { desires: { skills: ["Languages", "Art"], mental: ["Creative", "Empathetic"], physical: ["Attractive"], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["medium", "large"], genitals: [] }, willingToTrade: { skills: ["Coding", "Math Skills", "Painting"], mental: ["Analytical", "Shy"], physical: ["Graceful", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Medicine", "First Aid"], mental: ["Patient", "Kind", "Intelligent"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Muscular", "Scarred", "Ugly"], bodyParts: [], chestSize: ["giant","flat masculine"], buttSize: ["giant","flat masculine"], genitals: [] } }, "Silva Silva": { desires: { skills: ["Management", "Accounting"], mental: ["Diplomatic", "Organized"], physical: ["Fashionable", "Attractive"], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Driving", "Athletics", "Languages"], mental: ["Ambitious"], physical: ["Quick", "Lean"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Persuasion", "Public Speaking"], mental: ["Shrewd", "Confident"], physical: ["Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Disorganized", "Dull"], physical: ["Overweight", "Clumsy", "Plain"], bodyParts: [], chestSize: ["small", "flat"], buttSize: ["small", "flat"], genitals: [] } }, "Grimm Patel": { desires: { skills: ["Legal Knowledge"], mental: ["Calm", "Patient"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking"], mental: ["Stubborn", "Cynical"], physical: ["Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Stealth", "Persuasion"], mental: ["Dominant", "Shrewd"], physical: ["Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Naive", "Trusting", "Submissive"], physical: ["Weak", "Youthful", "Soft"], bodyParts: [], chestSize: ["medium", "large", "huge", "giant"], buttSize: ["medium", "large", "huge", "giant"], genitals: [] } }, "Scarlett Vex": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Photography", "Dancing"], mental: ["Ambitious", "Arrogant"], physical: ["Fit", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Acting", "Modeling"], mental: ["Confident", "Outgoing"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Submissive"], physical: ["Ugly", "Plain", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jade Nightshade": { desires: { skills: ["Persuasion", "Social Media"], mental: ["Confident", "Alluring"], physical: ["Voluptuous"], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Singing", "Acting"], mental: ["Creative"], physical: ["Flexible", "Graceful"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Sexually Skilled"], mental: ["Sly"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Honest", "Naive", "Insecure"], physical: ["Plain", "Stiff", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Apollo Sterling": { desires: { skills: ["Acting", "Photography"], mental: ["Ambitious", "Charismatic"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music", "Athletics"], mental: ["Creative"], physical: ["Flexible", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Modeling"], mental: ["Confident", "Outgoing"], physical: ["Muscular"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Awkward", "Insecure"], physical: ["Ugly", "Overweight", "Weak"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Diamond Murphy": { desires: { skills: ["Management", "Sales"], mental: ["Organized", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Baking", "Stealth"], mental: ["Stubborn", "Selfish"], physical: ["Tattooed"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Persuasion"], mental: ["Sly", "Hardworking"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Naive", "Trusting", "Kind"], physical: ["Soft", "Youthful", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Tank Morrison": { desires: { skills: ["First Aid", "Driving"], mental: ["Patient", "Intelligent"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking", "Athletics"], mental: [], physical: ["Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Heavy Lifting"], mental: ["Brave", "Calm", "Honest", "Loyal"], physical: ["Muscular", "Tall", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Selfish", "Cowardly"], physical: ["Weak", "Clumsy", "Frail"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Candace Luxe": { desires: { skills: ["Photography", "Art"], mental: ["Creative", "Sensitive"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Painting", "Dancing"], mental: ["Friendly", "Empathetic"], physical: ["Pierced", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Confident", "Warm"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cold", "Cruel", "Aggressive"], physical: ["Scarred", "Blemished", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Ruby Becker": { desires: { skills: ["Public Speaking", "Acting"], mental: ["Confident", "Outgoing"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Writing", "Photography"], mental: ["Creative", "Shy"], physical: ["Freckled", "Smooth Skin"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Kind", "Sensitive"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Scarred", "Ugly", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sapphire Wallace": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Martial Arts", "Dancing"], mental: ["Ambitious", "Aggressive"], physical: ["Tattooed", "Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Dominant", "Confident"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Weak"], physical: ["Soft", "Weak", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jasmine Abrams": { desires: { skills: ["Meditation", "Art"], mental: ["Calm", "Creative"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Yoga"], mental: ["Patient", "Submissive"], physical: ["Flexible", "Graceful", "Smooth Skin"], bodyParts: [], chestSize: ["medium"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled", "Dancing"], mental: ["Friendly", "Kind"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Scarred", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Ebony Vasquez": { desires: { skills: ["Management", "Public Speaking"], mental: ["Confident", "Ambitious"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Acting", "Singing"], mental: ["Competitive"], physical: ["Smooth Skin"], bodyParts: [], chestSize: ["large"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Sly", "Witty"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Dull"], physical: ["Ugly", "Plain", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Amber Skye": { desires: { skills: ["Photography", "Acting"], mental: ["Creative", "Ambitious"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Social Media", "Music"], mental: ["Curious", "Naive"], physical: ["Youthful", "Smooth Skin"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sexually Skilled"], mental: ["Optimistic", "Energetic"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cynical", "Cruel", "Pessimistic"], physical: ["Scarred", "Ugly", "Mature"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Kate Velvet": { desires: { skills: ["Legal Knowledge", "Public Speaking"], mental: ["Intelligent", "Diplomatic"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Languages"], mental: ["Arrogant"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Management", "Persuasion", "Accounting", "Sexually Skilled"], mental: ["Dominant", "Shrewd", "Ambitious", "Confident"], physical: ["Attractive", "Mature", "Voluptuous", "Sharp Features"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: false }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Naive", "Foolish"], physical: ["Ugly", "Youthful", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Bella Carver": { desires: { skills: ["Management", "Business"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Acting", "Makeup"], mental: ["Creative", "Naive"], physical: ["Youthful"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Social Media", "Photography"], mental: ["Outgoing", "Ambitious"], physical: ["Attractive", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Introverted", "Cynical", "Mature"], physical: ["Ugly", "Mature", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jake Steel": { desires: { skills: ["Mechanical Repair"], mental: ["Patient", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Fishing", "Driving"], mental: ["Calm"], physical: ["Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Hardworking", "Honest", "Loyal"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Deceitful", "Lazy"], physical: ["Weak", "Clumsy", "Soft"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Marco Rodriguez": { desires: { skills: ["Dancing", "Music"], mental: ["Creative", "Outgoing"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Cooking", "Guitar"], mental: ["Friendly"], physical: ["Tattooed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Competitive", "Brave"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Introverted", "Cold"], physical: ["Weak", "Stiff", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Tyrone Washington": { desires: { skills: ["Business", "Public Speaking"], mental: ["Ambitious", "Confident"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Basketball", "Music"], mental: [], physical: ["Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Outgoing", "Witty"], physical: ["Muscular", "Strong", "Sturdy", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Submissive"], physical: ["Short", "Weak", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sheryl Williams": { desires: { skills: ["Management", "Leadership"], mental: ["Organized", "Diplomatic"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Gardening"], mental: ["Stubborn"], physical: ["Athletic Build"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction", "Martial Arts"], mental: ["Hardworking", "Brave"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive", "Shy", "Weak"], physical: ["Soft", "Weak", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "David O'Brien": { desires: { skills: ["Art", "Music"], mental: ["Creative", "Calm"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Plumbing", "Painting"], mental: [], physical: ["Freckled"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Construction"], mental: ["Calm", "Patient", "Thoughtful"], physical: ["Muscular", "Strong", "Sturdy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Loud", "Arrogant"], physical: ["Weak", "Clumsy", "Ugly"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Mike Murphy": { desires: { skills: ["Combat Training"], mental: ["Disciplined", "Focused"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], desiredJob: "Brothel Worker" }, willingToTrade: { skills: ["Cooking", "Swimming"], mental: ["Aggressive", "Short Tempered"], physical: ["Tattooed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Competitive", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Calm", "Patient", "Submissive"], physical: ["Weak", "Soft", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Carlos Mendez": { desires: { skills: ["Cooking", "Performance"], mental: ["Creative", "Charming"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Dancing", "Guitar"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Friendly", "Outgoing", "Optimistic"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cold", "Cruel", "Pessimistic"], physical: ["Ugly", "Scarred", "Weak"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Jamal Rivers": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Basketball", "Writing"], mental: [], physical: ["Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Intelligent", "Competitive"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Foolish", "Disorganized"], physical: ["Weak", "Overweight", "Clumsy"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Rosa Otterino": { desires: { skills: ["Art", "Photography"], mental: ["Creative", "Patient"], physical: [], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Swimming", "Painting"], mental: [], physical: ["Athletic Build", "Tattooed"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Hardworking", "Honest", "Calm"], physical: ["Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Deceitful", "Lazy"], physical: ["Weak", "Soft", "Clumsy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Keisha Jackson": { desires: { skills: ["Performance", "Music"], mental: ["Creative", "Outgoing"], physical: ["Attractive"], bodyParts: [], chestSize: ["large", "huge","flat masculine"], buttSize: ["huge", "giant","flat masculine"], genitals: [] }, willingToTrade: { skills: ["Singing", "Cooking"], mental: [], physical: ["Curvy"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Heavy Lifting", "Athletics"], mental: ["Confident", "Outgoing", "Brave"], physical: ["Muscular", "Strong", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Introverted", "Cold"], physical: ["Weak", "Plain", "Slim"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Dick Richardson": { desires: { skills: ["Business", "Finance"], mental: ["Shrewd", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: ["Arrogant", "Selfish"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Public Speaking", "Management", "Legal Knowledge"], mental: ["Shrewd", "Ambitious", "Dominant"], physical: ["Mature", "Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Honest", "Kind", "Submissive"], physical: ["Youthful", "Attractive", "Weak"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Creo Applesauce": { desires: { skills: ["Art", "Music"], mental: ["Creative", "Confident"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Piano", "Languages"], mental: ["Submissive", "Anxious"], physical: ["Lean"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Management", "Accounting", "Coding"], mental: ["Intelligent", "Analytical", "Patient"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Dominant", "Arrogant"], physical: ["Muscular", "Scarred", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Brad Icus": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Gardening", "Cooking"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Athletics", "Sales", "Heavy Lifting"], mental: ["Energetic", "Friendly", "Optimistic"], physical: ["Fit", "Muscular", "Athletic Build", "Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Pessimistic", "Introverted"], physical: ["Weak", "Overweight", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Raven Bido": { desires: { skills: ["Music", "Performance"], mental: ["Confident", "Outgoing"], physical: [], bodyParts: [], chestSize: ["medium", "large","flat masculine"], buttSize: ["medium", "large","flat masculine"], genitals: [] }, willingToTrade: { skills: [], mental: ["Introverted", "Shy"], physical: ["Lean", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Art", "Painting", "Music", "Writing"], mental: ["Creative", "Curious"], physical: ["Tattooed", "Pierced"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Prep", "Optimistic"], physical: ["Plain", "Fashionable", "Smooth Skin"], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] } }, "Crystal Meffin": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Art", "Photography"], mental: [], physical: ["Youthful"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup"], mental: ["Friendly", "Outgoing", "Creative"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Introverted", "Cynical", "Rude"], physical: ["Ugly", "Clumsy", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Sophi Boris": { desires: { skills: ["Acting", "Performance"], mental: ["Creative", "Confident"], physical: [], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Social Media", "Singing"], mental: ["Arrogant"], physical: ["Curvy"], bodyParts: [], chestSize: ["large"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup", "Dancing"], mental: ["Witty", "Ambitious"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Humble", "Submissive"], physical: ["Plain", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Naomi Light": { desires: { skills: ["Meditation", "Teaching"], mental: ["Calm", "Wise"], physical: [], bodyParts: [], chestSize: ["medium", "large","flat masculine"], buttSize: ["large", "huge","flat masculine"], genitals: [] }, willingToTrade: { skills: ["Yoga", "Gardening"], mental: [], physical: ["Flexible"], bodyParts: [], chestSize: ["small"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Hair Styling", "Makeup"], mental: ["Kind", "Patient", "Empathetic"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Scarred", "Ugly", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Kevin Oats": { desires: { skills: ["Social Skills", "Public Speaking"], mental: ["Confident", "Outgoing"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], desiredJob: "Brothel Worker" }, willingToTrade: { skills: ["Gaming"], mental: ["Shy", "Awkward", "Insecure"], physical: ["Lean", "Youthful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Coding", "Sales", "Math Skills"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: ["flat masculine"], buttSize: ["flat masculine"], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Aggressive", "Dominant"], physical: ["Ugly", "Muscular", "Scarred"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Destiny Pumpkin": { desires: { skills: ["Business", "Management"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Art", "Writing"], mental: ["Selfish"], physical: ["Tattooed", "Pierced"], bodyParts: [], chestSize: ["huge"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Persuasion", "Sexually Skilled"], mental: ["Confident", "Sly", "Creative"], physical: ["Attractive", "Voluptuous"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Kind", "Honest", "Submissive"], physical: ["Plain", "Ugly", "Soft"], bodyParts: [], chestSize: ["flat", "small", "medium"], buttSize: ["flat", "small"], genitals: [] } }, "Alex Passionfruit": { desires: { skills: ["Art", "Photography"], mental: ["Creative", "Sensitive"], physical: [], bodyParts: ["huge"], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music", "Gaming"], mental: [], physical: ["Lean", "Pierced"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Sales", "Persuasion", "Sexually Skilled"], mental: ["Outgoing", "Witty", "Curious"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: ["Femboy"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Ugly", "Muscular", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Hannah Chuckins": { desires: { skills: ["Business", "Sales"], mental: ["Ambitious", "Confident"], physical: [], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: ["Painting", "Singing"], mental: ["Shy"], physical: ["Freckled"], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Baking", "Cooking", "Gardening"], mental: ["Kind", "Patient", "Creative"], physical: ["Soft", "Curvy"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cruel", "Aggressive", "Arrogant"], physical: ["Ugly", "Scarred", "Athletic Build"], bodyParts: [], chestSize: ["flat", "small"], buttSize: ["flat", "small"], genitals: [] } }, "Pheiffer Coms": { desires: { skills: ["Medicine", "Investigation"], mental: ["Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Fishing"], mental: ["Stubborn"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Combat", "Driving", "First Aid", "Athletics"], mental: ["Brave", "Honest"], physical: ["Fit", "Strong", "Athletic Build", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Cowardly", "Lazy"], physical: ["Weak", "Overweight", "Clumsy"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Fen Ris": { desires: { skills: ["Legal Knowledge", "Sexually Skilled"], mental: ["Calm", "Patient", "Honest"], physical: ["Curvy"], bodyParts: [], chestSize: ["giant"], buttSize: ["large", "huge", "giant"], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: ["huge"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Teaching", "Athletics", "Heavy Lifting", "Combat", "Yoga"], mental: ["Confident"], physical: ["Sharp Features", "Muscular", "Athletic Build", "Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: ["Calm", "Patient", "Honest"], physical: ["Were-Creature"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Deceitful", "Cowardly", "Cruel"], physical: ["Weak", "Ugly", "Blemished"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Selkira Onyxia": { desires: { skills: ["Public Speaking", "Social Media"], mental: ["Extroverted", "Patient", "Warm"], physical: ["Pale Skin"], bodyParts: [], chestSize: ["huge"], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Serving", "Acting", "Languages"], mental: ["Overthinker", "Impulsive", "Cold", "Jealous"], physical: ["Broad-shouldered"], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [], job: true }, reluctantToTrade: { skills: ["High Heels Proficient", "Sexually Skilled"], mental: ["Seductive", "Alluring"], physical: ["Silky Voice"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: ["Dominant"], physical: ["Curvy", "Flexible"], bodyParts: ["gender"], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Submissive"], physical: ["Ugly", "Overweight", "Blemished", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Janis Besser": { desires: { skills: ["Modeling", "Sexually Skilled"], mental: ["Competitive", "Creative", "Intelligent"], physical: ["Voluptuous"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [] }, willingToTrade: { skills: ["Gardening", "Painting"], mental: ["Shy", "Nurturing"], physical: ["Petite", "Soft", "Freckled", "Youthful"], bodyParts: [], chestSize: ["small"], buttSize: ["small"], genitals: [], job: true }, reluctantToTrade: { skills: ["Baking", "Cooking"], mental: ["Kind", "Patient", "Creative"], physical: ["Warm Tone", "Quick"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Aggressive", "Cruel", "Arrogant"], physical: ["Muscular", "Tall", "Scarred", "Ugly"], bodyParts: [], chestSize: ["flat masculine", "giant"], buttSize: ["flat masculine", "giant"], genitals: [] } }, "Dennis Fungi": { desires: { skills: ["Music", "Performance", "Art"], mental: ["Creative", "Ambitious"], physical: ["Attractive"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Yoga"], mental: ["Energetic"], physical: ["Flexible"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Teaching", "Athletics"], mental: ["Confident", "Outgoing", "Disciplined"], physical: ["Fit", "Athletic Build", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Clumsy", "Stiff"], physical: ["Overweight", "Weak", "Ugly"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["huge", "giant"], genitals: [] } }, "Yvela Mushroom": { desires: { skills: ["Performance", "Acting", "Music"], mental: ["Outgoing", "Creative"], physical: ["Attractive", "Flexible"], bodyParts: [], chestSize: ["small", "flat"], buttSize: ["small", "flat"], genitals: [] }, willingToTrade: { skills: ["Martial Arts"], mental: ["Competitive"], physical: [], bodyParts: [], chestSize: ["medium"], buttSize: ["large"], genitals: [], job: true }, reluctantToTrade: { skills: ["Dancing", "Teaching", "Athletics", "Yoga"], mental: ["Confident", "Ambitious", "Disciplined"], physical: ["Fit", "Athletic Build", "Graceful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Shy", "Submissive"], physical: ["Overweight", "Weak", "Clumsy", "Stiff", "Ugly"], bodyParts: [], chestSize: ["flat masculine"], buttSize: ["flat masculine"], genitals: [] } }, "Banana Banana": { desires: { skills: ["Customer Service", "Social Media"], mental: ["Creative", "Outgoing"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Music"], mental: ["Talkative"], physical: ["Youthful", "Quick"], bodyParts: [], chestSize: ["medium"], buttSize: ["medium"], genitals: [], job: true }, reluctantToTrade: { skills: ["Cooking", "Art"], mental: ["Friendly", "Optimistic", "Energetic", "Bubbly"], physical: ["Friendly Tone", "Fashionable"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Cynical", "Rude", "Introverted"], physical: ["Ugly", "Mature", "Plain"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Xenis Aku": { desires: { skills: ["Navigation", "Mechanical Repair"], mental: ["Organized", "Patient"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: ["Introverted"], physical: ["Mature", "Relaxed"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Driving", "Customer Service", "First Aid"], mental: ["Calm", "Honest", "Reliable", "Thoughtful"], physical: ["Sturdy", "Calm Voice"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Unreliable", "Reckless", "Aggressive"], physical: ["Weak", "Clumsy", "Youthful"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Xanithar Galdenentri": { desires: { skills: ["Medicine", "Teaching"], mental: ["Wise", "Intelligent", "Analytical"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Writing", "Languages"], mental: ["Paranoid", "Erratic", "Obsessive"], physical: ["Underweight", "Mumbly Voice", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: [], mental: ["Crazy", "Eccentric", "Intelligent", "Bookworm"], physical: ["Mature", "Freckled"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Magic Theory"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Dull", "Foolish", "Simple"], physical: ["Muscular", "Attractive", "Youthful"], bodyParts: [], chestSize: ["large", "huge", "giant"], buttSize: ["large", "huge", "giant"], genitals: [] } }, "Trixie Rye": { desires: { skills: ["Management", "Business"], mental: ["Ambitious", "Organized"], physical: [], bodyParts: [], chestSize: ["giant"], buttSize: ["giant"], genitals: [] }, willingToTrade: { skills: ["Dancing"], mental: ["Sly"], physical: ["Smooth Skin"], bodyParts: [], chestSize: ["huge"], buttSize: ["huge"], genitals: [], job: true }, reluctantToTrade: { skills: ["Serving", "High Heels Proficient", "Customer Service", "Persuasion"], mental: ["Confident", "Flirty", "Witty", "Outgoing"], physical: ["Attractive", "Voluptuous", "Graceful", "Charming Tone"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Insecure", "Honest"], physical: ["Ugly", "Plain", "Clumsy", "Stiff"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Butt Johnson": { desires: { skills: ["Gaming", "Coding", "Tech-Savvy", "Social Media", "Animation", "Video Editing"], mental: ["Focused", "Organized", "Confident", "Witty"], physical: ["Fit", "Attractive", "Lean", "Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Forklift Certified"], mental: ["Lazy", "Disorganized", "Forgetful", "Shy", "Awkward"], physical: ["Overweight", "Plain", "Blemished", "Unkempt"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Gaming", "Coding", "Tech-Savvy"], mental: ["Nerd", "Introverted", "Obsessive"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, neverTrade: { skills: ["Social Media"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: true }, wontTradeFor: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Revna McKraken": { desires: { // She ONLY wants these specific traits for vanity and efficiency skills: ["High Heels Proficient", "Modeling", "Dancing", "Management", "Athletics", "Tech-Savvy", "Coding"], mental: ["Alluring", "Witty", "Efficient", "Quick Learner", "Shrewd"], physical: ["Smooth Skin", "Sharp Features", "Soft", "Flexible", "Fashionable"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { // She's a vampire - she NEVER gives anything away skills: ["Sexually Skilled", "Stealth", "Persuasion", "Acting", "Languages", "Product Knowledge", "Martial Arts", "Gardening", "Writing", "Medicine", "Combat", "High Heels Proficient", "Modeling", "Dancing", "Management", "Athletics", "Tech-Savvy", "Coding", "Occult Expert"], mental: ["Charming", "Diplomatic", "Bookworm", "Seductive", "Intelligent", "Moody", "Sly", "Confident", "Creative", "Patient", "Perceptive", "Deceitful", "Goth", "Alluring", "Witty", "Efficient", "Quick Learner", "Shrewd"], physical: ["Pale Skin", "Attractive", "Graceful", "Voluptuous", "Quick Reflexes", "Smooth Skin", "Sharp Features", "Soft", "Flexible", "Fashionable", "Definitely not a Vampire"], voiceTraits: ["Silky Voice"], bodyParts: ["gender", "skinTone", "hairColor", "hairLength", "age", "genitals"], chestSize: ["medium"], buttSize: ["medium"], genitals: ["vagina"], name: true, job: true }, wontTradeFor: { // She ONLY accepts what she desires - everything else is rejected // All skills EXCEPT her desires skills: ["Sexually Skilled", "Stealth", "Persuasion", "Acting", "Languages", "Product Knowledge", "Martial Arts", "Gardening", "Writing", "Medicine", "Combat", "Occult Expert", "Math Skills", "Plumbing", "Swimmer", "Swimming", "Makeup", "Cooking", "Photography", "Maid", "Singing", "Serving", "Hair Styling", "Cleaning", "Trading", "Driving", "Lock Picking", "First Aid", "Construction", "Heavy Lifting", "Social Media", "Baking", "Public Speaking", "Art", "Painting", "Music", "Guitar", "Piano", "Teaching", "Sales", "Accounting", "Legal Knowledge", "Foreign Language", "Languages", "Yoga", "Retail", "Troubleshooting", "Forklift Certified", "Inventory Management", "Customer Service", "Were-Creature", "Sunfish", "Criminal Deluxe", "Oral Expert", "Anal Expert", "Rough Sex Enthusiast", "Sensual Lover", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Roleplay Expert", "Dirty Talker", "Tantric Master", "Exhibitionist", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"], // All mental traits EXCEPT her desires mental: ["Charming", "Diplomatic", "Bookworm", "Seductive", "Intelligent", "Moody", "Sly", "Confident", "Creative", "Patient", "Perceptive", "Deceitful", "Goth", "Swift", "Silver-Tongued", "Bimbo", "Pensive", "Jock", "Naturally Gifted", "Extroverted", "Introverted", "Bitchy", "Kind", "Honest", "Dominant", "Submissive", "Shy", "Aggressive", "Passive", "Optimistic", "Pessimistic", "Cruel", "Empathetic", "Stubborn", "Jealous", "Supportive", "Friendly", "Competitive", "Logical", "Lazy", "Hardworking", "Arrogant", "Humble", "Paranoid", "Trusting", "Ambitious", "Complacent", "Dull", "Brave", "Cowardly", "Mature", "Impatient", "Patient", "Wise", "Foolish", "Analytical", "Outgoing", "Curious", "Calm", "Energetic", "Thoughtful", "Chill", "Nonchalant", "Organized", "Resourceful", "Focused", "Disciplined", "Determined", "Steadfast", "Considerate", "Polite", "Funny", "Reassuring", "Loyal", "Talkative", "Direct", "Negotiator", "Crafty", "Workaholic", "High Stamina", "Flirty", "Warm", "Lucky", "Blunt", "Perfectionist", "Overthinker", "Unpredictable", "Risk Taker", "Impulsive", "Cynical", "Quiet", "Awkward", "Tone Deaf", "Tease", "Clingy", "Sensitive", "Corporate Drone", "Forgetful", "Disorganized", "Selfish", "Erratic", "Obsessive", "Insecure", "Short Tempered", "Rude", "Unreliable", "Slow Learner", "Reckless", "Cold", "Insensitive", "Unskilled", "Unlucky", "Nerd", "Geek", "Prep", "Tomboy", "Femboy", "Diva", "High Energy", "Deep Thinker", "Monotone Expression", "Sarcastic", "Artistic", "Relaxed", "Humorous", "Detail-Oriented", "Customer-Focused", "Punctual", "Naive", "Tech Savvy", "Delinquent", "Musky", "Perverted", "Gambling Addiction"], // All physical traits EXCEPT her desires physical: ["Pale Skin", "Attractive", "Graceful", "Voluptuous", "Quick Reflexes", "Definitely not a Vampire", "Tall", "Short", "Curvy", "Lean", "Muscular", "Pierced", "Youthful", "Mature", "Tan Skin", "Dark Skin", "Plain", "Ugly", "Fit", "Overweight", "Underweight", "Strong", "Clumsy", "Weak", "Stiff", "Freckled", "Blemished", "Tattooed", "Athletic Build", "Petite", "Broad-shouldered", "Quick", "Sturdy", "Scarred", "Short Hair", "Long Hair", "Fast", "Slow", "Were-Creature", "Sunfish"], // All voice traits voiceTraits: ["Silky Voice", "Smooth Voice", "Soft-Spoken", "Warm Tone", "Gentle Voice", "Soothing Tone", "Clear Enunciation", "Articulate Speech", "Smooth Talker", "Friendly Tone", "Charismatic Voice", "Steady Voice", "Pleasant Cadence", "Calm Voice", "Expressive Voice", "Animated Tone", "Lively Tone", "Charming Tone", "Hushed Intimate Voice", "Balanced Neutral Tone", "Sing-Songy Voice", "Eager Tone", "Bouncy Tone", "Melodic Voice", "Clear Pronunciation", "Even-Paced Voice", "Understated Voice", "Soft Monologue Style", "Fast Talker", "Rapid-Fire Speech", "Deep Voice", "High-Pitched Tone", "Raspy Voice", "Gravelly Voice", "Croaky Voice", "Breathy Voice", "Nasally Tone", "Stoic Tone", "Measured Speech", "Choppy Speech", "Interruptive Tone", "Sharp Voice", "Snappy Tone", "Flat Voice", "Monotone", "Deadpan Delivery", "Detached Voice", "Emotionless Tone", "Slow Calm Voice", "Lazy Drawl", "Mumbly Voice", "Stuttering Speech", "Grim Tone", "Robotic Tone", "Flat Uninterested Voice", "Whiny Voice", "Slurred Speech", "Shaky Voice", "Gaelic Accent"], // All body parts bodyParts: ["gender", "skinTone", "hairColor", "hairLength", "age", "genitals", "chest", "butt"], // All chest sizes chestSize: ["flat", "flat masculine", "small", "medium", "large", "huge", "giant", "gigantic"], // All butt sizes buttSize: ["flat", "flat masculine", "small", "medium", "large", "huge", "giant", "gigantic"], // All genital types genitals: ["small penis", "penis", "big penis", "tight vagina", "vagina", "loose vagina"] } }, "Purple Wood": { desires: { skills: ["Languages", "Coding", "Math Skills"], mental: ["Intelligent", "Analytical", "Logical", "Wise"], physical: [], bodyParts: [], chestSize: ["medium", "large"], buttSize: ["huge", "giant"], genitals: [] }, willingToTrade: { skills: [], mental: ["Bimbo", "Moody"], physical: ["Pierced"], bodyParts: [], chestSize: ["small"], buttSize: [], genitals: [], job: true }, reluctantToTrade: { skills: ["Art", "Music", "Painting", "Writing"], mental: ["Creative", "Introverted", "Goth"], physical: ["Attractive", "Tattooed", "Graceful"], bodyParts: [], chestSize: [], buttSize: ["huge"], genitals: [] }, neverTrade: { skills: [], mental: [], physical: ["Pale Skin"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Arrogant", "Cruel", "Optimistic", "Prep"], physical: ["Plain", "Fashionable", "Muscular"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Luna Snow": { desires: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Art", "Music", "Guitar"], mental: ["Stubborn", "Artistic", "Wise", "Intelligent", "Lucky", "Bookworm", "Creative", "Calm", "Funny", "Charming", "Charismatic Voice", "Warm"], physical: ["Short", "Attractive", "Youthful", "Curvy", "Fit"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: true, job: true }, wontTradeFor: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Luna Snow": { desires: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Art", "Music", "Guitar"], mental: ["Stubborn", "Artistic", "Wise", "Intelligent", "Lucky", "Bookworm", "Creative", "Calm", "Funny", "Charming", "Charismatic Voice", "Warm"], physical: ["Short", "Attractive", "Youthful", "Curvy", "Fit"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: true, job: true }, wontTradeFor: { skills: [], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Boris Shorthead": { desires: { skills: ["Heavy Lifting", "Construction", "Athletics"], mental: ["Stubborn", "Aggressive", "Dominant"], physical: ["Tall", "Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Public Speaking", "First Aid"], mental: ["Blunt", "Loyal"], physical: ["Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Combat", "Driving"], mental: ["Disciplined", "Brave"], physical: ["Muscular", "Strong"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: ["Short"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Shy", "Submissive", "Cowardly"], physical: ["Weak", "Clumsy", "Petite"], bodyParts: [], chestSize: ["huge", "giant"], buttSize: ["huge", "giant"], genitals: [] } }, "Mareregererrer Mayonnaise": { desires: { skills: ["Management", "Legal Knowledge", "Persuasion"], mental: ["Ambitious", "Shrewd", "Diplomatic"], physical: ["Attractive", "Fashionable"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["First Aid", "Persuasion"], mental: ["Direct", "Analytical"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Combat", "Driving"], mental: ["Confident", "Determined"], physical: ["Athletic Build", "Fit"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: ["Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Lazy", "Foolish", "Reckless"], physical: ["Ugly", "Weak", "Overweight"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Poggies Name420": { desires: { skills: ["Modeling", "Makeup", "Dancing", "Sexually Skilled"], mental: ["Seductive", "Flirty", "Alluring", "Charming"], physical: ["Attractive", "Curvy", "Voluptuous", "Fashionable"], bodyParts: [], chestSize: ["medium", "large", "huge"], buttSize: ["huge", "giant", "gigantic"], genitals: [] }, willingToTrade: { skills: ["High Heels Proficient", "Dancing"], mental: ["Energetic", "Flirty"], physical: ["Graceful", "Smooth Skin"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Combat", "Driving"], mental: ["Confident", "Unpredictable"], physical: ["Petite"], bodyParts: [], chestSize: [], buttSize: ["giant"], genitals: [] }, neverTrade: { skills: [], mental: ["Femboy"], physical: ["Long Hair"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: true }, wontTradeFor: { skills: [], mental: ["Boring", "Dull", "Cold"], physical: ["Ugly", "Muscular", "Broad-shouldered"], bodyParts: [], chestSize: [], buttSize: ["flat", "small"], genitals: [] } }, "Sunny Flipflop": { desires: { skills: ["Medicine", "Stealth", "Persuasion"], mental: ["Shrewd", "Analytical", "Diplomatic"], physical: ["Intimidating", "Scarred"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: ["Driving", "First Aid"], mental: ["Ambitious"], physical: ["Athletic Build"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Combat", "Legal Knowledge", "Management", "Public Speaking", "Persuasion"], mental: ["Confident", "Disciplined", "Brave", "Honest", "Loyal"], physical: ["Muscular", "Strong", "Fit", "Tall"], bodyParts: [], chestSize: [], buttSize: [], genitals: ["big penis"] }, neverTrade: { skills: [], mental: ["Hardworking", "Organized"], physical: ["Dark Skin"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: true }, wontTradeFor: { skills: [], mental: ["Deceitful", "Cowardly", "Lazy", "Corrupt"], physical: ["Weak", "Clumsy", "Overweight"], bodyParts: [], chestSize: ["giant"], buttSize: [], genitals: [] } }, "Bongo Bongo": { desires: { skills: ["Management", "Sales", "Martial Arts"], mental: ["Confident", "Ambitious", "Witty"], physical: ["Attractive", "Graceful"], bodyParts: [], chestSize: ["large", "huge"], buttSize: ["large", "huge"], genitals: [] }, willingToTrade: { skills: ["Product Knowledge", "Inventory Management"], mental: ["Patient", "Polite"], physical: ["Sharp Features"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], job: false }, reluctantToTrade: { skills: ["Customer Service", "Combat", "First Aid"], mental: ["Friendly", "Brave", "Disciplined", "Organized"], physical: ["Fit", "Quick Reflexes"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: [], mental: [], physical: ["Pale Skin", "Long Hair"], bodyParts: [], chestSize: [], buttSize: [], genitals: [], name: false, job: false }, wontTradeFor: { skills: [], mental: ["Rude", "Disorganized", "Lazy"], physical: ["Ugly", "Clumsy", "Blemished"], bodyParts: [], chestSize: [], buttSize: [], genitals: [] } }, "Roisin Sullivan": { desires: { skills: ["BDSM Enthusiast - Dom", "Occult Expert", "Persuasion"], mental: ["Analytical", "Chill", "Considerate", "Creative", "Friendly", "Funny", "Hardworking", "High Stamina", "Humorous", "Mature", "Perverted", "Sarcastic", "Seductive", "Were-Creature"], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, willingToTrade: { skills: [], mental: ["Cold", "Disorganized", "Forgetful", "Impatient", "Insecure", "Reckless", "Sensitive", "Stubborn"], physical: [], bodyParts: [], chestSize: ["gigantic"], buttSize: ["gigantic"], genitals: [], job: false }, reluctantToTrade: { skills: ["Forklift Certified"], mental: [], physical: [], bodyParts: [], chestSize: [], buttSize: [], genitals: [] }, neverTrade: { skills: ["Athletics", "Baking", "Combat", "Driving", "Gardening", "Heavy Lifting", "Swimmer"], mental: ["Alluring", "Ambitious", "Blunt", "Competitive", "Confident", "Delinquent", "Determined", "Dominant", "Efficient", "Extroverted", "Lucky", "Risk Taker", "Steadfast"], physical: ["Athletic Build", "Attractive", "Fast", "Fit", "Flexible", "Long Hair", "Perceptive", "Quick Reflexes", "Relaxed", "Smooth Skin", "Strong", "Sturdy", "Tall", "Youthful"], bodyParts: ["chest", "butt", "genitals"], chestSize: ["huge"], buttSize: ["large"], genitals: ["tight vagina"], voiceTraits: ["Gaelic Accent"], name: true, job: true }, wontTradeFor: { skills: ["Anal Expert", "BDSM Enthusiast - Sub", "Dancing", "High Heels Proficient", "Maid", "Oral Expert", "Social Media"], mental: ["Awkward", "Bimbo", "Bookworm", "Corrupt", "Cynical", "Flirty", "Introverted", "Kind", "Loyal", "Musky", "Negotiator", "Nonchalant", "Paranoid", "Quiet", "Shy", "Sunfish", "Tease", "Tone Deaf", "Unlucky", "Unpredictable", "Unskilled"], physical: ["Blemished", "Clumsy", "Definitely not a Vampire", "Monotone Expression", "Overweight", "Petite", "Plain", "Short", "Slow", "Soft", "Stiff", "Ugly", "Underweight", "Voluptuous", "Weak"], bodyParts: [], chestSize: ["gigantic", "giant", "large chest", "average chest", "small chest", "flat chest", "flat masculine", "masculine chest"], buttSize: ["gigantic", "giant", "large butt", "average butt", "small butt", "flat butt", "flat masculine", "masculine butt"], genitals: [] } } }>> /* ================================== */ /* === NPC TRADING PREFERENCE FUNCTIONS === */ /* ================================== */ /* Function to check if NPC has trading preferences defined */ <<set setup.getNPCPreferences = function(npcNameOrObject) { /* If passed an NPC object, use their permanent ID */ if (typeof npcNameOrObject === 'object' && npcNameOrObject.permanentId) { return setup.npcTradingPreferences[npcNameOrObject.permanentId] || null; } /* Otherwise treat as name string */ return setup.npcTradingPreferences[npcNameOrObject] || null; }>> /* Function to calculate preference-based trade chance modifier */ <<set setup.calculatePreferenceModifier = function(npc, playerPackage, npcPackage) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return 0; var modifier = 0; // Check what player is OFFERING that NPC desires if (preferences.desires) { if (playerPackage.skills && preferences.desires.skills) { playerPackage.skills.forEach(function(skill) { if (preferences.desires.skills.includes(skill)) { modifier += 30; } }); } if (playerPackage.mental && preferences.desires.mental) { playerPackage.mental.forEach(function(trait) { if (preferences.desires.mental.includes(trait)) { modifier += 15; } }); } if (playerPackage.physical && preferences.desires.physical) { playerPackage.physical.forEach(function(trait) { if (preferences.desires.physical.includes(trait)) { modifier += 15; } }); } if (playerPackage.bodyParts && preferences.desires.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (preferences.desires.bodyParts.includes(part.name)) { modifier += 20; } }); } } // Check what player is REQUESTING that NPC is reluctant to trade if (preferences.reluctantToTrade) { if (npcPackage.skills && preferences.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (preferences.reluctantToTrade.skills.includes(skill)) { modifier -= 20; } }); } if (npcPackage.mental && preferences.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (preferences.reluctantToTrade.mental.includes(trait)) { modifier -= 15; } }); } if (npcPackage.physical && preferences.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (preferences.reluctantToTrade.physical.includes(trait)) { modifier -= 50; } }); } if (npcPackage.bodyParts && preferences.reluctantToTrade.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (preferences.reluctantToTrade.bodyParts.includes(part.name)) { modifier -= 25; } }); } } return modifier; }>> /* Function to check if trade is blocked by NPC's "never trade" or "wont trade for" rules */ <<set setup.isTradeBlocked = function(npc, playerPackage, npcPackage) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return false; // Check "never trade" - things NPC won't give away (only check npcPackage - what NPC actually has and is offering) if (preferences.neverTrade) { var neverTrade = preferences.neverTrade; // Check if player is requesting NPC's name if (neverTrade.name && npcPackage.name && npcPackage.name.length > 0) { return true; } // Check if player is requesting NPC's job if (neverTrade.job && npcPackage.job !== null && npcPackage.job !== undefined) { return true; } // ONLY block if the NPC is actually offering these items (they're in npcPackage) if (npcPackage.skills && neverTrade.skills) { for (var i = 0; i < npcPackage.skills.length; i++) { if (neverTrade.skills.includes(npcPackage.skills[i])) { return true; } } } if (npcPackage.mental && neverTrade.mental) { for (var i = 0; i < npcPackage.mental.length; i++) { if (neverTrade.mental.includes(npcPackage.mental[i])) { return true; } } } if (npcPackage.physical && neverTrade.physical) { for (var i = 0; i < npcPackage.physical.length; i++) { if (neverTrade.physical.includes(npcPackage.physical[i])) { return true; } } } if (npcPackage.bodyParts && neverTrade.bodyParts) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (neverTrade.bodyParts.includes(npcPackage.bodyParts[i].name)) { return true; } } } // Check chest sizes in NPC package if (npcPackage.bodyParts && neverTrade.chestSize) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "chest") { var npcChestSize = npc.bodyParts.chest; if (neverTrade.chestSize.includes(npcChestSize)) { return true; } } } } // Check butt sizes in NPC package if (npcPackage.bodyParts && neverTrade.buttSize) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "butt") { var npcButtSize = npc.bodyParts.butt; if (neverTrade.buttSize.includes(npcButtSize)) { return true; } } } } // Check genitals in NPC package if (npcPackage.bodyParts && neverTrade.genitals) { for (var i = 0; i < npcPackage.bodyParts.length; i++) { if (npcPackage.bodyParts[i].name === "genitals") { var npcGenitals = npc.bodyParts.genitals; if (neverTrade.genitals.includes(npcGenitals)) { return true; } } } } } // Check "wont trade for" - things NPC won't accept from player (only check playerPackage) if (preferences.wontTradeFor) { var wontTradeFor = preferences.wontTradeFor; if (playerPackage.skills && wontTradeFor.skills) { for (var i = 0; i < playerPackage.skills.length; i++) { if (wontTradeFor.skills.includes(playerPackage.skills[i])) { return true; } } } if (playerPackage.mental && wontTradeFor.mental) { for (var i = 0; i < playerPackage.mental.length; i++) { if (wontTradeFor.mental.includes(playerPackage.mental[i])) { return true; } } } if (playerPackage.physical && wontTradeFor.physical) { for (var i = 0; i < playerPackage.physical.length; i++) { if (wontTradeFor.physical.includes(playerPackage.physical[i])) { return true; } } } if (playerPackage.bodyParts && wontTradeFor.bodyParts) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (wontTradeFor.bodyParts.includes(playerPackage.bodyParts[i].name)) { return true; } } } // Check chest sizes in player package if (playerPackage.bodyParts && wontTradeFor.chestSize) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "chest") { var v = State.variables; var playerChestSize = v.bodyParts.chest; if (wontTradeFor.chestSize.includes(playerChestSize)) { return true; } } } } // Check butt sizes in player package if (playerPackage.bodyParts && wontTradeFor.buttSize) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "butt") { var v = State.variables; var playerButtSize = v.bodyParts.butt; if (wontTradeFor.buttSize.includes(playerButtSize)) { return true; } } } } // Check genitals in player package if (playerPackage.bodyParts && wontTradeFor.genitals) { for (var i = 0; i < playerPackage.bodyParts.length; i++) { if (playerPackage.bodyParts[i].name === "genitals") { var v = State.variables; var playerGenitals = v.bodyParts.genitals; if (wontTradeFor.genitals.includes(playerGenitals)) { return true; } } } } } return false; }>> /* Function to calculate preference-based value adjustment */ <<set setup.calculatePreferenceValueAdjustment = function(npc, playerPackage, npcPackage, baseValue) { var preferences = setup.getNPCPreferences(npc); if (!preferences) return baseValue; var multiplier = 1.0; // Items player is offering that NPC desires = reduce required payment if (preferences.desires) { if (playerPackage.skills && preferences.desires.skills) { playerPackage.skills.forEach(function(skill) { if (preferences.desires.skills.includes(skill)) { multiplier *= 0.85; // 15% discount per desired item } }); } if (playerPackage.mental && preferences.desires.mental) { playerPackage.mental.forEach(function(trait) { if (preferences.desires.mental.includes(trait)) { multiplier *= 0.85; } }); } if (playerPackage.physical && preferences.desires.physical) { playerPackage.physical.forEach(function(trait) { if (preferences.desires.physical.includes(trait)) { multiplier *= 0.85; } }); } } // Items NPC is reluctant to trade = increase required payment if (preferences.reluctantToTrade) { if (npcPackage.skills && preferences.reluctantToTrade.skills) { npcPackage.skills.forEach(function(skill) { if (preferences.reluctantToTrade.skills.includes(skill)) { multiplier *= 1.3; // 30% premium for reluctant items } }); } if (npcPackage.mental && preferences.reluctantToTrade.mental) { npcPackage.mental.forEach(function(trait) { if (preferences.reluctantToTrade.mental.includes(trait)) { multiplier *= 1.3; } }); } if (npcPackage.physical && preferences.reluctantToTrade.physical) { npcPackage.physical.forEach(function(trait) { if (preferences.reluctantToTrade.physical.includes(trait)) { multiplier *= 1.3; } }); } } return Math.round(baseValue * multiplier); }>>
/* ---------------------------------- */ /* --- TRADE EXECUTION FUNCTION --- */ /* ---------------------------------- */ // Helper function to check and assign gender-mismatch traits <<set setup.updateGenderMismatchTraits = function(character) { // If no character passed, assume player if (!character) { character = State.variables; } var gender = character.bodyParts.gender; var genitals = character.bodyParts.genitals; var traits = character.physicalTraits; // Remove both special traits first traits.delete("Cuntboy"); traits.delete("Futanari"); // Check for mismatch and add appropriate trait if (gender === "male" && (genitals === "tight vagina" || genitals === "vagina" || genitals === "loose vagina")) { if (!traits.includes("Cuntboy")) { traits.push("Cuntboy"); } } else if (gender === "female" && (genitals === "small penis" || genitals === "penis" || genitals === "big penis")) { if (!traits.includes("Futanari")) { traits.push("Futanari"); } } }>> <<set setup.attemptTrade = function(npc, playerPackage, npcPackage) { var v = State.variables; // Calculate trade chance with relationship and preference adjustments var playerValue = setup.calculateTradeValue(playerPackage, true); var npcValue = setup.calculateTradeValue(npcPackage, false); // Apply preference-based adjustments FIRST (willing/reluctant/desires) var adjustedNpcValue = setup.calculatePreferenceValueAdjustment(npc, playerPackage, npcPackage, npcValue); // THEN apply relationship-based threshold reduction var relLevel = (v.relationships[npc.name]) ? v.relationships[npc.name].level : 1; if (relLevel === 2) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.95); // 5% discount } else if (relLevel === 3) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.90); // 10% discount } else if (relLevel === 4) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.85); // 15% discount } else if (relLevel >= 5) { adjustedNpcValue = Math.floor(adjustedNpcValue * 0.80); // 20% discount (cap) } // ===== SKILL TREE: Apply Trade Value Reduction ===== var skillTreeReduction = setup.skillTree.getEffect("tradeValueReduction"); if (skillTreeReduction > 0) { adjustedNpcValue = Math.max(0, adjustedNpcValue - skillTreeReduction); } // Calculate chance with adjusted value var tradeChance = setup.calculateTradeChance(playerValue, adjustedNpcValue, npc, playerPackage, npcPackage); // Roll for success var roll = Math.random() * 100; var success = roll <= tradeChance; // Initialize result object var result = { success: success, playerGave: { name: [], physical: [], mental: [], skills: [], bodyParts: [], job: null }, playerReceived: { name: [], physical: [], mental: [], skills: [], bodyParts: [], job: null }, npcGave: { physical: [], mental: [], skills: [], bodyParts: [], job: null }, npcReceived: { physical: [], mental: [], skills: [], bodyParts: [], job: null } }; if (success) { // Find the NPC in the main array var npcIndex = -1; for (var i = 0; i < v.npcs.length; i++) { if (v.npcs[i].name === npc.name) { npcIndex = i; break; } } if (npcIndex === -1) { return result; } // Work directly with the NPC in the array var targetNPC = v.npcs[npcIndex]; // Check if we're trading with Roisin (do this early) var isRoisin = (targetNPC.name === "Roisin Sullivan" || targetNPC.name.includes("Roisin")); // RECORD WHAT PLAYER IS GIVING (before any swaps) if (playerPackage.name && playerPackage.name.length > 0) { playerPackage.name.forEach(function(nameItem) { result.playerGave.name.push({type: nameItem.type, value: nameItem.value}); }); } if (playerPackage.physical) { playerPackage.physical.forEach(function(trait) { result.playerGave.physical.push(trait); }); } if (playerPackage.mental) { playerPackage.mental.forEach(function(trait) { result.playerGave.mental.push(trait); }); } if (playerPackage.skills) { playerPackage.skills.forEach(function(skill) { result.playerGave.skills.push(skill); }); } if (playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { var partValue = part.name === "chest" ? v.bodyParts.chest : part.name === "butt" ? v.bodyParts.butt : part.name === "gender" ? v.bodyParts.gender : part.name === "genitals" ? v.bodyParts.genitals : part.name === "skinTone" ? v.appearance.skinTone : part.name === "hairColor" ? v.appearance.hairColor : part.name === "hairLength" ? v.appearance.hairLength : part.name === "age" ? v.appearance.age : ""; result.playerGave.bodyParts.push({name: part.name, value: partValue}); }); } if (playerPackage.job !== null && playerPackage.job !== undefined) { var playerOldJob = v.jobs && v.jobs.length > 0 ? v.jobs[0] : "Unemployed"; result.playerGave.job = playerOldJob; } // RECORD WHAT PLAYER IS RECEIVING (before any swaps) if (npcPackage.name && npcPackage.name.length > 0) { npcPackage.name.forEach(function(nameItem) { result.playerReceived.name.push({type: nameItem.type, value: nameItem.value}); }); } if (npcPackage.physical) { npcPackage.physical.forEach(function(trait) { result.playerReceived.physical.push(trait); }); } if (npcPackage.mental) { npcPackage.mental.forEach(function(trait) { result.playerReceived.mental.push(trait); }); } if (npcPackage.skills) { npcPackage.skills.forEach(function(skill) { result.playerReceived.skills.push(skill); }); } if (npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { var npcOriginalValue = part.name === "chest" ? targetNPC.bodyParts.chest : part.name === "butt" ? targetNPC.bodyParts.butt : part.name === "gender" ? targetNPC.bodyParts.gender : part.name === "genitals" ? targetNPC.bodyParts.genitals : part.name === "skinTone" ? targetNPC.appearance.skinTone : part.name === "hairColor" ? targetNPC.appearance.hairColor : part.name === "hairLength" ? targetNPC.appearance.hairLength : part.name === "age" ? targetNPC.appearance.age : ""; result.playerReceived.bodyParts.push({name: part.name, value: npcOriginalValue}); }); } if (playerPackage.job !== null && playerPackage.job !== undefined) { var npcOldJob = targetNPC.jobs && targetNPC.jobs.length > 0 ? targetNPC.jobs[0] : "Unemployed"; result.playerReceived.job = npcOldJob; } // NOW PERFORM THE ACTUAL SWAPS // Names if (playerPackage.name && playerPackage.name.length > 0) { // Store the old name for schedule update var oldNPCName = targetNPC.name; // Extract NPC name parts at the start var npcNameParts = targetNPC.name.split(" "); var npcFirst = npcNameParts[0] || ""; var npcLast = npcNameParts.slice(1).join(" ") || ""; // Perform swaps playerPackage.name.forEach(function(nameItem) { if (nameItem.type === "firstName") { var tempFirst = v.firstName; v.firstName = npcFirst; npcFirst = tempFirst; } else if (nameItem.type === "lastName") { var tempLast = v.lastName; v.lastName = npcLast; npcLast = tempLast; } }); // Rebuild NPC name with both parts var newNPCName; if (npcLast && npcLast.trim() !== "") { newNPCName = npcFirst + " " + npcLast; } else { newNPCName = npcFirst; } // Update the NPC's name in the array EXPLICITLY targetNPC.name = newNPCName; v.npcs[npcIndex].name = newNPCName; // CRITICAL: Update the location schedule key with the new name if (v.npcLocationSchedules && v.npcLocationSchedules[oldNPCName]) { v.npcLocationSchedules[newNPCName] = v.npcLocationSchedules[oldNPCName]; delete v.npcLocationSchedules[oldNPCName]; } // CRITICAL: Update old schedule system if it exists if (v.npcSchedules && v.npcSchedules[oldNPCName]) { v.npcSchedules[newNPCName] = v.npcSchedules[oldNPCName]; delete v.npcSchedules[oldNPCName]; } // CRITICAL: Update the relationship key with the new name using helper function setup.updateNPCRelationshipKey(oldNPCName, newNPCName); // CRITICAL: Update metNPCs array - remove ALL instances of old name, add new name once v.metNPCs = v.metNPCs.filter(function(name) { return name !== oldNPCName; }); if (!v.metNPCs.includes(newNPCName)) { v.metNPCs.push(newNPCName); } // CRITICAL: Update $tradingWithNPC reference v.tradingWithNPC = v.npcs[npcIndex]; } // Physical traits - player gives to NPC if (playerPackage.physical) { playerPackage.physical.forEach(function(trait) { // Check if this is a transformation trait being traded away if (setup.isTransformationTrait && setup.isTransformationTrait(trait)) { // Revert the transformation (removes granted traits, clears activeTransformation) setup.revertFullTransformation(trait); } v.physicalTraits.delete(trait); // Check for conflicts with NPC's existing traits var conflict = setup.getConflictingTrait(trait, targetNPC.physicalTraits); if (conflict) { targetNPC.physicalTraits.delete(conflict); // Track what NPC lost due to conflict result.npcGave.physical.push(conflict); } if (!targetNPC.physicalTraits.includes(trait)) { targetNPC.physicalTraits.push(trait); // Track what NPC received result.npcReceived.physical.push(trait); // Auto-adjust body parts if it's a body type trait if (setup.bodyTypeRequirements[trait]) { setup.adjustBodyPartsForTrait(trait, false, targetNPC); } } }); } // Mental traits - player gives to NPC if (playerPackage.mental) { playerPackage.mental.forEach(function(trait) { // Special handling for Bimbo trait - deactivate for player if (trait === "Bimbo") { setup.deactivateBimboTrait(v); } // Check if it's the character creation trait if (trait === v.characterCreationTrait) { v.characterCreationTrait = null; } else { v.mentalTraits.delete(trait); } // Check for conflicts with NPC's existing traits var conflict = setup.getConflictingTrait(trait, targetNPC.mentalTraits); if (conflict) { targetNPC.mentalTraits.delete(conflict); // Track what NPC lost due to conflict result.npcGave.mental.push(conflict); } if (!targetNPC.mentalTraits.includes(trait)) { targetNPC.mentalTraits.push(trait); // Track what NPC received result.npcReceived.mental.push(trait); // Special handling for Bimbo trait - activate for NPC if (trait === "Bimbo") { setup.activateBimboTrait(targetNPC); } } }); } // Skills - player gives to NPC if (playerPackage.skills) { playerPackage.skills.forEach(function(skill) { v.skills.delete(skill); if (!targetNPC.skills.includes(skill)) { targetNPC.skills.push(skill); // Track what NPC received result.npcReceived.skills.push(skill); } }); } // Body parts swap if (playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (part.name === "chest" || part.name === "butt" || part.name === "gender" || part.name === "genitals") { // Track old and new values for transformation descriptions var npcOldValue = targetNPC.bodyParts[part.name]; var npcNewValue = v.bodyParts[part.name]; var temp = v.bodyParts[part.name]; v.bodyParts[part.name] = targetNPC.bodyParts[part.name]; targetNPC.bodyParts[part.name] = temp; // Track what NPC received (with old and new values for description) result.npcReceived.bodyParts.push({ name: part.name, oldValue: npcOldValue, newValue: npcNewValue }); // Update gender-mismatch traits after swapping gender or genitals if (part.name === "gender" || part.name === "genitals") { setup.updateGenderMismatchTraits(v); setup.updateGenderMismatchTraits(targetNPC); } } else if (part.name === "skinTone" || part.name === "hairColor" || part.name === "age") { // Track old and new values var npcOldValue = targetNPC.appearance[part.name]; var npcNewValue = v.appearance[part.name]; var temp = v.appearance[part.name]; v.appearance[part.name] = targetNPC.appearance[part.name]; targetNPC.appearance[part.name] = temp; // If swapping age, also swap Youthful/Mature traits (these are independent physical traits, NOT the age value) if (part.name === "age") { var playerHadMature = v.physicalTraits.includes("Mature"); var playerHadYouthful = v.physicalTraits.includes("Youthful"); var npcHadMature = targetNPC.physicalTraits.includes("Mature"); var npcHadYouthful = targetNPC.physicalTraits.includes("Youthful"); // Remove old traits from both v.physicalTraits.delete("Mature"); v.physicalTraits.delete("Youthful"); targetNPC.physicalTraits.delete("Mature"); targetNPC.physicalTraits.delete("Youthful"); // Swap: player gets NPC's traits, NPC gets player's traits if (npcHadMature) v.physicalTraits.push("Mature"); if (npcHadYouthful) v.physicalTraits.push("Youthful"); if (playerHadMature) targetNPC.physicalTraits.push("Mature"); if (playerHadYouthful) targetNPC.physicalTraits.push("Youthful"); } // Track what NPC received result.npcReceived.bodyParts.push({ name: part.name, oldValue: npcOldValue, newValue: npcNewValue }); } else if (part.name === "hairLength") { // Track old and new values var npcOldValue = targetNPC.appearance.hairLength; var npcNewValue = v.appearance.hairLength; // Swap hair length var tempHairLength = v.appearance.hairLength; v.appearance.hairLength = targetNPC.appearance.hairLength; targetNPC.appearance.hairLength = tempHairLength; // Track what NPC received result.npcReceived.bodyParts.push({ name: part.name, oldValue: npcOldValue, newValue: npcNewValue }); // Hair length traits are kept for bonus calculations but filtered from display // So we need to swap them too var playerHadShort = v.physicalTraits.includes("Short Hair"); var playerHadLong = v.physicalTraits.includes("Long Hair"); var npcHadShort = targetNPC.physicalTraits.includes("Short Hair"); var npcHadLong = targetNPC.physicalTraits.includes("Long Hair"); // Remove old traits v.physicalTraits.delete("Short Hair"); v.physicalTraits.delete("Long Hair"); targetNPC.physicalTraits.delete("Short Hair"); targetNPC.physicalTraits.delete("Long Hair"); // Swap the traits if (npcHadShort) v.physicalTraits.push("Short Hair"); if (npcHadLong) v.physicalTraits.push("Long Hair"); if (playerHadShort) targetNPC.physicalTraits.push("Short Hair"); if (playerHadLong) targetNPC.physicalTraits.push("Long Hair"); } }); } // NPC gives traits/skills to player if (npcPackage.physical) { npcPackage.physical.forEach(function(trait) { targetNPC.physicalTraits.delete(trait); // Track what NPC gave away result.npcGave.physical.push(trait); // Check for conflicts with player's existing traits var conflict = setup.getConflictingTrait(trait, v.physicalTraits); if (conflict) { v.physicalTraits.delete(conflict); } if (!v.physicalTraits.includes(trait)) { v.physicalTraits.push(trait); // Check if this is a transformation trait being received - apply silently (no cutscene) if (setup.isTransformationTrait && setup.isTransformationTrait(trait)) { setup.applyTransformationSilent(trait); } // Auto-adjust body parts if it's a body type trait (only if not a transformation) else if (setup.bodyTypeRequirements[trait]) { setup.adjustBodyPartsForTrait(trait, true); } } }); } if (npcPackage.mental) { npcPackage.mental.forEach(function(trait) { // Special handling for Bimbo trait - deactivate for NPC if (trait === "Bimbo") { setup.deactivateBimboTrait(targetNPC); } targetNPC.mentalTraits.delete(trait); // Track what NPC gave away result.npcGave.mental.push(trait); // Check for conflicts with player's existing traits var conflict = setup.getConflictingTrait(trait, v.mentalTraits); if (conflict) { // If conflict is the character creation trait, remove it if (conflict === v.characterCreationTrait) { v.characterCreationTrait = null; } else { v.mentalTraits.delete(conflict); } } // Add to mental traits (character creation traits become regular traits when received) if (!v.mentalTraits.includes(trait)) { v.mentalTraits.push(trait); // Special handling for Bimbo trait - activate for player if (trait === "Bimbo") { setup.activateBimboTrait(v); } } }); } if (npcPackage.skills) { npcPackage.skills.forEach(function(skill) { targetNPC.skills.delete(skill); // Track what NPC gave away result.npcGave.skills.push(skill); if (!v.skills.includes(skill)) { v.skills.push(skill); } }); } // SPECIAL HANDLING FOR Roisin'S EVOLUTION TRAITS // This runs AFTER all trait transfers are complete if (isRoisin) { console.log("=== Roisin EVOLUTION TRAIT CHECK ==="); console.log("Physical traits BEFORE cleanup:", targetNPC.physicalTraits); console.log("Chest BEFORE cleanup:", targetNPC.bodyParts.chest); console.log("Butt BEFORE cleanup:", targetNPC.bodyParts.butt); // Check if any of her evolution traits were traded away (player received them) if (npcPackage.physical) { npcPackage.physical.forEach(function(trait) { // Reset body parts when evolution size traits are removed if (trait === "Gigantic Chest") { targetNPC.bodyParts.chest = "huge"; targetNPC.physicalTraits.delete("Gigantic Chest"); targetNPC.physicalTraits.delete("Giant Chest"); targetNPC.physicalTraits.delete("Huge"); console.log("✓ Roisin traded away Gigantic Chest TRAIT - reset to 'huge'"); } else if (trait === "Gigantic Butt") { targetNPC.bodyParts.butt = "large"; targetNPC.physicalTraits.delete("Gigantic Butt"); targetNPC.physicalTraits.delete("Giant Butt"); targetNPC.physicalTraits.delete("Large Butt"); targetNPC.physicalTraits.delete("Large"); console.log("✓ Roisin traded away Gigantic Butt TRAIT - reset to 'large'"); } else if (trait === "Giant Chest") { targetNPC.bodyParts.chest = "huge"; targetNPC.physicalTraits.delete("Giant Chest"); targetNPC.physicalTraits.delete("Huge"); console.log("✓ Roisin traded away Giant Chest TRAIT - reset to 'huge'"); } else if (trait === "Giant Butt") { targetNPC.bodyParts.butt = "large"; targetNPC.physicalTraits.delete("Giant Butt"); targetNPC.physicalTraits.delete("Large Butt"); targetNPC.physicalTraits.delete("Large"); console.log("✓ Roisin traded away Giant Butt TRAIT - reset to 'large'"); } }); } // ALSO check if body parts were swapped and clean up mismatched size traits if (npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (part.name === "chest") { // Player took her chest body part, clean up her size traits targetNPC.physicalTraits.delete("Gigantic Chest"); targetNPC.physicalTraits.delete("Giant Chest"); targetNPC.physicalTraits.delete("Huge"); console.log("✓ Roisin's chest body part was swapped - cleaned all chest size traits"); } else if (part.name === "butt") { // Player took her butt body part, clean up her size traits targetNPC.physicalTraits.delete("Gigantic Butt"); targetNPC.physicalTraits.delete("Giant Butt"); targetNPC.physicalTraits.delete("Large Butt"); targetNPC.physicalTraits.delete("Large"); console.log("✓ Roisin's butt body part was swapped - cleaned all butt size traits"); } }); } // Log evolution skills when traded away if (npcPackage.skills) { npcPackage.skills.forEach(function(skill) { if (skill === "Sunfish") { console.log("✓ Roisin traded away Sunfish skill"); } else if (skill === "Occult Expert") { console.log("✓ Roisin traded away Occult Expert skill"); } }); } // Log evolution mental traits when traded away if (npcPackage.mental) { npcPackage.mental.forEach(function(trait) { if (trait === "Lucky") { console.log("✓ Roisin traded away Lucky trait"); } }); } console.log("Physical traits AFTER cleanup:", targetNPC.physicalTraits); console.log("Chest AFTER cleanup:", targetNPC.bodyParts.chest); console.log("Butt AFTER cleanup:", targetNPC.bodyParts.butt); console.log("=== END Roisin CHECK ==="); } // Job swap if (playerPackage.job !== null && playerPackage.job !== undefined) { var playerOldJob = v.jobs && v.jobs.length > 0 ? v.jobs[0] : "Unemployed"; var npcOldJob = targetNPC.jobs && targetNPC.jobs.length > 0 ? targetNPC.jobs[0] : "Unemployed"; // Update player's job to what NPC had if (npcOldJob !== "Unemployed") { v.jobs = [npcOldJob]; v.homeless = false; } else { v.jobs = []; } // Update NPC's job - replace only the FIRST job, keep others if (playerOldJob !== "Unemployed") { if (targetNPC.jobs.length > 1) { // NPC has multiple jobs - replace the first one targetNPC.jobs[0] = playerOldJob; } else { // NPC has one or no jobs - set as single job targetNPC.jobs = [playerOldJob]; } } else { // Player gave Unemployed - remove first job but keep others if (targetNPC.jobs.length > 1) { targetNPC.jobs.shift(); // Remove first job } else { targetNPC.jobs = []; } } // Note: Job-based locations are handled automatically by setup.getNPCLocation() // which checks the NPC's primary job and returns the appropriate location // No need to manually update schedules } // Update the reference v.tradingWithNPC = targetNPC; // DYNAMIC BEHAVIOR UPDATE: Recalculate personality and update behavior based on new traits setup.updateNPCBehavior(targetNPC); // Calculate BASE relationship points BEFORE applying artifact multiplier // This now includes skill tree tradeRelationshipBonus when NPC receives desired items var baseRelationshipPoints = setup.addTradeRelationshipBonus(npc, playerPackage, npcPackage); var finalRelationshipPoints = baseRelationshipPoints; // Apply Gentle Giant's Heart multiplier (4x) if (v.currentArtifact === "The Gentle Giant's Heart") { finalRelationshipPoints = baseRelationshipPoints * 4; } // Add the modified relationship points if (finalRelationshipPoints !== 0) { setup.addRelationshipPoints(npc.name, finalRelationshipPoints); } // Store relationship points in result for display result.relationshipChange = finalRelationshipPoints; result.hasArtifactBonus = (v.currentArtifact === "The Gentle Giant's Heart" && baseRelationshipPoints !== 0); // Decrease trades remaining v.tradesRemainingToday -= 1; // Clear trade packages v.playerTradePackage = {stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: []}; v.npcTradePackage = {stats: [], physical: [], mental: [], skills: [], bodyParts: [], job: null, name: []}; } else { // Trade failed v.failedTradesWithToday.push(npc.name); v.tradesRemainingToday -= 1; result.relationshipChange = 0; result.hasArtifactBonus = false; } return result; }>>
/* ---------------------------------- */ /* --- JOB SCHEDULES (CONSTANT DATA) --- */ /* ---------------------------------- */ <<set setup.jobSchedules = { "Unemployed": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening", "night"], alwaysAvailable: true }, "Street Performer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Package Courier": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Construction Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Dock Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Security Guard": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Baker": { days: ["Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Maid": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Fitness Shop Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Tech Store Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Adult Store Clerk": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening", "night"], alwaysAvailable: false }, "Beauty Salon Stylist": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Ecentric Shop Worker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Brothel Worker": { days: ["Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Brothel Owner": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["afternoon", "evening", "night"], alwaysAvailable: false }, "City Mayor": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Mayor's Secretary": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Hooker": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Stripper": { days: ["Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Prostitute": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Model": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Bouncer": { days: ["Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false }, "Porn Star": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Social Media Influencer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening"], alwaysAvailable: false }, "Black Market Dealer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["night"], alwaysAvailable: false }, "Police Officer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["morning", "afternoon", "evening", "night"], alwaysAvailable: false }, "Clinic Assistant": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Data Analyst": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }, "Negotiator": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["afternoon", "evening"], alwaysAvailable: false }, "Enforcer": { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], times: ["evening", "night"], alwaysAvailable: false } }>> /* ---------------------------------- */ /* --- UPDATE NPC SCHEDULE FOR JOB --- */ /* ---------------------------------- */ <<set setup.updateNPCScheduleForJob = function(npcName, newJob) { var v = State.variables; // Update the NPC's schedule using the constant schedule data var newSchedule = setup.jobSchedules[newJob]; if (newSchedule) { v.npcSchedules[npcName] = newSchedule; } else { // Default schedule if job not found v.npcSchedules[npcName] = { days: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], times: ["morning", "afternoon"], alwaysAvailable: false }; } }>>
/* ---------------------------------- */ /* --- PLAYER DIALOGUE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerDialogue = function(topic) { var v = State.variables; var dialogues = []; if (topic === "compliment") { // Layer 1: Primary personality modifiers if (v.mentalTraits.includes("Flirty") || v.mentalTraits.includes("Seductive")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("You know, you're looking absolutely stunning today... and I bet you know it too."); dialogues.push("Damn, you're gorgeous. I'm not even trying to be subtle here."); } else if (v.mentalTraits.includes("Shy")) { dialogues.push("Um... you're really... really attractive... I hope that's not too forward..."); dialogues.push("I've been thinking... you're beautiful... sorry if that's weird..."); } else { dialogues.push("You're looking absolutely stunning today..."); dialogues.push("I have to say, you're really attractive. Like, really attractive."); dialogues.push("Has anyone ever told you how gorgeous you are?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward") || v.mentalTraits.includes("Insecure")) { if (v.mentalTraits.includes("Kind")) { dialogues.push("Um... I just wanted to say... you seem really nice... and you look nice too..."); dialogues.push("Sorry if this is awkward, but... I think you're a really good person..."); } else if (v.mentalTraits.includes("Honest")) { dialogues.push("I'm not good at this, but... honestly, you're pretty great..."); dialogues.push("This is hard to say, but... I think you're cool. Really cool."); } else { dialogues.push("Um... you look... you look really nice today..."); dialogues.push("I just wanted to say... you're... you're pretty cool..."); dialogues.push("Sorry if this is weird, but... I think you're really great..."); } } else if (v.mentalTraits.includes("Confident") || v.mentalTraits.includes("Charming")) { if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { dialogues.push("You're looking fantastic today! Seriously, you've got such great energy!"); dialogues.push("I just have to say - you're an amazing person and it shows!"); } else if (v.mentalTraits.includes("Arrogant")) { dialogues.push("You know, for most people I wouldn't bother, but you're actually impressive."); dialogues.push("I don't give compliments often, but you're worthy of one. You look good."); } else { dialogues.push("You're looking great today! Seriously, you've got style."); dialogues.push("I appreciate what you bring to the table. You're a good person."); dialogues.push("Just wanted to let you know - you're pretty awesome."); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt") || v.mentalTraits.includes("Honest")) { if (v.mentalTraits.includes("Rude")) { dialogues.push("You don't look terrible. That's something."); dialogues.push("I guess you look okay. Better than most people here."); } else if (v.mentalTraits.includes("Kind")) { dialogues.push("I'm just being honest - you're a really good person and I respect that."); dialogues.push("Straight up, you're great. That's just the truth."); } else { dialogues.push("You look good. That's all."); dialogues.push("I respect you. Thought you should know."); dialogues.push("You're a solid person. Just being honest."); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm") || v.mentalTraits.includes("Kind")) { if (v.mentalTraits.includes("Energetic") || v.mentalTraits.includes("Talkative")) { dialogues.push("Oh my gosh, I just have to tell you - you're such a wonderful person! Like, genuinely amazing!"); dialogues.push("You're so great! Every time I see you it just makes my day better! You're the best!"); } else { dialogues.push("Hey, I just wanted to say you're a really great person!"); dialogues.push("You always brighten up the room, you know that?"); dialogues.push("I really enjoy spending time with you. You're awesome!"); } } else if (v.mentalTraits.includes("Sarcastic") || v.mentalTraits.includes("Witty")) { dialogues.push("I'm shocked to say this, but... you're actually pretty cool. Who knew?"); dialogues.push("Against all odds, you've managed to be impressive. Congratulations."); dialogues.push("Well, well... looks like someone's doing something right. Good for you."); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If I may say so, you carry yourself very well. It's quite admirable."); dialogues.push("I wanted to express my appreciation for your character. You're quite remarkable."); dialogues.push("Please allow me to say - you're a truly commendable individual."); } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("Yeah, you're pretty cool. Just thought I'd mention it."); dialogues.push("You're alright. Better than alright, actually."); dialogues.push("Gotta say, you're a good person to know."); } else { dialogues.push("I think you're really cool, honestly."); dialogues.push("You seem like a good person. Just thought I'd say that."); dialogues.push("You're pretty great, you know?"); } } else if (topic === "insult") { // Insults based on personality if (v.mentalTraits.includes("Bitchy") || v.mentalTraits.includes("Rude")) { if (v.mentalTraits.includes("Arrogant")) { dialogues.push("You're pathetic. Like, genuinely beneath me. It's almost sad."); dialogues.push("I've met garbage with more class than you. And I'm not even exaggerating."); } else if (v.mentalTraits.includes("Sarcastic")) { dialogues.push("Oh wow, you're just SO impressive. Really. I'm in awe of your mediocrity."); dialogues.push("Congratulations on being the most disappointing person I've met today. And that's saying something."); } else { dialogues.push("You know what? You're kind of pathetic, honestly."); dialogues.push("Wow, you're even more annoying than I thought."); dialogues.push("Do everyone a favor and shut up for once."); } } else if (v.mentalTraits.includes("Aggressive") || v.mentalTraits.includes("Short Tempered")) { if (v.mentalTraits.includes("Dominant")) { dialogues.push("You're really pissing me off right now! Know your place!"); dialogues.push("I'm done with your shit! You need to back the hell off!"); } else if (v.mentalTraits.includes("Impulsive") || v.mentalTraits.includes("Reckless")) { dialogues.push("You know what?! FUCK YOU! I don't need this!"); dialogues.push("That's IT! You're a complete asshole and I'm DONE!"); } else { dialogues.push("You're really pissing me off right now!"); dialogues.push("I'm sick of your attitude!"); dialogues.push("You know what your problem is? Everything."); } } else if (v.mentalTraits.includes("Cruel") || v.mentalTraits.includes("Cold") || v.mentalTraits.includes("Insensitive")) { if (v.mentalTraits.includes("Calm")) { dialogues.push("You're worthless. Completely worthless. And that's just an objective fact."); dialogues.push("I don't know why anyone tolerates you. I certainly don't plan to."); } else if (v.mentalTraits.includes("Blunt")) { dialogues.push("You're a waste of space. That's not an insult, it's an observation."); dialogues.push("Honestly? You're garbage. Pure garbage."); } else { dialogues.push("You're worthless. Completely worthless."); dialogues.push("I don't know why anyone tolerates you."); dialogues.push("You're a waste of space."); } } else if (v.mentalTraits.includes("Sarcastic") || v.mentalTraits.includes("Witty")) { if (v.mentalTraits.includes("Arrogant")) { dialogues.push("Oh wow, you're just SO impressive. Really. I'm trembling with awe at your incompetence."); dialogues.push("Bravo. Truly. You've somehow managed to be even more disappointing than I expected."); } else if (v.mentalTraits.includes("Cynical")) { dialogues.push("Congratulations on being the most mediocre person I've met. And I meet a lot of mediocre people."); dialogues.push("Your personality is about as exciting as watching paint dry. Actually, paint drying is more interesting."); } else { dialogues.push("Oh wow, you're just SO impressive. Really."); dialogues.push("Congratulations on being the most mediocre person I've met today."); dialogues.push("Your personality is about as exciting as watching paint dry."); } } else if (v.mentalTraits.includes("Blunt") || v.mentalTraits.includes("Direct")) { if (v.mentalTraits.includes("Honest")) { dialogues.push("You're annoying. That's just the truth."); dialogues.push("I don't like you. I'm just being honest here."); } else { dialogues.push("You're annoying. Plain and simple."); dialogues.push("I don't like you. At all."); } } else if (v.mentalTraits.includes("Passive Aggressive") || v.mentalTraits.includes("Jealous")) { dialogues.push("Oh, how nice for you. Must be so easy being you. So... easy."); dialogues.push("Wow, you're just perfect, aren't you? Absolutely perfect. *Clearly sarcastic*"); dialogues.push("I'm SO happy for you. Really. Can't you tell how happy I am?"); } else if (v.mentalTraits.includes("Moody") || v.mentalTraits.includes("Erratic")) { dialogues.push("You know what? I'm DONE with you! You're terrible!"); dialogues.push("Ugh! You're SO annoying! I can't even deal with you right now!"); dialogues.push("Why are you like this?! You're the WORST!"); } else { dialogues.push("You're really annoying, you know that?"); dialogues.push("I don't like you. At all."); dialogues.push("You're kind of terrible, honestly."); } } else if (topic === "opinion") { // Asking their opinion if (v.mentalTraits.includes("Insecure") || v.mentalTraits.includes("Anxious")) { if (v.mentalTraits.includes("Shy")) { dialogues.push("Um... can I ask... what do you think of me? I'm... I'm really nervous to hear it..."); dialogues.push("I've been wondering... do you think I'm... okay? As a person? Sorry if that's weird..."); } else if (v.mentalTraits.includes("Sensitive")) { dialogues.push("Please be gentle, but... what do you honestly think of me? I'm worried..."); dialogues.push("I need to know... what's your opinion of me? I can handle it... I think..."); } else { dialogues.push("So... what do you think of me? Be honest... I can take it..."); dialogues.push("I've been wondering... do you think I'm okay? As a person?"); dialogues.push("Can I ask... what's your honest opinion of me? I'm a bit nervous to hear it..."); } } else if (v.mentalTraits.includes("Arrogant") || v.mentalTraits.includes("Vain")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("So, what do you think of me? And don't hold back - I already know I'm impressive, but I want to hear you say it."); dialogues.push("Give me your assessment. I'm obviously great, but I'm curious what you specifically appreciate about me."); } else if (v.mentalTraits.includes("Dominant")) { dialogues.push("Tell me what you think of me. I expect honesty, and I expect it to be positive."); dialogues.push("Your opinion of me - give it. Make it good."); } else { dialogues.push("So, what do you think of me? And don't hold back - I know I'm impressive."); dialogues.push("I'm curious what your assessment of me is. I already know I'm great, but go ahead."); dialogues.push("Give me your honest opinion of me. Though I'm sure it's positive."); } } else if (v.mentalTraits.includes("Curious") || v.mentalTraits.includes("Analytical")) { if (v.mentalTraits.includes("Direct")) { dialogues.push("What's your objective assessment of me? I'm collecting data."); dialogues.push("I need your honest evaluation. What do you think of me?"); } else if (v.mentalTraits.includes("Thoughtful")) { dialogues.push("I'm genuinely curious about your perception of me. How do you see me as a person?"); dialogues.push("I've been contemplating self-perception versus external perception. What's your honest view of me?"); } else { dialogues.push("I'm genuinely curious - what's your honest assessment of me as a person?"); dialogues.push("From your perspective, what kind of person do you think I am?"); dialogues.push("I'd like to know your objective opinion of me, if you don't mind sharing."); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { if (v.mentalTraits.includes("Honest")) { dialogues.push("What do you think of me? And I want the truth, not politeness."); dialogues.push("Give it to me straight - what's your real opinion of me?"); } else if (v.mentalTraits.includes("Confident")) { dialogues.push("What do you think of me? Don't sugarcoat it. I can handle honesty."); dialogues.push("Your opinion of me. Now. No bullshit."); } else { dialogues.push("What do you think of me? Don't sugarcoat it."); dialogues.push("Give it to me straight - what's your opinion of me?"); dialogues.push("Be honest. What do you think about me?"); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { if (v.mentalTraits.includes("Talkative") || v.mentalTraits.includes("Outgoing")) { dialogues.push("Hey! I'd absolutely love to know what you think of me! Be totally honest - I really want to know!"); dialogues.push("Ooh, ooh! Tell me what you think about me! I'm so curious and I promise I won't be offended!"); } else if (v.mentalTraits.includes("Kind")) { dialogues.push("I'd really appreciate hearing what you think of me. Your opinion matters to me!"); dialogues.push("If you don't mind sharing, I'd love to know your thoughts about me as a person."); } else { dialogues.push("Hey, I'd love to know what you think of me! Honest opinions only!"); dialogues.push("So, what's your take on me? I'm genuinely interested!"); dialogues.push("I'm curious - how do you see me as a person?"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("So what do you think of me? Just curious."); dialogues.push("What's your take on me?"); dialogues.push("Your opinion of me - what is it?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If I may ask, what is your opinion of me? I value your perspective."); dialogues.push("I would appreciate hearing your thoughts about me, if you're comfortable sharing."); dialogues.push("May I inquire as to your assessment of my character?"); } else { dialogues.push("What's your honest opinion of me?"); dialogues.push("So... what do you think of me?"); dialogues.push("I'm curious what you think about me."); } } else if (topic === "job") { // Asking about their job if (v.mentalTraits.includes("Curious") || v.mentalTraits.includes("Interested")) { if (v.mentalTraits.includes("Energetic") || v.mentalTraits.includes("Talkative")) { dialogues.push("Oh! What do you do for work?! I'm SO curious! Tell me everything!"); dialogues.push("I've been dying to know - what's your job? What's it like? Is it fun?!"); } else if (v.mentalTraits.includes("Analytical")) { dialogues.push("I'm quite interested in learning about your occupation. What field are you in?"); dialogues.push("What's your professional role? I'd like to understand more about what you do."); } else { dialogues.push("So what do you do for work? I'm really curious!"); dialogues.push("Tell me about your job! What's it like?"); dialogues.push("I'd love to hear about what you do for a living!"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("So, what's your job?"); dialogues.push("What do you do for work?"); dialogues.push("You working anywhere?"); } else if (v.mentalTraits.includes("Professional") || v.mentalTraits.includes("Businesslike")) { dialogues.push("What's your current occupation?"); dialogues.push("May I ask what line of work you're in?"); dialogues.push("What's your professional role?"); } else if (v.mentalTraits.includes("Nosy") || v.mentalTraits.includes("Gossipy")) { dialogues.push("Okay, so I've been dying to know - what do you do for work?"); dialogues.push("Spill! What's your job? I need to know!"); dialogues.push("Come on, tell me - where do you work?"); } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { dialogues.push("What's your job?"); dialogues.push("Where do you work?"); dialogues.push("What do you do?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If you don't mind my asking, what is your occupation?"); dialogues.push("May I inquire about your line of work?"); dialogues.push("What do you do professionally, if I may ask?"); } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { dialogues.push("So... um... what do you do for work? If you don't mind me asking..."); dialogues.push("I was wondering... what's your job?"); dialogues.push("Can I ask... what do you do?"); } else { dialogues.push("What do you do for work?"); dialogues.push("So, what's your job?"); dialogues.push("What kind of work do you do?"); } } else if (topic === "trading") { // Asking about trading if (v.mentalTraits.includes("Shrewd") || v.mentalTraits.includes("Sly")) { if (v.mentalTraits.includes("Confident")) { dialogues.push("Let's talk business. I'm curious about your trading preferences. What catches your eye?"); dialogues.push("I think we could make some mutually beneficial arrangements. What interests you?"); } else if (v.mentalTraits.includes("Careful") || v.mentalTraits.includes("Cautious")) { dialogues.push("I'm exploring potential trading opportunities. What might you be interested in?"); dialogues.push("Hypothetically speaking, what would appeal to you in a trade?"); } else { dialogues.push("I'm curious about what you might be willing to trade. What interests you?"); dialogues.push("Let's talk business. What are you looking for in a trade?"); dialogues.push("So, hypothetically speaking... what would you be willing to trade?"); } } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { if (v.mentalTraits.includes("Businesslike")) { dialogues.push("Trading. Are you interested? What are your terms?"); dialogues.push("Let's discuss trading. What do you want?"); } else { dialogues.push("Are you interested in trading? What do you want?"); dialogues.push("Let's cut to the chase - what would you trade for?"); dialogues.push("Trading. You interested? What are you after?"); } } else if (v.mentalTraits.includes("Friendly") || v.mentalTraits.includes("Warm")) { if (v.mentalTraits.includes("Enthusiastic") || v.mentalTraits.includes("Energetic")) { dialogues.push("Hey! I was thinking - are you interested in trading? What kind of things would you love to get?!"); dialogues.push("Ooh! Trading! Are you into it? What are you looking for? I'm so curious!"); } else { dialogues.push("Hey, I was wondering if you'd ever be interested in trading? What kind of things appeal to you?"); dialogues.push("So, just curious - are you open to trading? What would you be looking for?"); dialogues.push("I'd love to know what you're interested in trading for!"); } } else if (v.mentalTraits.includes("Cautious") || v.mentalTraits.includes("Careful")) { if (v.mentalTraits.includes("Analytical")) { dialogues.push("I'm evaluating trading possibilities. What parameters would interest you?"); dialogues.push("From a practical standpoint, what would you consider for a trade?"); } else { dialogues.push("I wanted to ask... would you ever consider trading? What might you be interested in?"); dialogues.push("Just exploring options here - what would you potentially trade for?"); dialogues.push("Hypothetically, what kind of trades would interest you?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { dialogues.push("Um... so... I was wondering about trading? What would you... be interested in?"); dialogues.push("I wanted to ask... are you... open to trading? What do you like?"); dialogues.push("This might be awkward but... trading? Are you interested?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("If you'd be amenable, I'd like to discuss trading possibilities. What might interest you?"); dialogues.push("Might I inquire about your trading preferences? What appeals to you?"); dialogues.push("Would you be open to discussing potential trades? What would you find valuable?"); } else { dialogues.push("Are you interested in trading? What are you looking for?"); dialogues.push("What would you be willing to trade for?"); dialogues.push("I'm curious about your trading preferences. What interests you?"); } } else if (topic === "smalltalk") { // Small talk if (v.mentalTraits.includes("Outgoing") || v.mentalTraits.includes("Talkative") || v.mentalTraits.includes("Energetic")) { if (v.mentalTraits.includes("Friendly")) { dialogues.push("Hey there! So! How's everything been going? What's new with you? Tell me everything!"); dialogues.push("Oh my gosh, hi! Let's just chat! How have you been? What's happening in your life?!"); } else if (v.mentalTraits.includes("Enthusiastic")) { dialogues.push("So! What's up?! How's life?! What have you been doing?!"); dialogues.push("Hey! Let's talk! What's been going on with you?!"); } else { dialogues.push("So! How's everything been going? What's new with you?"); dialogues.push("Hey! Let's chat! How have you been? What's going on?"); dialogues.push("I'm in the mood to just talk! How's life treating you?"); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { if (v.mentalTraits.includes("Kind")) { dialogues.push("Um... so... how have you been? I hope everything's okay..."); dialogues.push("I was just... wondering how things are going for you..."); } else if (v.mentalTraits.includes("Anxious")) { dialogues.push("So... um... the weather's been... okay... hasn't it? Sorry, I'm not good at this..."); dialogues.push("I... uh... how are things? Sorry if this is awkward..."); } else { dialogues.push("So... um... how are things?"); dialogues.push("I was just... wondering how you've been..."); dialogues.push("The weather's been... nice... hasn't it?"); } } else if (v.mentalTraits.includes("Nonchalant") || v.mentalTraits.includes("Chill")) { dialogues.push("What's up? How's it going?"); dialogues.push("So, what's new?"); dialogues.push("How've you been?"); } else if (v.mentalTraits.includes("Polite") || v.mentalTraits.includes("Diplomatic")) { dialogues.push("Good day! How have you been faring lately?"); dialogues.push("I hope things have been going well for you?"); dialogues.push("How are you doing these days?"); } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { dialogues.push("How are you?"); dialogues.push("What's new?"); dialogues.push("Everything good?"); } else if (v.mentalTraits.includes("Sarcastic")) { dialogues.push("So... lovely weather we're having. Riveting stuff."); dialogues.push("How about that local sports team? Really giving it their all, I'm sure."); dialogues.push("What's new? Besides the crushing monotony of existence?"); } else if (v.mentalTraits.includes("Bitchy") || v.mentalTraits.includes("Rude")) { dialogues.push("So... we're really doing small talk? Fine. How are you or whatever."); dialogues.push("What's up. And don't bore me with your life story."); dialogues.push("How's it going. Keep it short."); } else { dialogues.push("So, how's everything going?"); dialogues.push("What's been happening with you?"); dialogues.push("How are things?"); } } // === NEW CONVERSATION TOPICS === else if (topic === "flirt") { // Flirting dialogue - based on player personality // Check for highly sexual traits for more explicit dialogue var hasExplicitTraits = v.mentalTraits.includes("Nymphomaniac") || v.mentalTraits.includes("Lustful") || v.mentalTraits.includes("Perverted") || v.mentalTraits.includes("Lewd"); var hasSeductiveTraits = v.mentalTraits.includes("Seductive") || v.mentalTraits.includes("Flirty"); // EXPLICIT SEXUAL FLIRTING - requires Nymphomaniac/Lustful/Perverted/Lewd traits if (hasExplicitTraits) { if (v.mentalTraits.includes("Confident") || v.mentalTraits.includes("Dominant")) { dialogues.push("*eyes roam your body hungrily* I want you. Right now. I've been thinking about all the things I want to do to you..."); dialogues.push("*moves very close* I can't stop thinking about how good you'd feel... how good you'd taste..."); dialogues.push("*whispers seductively* Let's stop pretending. I know you want me too. I can see it in your eyes..."); } else if (v.mentalTraits.includes("Submissive")) { dialogues.push("*looks up at you with need* I... I want you so badly. Please... I'll do anything you want..."); dialogues.push("*whimpers* I can't stop thinking about you... about being yours... please use me..."); dialogues.push("*trembling* I need you. My body aches for your touch. I'll be good, I promise..."); } else if (v.mentalTraits.includes("Shy")) { dialogues.push("*blushing intensely* I... I have these thoughts about you... really dirty thoughts... I'm sorry..."); dialogues.push("*can barely speak* Y-you make me feel... things... *voice drops* ...I want you so much..."); dialogues.push("*fidgeting nervously* I know I shouldn't say this but... I fantasize about you... a lot..."); } else { dialogues.push("*breathing heavily* I want you. I've been imagining what we could do together... alone..."); dialogues.push("*bites lip* I can't control myself around you. You make me so... worked up..."); dialogues.push("*intense gaze* Let's find somewhere private. I need to feel you against me..."); } } // SEDUCTIVE FLIRTING - Seductive/Flirty traits (moderately sensual) else if (hasSeductiveTraits) { if (v.mentalTraits.includes("Confident")) { dialogues.push("*leans in with a smile* You know, I can't help but notice how attractive you are..."); dialogues.push("I've been watching you, and I have to say... you're absolutely captivating."); dialogues.push("*smirks* Has anyone ever told you that you have the most gorgeous eyes?"); } else if (v.mentalTraits.includes("Playful")) { dialogues.push("*twirls hair* So... do you come here often? Because I'd definitely remember someone like you."); dialogues.push("You're cute. Like, really cute. I just thought you should know."); dialogues.push("*winks* Is it hot in here, or is it just you?"); } else { dialogues.push("*moves closer* I've been thinking about you... a lot, actually."); dialogues.push("There's something about you that I find absolutely irresistible."); dialogues.push("I can't help it... I'm drawn to you."); } } else if (v.mentalTraits.includes("Shy") || v.mentalTraits.includes("Awkward")) { if (v.mentalTraits.includes("Romantic")) { dialogues.push("I... um... I think you're really... *blushes* ...beautiful. Sorry, was that weird?"); dialogues.push("*fidgets nervously* I've wanted to tell you... you're... you're really special to me..."); dialogues.push("This is embarrassing but... I can't stop thinking about you..."); } else { dialogues.push("Um... so... you're... you're really... *trails off* ...attractive..."); dialogues.push("I... uh... *face turns red* ...you look nice. Really nice."); dialogues.push("*stares at feet* I like you... like, LIKE you like you... sorry..."); } } else if (v.mentalTraits.includes("Confident") || v.mentalTraits.includes("Charming")) { if (v.mentalTraits.includes("Smooth")) { dialogues.push("I have to be honest with you - I find you incredibly attractive."); dialogues.push("There's something magnetic about you. I had to say something."); dialogues.push("I'm not usually this forward, but... you've caught my attention."); } else { dialogues.push("You know, you're really good-looking. Just putting that out there."); dialogues.push("I'd be lying if I said I wasn't attracted to you."); dialogues.push("Can I just say... you're absolutely stunning."); } } else if (v.mentalTraits.includes("Playful") || v.mentalTraits.includes("Mischievous")) { dialogues.push("*grins* So... are you always this cute, or did you do something special today?"); dialogues.push("Hey, I've got a question - are you a magician? Because whenever I look at you, everyone else disappears."); dialogues.push("I was trying to think of a clever pick-up line, but honestly? You're just really hot."); } else if (v.mentalTraits.includes("Direct") || v.mentalTraits.includes("Blunt")) { dialogues.push("Look, I'm just going to say it - I'm attracted to you."); dialogues.push("I'm not going to play games. I think you're hot. There it is."); dialogues.push("I find you attractive. Thought you should know."); } else if (v.mentalTraits.includes("Romantic")) { dialogues.push("I know this might seem sudden, but... I feel a connection with you."); dialogues.push("There's something special about you. I can't explain it, but I feel drawn to you."); dialogues.push("Every time I see you, my heart beats a little faster..."); } else { dialogues.push("So... I think you're really attractive..."); dialogues.push("I've been wanting to tell you... I like you. A lot."); dialogues.push("You're pretty amazing, you know that?"); } } else if (topic === "debate") { if (v.mentalTraits.includes("Nerd") || v.mentalTraits.includes("Intelligent")) { if (v.mentalTraits.includes("Enthusiastic")) { dialogues.push("Oh! I'd love to hear your thoughts on this! What's your take on the nature of reality?"); dialogues.push("Have you ever considered the philosophical implications of consciousness? I have SO many thoughts!"); } else { dialogues.push("I'd love to have an intellectual discussion with you. What topics interest you?"); dialogues.push("Let's explore some ideas together. What's your perspective on...?"); } } else if (v.mentalTraits.includes("Analytical") || v.mentalTraits.includes("Curious")) { dialogues.push("I've been analyzing some interesting problems. Want to discuss them?"); dialogues.push("Let's examine this from multiple angles. What do you think about...?"); } else { dialogues.push("Want to have an intellectual discussion about something?"); dialogues.push("I've been thinking about some interesting ideas. Want to debate?"); } } else if (topic === "fitness") { if (v.mentalTraits.includes("Jock") || v.mentalTraits.includes("Athletic")) { if (v.mentalTraits.includes("Competitive")) { dialogues.push("So, you work out? What's your PR? I bet I can beat it!"); dialogues.push("Let's talk gains! What's your training routine?"); } else { dialogues.push("So, you into fitness? What's your workout routine like?"); dialogues.push("Let's talk sports! What are you into?"); } } else { dialogues.push("So, are you into fitness or sports at all?"); dialogues.push("What kind of physical activities do you enjoy?"); } } else if (topic === "gossip") { if (v.mentalTraits.includes("Gossipy") || v.mentalTraits.includes("Nosy")) { dialogues.push("Oh my GOD, have you heard what's been going on?! I have SO much to tell you!"); dialogues.push("*whispers* Have you heard what's been going on around here?"); } else { dialogues.push("So... heard any good gossip lately?"); dialogues.push("What's the word around here? Anything interesting happening?"); } } else if (topic === "darkTopics") { if (v.mentalTraits.includes("Goth") || v.mentalTraits.includes("Pessimistic")) { dialogues.push("Let's discuss something real. What do you think happens when we die?"); dialogues.push("The world is a cruel place. Don't you ever just... feel the weight of it?"); } else if (v.mentalTraits.includes("Philosophical")) { dialogues.push("I've been contemplating mortality. What are your thoughts on death?"); dialogues.push("The nature of suffering... why do we experience pain?"); } else { dialogues.push("Can we talk about something deeper? Something... darker?"); dialogues.push("What's the darkest thought you've ever had? I won't judge."); } } else if (topic === "beSubmissive") { if (v.mentalTraits.includes("Submissive") || v.mentalTraits.includes("Timid")) { dialogues.push("*looks down* Whatever you want to talk about... I'll follow your lead..."); dialogues.push("You're in charge here. I'm just... happy to go along with whatever you want."); } else if (v.mentalTraits.includes("Shy")) { dialogues.push("Um... you seem like you know what you're doing. I'll... I'll follow you."); } else { dialogues.push("You know what? You lead. I'll follow."); dialogues.push("Guide me. I want to hear what you have to say."); } } else if (topic === "takeCharge") { if (v.mentalTraits.includes("Dominant") || v.mentalTraits.includes("Bossy")) { dialogues.push("Alright, here's what we're going to do. Listen up."); dialogues.push("I'll handle this. Just follow my lead and everything will be fine."); } else if (v.mentalTraits.includes("Confident")) { dialogues.push("I've got this. Let me take the lead for a moment."); dialogues.push("Trust me on this one. I know what I'm doing."); } else { dialogues.push("Can I take the lead on this one?"); dialogues.push("Let me guide this conversation for a bit."); } } else if (topic === "playAlong") { if (v.mentalTraits.includes("Bimbo") || v.mentalTraits.includes("Airhead")) { dialogues.push("Oh my gosh, YES! Let's totally do that! Whatever it is!"); dialogues.push("Like, that sounds SO fun! I'm totally in!"); } else if (v.mentalTraits.includes("Bubbly") || v.mentalTraits.includes("Enthusiastic")) { dialogues.push("YES! I'm SO into whatever you're into! Let's GO!"); } else { dialogues.push("Okay, I'm playing along! This is fun!"); dialogues.push("Ha! I'm totally with you on this!"); } } else if (topic === "fashion") { if (v.mentalTraits.includes("Prep") || v.mentalTraits.includes("Vain")) { dialogues.push("So, I couldn't help but notice your style. Let's talk fashion!"); dialogues.push("Fashion is everything, don't you think? What's your signature look?"); } else { dialogues.push("So, what's your style like? I'm curious!"); dialogues.push("Let's talk fashion! What do you usually wear?"); } } else if (topic === "advice") { if (v.mentalTraits.includes("Insecure") || v.mentalTraits.includes("Anxious")) { dialogues.push("I... I really need some advice. I don't know what to do..."); } else if (v.mentalTraits.includes("Friendly")) { dialogues.push("Hey, can I ask you something? I could really use some advice!"); } else { dialogues.push("Can I ask you for some advice?"); dialogues.push("I've been thinking about something and I'd appreciate your input."); } } else if (topic === "secrets") { if (v.mentalTraits.includes("Trusting") || v.mentalTraits.includes("Open")) { dialogues.push("I feel like I can trust you... Can I tell you something?"); } else if (v.mentalTraits.includes("Mischievous")) { dialogues.push("Want to hear something you definitely shouldn't know?"); } else { dialogues.push("Can I share a secret with you?"); dialogues.push("I trust you enough to tell you this. Can you keep a secret?"); } } else if (topic === "support") { if (v.mentalTraits.includes("Kind") || v.mentalTraits.includes("Caring")) { dialogues.push("Hey, I just wanted to check in on you. How are you really doing?"); dialogues.push("I'm here for you, you know that right? Whatever you're going through."); } else { dialogues.push("Hey, I just wanted you to know I'm here if you need support."); dialogues.push("You can count on me, you know. I've got your back."); } } else if (topic === "plan") { if (v.mentalTraits.includes("Enthusiastic") || v.mentalTraits.includes("Energetic")) { dialogues.push("Oh my gosh, we should totally hang out! What do you want to do?!"); dialogues.push("Let's make plans! I have SO many ideas!"); } else { dialogues.push("Hey, want to make some plans to hang out?"); dialogues.push("We should do something together sometime. What sounds fun?"); } } else if (topic === "deep") { if (v.mentalTraits.includes("Philosophical") || v.mentalTraits.includes("Thoughtful")) { dialogues.push("I want to go deeper. What truly matters to you in life?"); dialogues.push("Let's have a real conversation. What are your deepest fears and hopes?"); } else { dialogues.push("Can we have a deeper conversation? I want to really know you."); dialogues.push("Let's talk about something meaningful. What matters most to you?"); } } else if (topic === "confide") { if (v.mentalTraits.includes("Anxious") || v.mentalTraits.includes("Worried")) { dialogues.push("I... I've been so worried lately. Can I talk to you about it?"); } else { dialogues.push("Can I confide something in you? I've been worried about..."); dialogues.push("There's something that's been bothering me. I trust you with this."); } } else if (topic === "bestFriend") { if (v.mentalTraits.includes("Emotional") || v.mentalTraits.includes("Sentimental")) { dialogues.push("You know you're my best friend, right? I... I don't know what I'd do without you."); } else if (v.mentalTraits.includes("Playful")) { dialogues.push("You know you're stuck with me forever, right? Best friends for life!"); } else { dialogues.push("You're my best friend. I just wanted you to know that."); dialogues.push("I'm so glad we're this close. You mean the world to me."); } } else if (topic === "tease") { if (v.mentalTraits.includes("Playful") || v.mentalTraits.includes("Mischievous")) { dialogues.push("*grins* Sooo... did you forget how to use a mirror this morning, or...?"); dialogues.push("Hey, I'm just saying... you're kinda dorky. In the best way, obviously!"); } else if (v.mentalTraits.includes("Sarcastic")) { dialogues.push("Oh, you're SO impressive. Really. Truly. *barely conceals smirk*"); } else { dialogues.push("*smiles* I'm just teasing you! Don't take it too seriously!"); dialogues.push("I have to give you a hard time. It's too easy!"); } } else if (topic === "challenge") { if (v.mentalTraits.includes("Argumentative") || v.mentalTraits.includes("Confrontational")) { dialogues.push("I don't think you're right about that. Let me tell you why..."); dialogues.push("Actually, I completely disagree. Here's my counter-argument..."); } else if (v.mentalTraits.includes("Bold") || v.mentalTraits.includes("Confident")) { dialogues.push("I'm going to push back on that. I don't think you're seeing the full picture."); } else { dialogues.push("I'm not sure I agree with that. What if we looked at it this way?"); dialogues.push("Can I challenge that idea? I see it differently."); } } else if (topic === "pushBoundaries") { if (v.mentalTraits.includes("Bold") || v.mentalTraits.includes("Daring")) { dialogues.push("Let's take this further... I want to push past the usual limits."); dialogues.push("I'm feeling adventurous. Want to see how far we can take this?"); } else if (v.mentalTraits.includes("Flirty") || v.mentalTraits.includes("Seductive")) { dialogues.push("*moves closer* I think we should... explore some new territory..."); dialogues.push("*intense gaze* I want more. Don't you?"); } else { dialogues.push("I think we should take this further. What do you think?"); dialogues.push("I'm ready for more if you are..."); } } // Default fallback if (dialogues.length === 0) { dialogues.push("..."); } return dialogues[Math.floor(Math.random() * dialogues.length)]; }>> /* ---------------------------------- */ /* --- PLAYER TRAIT SPECIAL OPTIONS --- */ /* ---------------------------------- */ /* Get special dialogue options available based on player traits */ <<set setup.getPlayerTraitDialogueOptions = function(npc, context) { var v = State.variables; var options = []; var mentalTraits = v.mentalTraits || []; var physicalTraits = v.physicalTraits || []; // Confident trait: Assert dominance option if (mentalTraits.includes("Confident")) { options.push({ id: "assert_dominance", label: "Assert Dominance", trait: "Confident", description: "Use your confidence to take charge of the conversation", effect: function() { return { relationshipChange: 3, npcResponse: "impressed" }; } }); } // Flirty + Attractive: Special flirtation options if (mentalTraits.includes("Flirty") && physicalTraits.includes("Attractive")) { options.push({ id: "seductive_approach", label: "Seductive Approach", trait: "Flirty + Attractive", description: "Use your looks and charm to flirt boldly", effect: function() { return { relationshipChange: 5, npcResponse: "flustered" }; } }); } // Intelligent: Analyze option to gain insights if (mentalTraits.includes("Intelligent")) { options.push({ id: "analyze", label: "Analyze", trait: "Intelligent", description: "Study the NPC to learn more about them", effect: function() { return { gainInsight: true, npcResponse: "noticed" }; } }); } // Intimidating or Strong or Muscular: Intimidation option if (mentalTraits.includes("Intimidating") || physicalTraits.includes("Muscular") || physicalTraits.includes("Strong")) { options.push({ id: "intimidate", label: "Intimidate", trait: physicalTraits.includes("Muscular") ? "Muscular" : "Intimidating", description: "Use your presence to pressure the NPC", effect: function() { return { relationshipChange: -2, npcResponse: "fearful", complianceBonus: true }; } }); } // Empathetic: Console option when NPC is upset if (mentalTraits.includes("Empathetic") || mentalTraits.includes("Kind")) { options.push({ id: "console", label: "Console", trait: mentalTraits.includes("Empathetic") ? "Empathetic" : "Kind", description: "Offer emotional support and comfort", effect: function() { return { relationshipChange: 4, npcResponse: "grateful" }; } }); } // Bimbo: Unique ditzy dialogue options if (mentalTraits.includes("Bimbo")) { options.push({ id: "ditzy_charm", label: "Ditzy Charm", trait: "Bimbo", description: "Use your airheaded charm to disarm them", effect: function() { return { relationshipChange: 2, npcResponse: "amused" }; } }); } // Manipulative: Manipulation option if (mentalTraits.includes("Manipulative") || mentalTraits.includes("Deceitful")) { options.push({ id: "manipulate", label: "Manipulate", trait: "Manipulative", description: "Subtly guide the conversation to your advantage", effect: function() { return { relationshipChange: 0, npcResponse: "manipulated", advantageGained: true }; } }); } // Charming: Smooth talk option if (mentalTraits.includes("Charming")) { options.push({ id: "smooth_talk", label: "Smooth Talk", trait: "Charming", description: "Use your natural charm to win them over", effect: function() { return { relationshipChange: 4, npcResponse: "charmed" }; } }); } // Dominant: Take control option if (mentalTraits.includes("Dominant")) { options.push({ id: "take_control", label: "Take Control", trait: "Dominant", description: "Assert your authority over the situation", effect: function() { return { relationshipChange: 2, npcResponse: "submitting" }; } }); } // Submissive: Defer option if (mentalTraits.includes("Submissive")) { options.push({ id: "defer", label: "Defer", trait: "Submissive", description: "Show deference and let them lead", effect: function() { return { relationshipChange: 2, npcResponse: "pleased" }; } }); } return options; }>> /* Check if player has any special dialogue options available */ <<set setup.hasSpecialDialogueOptions = function(npc, context) { var options = setup.getPlayerTraitDialogueOptions(npc, context); return options.length > 0; }>> /* Execute a special dialogue option and return the result */ <<set setup.executeSpecialDialogueOption = function(optionId, npc) { var v = State.variables; var options = setup.getPlayerTraitDialogueOptions(npc, "talk"); for (var i = 0; i < options.length; i++) { if (options[i].id === optionId) { var result = options[i].effect(); // Apply relationship change if (result.relationshipChange && result.relationshipChange !== 0) { setup.addRelationshipPoints(npc.name, result.relationshipChange); } return { success: true, option: options[i], result: result }; } } return { success: false }; }>>
/* ---------------------------------- */ /* --- PLAYER IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerFaceImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, locationImagesEnabled: true, customImages: { face: "", chest: "", butt: "" } }; } // Ensure locationImagesEnabled exists for backwards compatibility if (v.imageSettings.locationImagesEnabled === undefined) { v.imageSettings.locationImagesEnabled = true; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.face || ""; } // LABORATORY TRANSFORMATION PORTRAIT OVERRIDE // Maps trait names to exact file names in Images/Faces/Laboratory/ var labTransformations = [ "Succubus", "Imp", "Hellhound", "Werecat", "Werewolf", "Werebunny", "Werefox", "Weresheep", "Hucow", "Trophy Wife", "Gym Bunny", "E-Girl", "Punk", "Gyaru", "Siren", "Living Doll", "Dominatrix", "Slut", "Himbo" ]; // Map trait names to exact file name prefixes (matching actual files in Laboratory folder) var traitToFilePrefix = { "Succubus": "Succubus_Female", "Imp": "imp", "Hellhound": "hellhound", "Werecat": "female_werecat", "Werewolf": "female_werewolf", "Werebunny": "female_werebunny", "Werefox": "Werefox_Female", "Weresheep": "Weresheep_Female", "Hucow": "Hucow_Female", "Trophy Wife": "TrophyWife_Female", "Gym Bunny": "gymbunny", "E-Girl": "egirl", "Punk": "Punk_Female", "Gyaru": "Gyaru_Female", "Siren": "Siren_Female", "Living Doll": "LivingDoll_Female", "Dominatrix": "Dominatrix_Female", "Slut": "Slut_Female", "Himbo": "Himbo_Male" }; // Map age suffix format for each transformation (some use _Adult, some use _adult) var traitToAgeSuffix = { "Succubus": { adult: "_Adult", mature: "_Mature" }, "Imp": { adult: "_adult", mature: "_mature" }, "Hellhound": { adult: "_adult", mature: "_mature" }, "Werecat": { adult: "_adult", mature: "_mature" }, "Werewolf": { adult: "_adult", mature: "_mature" }, "Werebunny": { adult: "_adult", mature: "_mature" }, "Werefox": { adult: "_Adult", mature: "_Mature" }, "Weresheep": { adult: "_Adult", mature: "_Mature" }, "Hucow": { adult: "_Adult", mature: "_Mature" }, "Trophy Wife": { adult: "_Adult", mature: "_Mature" }, "Gym Bunny": { adult: "_adult", mature: "_mature" }, "E-Girl": { adult: "_adult", mature: "_mature" }, "Punk": { adult: "_Adult", mature: "_Mature" }, "Gyaru": { adult: "_Adult", mature: "_Mature" }, "Siren": { adult: "_Adult", mature: "_Mature" }, "Living Doll": { adult: "_Adult", mature: "_Mature" }, "Dominatrix": { adult: "_Adult", mature: "_Mature" }, "Slut": { adult: "_Adult", mature: "_Mature" }, "Himbo": { adult: "_Adult", mature: "_Mature" } }; var physTraits = v.physicalTraits || []; var mentTraits = v.mentalTraits || []; var allTraits = physTraits.concat(mentTraits); for (var i = 0; i < labTransformations.length; i++) { var transform = labTransformations[i]; if (allTraits.includes(transform)) { var labIsMature = v.appearance.age === "Mature Adult"; var ageKey = labIsMature ? "mature" : "adult"; var filePrefix = traitToFilePrefix[transform]; var ageSuffix = traitToAgeSuffix[transform][ageKey]; return "Images/Faces/Laboratory/" + filePrefix + ageSuffix + ".webp"; } } // BIMBO TRAIT OVERRIDE - Check this BEFORE standard image generation if (v.mentalTraits && v.mentalTraits.includes("Bimbo")) { var isMature = v.appearance.age === 'Mature Adult'; if (isMature) { return 'Images/Faces/Bimbo/Bimbom.webp'; } else { return 'Images/Faces/Bimbo/Bimboa.webp'; } } // LIFE SWAP PORTRAIT OVERRIDE - If player has swapped with an NPC, use NPC's portrait // Only applies if lifeSwapPortraitSource exists and is NOT "player" (original player) if (v.lifeSwapPortraitSource && v.lifeSwapPortraitSource !== "player") { // Check if player has custom images from the swap (the NPC gave them theirs) if (v.imageSettings.customImages && v.imageSettings.customImages.face) { return v.imageSettings.customImages.face; } // Otherwise use the NPC's portrait path based on player's CURRENT gender and age var formattedSource = v.lifeSwapPortraitSource.replace(/ /g, "_").replace(/\u0027/g, ""); // Determine portrait variant based on current gender and age var currentGender = v.bodyParts && v.bodyParts.gender ? v.bodyParts.gender.toLowerCase() : "female"; var currentAge = v.appearance && v.appearance.age ? v.appearance.age : "Adult"; var isMature = (currentAge === "Mature Adult" || currentAge === "Mature"); var isFemboy = v.mentalTraits && v.mentalTraits.includes("Femboy"); var portraitVariant; if (currentGender === "male") { if (isFemboy) { portraitVariant = isMature ? "femboy_mature" : "femboy_adult"; } else { portraitVariant = isMature ? "male_mature" : "male_adult"; } } else { portraitVariant = isMature ? "female_mature" : "female_adult"; } return 'Images/NPCs/' + formattedSource + '/' + portraitVariant + '.webp'; } // Get basic appearance info var gender = v.bodyParts.gender === "male" ? "Male" : "Female"; var hairStyle = v.appearance.hairStyle === "messy" ? "Messy_" : ""; var hairLength = v.appearance.hairLength === "long" ? "Long" : "Short"; var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var hairColorMap = { "Black": "Black", "Brown": "Brown", "Blonde": "Blonde", "Red": "Red", "Platinum Blonde": "Platinum" }; var hairColor = hairColorMap[v.appearance.hairColor] || v.appearance.hairColor; var age = v.appearance.age === "Mature Adult" ? "Mature" : "Adult"; // Build filename var filename = gender + "_" + hairStyle + hairLength + "_" + skinTone + "_" + hairColor + "_" + age + ".webp"; // Return standard path return "Images/Faces/" + filename; }>> /* ---------------------------------- */ /* --- CHEST IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerChestImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, locationImagesEnabled: true, customImages: { face: "", chest: "", butt: "" } }; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.chest || ""; } // Otherwise return default image path var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var chestSizeMap = { "flat masculine": "Masculine_Flat", "flat": "Flat", "small": "Small", "medium": "Medium", "large": "Big", "huge": "Huge", "giant": "Giant", "gigantic": "Gigantic" }; var chestSize = chestSizeMap[v.bodyParts.chest.toLowerCase()] || "Flat"; var filename = chestSize + "_" + skinTone + ".webp"; return "Images/Chests/" + filename; }>> /* ---------------------------------- */ /* --- BUTT IMAGE GENERATION --- */ /* ---------------------------------- */ <<set setup.getPlayerButtImage = function() { var v = State.variables; // Initialize imageSettings if it doesn't exist if (!v.imageSettings) { v.imageSettings = { imagesEnabled: true, locationImagesEnabled: true, customImages: { face: "", chest: "", butt: "" } }; } // If images are disabled, return custom image or empty string if (!v.imageSettings.imagesEnabled) { return v.imageSettings.customImages.butt || ""; } // Otherwise return default image path var skinTone = v.appearance.skinTone.charAt(0).toUpperCase() + v.appearance.skinTone.slice(1); var buttSizeMap = { "flat masculine": "Masculine_Flat", "flat": "Flat", "small": "Small", "medium": "Medium", "large": "Big", "huge": "Huge", "giant": "Giant", "gigantic": "Gigantic" }; var buttSize = buttSizeMap[v.bodyParts.butt.toLowerCase()] || "Flat"; var filename = buttSize + "_" + skinTone + ".webp"; return "Images/Butts/" + filename; }>>
/* ======================================== TRANSFORMATION TEXT FUNCTIONS - COMPLETE Comprehensive descriptions for every size change Single result image per transformation 8 sizes for chest/butt (including flatmasculine) Age-based bimbo images ======================================== */ /* ---------------------------------- */ /* --- REQUIRED ARRAYS --- */ /* ---------------------------------- */ <<if !setup.chestSizeOrder>> <<set setup.chestSizeOrder = ["flatmasculine", "flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> <</if>> <<if !setup.buttSizeOrder>> <<set setup.buttSizeOrder = ["flatmasculine", "flat", "small", "medium", "large", "huge", "giant", "gigantic"]>> <</if>> /* ---------------------------------- */ /* --- CHEST TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getChestTransformationText = function(oldSize, newSize) { var imageHTML = ""; // Safety check for undefined values if (!oldSize || !newSize) { return "Chest transformation cannot be processed - missing size information."; } if (!setup.chestSizeOrder) { setup.chestSizeOrder = ["flatmasculine", "flat", "small", "medium", "large", "huge", "giant", "gigantic"]; } var oldS = oldSize.toLowerCase().replace(/\s+/g, ''); var newS = newSize.toLowerCase().replace(/\s+/g, ''); if (oldS === newS) { return "Your chest remains unchanged."; } // Single result image - just the final size if (typeof $imageSettings !== "undefined" && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled) { var imagePath = "Images/PostSwap/Chest_" + newS + ".webp"; imageHTML = '<div style="text-align: center; margin: 20px 0;">'; imageHTML += '<img src="' + imagePath + '" style="max-width: 60%; border-radius: 10px; border: 2px solid #FF69B4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Chest Result">'; imageHTML += '</div>'; } // Get the transformation key var key = oldS + "_to_" + newS; // Define all transformation descriptions var transformations = { // FROM FLAT MASCULINE "flatmasculine_to_flat": [ "Your chest tingles subtly as the masculine firmness softens slightly. The hard, muscular flatness gives way to a smoother, softer flatness—still without curves, but less aggressively masculine. The change is subtle but noticeable." ], "flatmasculine_to_small": [ "A warm tingling spreads across your chest as subtle swells begin to form. The hard masculine flatness softens as small, sensitive mounds push outward, creating the first hints of feminine curves. Your nipples harden as they adjust to their new prominence.", "You feel a pleasant warmth as your masculine chest begins to transform. Delicate flesh swells gently outward, forming small, pert breasts. The transformation from masculine flatness to modest femininity is gentle but unmistakable." ], "flatmasculine_to_medium": [ "Heat blooms across your chest as your masculine flatness transforms dramatically. Your breasts swell outward with steady pressure, expanding from hard muscle into full, rounded curves that fill your palms. The transformation from masculine to feminine leaves you breathless.", "You gasp as your masculine chest surges forward, hard muscle softening and swelling. Medium-sized breasts emerge with surprising weight, their soft curves bouncing gently with each breath. The transformation from flat masculinity to feminine fullness is profound." ], "flatmasculine_to_large": [ "Your masculine chest explodes outward with overwhelming sensation. The hard, flat muscle transforms rapidly into large, heavy breasts that surge into existence. Your back arches involuntarily as the substantial weight settles, nipples hardening atop the impressive mounds.", "An intense pressure builds in your masculine chest before releasing in a rush of feminizing growth. Your breasts swell dramatically, expanding from hard flatness to large, bouncing curves that demand attention. You moan as the weight becomes deliciously apparent." ], "flatmasculine_to_huge": [ "Overwhelming heat surges through your chest as your masculine flatness transforms extremely. Huge breasts explode outward, the hard muscle becoming enormous, heavy orbs that bounce and sway. The massive weight pulls at your shoulders, nipples thick and prominent.", "Your masculine chest erupts with sensation as a profound change overtakes you. Huge breasts swell into existence, expanding dramatically from flat hardness until they dominate your torso. You gasp and moan as the enormous weight settles." ], "flatmasculine_to_giant": [ "Your masculine chest surges outward in an overwhelming wave of transformation. Giant breasts explode into existence, massive and heavy, swelling until they dominate your entire frame. You cry out at the extreme weight, the transformation from masculine flatness to extreme femininity shocking.", "An almost unbearable pressure radiates through your masculine chest before releasing in a flood of growth. Your breasts expand to giant proportions from hard flatness, the massive orbs bouncing with substantial weight. The transformation is both shocking and intensely arousing." ], "flatmasculine_to_gigantic": [ "Your masculine chest erupts with the most extreme transformation possible. Gigantic breasts explode outward from hard muscle, growing to truly enormous proportions. The massive, heavy orbs swing and bounce with overwhelming weight, completely reshaping your silhouette.", "An incredible pressure builds in your masculine chest before bursting forth in extreme growth. Your breasts expand to gigantic size from flat hardness, the enormous mounds dominating your entire torso. You moan loudly as the extreme weight settles." ], // FROM FLAT "flat_to_flatmasculine": [ "Your chest tingles as it firms and hardens slightly. The soft flatness becomes more muscular, more aggressively masculine. The subtle change leaves your chest harder and more defined, though still without curves." ], "flat_to_small": [ "A warm tingling spreads across your chest as subtle swells begin to form. Small, sensitive mounds push outward, creating the first hints of feminine curves. Your nipples harden as they adjust to their new prominence.", "You feel a pleasant warmth as your chest begins to bud. Delicate flesh swells gently outward, forming small, pert breasts. The transformation is gentle but unmistakable, leaving you with modest, sensitive curves.", "Your flat chest tingles intensely as new tissue begins to develop. Slowly but surely, small breasts emerge, pushing outward with youthful firmness. You gasp at the novel weight and sensitivity." ], "flat_to_medium": [ "Heat blooms across your chest as substantial growth begins. Your breasts swell outward with steady pressure, expanding from nothing into full, rounded curves that fill your palms. The transformation leaves you breathless.", "You gasp as your chest surges forward, flesh multiplying and swelling. Medium-sized breasts emerge with surprising weight, their soft curves bouncing gently with each breath. Nipples peak prominently atop the new mounds.", "Intense tingling radiates through your chest as it transforms dramatically. Your breasts grow from flat to full and round, the newly formed curves jiggling softly. The substantial weight feels both strange and arousing." ], "flat_to_large": [ "Your chest explodes outward with overwhelming sensation. Large, heavy breasts surge into existence, the transformation rapid and profound. Your back arches involuntarily as the substantial weight settles, nipples hardening atop the impressive mounds.", "An intense pressure builds in your chest before releasing in a rush of growth. Your breasts swell dramatically, expanding from nothing to large, bouncing curves that demand attention. You moan as the weight becomes deliciously apparent.", "You cry out as your chest transforms dramatically. Flesh multiplies rapidly, creating large, heavy breasts that hang with enticing weight. The transformation is total—where there was flatness now sits impressive, jiggling femininity." ], "flat_to_huge": [ "Overwhelming heat surges through your chest as an extreme transformation begins. Your breasts explode outward, growing into huge, heavy orbs that bounce and sway. The massive weight pulls at your shoulders, nipples thick and prominent.", "Your chest erupts with sensation as a profound change overtakes you. Huge breasts swell into existence, expanding dramatically until they dominate your torso. You gasp and moan as the enormous weight settles, soft flesh spilling abundantly.", "An intense pressure builds to an overwhelming crescendo as your chest transforms completely. Huge, heavy breasts emerge with shocking speed, their substantial mass jiggling with every movement. The transformation leaves you panting and sensitized." ], "flat_to_giant": [ "Your chest surges outward in an overwhelming wave of transformation. Giant breasts explode into existence, massive and heavy, swelling until they dominate your entire frame. You cry out at the extreme weight, nipples peaked atop the enormous mounds.", "An almost unbearable pressure radiates through your chest before releasing in a flood of growth. Your breasts expand to giant proportions, the massive orbs bouncing and swaying with substantial weight. The transformation is both shocking and intensely arousing.", "You feel your chest transforming dramatically as giant breasts surge forth. The massive curves expand rapidly, growing heavier and fuller until they hang impressively. Your back arches under the extreme new weight, sensation overwhelming you." ], "flat_to_gigantic": [ "Your chest erupts with the most extreme transformation possible. Gigantic breasts explode outward, growing to truly enormous proportions. The massive, heavy orbs swing and bounce with overwhelming weight, completely reshaping your silhouette.", "An incredible pressure builds in your chest before bursting forth in extreme growth. Your breasts expand to gigantic size, the enormous mounds dominating your entire torso. You moan loudly as the extreme weight settles, flesh abundant and soft.", "Your chest transforms in the most profound way imaginable. Gigantic breasts surge into existence, expanding rapidly to truly extreme proportions. The massive weight pulls intensely at your frame, each movement causing them to bounce and sway dramatically." ], // FROM SMALL "small_to_flatmasculine": [ "A cool, pulling sensation spreads through your chest as your small breasts begin to shrink and harden. The soft mounds flatten completely, becoming hard, muscular, and aggressively masculine. The feminine curves disappear entirely, replaced by firm muscle." ], "small_to_flat": [ "A cool, pulling sensation spreads through your chest as your small breasts begin to shrink. The soft mounds gradually flatten, flesh receding until your chest is completely smooth. The sensitivity fades with the curves.", "You feel your breasts diminishing, the small swells pulling inward and flattening. The transformation is thorough—soft curves disappear entirely, leaving you with a flat, smooth chest. The feminine weight vanishes completely.", "Tingling spreads through your chest as your small breasts reduce gradually. The delicate mounds flatten steadily until no trace of them remains. Your chest returns to a completely flat state." ], "small_to_medium": [ "Warmth blooms across your chest as your small breasts begin to swell. They expand steadily, growing fuller and rounder until they reach a nice handful. The increased weight is pleasant and noticeable.", "You gasp as your breasts grow from small to medium, flesh swelling outward with steady pressure. The transformation leaves you with nicely rounded curves that bounce gently. Your nipples harden atop the fuller mounds.", "Your chest tingles as growth begins. Your small breasts expand pleasantly, filling out into medium-sized curves that feel substantial in your hands. The added weight and sensitivity makes you shiver." ], "small_to_large": [ "Intense heat radiates through your chest as dramatic growth begins. Your small breasts swell rapidly, expanding into large, heavy curves that bounce with their new weight. The transformation is substantial and arousing.", "You moan as your breasts surge forward dramatically. They grow from small to large, the flesh multiplying until you have impressive, jiggling curves. The considerable weight settles heavily, nipples peaked with stimulation.", "Your chest transforms significantly as your breasts expand. The small mounds swell into large, bouncing breasts that demand attention. You gasp at the dramatic increase in weight and sensitivity." ], "small_to_huge": [ "Your chest explodes with sensation as extreme growth overtakes you. Your small breasts expand massively, swelling into huge, heavy orbs that hang with substantial weight. The transformation is profound and intense.", "Overwhelming pressure builds in your chest before releasing in a surge of growth. Your breasts expand from small to huge, the massive curves bouncing and swaying. You cry out at the extreme increase in weight.", "You feel your breasts transforming dramatically, growing from small to huge. The enormous expansion leaves you with massive, jiggling curves that dominate your torso. The weight is extreme and arousing." ], "small_to_giant": [ "An overwhelming transformation overtakes your chest. Your small breasts explode outward, expanding into giant, heavy orbs that swing with massive weight. The extreme growth leaves you moaning and breathless.", "Intense pressure radiates through your chest as your breasts undergo extreme growth. They expand from small to giant proportions, the enormous mounds bouncing heavily. You gasp at the shocking transformation.", "Your chest surges dramatically as your breasts grow to giant size. The massive expansion creates enormous, swaying curves that completely reshape your silhouette. The extreme weight pulls intensely at your frame." ], "small_to_gigantic": [ "Your chest erupts with the most extreme transformation possible. Your small breasts explode into gigantic proportions, the enormous orbs swelling with overwhelming weight. The transformation is shocking and intensely arousing.", "Incredible pressure builds before bursting forth in extreme growth. Your breasts expand from small to gigantic, the massive mounds dominating your entire body. You cry out as the extreme weight settles.", "Your chest transforms in the most profound way. Your small breasts surge into gigantic curves, expanding to truly enormous size. The massive weight bounces and sways with every movement, leaving you panting." ], // FROM MEDIUM "medium_to_flatmasculine": [ "A pulling sensation courses through your chest as your breasts shrink rapidly and harden. The medium curves diminish and firm, receding entirely until your chest is hard, muscular, and masculine. All feminine softness transforms into firm muscle." ], "medium_to_flat": [ "A pulling sensation courses through your chest as your breasts begin to shrink rapidly. The medium-sized curves diminish steadily, receding entirely until your chest is completely flat. All feminine softness vanishes.", "You feel your breasts reducing significantly, the medium mounds pulling inward and flattening. The transformation is complete—rounded curves disappear, leaving you with a smooth, firm chest. The weight and sensitivity fade entirely.", "Your chest tingles as your breasts shrink dramatically. The medium-sized curves flatten thoroughly, all traces of feminine shape disappearing. Your chest returns to a flat state." ], "medium_to_small": [ "Cool tingling spreads through your chest as your breasts begin to shrink. The medium curves reduce pleasantly, becoming smaller and perkier. You end up with cute, modest breasts that sit high on your chest.", "You feel your breasts diminishing slightly, the medium mounds reducing to small, pert swells. The transformation is gentle but noticeable, leaving you with dainty, sensitive curves.", "Your chest shifts as your breasts shrink from medium to small. The curves reduce steadily, becoming more modest and youthful. The reduced weight feels lighter and firmer." ], "medium_to_large": [ "Warmth spreads across your chest as your breasts begin to swell. The medium curves expand steadily, growing heavier and fuller. You end up with large, impressive breasts that bounce enticingly.", "You gasp as your breasts grow noticeably, the medium mounds expanding into large, heavy curves. The increased weight settles pleasantly, flesh jiggling with each breath. Your nipples harden atop the fuller breasts.", "Your chest tingles as growth begins. Your medium breasts swell into large, attention-grabbing curves that hang with pleasant weight. The transformation leaves you feeling voluptuous and sensitive." ], "medium_to_huge": [ "Intense heat radiates through your chest as dramatic growth begins. Your medium breasts expand rapidly, swelling into huge, heavy orbs that bounce with substantial weight. The transformation is extreme and arousing.", "You moan as your breasts surge forward significantly. They grow from medium to huge, the flesh multiplying until you have massive, jiggling curves. The considerable weight settles heavily, pulling at your shoulders.", "Your chest transforms dramatically as your breasts expand. The medium mounds swell into huge, swaying breasts that dominate your torso. You gasp at the extreme increase in weight and sensitivity." ], "medium_to_giant": [ "Your chest erupts with sensation as profound growth overtakes you. Your medium breasts expand massively, swelling into giant, heavy orbs that hang with extreme weight. The transformation is shocking and intense.", "Overwhelming pressure builds in your chest before releasing in a surge of growth. Your breasts expand from medium to giant, the enormous curves bouncing and swaying. You cry out at the massive increase in weight.", "You feel your breasts transforming dramatically, growing from medium to giant. The enormous expansion leaves you with massive, jiggling curves that completely reshape your silhouette. The weight is extreme." ], "medium_to_gigantic": [ "Your chest explodes with the most extreme transformation. Your medium breasts expand into gigantic proportions, the enormous orbs swelling with overwhelming weight. The change is total and intensely arousing.", "Incredible pressure radiates through your chest before bursting forth in extreme growth. Your breasts expand from medium to gigantic, the massive mounds dominating your entire body. You gasp at the shocking transformation.", "Your chest undergoes the most profound change possible. Your medium breasts surge into gigantic curves, expanding to truly enormous size. The massive weight bounces heavily, leaving you breathless." ], // FROM LARGE "large_to_flatmasculine": [ "An intense pulling sensation courses through your chest as your large breasts shrink dramatically and harden. The heavy curves diminish and firm rapidly, receding entirely until your chest is hard, muscular, and masculine. The transformation is profound and complete." ], "large_to_flat": [ "An intense pulling sensation courses through your chest as your large breasts shrink dramatically. The heavy curves diminish rapidly, receding entirely until your chest is completely flat. The transformation is profound and complete.", "You feel your breasts reducing massively, the large mounds pulling inward and flattening entirely. The transformation is extreme—bouncing curves disappear completely, leaving you with a smooth, firm chest. All weight vanishes.", "Your chest tingles intensely as your breasts shrink dramatically. The large, heavy curves flatten thoroughly, every trace of feminine shape disappearing. Your chest returns to a completely flat state." ], "large_to_small": [ "Cool tingling spreads through your chest as your breasts shrink considerably. The large curves reduce significantly, becoming small, pert swells. The dramatic reduction in weight feels almost dizzying.", "You feel your breasts diminishing substantially, the large mounds reducing to small, modest curves. The transformation is significant—you lose considerable weight and volume, ending with delicate, sensitive breasts.", "Your chest shifts dramatically as your breasts shrink from large to small. The curves reduce extensively, becoming much more modest and youthful. The greatly reduced weight feels remarkably lighter." ], "large_to_medium": [ "A pulling sensation spreads through your chest as your large breasts begin to shrink. The heavy curves reduce to a more moderate size, becoming medium-sized and manageable. The reduced weight is noticeable but pleasant.", "You feel your breasts diminishing somewhat, the large mounds reducing to medium, rounded curves. The transformation is clear—you lose some weight and volume, but retain attractive feminine shape.", "Your chest tingles as your breasts shrink from large to medium. The impressive curves reduce to a more modest size, less heavy but still nicely rounded. The reduced weight feels more comfortable." ], "large_to_huge": [ "Warmth blooms across your chest as your large breasts begin to swell further. They expand steadily, growing even heavier and fuller. You end up with huge, impressive breasts that bounce and sway dramatically.", "You gasp as your breasts grow significantly, the large mounds expanding into huge, heavy curves. The increased weight becomes quite substantial, flesh jiggling heavily with each breath. Your nipples peak prominently.", "Your chest tingles as dramatic growth begins. Your large breasts swell into huge, dominating curves that hang with considerable weight. The transformation leaves you feeling extremely voluptuous." ], "large_to_giant": [ "Intense heat radiates through your chest as extreme growth begins. Your large breasts expand massively, swelling into giant, heavy orbs that bounce with enormous weight. The transformation is profound and arousing.", "You moan as your breasts surge forward dramatically. They grow from large to giant, the flesh multiplying until you have massive, swaying curves. The extreme weight settles heavily, pulling at your frame.", "Your chest transforms significantly as your breasts expand. The large mounds swell into giant, attention-commanding breasts that dominate your entire torso. You gasp at the massive increase in weight." ], "large_to_gigantic": [ "Your chest erupts with sensation as the most extreme growth overtakes you. Your large breasts expand into gigantic proportions, the enormous orbs swelling with overwhelming weight. The transformation is shocking and intense.", "Overwhelming pressure builds in your chest before releasing in a surge of extreme growth. Your breasts expand from large to gigantic, the massive curves bouncing heavily. You cry out at the incredible transformation.", "You feel your breasts transforming dramatically, growing from large to gigantic. The enormous expansion creates truly massive, swaying curves. The extreme weight bounces and jiggles with overwhelming presence." ], // FROM HUGE "huge_to_flatmasculine": [ "An extreme pulling sensation courses through your chest as your huge breasts shrink and harden dramatically. The massive curves diminish and firm completely, receding entirely until your chest is hard, muscular, and masculine. The loss of weight is shocking." ], "huge_to_flat": [ "An extreme pulling sensation courses through your chest as your huge breasts shrink dramatically. The massive curves diminish completely, receding entirely until your chest is flat. The loss of weight is shocking.", "You feel your breasts reducing massively, the huge mounds pulling inward and flattening entirely. The transformation is extreme—heavy, bouncing curves disappear completely, leaving you with a smooth, firm chest.", "Your chest experiences intense tingling as your breasts shrink dramatically. The huge, heavy curves flatten thoroughly, every trace of the massive mounds disappearing. Your chest returns to complete flatness." ], "huge_to_small": [ "Intense pulling spreads through your chest as your breasts shrink extremely. The huge curves reduce dramatically to small, pert swells. The massive reduction in weight feels almost disorienting—you go from heavy and bouncing to delicate and modest.", "You feel your breasts diminishing enormously, the huge mounds reducing to small, dainty curves. The transformation is extreme—you lose massive weight and volume, ending with subtle, sensitive breasts.", "Your chest shifts dramatically as your breasts shrink from huge to small. The massive curves reduce extensively, becoming tiny and youthful. The drastically reduced weight feels remarkably lighter." ], "huge_to_medium": [ "Strong pulling sensations course through your chest as your huge breasts begin to shrink considerably. The massive curves reduce to a more moderate medium size. The significant reduction in weight is both noticeable and relieving.", "You feel your breasts diminishing substantially, the huge mounds reducing to medium, manageable curves. The transformation is significant—you lose considerable weight and volume, but retain pleasant feminine shape.", "Your chest tingles as your breasts shrink from huge to medium. The massive curves reduce significantly to a more modest size. The greatly reduced weight feels much more comfortable and manageable." ], "huge_to_large": [ "Cool tingling spreads through your chest as your huge breasts shrink somewhat. The massive curves reduce to large, still impressive breasts. The reduction in weight is noticeable—lighter but still substantial and bouncing.", "You feel your breasts diminishing moderately, the huge mounds reducing to large, heavy curves. The transformation is clear—you lose some of the extreme weight, but retain impressive, attention-grabbing size.", "Your chest shifts as your breasts shrink from huge to large. The massive curves reduce to a somewhat smaller (but still substantial) size. The reduced weight feels more manageable while remaining voluptuous." ], "huge_to_giant": [ "Warmth spreads across your chest as your huge breasts begin to swell even further. They expand steadily, growing into giant, massively heavy orbs. The increased weight becomes extreme and dominating.", "You gasp as your breasts grow notably, the huge mounds expanding into giant, enormous curves. The weight becomes truly extreme, flesh jiggling massively with each breath. Your back arches under the burden.", "Your chest tingles as extreme growth begins. Your huge breasts swell into giant, completely dominating curves that swing with massive weight. The transformation pushes you to new extremes." ], "huge_to_gigantic": [ "Intense heat radiates through your chest as the ultimate growth begins. Your huge breasts expand into gigantic proportions, the enormous orbs swelling with the most extreme weight possible. The transformation is overwhelming.", "You moan loudly as your breasts surge forward to maximum size. They grow from huge to gigantic, the flesh multiplying until you have truly massive, swaying curves. The weight is almost unbearable—heavy and ever-present.", "Your chest transforms dramatically as your breasts expand to their absolute limit. The huge mounds swell into gigantic, world-dominating breasts. You cry out at the extreme final transformation." ], // FROM GIANT "giant_to_flatmasculine": [ "An overwhelming pulling sensation courses through your chest as your giant breasts shrink and harden completely. The enormous curves diminish and firm entirely, receding until your chest is hard, muscular, and masculine. The extreme loss of weight is shocking and disorienting." ], "giant_to_flat": [ "An overwhelming pulling sensation courses through your chest as your giant breasts shrink completely. The enormous curves diminish entirely, receding until your chest is flat. The extreme loss of weight is shocking and disorienting.", "You feel your breasts reducing massively, the giant mounds pulling inward and vanishing entirely. The transformation is the most extreme possible—enormous, swaying curves disappear completely, leaving you with a smooth, firm chest.", "Your chest experiences overwhelming tingling as your breasts shrink dramatically. The giant, massive curves flatten thoroughly and completely. Your chest returns to absolute flatness—the change is total." ], "giant_to_small": [ "Extreme pulling spreads through your chest as your breasts shrink to the opposite extreme. The giant curves reduce dramatically to small, pert swells. The massive reduction from enormous to delicate is almost surreal.", "You feel your breasts diminishing incredibly, the giant mounds reducing to small, dainty curves. The transformation is extreme—you lose massive weight and volume, going from dominating to modest.", "Your chest undergoes an extreme transformation as your breasts shrink from giant to small. The enormous curves reduce drastically, becoming tiny and youthful. The weight difference is staggering." ], "giant_to_medium": [ "Strong pulling sensations course through your chest as your giant breasts shrink dramatically. The enormous curves reduce to medium size—a significant transformation. You lose extreme weight and dominance.", "You feel your breasts diminishing greatly, the giant mounds reducing to medium, manageable curves. The transformation is major—you lose most of the extreme weight, ending at a more moderate size.", "Your chest tingles intensely as your breasts shrink from giant to medium. The massive curves reduce significantly to a modest, everyday size. The loss of extreme weight is palpable." ], "giant_to_large": [ "Pulling sensations spread through your chest as your giant breasts shrink considerably. The enormous curves reduce to large, still impressive breasts. You lose some extreme weight but retain substantial size.", "You feel your breasts diminishing noticeably, the giant mounds reducing to large, heavy curves. The transformation is clear—less extreme weight, but still impressive and attention-grabbing.", "Your chest shifts as your breasts shrink from giant to large. The massive curves reduce to a somewhat smaller (though still substantial) size. The weight becomes more manageable." ], "giant_to_huge": [ "Cool tingling spreads through your chest as your giant breasts shrink moderately. The enormous curves reduce to huge, massively heavy breasts. The weight remains extreme but slightly less dominating.", "You feel your breasts diminishing somewhat, the giant mounds reducing to huge, still very substantial curves. The transformation reduces the most extreme proportions while keeping you very voluptuous.", "Your chest shifts as your breasts shrink from giant to huge. The enormous curves reduce slightly but remain massive and heavy. The weight is still extreme but marginally more manageable." ], "giant_to_gigantic": [ "Warmth spreads across your chest as your giant breasts swell to their absolute maximum. They expand further into gigantic, impossibly heavy orbs. The weight becomes the most extreme possible.", "You gasp as your breasts grow to their final size, the giant mounds expanding into gigantic, truly enormous curves. The weight becomes ultimate—flesh jiggling massively with overwhelming presence.", "Your chest tingles as the final growth begins. Your giant breasts swell into gigantic, absolutely dominating curves. The transformation takes you to the absolute extreme of size and weight." ], // FROM GIGANTIC "gigantic_to_flatmasculine": [ "An absolutely overwhelming pulling sensation courses through your chest as your gigantic breasts shrink and harden completely. The impossibly enormous curves diminish and firm entirely, receding until your chest is hard, muscular, and masculine. The transformation is the most extreme possible." ], "gigantic_to_flat": [ "An absolutely overwhelming pulling sensation courses through your chest as your gigantic breasts shrink completely. The impossibly enormous curves diminish entirely, receding until your chest is flat. The transformation is the most extreme possible.", "You feel your breasts reducing from their maximum size, the gigantic mounds pulling inward and vanishing entirely. The transformation is total—enormous, heavily swaying curves disappear completely, leaving only smooth firmness.", "Your chest experiences the most intense tingling imaginable as your breasts shrink from maximum to nothing. The gigantic, world-dominating curves flatten thoroughly and completely. The loss of extreme weight is staggering." ], "gigantic_to_small": [ "Extreme pulling spreads through your chest as your breasts undergo the maximum possible reduction. The gigantic curves shrink dramatically to small, pert swells. The transformation from maximum to minimal is almost incomprehensible.", "You feel your breasts diminishing from their largest to smallest size, the gigantic mounds reducing to small, dainty curves. The loss of weight is extreme—from dominating your entire body to subtle swells.", "Your chest undergoes the ultimate transformation as your breasts shrink from gigantic to small. The enormous curves reduce drastically, becoming tiny and youthful. The weight difference is absolutely staggering." ], "gigantic_to_medium": [ "Overwhelming pulling sensations course through your chest as your gigantic breasts shrink dramatically. The impossibly large curves reduce to medium size—an extreme transformation. You lose massive weight and presence.", "You feel your breasts diminishing greatly, the gigantic mounds reducing to medium, everyday curves. The transformation is major—from extreme dominance to moderate normalcy.", "Your chest tingles intensely as your breasts shrink from gigantic to medium. The absolutely massive curves reduce significantly to a modest size. The loss of extreme weight changes everything." ], "gigantic_to_large": [ "Strong pulling sensations spread through your chest as your gigantic breasts shrink considerably. The enormous curves reduce to large, though still impressive breasts. You lose extreme size but retain substantial curves.", "You feel your breasts diminishing noticeably, the gigantic mounds reducing to large, heavy curves. The transformation is significant—less overwhelming weight, but still attention-grabbing and voluptuous.", "Your chest shifts as your breasts shrink from gigantic to large. The massive curves reduce substantially but remain impressive. The weight becomes much more manageable." ], "gigantic_to_huge": [ "Pulling sensations course through your chest as your gigantic breasts shrink moderately. The enormous curves reduce to huge, massively heavy breasts. The weight remains very extreme but less overwhelming.", "You feel your breasts diminishing somewhat, the gigantic mounds reducing to huge, still very substantial curves. The transformation reduces the absolute extreme while keeping you incredibly voluptuous.", "Your chest shifts as your breasts shrink from gigantic to huge. The absolutely enormous curves reduce but remain massive. The weight is still extreme but more bearable." ], "gigantic_to_giant": [ "Cool tingling spreads through your chest as your gigantic breasts shrink slightly. The enormous curves reduce to giant, extremely heavy breasts. The weight remains massive but marginally less extreme.", "You feel your breasts diminishing modestly, the gigantic mounds reducing to giant, still enormous curves. The transformation is subtle—from absolutely maximum to merely extreme.", "Your chest shifts as your breasts shrink from gigantic to giant. The impossibly large curves reduce slightly but remain massively heavy and dominating. The difference is noticeable but not dramatic." ] }; // Get the appropriate transformation text var textArray = transformations[key]; if (!textArray || textArray.length === 0) { // Fallback for any missing combinations return imageHTML + "Your chest tingles as it transforms from " + oldSize + " to " + newSize + "."; } // Return image + random variation return imageHTML + textArray[Math.floor(Math.random() * textArray.length)]; }>> /* ---------------------------------- */ /* --- BUTT TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getButtTransformationText = function(oldSize, newSize) { var imageHTML = ""; // Safety check for undefined values if (!oldSize || !newSize) { return "Butt transformation cannot be processed - missing size information."; } if (!setup.buttSizeOrder) { setup.buttSizeOrder = ["flatmasculine", "flat", "small", "medium", "large", "huge", "giant", "gigantic"]; } var oldS = oldSize.toLowerCase().replace(/\s+/g, ''); var newS = newSize.toLowerCase().replace(/\s+/g, ''); if (oldS === newS) { return "Your butt remains unchanged."; } // Single result image - just the final size if (typeof $imageSettings !== "undefined" && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled) { var imagePath = "Images/PostSwap/Butt_" + newS + ".webp"; imageHTML = '<div style="text-align: center; margin: 20px 0;">'; imageHTML += '<img src="' + imagePath + '" style="max-width: 60%; border-radius: 10px; border: 2px solid #FF69B4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Butt Result">'; imageHTML += '</div>'; } // Get the transformation key var key = oldS + "_to_" + newS; // Define all transformation descriptions var transformations = { // FROM FLAT MASCULINE "flatmasculine_to_flat": [ "Your rear tingles subtly as the hard, muscular flatness softens slightly. The firm masculine shape gives way to a smoother, softer flatness—still without curves, but less aggressively masculine." ], "flatmasculine_to_small": [ "A warm tingling spreads through your rear as subtle curves begin to form. Your hard, masculine flatness softens as small, pert cheeks push outward, creating the first hints of feminine curves. The transformation is modest but unmistakable.", "You feel pleasant warmth as your masculine behind begins to transform. Delicate curves emerge, forming a small, rounded butt that's firm and lifted. The new shape feels taut and youthful." ], "flatmasculine_to_medium": [ "Heat blooms through your rear as your masculine flatness transforms substantially. Your butt swells outward with steady pressure, expanding from hard muscle into full, rounded curves that jiggle pleasantly. The transformation from masculine to feminine leaves you breathless.", "You gasp as your hard, flat behind surges backward, muscle softening and swelling. A medium-sized butt emerges with surprising weight, the soft cheeks bouncing gently with each step. The transformation from flat masculinity to feminine fullness is profound." ], "flatmasculine_to_large": [ "Your masculine rear explodes outward with overwhelming sensation. The hard, flat muscle transforms rapidly into a large, heavy butt that surges into existence. Your hips sway involuntarily as the substantial weight settles, cheeks bouncing and jiggling with impressive presence.", "An intense pressure builds in your behind before releasing in a rush of feminizing growth. Your butt swells dramatically, expanding from hard flatness to large, bouncing curves that demand attention. You moan as the weight becomes deliciously apparent." ], "flatmasculine_to_huge": [ "Overwhelming heat surges through your rear as your masculine flatness transforms extremely. A huge butt explodes outward, the hard muscle becoming enormous, heavy globes that bounce and sway. The massive weight affects your entire posture.", "Your masculine behind erupts with sensation as a profound change overtakes you. A huge butt swells into existence, expanding dramatically from flat hardness until it dominates your lower body. You gasp and moan as the enormous weight settles." ], "flatmasculine_to_giant": [ "Your masculine rear surges outward in an overwhelming wave of transformation. A giant butt explodes into existence, massive and heavy, swelling until it dominates your entire lower body. You cry out at the extreme weight, the transformation from masculine flatness to extreme femininity shocking.", "An almost unbearable pressure radiates through your behind before releasing in a flood of growth. Your butt expands to giant proportions from hard flatness, the massive globes bouncing with substantial weight. The transformation is both shocking and intensely arousing." ], "flatmasculine_to_gigantic": [ "Your masculine rear erupts with the most extreme transformation possible. A gigantic butt explodes outward from hard muscle, growing to truly enormous proportions. The massive, heavy globes swing and bounce with overwhelming weight, completely reshaping your silhouette from behind.", "An incredible pressure builds in your behind before bursting forth in extreme growth. Your butt expands to gigantic size from flat hardness, the enormous cheeks dominating your entire lower body. You moan loudly as the extreme weight settles." ], // FROM FLAT "flat_to_flatmasculine": [ "Your rear tingles as it firms and hardens slightly. The soft flatness becomes more muscular, more aggressively masculine. The subtle change leaves your behind harder and more defined, though still without curves." ], "flat_to_small": [ "A warm tingling spreads through your rear as subtle curves begin to form. Your butt swells gently outward, creating small, pert cheeks that feel firm and lifted. The transformation is modest but unmistakable.", "You feel pleasant warmth as your flat rear begins to develop. Delicate curves push outward, forming a small, rounded butt that fills your pants better. The new shape feels taut and youthful.", "Your flat behind tingles intensely as new flesh begins to develop. Slowly but surely, a small, perky butt emerges. You gasp at the novel weight and the way it affects your posture." ], "flat_to_medium": [ "Heat blooms through your rear as substantial growth begins. Your butt swells outward with steady pressure, expanding from nothing into full, rounded curves that jiggle pleasantly. The transformation leaves you breathless.", "You gasp as your behind surges backward, flesh multiplying and swelling. A medium-sized butt emerges with surprising weight, the soft cheeks bouncing gently with each step. The substantial curves feel both strange and arousing.", "Intense tingling radiates through your rear as it transforms dramatically. Your butt grows from flat to full and round, the newly formed cheeks jiggling softly. The substantial weight affects how you move." ], "flat_to_large": [ "Your rear explodes outward with overwhelming sensation. A large, heavy butt surges into existence, the transformation rapid and profound. Your hips sway involuntarily as the substantial weight settles, cheeks bouncing and jiggling with impressive presence.", "An intense pressure builds in your behind before releasing in a rush of growth. Your butt swells dramatically, expanding from nothing to large, bouncing curves that demand attention. You moan as the weight becomes deliciously apparent.", "You cry out as your rear transforms dramatically. Flesh multiplies rapidly, creating a large, heavy butt that jiggles with enticing weight. The transformation is total—where there was flatness now sits impressive, feminine curviness." ], "flat_to_huge": [ "Overwhelming heat surges through your rear as an extreme transformation begins. Your butt explodes outward, growing into huge, heavy globes that bounce and sway. The massive weight affects your entire posture, cheeks full and prominent.", "Your behind erupts with sensation as a profound change overtakes you. A huge butt swells into existence, expanding dramatically until it dominates your lower body. You gasp and moan as the enormous weight settles, soft flesh spilling abundantly.", "An intense pressure builds to an overwhelming crescendo as your rear transforms completely. Huge, heavy cheeks emerge with shocking speed, their substantial mass jiggling with every movement. The transformation leaves you panting and sensitized." ], "flat_to_giant": [ "Your rear surges outward in an overwhelming wave of transformation. A giant butt explodes into existence, massive and heavy, swelling until it dominates your entire lower body. You cry out at the extreme weight, cheeks bouncing dramatically.", "An almost unbearable pressure radiates through your behind before releasing in a flood of growth. Your butt expands to giant proportions, the massive globes bouncing and swaying with substantial weight. The transformation is both shocking and intensely arousing.", "You feel your rear transforming dramatically as a giant butt surges forth. The massive curves expand rapidly, growing heavier and fuller until they protrude impressively. Your walk changes completely under the extreme new weight, sensation overwhelming you." ], "flat_to_gigantic": [ "Your rear erupts with the most extreme transformation possible. A gigantic butt explodes outward, growing to truly enormous proportions. The massive, heavy globes swing and bounce with overwhelming weight, completely reshaping your silhouette from behind.", "An incredible pressure builds in your behind before bursting forth in extreme growth. Your butt expands to gigantic size, the enormous cheeks dominating your entire lower body. You moan loudly as the extreme weight settles, flesh abundant and soft.", "Your rear transforms in the most profound way imaginable. A gigantic butt surges into existence, expanding rapidly to truly extreme proportions. The massive weight affects every movement dramatically, each step causing your enormous cheeks to bounce and sway." ], // FROM SMALL "small_to_flatmasculine": [ "A cool, pulling sensation spreads through your rear as your small butt begins to shrink and harden. The perky cheeks flatten and firm completely, becoming hard, muscular, and aggressively masculine. The feminine curves disappear entirely, replaced by firm muscle." ], "small_to_flat": [ "A cool, pulling sensation spreads through your rear as your small butt begins to shrink. The perky cheeks gradually flatten, flesh receding until your behind is completely smooth. The soft curves disappear entirely.", "You feel your butt diminishing, the small swells pulling inward and flattening. The transformation is thorough—rounded curves disappear entirely, leaving you with a flat, firm behind. The feminine weight vanishes completely.", "Tingling spreads through your rear as your small butt reduces gradually. The delicate cheeks flatten steadily until no trace of them remains. Your behind returns to a completely flat state." ], "small_to_medium": [ "Warmth blooms through your rear as your small butt begins to swell. It expands steadily, growing fuller and rounder until you have a nice handful of curves. The increased weight is pleasant and noticeable when you walk.", "You gasp as your butt grows from small to medium, flesh swelling outward with steady pressure. The transformation leaves you with nicely rounded cheeks that bounce gently with each step. The fuller curves feel substantial.", "Your behind tingles as growth begins. Your small butt expands pleasantly, filling out into medium-sized curves that feel good in your hands. The added weight and jiggle makes you shiver with each movement." ], "small_to_large": [ "Intense heat radiates through your rear as dramatic growth begins. Your small butt swells rapidly, expanding into large, heavy curves that bounce with their new weight. The transformation is substantial and arousing.", "You moan as your behind surges backward dramatically. It grows from small to large, the flesh multiplying until you have impressive, jiggling cheeks. The considerable weight settles heavily, affecting how you walk and sit.", "Your rear transforms significantly as your butt expands. The small mounds swell into large, bouncing cheeks that demand attention. You gasp at the dramatic increase in weight and how it changes your movements." ], "small_to_huge": [ "Your rear explodes with sensation as extreme growth overtakes you. Your small butt expands massively, swelling into huge, heavy globes that protrude with substantial weight. The transformation is profound and intense.", "Overwhelming pressure builds in your behind before releasing in a surge of growth. Your butt expands from small to huge, the massive cheeks bouncing and swaying. You cry out at the extreme increase in weight and presence.", "You feel your butt transforming dramatically, growing from small to huge. The enormous expansion leaves you with massive, jiggling curves that dominate your lower body. The weight is extreme and affects everything." ], "small_to_giant": [ "An overwhelming transformation overtakes your rear. Your small butt explodes outward, expanding into giant, heavy globes that sway with massive weight. The extreme growth leaves you moaning and breathless.", "Intense pressure radiates through your behind as your butt undergoes extreme growth. It expands from small to giant proportions, the enormous cheeks bouncing heavily. You gasp at the shocking transformation.", "Your rear surges dramatically as your butt grows to giant size. The massive expansion creates enormous, swaying curves that completely reshape how you move. The extreme weight pulls at your entire lower body." ], "small_to_gigantic": [ "Your rear erupts with the most extreme transformation possible. Your small butt explodes into gigantic proportions, the enormous globes swelling with overwhelming weight. The transformation is shocking and intensely arousing.", "Incredible pressure builds before bursting forth in extreme growth. Your butt expands from small to gigantic, the massive cheeks dominating your entire lower body. You cry out as the extreme weight settles.", "Your behind transforms in the most profound way. Your small butt surges into gigantic curves, expanding to truly enormous size. The massive weight bounces and sways with every tiny movement, leaving you panting." ], // FROM MEDIUM "medium_to_flatmasculine": [ "A pulling sensation courses through your rear as your butt shrinks rapidly and hardens. The medium curves diminish and firm, receding entirely until your behind is hard, muscular, and masculine. All feminine roundness transforms into firm muscle." ], "medium_to_flat": [ "A pulling sensation courses through your rear as your butt begins to shrink rapidly. The medium-sized curves diminish steadily, receding entirely until your behind is completely flat. All feminine roundness vanishes.", "You feel your butt reducing significantly, the medium cheeks pulling inward and flattening. The transformation is complete—rounded curves disappear, leaving you with a smooth, firm behind. The weight and bounce fade entirely.", "Your rear tingles as your butt shrinks dramatically. The medium-sized curves flatten thoroughly, all traces of feminine shape disappearing. Your behind returns to a flat state." ], "medium_to_small": [ "Cool tingling spreads through your rear as your butt begins to shrink. The medium curves reduce pleasantly, becoming smaller and perkier. You end up with a cute, modest butt that sits high and firm.", "You feel your butt diminishing slightly, the medium cheeks reducing to small, pert swells. The transformation is gentle but noticeable, leaving you with a dainty, lifted behind.", "Your rear shifts as your butt shrinks from medium to small. The curves reduce steadily, becoming more modest and youthful. The reduced weight feels lighter and tighter." ], "medium_to_large": [ "Warmth spreads through your rear as your butt begins to swell. The medium curves expand steadily, growing heavier and fuller. You end up with a large, impressive butt that bounces enticingly with each step.", "You gasp as your butt grows noticeably, the medium cheeks expanding into large, heavy curves. The increased weight settles pleasantly, flesh jiggling with each movement. The fuller behind affects how your pants fit.", "Your rear tingles as growth begins. Your medium butt swells into large, attention-grabbing curves that protrude with pleasant weight. The transformation leaves you feeling voluptuous and more conscious of your movements." ], "medium_to_huge": [ "Intense heat radiates through your rear as dramatic growth begins. Your medium butt expands rapidly, swelling into huge, heavy globes that bounce with substantial weight. The transformation is extreme and arousing.", "You moan as your behind surges backward significantly. It grows from medium to huge, the flesh multiplying until you have massive, jiggling cheeks. The considerable weight settles heavily, dramatically affecting your posture.", "Your rear transforms dramatically as your butt expands. The medium cheeks swell into huge, swaying curves that dominate your lower body. You gasp at the extreme increase in weight and presence." ], "medium_to_giant": [ "Your rear erupts with sensation as profound growth overtakes you. Your medium butt expands massively, swelling into giant, heavy globes that protrude with extreme weight. The transformation is shocking and intense.", "Overwhelming pressure builds in your behind before releasing in a surge of growth. Your butt expands from medium to giant, the enormous cheeks bouncing and swaying. You cry out at the massive increase in size and weight.", "You feel your butt transforming dramatically, growing from medium to giant. The enormous expansion leaves you with massive, jiggling curves that completely reshape your silhouette. The weight is extreme and ever-present." ], "medium_to_gigantic": [ "Your rear explodes with the most extreme transformation. Your medium butt expands into gigantic proportions, the enormous globes swelling with overwhelming weight. The change is total and intensely arousing.", "Incredible pressure radiates through your behind before bursting forth in extreme growth. Your butt expands from medium to gigantic, the massive cheeks dominating your entire lower body. You gasp at the shocking transformation.", "Your rear undergoes the most profound change possible. Your medium butt surges into gigantic curves, expanding to truly enormous size. The massive weight bounces heavily with every movement, leaving you breathless." ], // FROM LARGE "large_to_flatmasculine": [ "An intense pulling sensation courses through your rear as your large butt shrinks dramatically and hardens. The heavy curves diminish and firm rapidly, receding entirely until your behind is hard, muscular, and masculine. The transformation is profound and complete." ], "large_to_flat": [ "An intense pulling sensation courses through your rear as your large butt shrinks dramatically. The heavy curves diminish rapidly, receding entirely until your behind is completely flat. The transformation is profound and complete.", "You feel your butt reducing massively, the large cheeks pulling inward and flattening entirely. The transformation is extreme—bouncing curves disappear completely, leaving you with a smooth, firm behind. All weight and jiggle vanish.", "Your rear tingles intensely as your butt shrinks dramatically. The large, heavy curves flatten thoroughly, every trace of feminine shape disappearing. Your behind returns to a completely flat state." ], "large_to_small": [ "Cool tingling spreads through your rear as your butt shrinks considerably. The large curves reduce significantly, becoming small, pert swells. The dramatic reduction in weight and presence feels almost dizzying.", "You feel your butt diminishing substantially, the large cheeks reducing to small, modest curves. The transformation is significant—you lose considerable weight and volume, ending with a delicate, lifted behind.", "Your rear shifts dramatically as your butt shrinks from large to small. The curves reduce extensively, becoming much more modest and youthful. The greatly reduced weight and bounce feel remarkably different." ], "large_to_medium": [ "A pulling sensation spreads through your rear as your large butt begins to shrink. The heavy curves reduce to a more moderate size, becoming medium-sized and manageable. The reduced weight is noticeable but pleasant.", "You feel your butt diminishing somewhat, the large cheeks reducing to medium, rounded curves. The transformation is clear—you lose some weight and volume, but retain attractive feminine shape.", "Your rear tingles as your butt shrinks from large to medium. The impressive curves reduce to a more modest size, less heavy but still nicely rounded. The reduced weight feels more comfortable when moving." ], "large_to_huge": [ "Warmth blooms through your rear as your large butt begins to swell further. It expands steadily, growing even heavier and fuller. You end up with huge, impressive cheeks that bounce and sway dramatically with each step.", "You gasp as your butt grows significantly, the large cheeks expanding into huge, heavy curves. The increased weight becomes quite substantial, flesh jiggling heavily with each movement. The curves protrude prominently.", "Your rear tingles as dramatic growth begins. Your large butt swells into huge, dominating curves that protrude with considerable weight. The transformation leaves you feeling extremely voluptuous and aware of your movements." ], "large_to_giant": [ "Intense heat radiates through your rear as extreme growth begins. Your large butt expands massively, swelling into giant, heavy globes that bounce with enormous weight. The transformation is profound and arousing.", "You moan as your behind surges backward dramatically. It grows from large to giant, the flesh multiplying until you have massive, swaying cheeks. The extreme weight settles heavily, dramatically affecting how you walk and sit.", "Your rear transforms significantly as your butt expands. The large cheeks swell into giant, attention-commanding curves that dominate your entire lower body. You gasp at the massive increase in weight and presence." ], "large_to_gigantic": [ "Your rear erupts with sensation as the most extreme growth overtakes you. Your large butt expands into gigantic proportions, the enormous globes swelling with overwhelming weight. The transformation is shocking and intense.", "Overwhelming pressure builds in your behind before releasing in a surge of extreme growth. Your butt expands from large to gigantic, the massive cheeks bouncing heavily. You cry out at the incredible transformation.", "You feel your butt transforming dramatically, growing from large to gigantic. The enormous expansion creates truly massive, swaying curves. The extreme weight bounces and jiggles with overwhelming presence in every movement." ], // FROM HUGE "huge_to_flatmasculine": [ "An extreme pulling sensation courses through your rear as your huge butt shrinks and hardens dramatically. The massive curves diminish and firm completely, receding entirely until your behind is hard, muscular, and masculine. The loss of weight and presence is shocking." ], "huge_to_flat": [ "An extreme pulling sensation courses through your rear as your huge butt shrinks dramatically. The massive curves diminish completely, receding entirely until your behind is flat. The loss of weight and presence is shocking.", "You feel your butt reducing massively, the huge cheeks pulling inward and flattening entirely. The transformation is extreme—heavy, bouncing curves disappear completely, leaving you with a smooth, firm behind.", "Your rear experiences intense tingling as your butt shrinks dramatically. The huge, heavy curves flatten thoroughly, every trace of the massive cheeks disappearing. Your behind returns to complete flatness." ], "huge_to_small": [ "Intense pulling spreads through your rear as your butt shrinks extremely. The huge curves reduce dramatically to small, pert swells. The massive reduction in weight feels almost disorienting—you go from heavy and bouncing to delicate and modest.", "You feel your butt diminishing enormously, the huge cheeks reducing to small, dainty curves. The transformation is extreme—you lose massive weight and volume, ending with a subtle, perky behind.", "Your rear shifts dramatically as your butt shrinks from huge to small. The massive curves reduce extensively, becoming tiny and youthful. The drastically reduced weight and presence feel remarkably different." ], "huge_to_medium": [ "Strong pulling sensations course through your rear as your huge butt begins to shrink considerably. The massive curves reduce to a more moderate medium size. The significant reduction in weight and bounce is both noticeable and relieving.", "You feel your butt diminishing substantially, the huge cheeks reducing to medium, manageable curves. The transformation is significant—you lose considerable weight and volume, but retain pleasant feminine shape.", "Your rear tingles as your butt shrinks from huge to medium. The massive curves reduce significantly to a more modest size. The greatly reduced weight feels much more comfortable and manageable." ], "huge_to_large": [ "Cool tingling spreads through your rear as your huge butt shrinks somewhat. The massive curves reduce to large, still impressive cheeks. The reduction in weight is noticeable—lighter but still substantial and bouncing.", "You feel your butt diminishing moderately, the huge cheeks reducing to large, heavy curves. The transformation is clear—you lose some of the extreme weight, but retain impressive, attention-grabbing size.", "Your rear shifts as your butt shrinks from huge to large. The massive curves reduce to a somewhat smaller (but still substantial) size. The reduced weight feels more manageable while remaining voluptuous." ], "huge_to_giant": [ "Warmth spreads through your rear as your huge butt begins to swell even further. It expands steadily, growing into giant, massively heavy globes. The increased weight becomes extreme and dominating.", "You gasp as your butt grows notably, the huge cheeks expanding into giant, enormous curves. The weight becomes truly extreme, flesh jiggling massively with each movement. Your posture adjusts dramatically under the burden.", "Your rear tingles as extreme growth begins. Your huge butt swells into giant, completely dominating curves that protrude with massive weight. The transformation pushes you to new extremes of size and presence." ], "huge_to_gigantic": [ "Intense heat radiates through your rear as the ultimate growth begins. Your huge butt expands into gigantic proportions, the enormous globes swelling with the most extreme weight possible. The transformation is overwhelming.", "You moan loudly as your behind surges backward to maximum size. It grows from huge to gigantic, the flesh multiplying until you have truly massive, swaying curves. The weight is almost unbearable—heavy and dominating every movement.", "Your rear transforms dramatically as your butt expands to its absolute limit. The huge cheeks swell into gigantic, world-dominating curves. You cry out at the extreme final transformation." ], // FROM GIANT "giant_to_flatmasculine": [ "An overwhelming pulling sensation courses through your rear as your giant butt shrinks and hardens completely. The enormous curves diminish and firm entirely, receding until your behind is hard, muscular, and masculine. The extreme loss of weight is shocking and disorienting." ], "giant_to_flat": [ "An overwhelming pulling sensation courses through your rear as your giant butt shrinks completely. The enormous curves diminish entirely, receding until your behind is flat. The extreme loss of weight is shocking and disorienting.", "You feel your butt reducing massively, the giant cheeks pulling inward and vanishing entirely. The transformation is the most extreme possible—enormous, swaying curves disappear completely, leaving you with a smooth, firm behind.", "Your rear experiences overwhelming tingling as your butt shrinks dramatically. The giant, massive curves flatten thoroughly and completely. Your behind returns to absolute flatness—the change is total." ], "giant_to_small": [ "Extreme pulling spreads through your rear as your butt shrinks to the opposite extreme. The giant curves reduce dramatically to small, pert swells. The massive reduction from enormous to delicate is almost surreal.", "You feel your butt diminishing incredibly, the giant cheeks reducing to small, dainty curves. The transformation is extreme—you lose massive weight and volume, going from dominating to modest.", "Your rear undergoes an extreme transformation as your butt shrinks from giant to small. The enormous curves reduce drastically, becoming tiny and youthful. The weight difference is staggering." ], "giant_to_medium": [ "Strong pulling sensations course through your rear as your giant butt shrinks dramatically. The enormous curves reduce to medium size—a significant transformation. You lose extreme weight and dominance.", "You feel your butt diminishing greatly, the giant cheeks reducing to medium, manageable curves. The transformation is major—you lose most of the extreme weight, ending at a more moderate size.", "Your rear tingles intensely as your butt shrinks from giant to medium. The massive curves reduce significantly to a modest, everyday size. The loss of extreme weight and presence is palpable." ], "giant_to_large": [ "Pulling sensations spread through your rear as your giant butt shrinks considerably. The enormous curves reduce to large, still impressive cheeks. You lose some extreme weight but retain substantial size and bounce.", "You feel your butt diminishing noticeably, the giant cheeks reducing to large, heavy curves. The transformation is clear—less extreme weight, but still impressive and attention-grabbing.", "Your rear shifts as your butt shrinks from giant to large. The massive curves reduce to a somewhat smaller (though still substantial) size. The weight becomes more manageable but remains voluptuous." ], "giant_to_huge": [ "Cool tingling spreads through your rear as your giant butt shrinks moderately. The enormous curves reduce to huge, massively heavy cheeks. The weight remains extreme but slightly less dominating.", "You feel your butt diminishing somewhat, the giant cheeks reducing to huge, still very substantial curves. The transformation reduces the most extreme proportions while keeping you very voluptuous.", "Your rear shifts as your butt shrinks from giant to huge. The enormous curves reduce slightly but remain massive and heavy. The weight is still extreme but marginally more manageable." ], "giant_to_gigantic": [ "Warmth spreads through your rear as your giant butt swells to its absolute maximum. It expands further into gigantic, impossibly heavy globes. The weight becomes the most extreme possible.", "You gasp as your butt grows to its final size, the giant cheeks expanding into gigantic, truly enormous curves. The weight becomes ultimate—flesh jiggling massively with overwhelming presence.", "Your rear tingles as the final growth begins. Your giant butt swells into gigantic, absolutely dominating curves. The transformation takes you to the absolute extreme of size and weight." ], // FROM GIGANTIC "gigantic_to_flatmasculine": [ "An absolutely overwhelming pulling sensation courses through your rear as your gigantic butt shrinks and hardens completely. The impossibly enormous curves diminish and firm entirely, receding until your behind is hard, muscular, and masculine. The transformation is the most extreme possible." ], "gigantic_to_flat": [ "An absolutely overwhelming pulling sensation courses through your rear as your gigantic butt shrinks completely. The impossibly enormous curves diminish entirely, receding until your behind is flat. The transformation is the most extreme possible.", "You feel your butt reducing from its maximum size, the gigantic cheeks pulling inward and vanishing entirely. The transformation is total—enormous, heavily swaying curves disappear completely, leaving only smooth firmness.", "Your rear experiences the most intense tingling imaginable as your butt shrinks from maximum to nothing. The gigantic, world-dominating curves flatten thoroughly and completely. The loss of extreme weight is staggering." ], "gigantic_to_small": [ "Extreme pulling spreads through your rear as your butt undergoes the maximum possible reduction. The gigantic curves shrink dramatically to small, pert swells. The transformation from maximum to minimal is almost incomprehensible.", "You feel your butt diminishing from its largest to smallest size, the gigantic cheeks reducing to small, dainty curves. The loss of weight is extreme—from dominating your entire lower body to subtle swells.", "Your rear undergoes the ultimate transformation as your butt shrinks from gigantic to small. The enormous curves reduce drastically, becoming tiny and youthful. The weight difference is absolutely staggering." ], "gigantic_to_medium": [ "Overwhelming pulling sensations course through your rear as your gigantic butt shrinks dramatically. The impossibly large curves reduce to medium size—an extreme transformation. You lose massive weight and presence.", "You feel your butt diminishing greatly, the gigantic cheeks reducing to medium, everyday curves. The transformation is major—from extreme dominance to moderate normalcy.", "Your rear tingles intensely as your butt shrinks from gigantic to medium. The absolutely massive curves reduce significantly to a modest size. The loss of extreme weight changes everything about how you move." ], "gigantic_to_large": [ "Strong pulling sensations spread through your rear as your gigantic butt shrinks considerably. The enormous curves reduce to large, though still impressive cheeks. You lose extreme size but retain substantial curves.", "You feel your butt diminishing noticeably, the gigantic cheeks reducing to large, heavy curves. The transformation is significant—less overwhelming weight, but still attention-grabbing and voluptuous.", "Your rear shifts as your butt shrinks from gigantic to large. The massive curves reduce substantially but remain impressive. The weight becomes much more manageable." ], "gigantic_to_huge": [ "Pulling sensations course through your rear as your gigantic butt shrinks moderately. The enormous curves reduce to huge, massively heavy cheeks. The weight remains very extreme but less overwhelming.", "You feel your butt diminishing somewhat, the gigantic cheeks reducing to huge, still very substantial curves. The transformation reduces the absolute extreme while keeping you incredibly voluptuous.", "Your rear shifts as your butt shrinks from gigantic to huge. The absolutely enormous curves reduce but remain massive. The weight is still extreme but more bearable." ], "gigantic_to_giant": [ "Cool tingling spreads through your rear as your gigantic butt shrinks slightly. The enormous curves reduce to giant, extremely heavy cheeks. The weight remains massive but marginally less extreme.", "You feel your butt diminishing modestly, the gigantic cheeks reducing to giant, still enormous curves. The transformation is subtle—from absolutely maximum to merely extreme.", "Your rear shifts as your butt shrinks from gigantic to giant. The impossibly large curves reduce slightly but remain massively heavy and dominating. The difference is noticeable but not dramatic." ] }; // Get the appropriate transformation text var textArray = transformations[key]; if (!textArray || textArray.length === 0) { // Fallback for any missing combinations return imageHTML + "Your butt tingles as it transforms from " + oldSize + " to " + newSize + "."; } // Return image + random variation return imageHTML + textArray[Math.floor(Math.random() * textArray.length)]; }>> /* ---------------------------------- */ /* --- GENITAL TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getGenitalTransformationText = function(oldType, newType) { var imageHTML = ""; if (oldType === newType) { return "Your genitals remain unchanged."; } var texts = []; var oldIsPenis = oldType.includes("penis"); var newIsPenis = newType.includes("penis"); // Single result image - just the final state if (typeof $imageSettings !== "undefined" && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled) { var imagePath = "Images/PostSwap/"; // Extract the descriptor (big, small, average, tight, loose) var descriptor = ""; if (newType.includes("big")) { descriptor = "Big"; } else if (newType.includes("small")) { descriptor = "Small"; } else if (newType.includes("average")) { descriptor = "Average"; } else if (newType.includes("tight")) { descriptor = "Tight"; } else if (newType.includes("loose")) { descriptor = "Loose"; } else { descriptor = "Average"; // Default fallback } if (newIsPenis) { imagePath += descriptor + "_penis.webp"; } else { imagePath += descriptor + "_vagina.webp"; } imageHTML = '<div style="text-align: center; margin: 20px 0;">'; imageHTML += '<img src="' + imagePath + '" style="max-width: 60%; border-radius: 10px; border: 2px solid #9370DB; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Genital Result">'; imageHTML += '</div>'; } if (oldIsPenis && newIsPenis) { // Penis size changes - VERY GRAPHIC if (newType === "big penis") { texts.push("Intense, overwhelming heat suddenly floods your groin, centering on your cock. You gasp as pleasure explodes through your shaft - it's happening, it's growing. Your penis begins swelling rapidly, thickening noticeably. You can feel every inch of growth, every bit of expansion. The shaft lengthens considerably, pushing forward, getting longer and longer. Blood rushes in, engorging your cock massively. Veins become prominently visible, standing out against your skin as your penis throbs with each pulse of growth. Your cock grows heavier, more substantial. The weight becomes undeniable - you can feel it hanging between your legs, thick and impressive. Your shaft continues thickening, the girth increasing dramatically. You reach down instinctively, wrapping your hand around your growing cock. Your fingers barely meet now - it's gotten so thick, so substantial. The transformation makes you rock hard - your massively enlarged penis stands fully erect, throbbing insistently. Pre-cum beads at the tip, your cockhead swollen and sensitive. When it finally stops, you're left panting, aroused beyond belief. Your cock is noticeably, substantially larger - both longer and much thicker. The impressive size is impossible to ignore, the weight pulling between your legs. Every movement makes you aware of your new size - the heft, the prominence. You're left flushed, heart racing, overwhelmed by the arousing transformation of your cock into something truly impressive."); texts.push("Pleasure and heat erupt in your groin as the transformation begins. Your cock swells rapidly, dramatically. The shaft thickens and lengthens in waves - each pulse making you gasp as you feel yourself getting bigger, heavier, more substantial. Your penis grows visibly, pushing outward, the skin stretching as more and more mass is added. Veins bulge prominently along your thickening shaft, pulsing with each beat of your racing heart. The sensation is overwhelmingly erotic. Your growing cock becomes rock hard, standing at full attention as it expands. You watch in aroused fascination as your penis lengthens considerably, the shaft extending inch by inch. The girth increases dramatically - what was once average becomes impressively thick, your cock swelling to substantial proportions. Your cockhead flares larger, more pronounced, the sensitive tip already glistening with pre-cum. The weight is immediately noticeable - your enhanced penis hangs heavy between your legs, the substantial heft undeniable. When fully hard, it throbs insistently, demanding attention. The transformation leaves you intensely aroused, acutely aware of your newly impressive endowment. Your thick, long cock pulses with need, the size impossible to ignore."); } else if (newType === "small penis") { texts.push("A strange, disorienting tingling sensation courses through your groin, centering on your cock. You feel your penis beginning to contract, to shrink. It's an odd feeling - not painful, but profoundly strange as your shaft begins diminishing in both length and girth. Your cock gets shorter, pulling back, retracting. The thickness decreases noticeably, your shaft slimming down. You reach down, wrapping your hand around your shrinking penis. Your fingers overlap easily now - it's gotten noticeably smaller, more modest. The weight decreases, the heft disappearing as your cock reduces to more petite proportions. When the transformation completes, you're left with a noticeably smaller penis - both shorter in length and thinner in girth. The shaft is modest now, cute even. Your reduced size is immediately apparent - less prominent, less substantial. It's a humbling change, your cock now decidedly on the smaller side."); texts.push("Your cock tingles intensely before the shrinking begins. The flesh contracts, your penis diminishing rapidly in size. You watch as your shaft gets shorter, smaller, your cockhead becoming less pronounced. The girth reduces noticeably - what was once substantial becomes slender, modest. The transformation is quick but profound. Your penis shrinks back, the shaft retracting, becoming noticeably smaller. The weight and heft disappear, leaving you with a more petite endowment. When it stops, you're left with a small penis - shorter, thinner, decidedly modest. The change is undeniable, your reduced size clearly visible."); } else { // Average penis texts.push("Your penis tingles and shifts, the shaft adjusting itself. The transformation is subtle but noticeable - your cock settles into comfortable, average proportions. Neither too large nor too small, your penis finds a natural middle ground. The shaft feels balanced, normal, unremarkable in a perfectly acceptable way. Your cock has become average - standard size and girth, the kind that most people have."); } } else if (!oldIsPenis && !newIsPenis) { // Vagina tightness changes - VERY GRAPHIC if (newType === "tight vagina") { texts.push("Intense sensation suddenly floods your core as your pussy begins transforming. You gasp as you feel your internal muscles contracting powerfully, clenching, tightening dramatically. The walls of your vagina squeeze inward, the canal becoming noticeably, significantly tighter. Every nerve ending seems to light up with heightened sensitivity as your pussy tightens around... nothing, creating an empty, gripping sensation that's deeply arousing. Your vaginal muscles tone and strengthen, becoming incredibly responsive. The walls of your pussy press together, the space inside becoming much more snug and gripping. You can feel how tight you've become - imagining anything entering you would be intensely felt, your tight pussy hugging and gripping every inch. Your labia feel more sensitive too, your entire sex heightened and responsive. When the transformation completes, you're left breathless and aroused. Your pussy is now very tight, almost virginally so - the kind of tightness that would make penetration incredibly intense for both you and any partner. The gripping, snug sensation is impossible to ignore. You shift your hips and feel your tight vaginal walls moving, clenching. You're left wet and aroused, your newly tightened pussy demanding attention."); texts.push("Waves of intense sensation course through your core as your pussy begins tightening dramatically. Your vaginal walls contract powerfully, muscles clenching and squeezing. You moan softly as you feel yourself getting tighter and tighter, the internal space becoming increasingly snug and gripping. Every internal muscle seems to tone, to strengthen. Your pussy becomes incredibly tight, the walls pressing together firmly. The sensation is deeply arousing - you can feel how snug you've become, how much more responsive and sensitive. Your vagina is now very tight, gripping, the kind of tightness that would hug anything inside you intensely. You're left flushed and wet, arousal flooding through you. Your tight pussy throbs with heightened sensitivity, the gripping sensation overwhelming. The transformation has left you with an incredibly tight, responsive vagina."); } else if (newType === "loose vagina") { texts.push("A releasing, opening sensation courses through your core as your pussy begins to loosen. Your vaginal walls relax, the internal muscles releasing their tension. You feel yourself opening up, becoming more spacious inside. The tightness fades, replaced by a looser, more accommodating feeling. Your vaginal canal becomes noticeably more open, more pliant. The walls are softer, more relaxed, creating more internal space. The transformation is profound - what was once tight and gripping becomes loose and accommodating. Your pussy could now take larger penetrations more easily, the looser walls more flexible and giving. When it completes, you're left with a noticeably looser vagina - more open, more spacious internally. The walls are relaxed and pliant, the gripping tightness replaced by accommodating looseness."); } else { // Average vagina texts.push("Your pussy tingles and adjusts, the vaginal walls finding a comfortable middle ground. The transformation settles your vagina into average tightness - neither too tight nor too loose. Your pussy becomes moderate, normal, the walls responsive but not gripping, accommodating but not loose. It's a comfortable, average state."); } } else if (oldIsPenis && !newIsPenis) { // Penis to Vagina - EXTREMELY GRAPHIC AND DETAILED texts.push("An overwhelming wave of sensation crashes over you as the profound transformation begins. Your cock tingles intensely, the feeling spreading through your entire groin. Then it starts - pleasure mixed with profound pressure, your penis beginning its dramatic change. You watch in shock and arousal as your shaft begins to shrink, pulling inward. Your cock retracts, getting smaller, shorter. The sensation is indescribable - flesh reshaping itself, your penis inverting as it recedes into your body. Your balls tighten against you, pulling up, ascending. You feel them transforming, changing, moving internally to become ovaries deep inside your pelvis. Your cock continues shrinking, the shaft disappearing as it inverts completely. You feel your scrotum beginning to split, the skin reshaping itself. A slit starts forming where your penis once stood, sensitive folds of flesh emerging. Your cockhead transforms into a clitoris - small but exquisitely sensitive. Labia form, soft outer lips, with delicate inner folds developing inside them. Internal structures develop rapidly - you can feel a vaginal canal creating itself inside you, tunneling deep. Muscles form along the walls. A cervix takes shape at the depths. A womb develops, settling into your lower abdomen. Your body creates ovaries from what were once testicles, positioning them properly inside you. Everything rewires - nerves, blood flow, sensation. When the transformation completes, you look down in awe. Where your cock and balls once hung, you now have a complete, fully functional pussy. Your labia are puffy and sensitive. You tentatively reach down, fingers exploring soft folds, finding the entrance to your new vagina. You're already wet, arousal having flooded through you during the transformation. You slip a finger inside, feeling your new vaginal walls, the tightness, the wetness. You have a vagina now. A real, complete, functional pussy where your masculine genitals used to be. The transformation is total - you can feel it, see it, touch it. Your new pussy throbs with sensitivity and need, already slick and ready, overwhelming you with new sensations."); texts.push("Intense pressure builds in your groin before erupting into the transformation. Your cock begins shrinking rapidly, the sensation both strange and intensely arousing. You moan as your penis pulls inward, inverting, disappearing into your body. Your testicles ascend, transforming as they move deep into your pelvis to become ovaries. Flesh splits and reforms. Your scrotum becomes labia - soft, puffy outer lips. Your cock inverts completely, the tissue becoming a vaginal canal inside you. Your glans transforms into a clitoris, positioned perfectly at the apex of your new slit, exquisitely sensitive. Delicate inner labia form, pink folds within the outer lips. You feel internal structures developing - a vaginal canal with responsive walls, muscles that can clench and grip. A cervix forms at the depths. A womb settles into your lower abdomen. Ovaries position themselves inside you. Everything rewires completely - the entire system transforming from male to female. When it's done, you look down at your new pussy. Perfect, wet, ready. You touch yourself tentatively, fingers exploring soft labia, finding your sensitive clit, slipping into the tight, wet entrance of your new vagina. You have a pussy now. Complete and functional, where your cock used to be. Your new vagina throbs with need, already dripping wet, overwhelming you with feminine sensation."); } else { // Vagina to Penis - EXTREMELY GRAPHIC AND DETAILED texts.push("An overwhelming surge of sensation crashes through your core as the profound transformation begins. Your pussy tingles intensely, the feeling both strange and arousing. Then it starts - your vaginal walls begin closing, sealing. You feel your internal canal narrowing, closing up as flesh starts pushing outward instead of forming an opening. Your ovaries transform, descending rapidly. You feel them moving down through your body, becoming testicles that drop into a forming scrotum. Your clitoris suddenly extends, growing rapidly. It thickens and lengthens at an incredible rate, flesh pushing outward as it becomes a shaft. Your clit grows longer, longer, becoming an actual penis. The flesh continues emerging, forming a full cock. Your labia fuse together, the soft inner and outer lips joining to become the skin of your shaft and a scrotum. You watch in aroused fascination as a cock grows from where your pussy was, extending outward, getting larger and harder. Your new penis becomes erect as it forms, standing at attention. Your descended testicles settle into your scrotum, hanging with undeniable weight. Inside, everything transforms - your vaginal canal disappears completely. Your cervix and womb vanish. Your ovaries complete their transformation into testicles. Everything rewires - nerves, blood flow, sensation all changing from female to male. Your body creates all the male structures, positioning everything correctly. When the transformation completes, you stare down in shock and intense arousal at your new cock jutting proudly from your groin. It's real, hard, throbbing. You wrap your hand around the shaft tentatively, feeling the heat, the hardness, the sensitivity. Your balls hang below, full and heavy. Pre-cum beads at the tip of your erect cock. You have a penis now. A real, complete, functional cock and balls where your feminine genitals used to be. Your new penis throbs insistently, rock hard, demanding attention, overwhelming you with masculine sensation and desperate arousal."); texts.push("Intense pressure builds in your core before the transformation erupts. Your pussy begins closing rapidly, the vaginal canal sealing as flesh pushes outward instead. You moan as your ovaries transform and descend, becoming testicles that drop into a forming scrotum with distinct weight. Your clitoris extends dramatically, growing at an impossible rate as it thickens and lengthens into a full shaft. Flesh emerges rapidly, your clit becoming a cock - longer, thicker, harder. Your labia fuse into penile skin, wrapping around your emerging shaft. A scrotum forms, your transformed testicles settling inside with undeniable heft. Your internal female structures disappear - vaginal canal vanishing, cervix and womb gone. Everything rewires from female to male, all the structures transforming completely. Your body creates a fully functional male reproductive system. When it's done, you stare at your new cock standing fully erect. You touch it, wrap your hand around the hard shaft, feel your heavy balls hanging below. Pre-cum drips from the tip. You have a penis now. Real, hard, throbbing, where your pussy used to be. Your new cock pulses with desperate need, overwhelming you with masculine arousal."); } return imageHTML + texts[Math.floor(Math.random() * texts.length)]; }>> /* ---------------------------------- */ /* --- GENDER TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getGenderTransformationText = function(oldGender, newGender) { // NO IMAGE for gender transformations if (oldGender === newGender) { return "Your gender remains unchanged."; } var texts = []; if (newGender === "female") { texts.push("Your entire body tingles as a profound, all-encompassing transformation washes over you. Your skeletal structure begins shifting - you feel your frame softening, shoulders narrowing as hips widen dramatically. Your pelvis reshapes itself, broadening to accommodate internal changes. Curves emerge where there were none before - your waist cinches inward while your hips flare outward. Fat redistributes across your body, settling into feminine patterns. Your chest swells as breasts bud and grow, filling out with soft, sensitive flesh. Your face transforms, features softening considerably. Your jawline smooths and narrows, becoming more delicate. Cheekbones rise higher, more prominent. Your lips plump up, fuller and more sensual. Your nose becomes smaller, more refined. Eyelashes grow longer and thicker. Your entire face becomes prettier, more feminine, undeniably female. Your voice rises in pitch, climbing octaves until it settles into a feminine register. Muscle mass decreases as your body becomes softer, smoother. Body hair recedes dramatically - facial hair vanishes, chest hair disappears, your skin becoming smooth and soft everywhere. Your hands and feet become smaller, more delicate. Hormones surge through you - estrogen flooding your system, testosterone fading. Your entire biochemistry shifts from male to female. The change is total, profound, undeniable. Every fiber of your being reshapes itself until you are completely, perfectly, unmistakably female. When it's over, you stand transformed - a woman in every sense, your body tingling with the profound change."); } else { texts.push("Your entire body tingles as a profound, all-encompassing transformation washes over you. Your skeletal structure begins shifting - you feel your frame broadening, shoulders widening as hips narrow. Your pelvis reshapes itself, becoming more compact and masculine. Your ribcage expands, your frame becoming larger, more imposing. Fat redistributes across your body, leaving feminine curves behind. Your chest flattens as breasts disappear, replaced by firm pectoral muscles. Your face transforms, features hardening considerably. Your jawline squares and widens, becoming more pronounced and angular. Your brow ridge becomes more prominent. Your nose grows slightly larger, more masculine. Your face takes on harder angles, becoming rugged, handsome, undeniably male. Your voice drops dramatically, descending octaves until it settles into a deep, masculine register. Muscle mass increases significantly - your body becomes stronger, harder, more defined. Body hair sprouts across your skin - facial hair emerges as stubble darkens your jaw, chest hair grows, body hair spreads across your arms and legs. Your hands and feet become larger, stronger. Hormones surge through you - testosterone flooding your system, estrogen fading. Your entire biochemistry shifts from female to male. The change is total, profound, undeniable. Every fiber of your being reshapes itself until you are completely, powerfully, unmistakably male. When it's over, you stand transformed - a man in every sense, your skin covered in newly sprouted hair."); } return texts[0]; }>> /* ---------------------------------- */ /* --- AGE TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getAgeTransformationText = function(oldAge, newAge) { // NO IMAGE for age transformations if (oldAge === newAge) { return "Your apparent age remains unchanged."; } var texts = []; if (newAge === "Mature Adult" || newAge === "Mature") { // Aging - erotic/sensual version texts.push("You feel your features shifting subtly as time seems to accelerate across your face and body. Fine lines begin appearing around your eyes - crow's feet that speak of years of laughter and smiles. Subtle wrinkles form around your mouth, at the corners of your lips. Your skin takes on a slightly weathered quality, the smoothness of youth giving way to something more lived-in, more experienced. Your face gains character and depth. The baby-faced softness fades, replaced by more defined features - stronger, more distinguished. There's a gravitas to your appearance now, a sense of wisdom and experience. Your eyes seem deeper, more knowing. Your expressions carry more weight. The transformation leaves you looking mature, worldly, sophisticated. There's an undeniable allure to it - the attractiveness of someone who has lived, who has experienced life. You look distinguished, refined, mature in a way that's deeply appealing. The years have been kind, leaving you with a mature beauty that's arguably more compelling than youth ever was."); } else { // De-aging - erotic/sensual version texts.push("You feel your features smoothing dramatically as years seem to fall away like shedding layers. The fine lines around your eyes fade, disappearing as if they never existed. Wrinkles smooth out, vanishing completely. Your skin becomes taut and supple again, regaining the elasticity and firmness of youth. Any weathering, any signs of aging simply melt away. Your face gains a fresh, youthful glow. Features soften and brighten, taking on the vibrant appearance of young adulthood. There's a vitality, an energy that radiates from you. Your skin is smooth and flawless, unmarked by time. You look young again - not childish, but youthfully mature, in the prime of life. The transformation is profound. Energy and vitality seem to radiate from every pore. You look vibrant, alive, youthful in a way that's undeniably attractive. This is youth at its peak - the perfect age, the ideal moment. You're young and it shows in every aspect of your appearance."); } return texts[0]; }>> /* ---------------------------------- */ /* --- BIMBO TRANSFORMATION --- */ /* ---------------------------------- */ <<set setup.getBimboTransformationText = function(isGaining) { var imageHTML = ""; var transformationText = ""; if (isGaining) { var currentGender = (typeof $gender !== "undefined") ? $gender : (typeof $bodyParts !== "undefined" && $bodyParts.gender) ? $bodyParts.gender : "female"; var currentGenitals = (typeof $bodyParts !== "undefined" && $bodyParts.genitals) ? $bodyParts.genitals : "vagina"; var currentAge = (typeof $bodyParts !== "undefined" && $bodyParts.age) ? $bodyParts.age : "Young Adult"; // Determine age type for image var ageType = "adult"; if (currentAge === "Mature Adult" || currentAge === "Mature") { ageType = "mature"; } // Image based only on age (no intensity) if (typeof $imageSettings !== "undefined" && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled) { var imagePath = "Images/PostSwap/Bimbo_" + ageType + ".webp"; imageHTML = '<div style="text-align: center; margin: 20px 0;">'; imageHTML += '<img src="' + imagePath + '" style="max-width: 60%; border-radius: 10px; border: 2px solid #FF1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Bimbo Result">'; imageHTML += '</div>'; } var wasMale = (currentGender === "male"); var hadSmallChest = true; // Always transform chest var hadSmallButt = true; // Always transform butt var hadPenis = currentGenitals.includes("penis"); transformationText += "An overwhelming pink haze floods your mind as the bimbo transformation takes hold. Your thoughts become fuzzy, harder to focus on complex things. Like, thinking is sooo much harder now? But who needs to think hard anyway! \n\n"; if (wasMale) transformationText += "Your entire body tingles as femininity surges through you like, totally completely! Your frame shifts - shoulders narrowing, hips widening dramatically. Your face softens so much, becoming super cute and pretty! Lips plump up, cheekbones rise, features becoming adorable and feminine. Body hair just, like, totally disappears! Your skin becomes smooth and soft everywhere. "; if (hadSmallChest) transformationText += "OMG your chest! Intense heat floods your breasts as they start swelling like crazy! They grow bigger and bigger and BIGGER in waves - it's so intense and, like, really hot? Your breasts expand to enormous proportions - huge, heavy, impossibly large! Your nipples get super stiff and sensitive. When it finally stops, you have these gigantic tits that bounce soooo heavily with every movement! They're, like, so big and jiggly and you totally can't stop noticing them! "; if (hadSmallButt) transformationText += "Your ass tingles super intensely before, like, exploding outward! OMG! The flesh swells so dramatically, each cheek growing rounder and fuller and just SO BIG! The expansion is, like, totally crazy - your butt becomes enormous, a massive bubble butt that jiggles constantly! The weight is insane - your huge ass bounces with even the tiniest movement! "; if (hadPenis) transformationText += "An intense sensation courses through your groin as your cock starts shrinking and, like, going inside? Your balls go up and become... something else? Your penis totally disappears as soft, sensitive folds emerge. When it's done, you have this tight, wet pussy where your cock used to be - already dripping and, like, super ready! "; transformationText += "\n\nThe mental changes are just as, like, totally profound! Thinking becomes sooo much harder - but way less important too! Complex thoughts just, like, slip away? Replaced by simpler, more fun stuff! You find yourself giggling way more, twirling your hair. Everything becomes about looking hot, feeling good, and having fun! Books? Like, boring! Math? Ugh, waaay too hard! But makeup? Fashion? Cute boys (or girls)? OMG, yes! \n\nYour vocabulary shifts - you can't help but say 'like' a lot? And ending sentences with question marks even when they're not questions? Your voice goes up in pitch, becoming all breathy and cute. Serious conversations are, like, totally hard to follow now? But who cares when you look this hot! \n\nYou're a total bimbo now - gorgeous, giggly, and not too bright. And honestly? It feels amazing! Like, totally amazing!"; } else { transformationText = "The pink haze suddenly lifts from your mind like fog burning away! Clarity rushes back - you can think clearly again! Complex thoughts that were so hard before become easy to grasp. Your mind sharpens, intelligence returning in a flood of awareness. \n\nYour body tingles as the bimbo changes begin reversing. Your gigantic chest shrinks considerably, the enormous breasts reducing to more moderate proportions. The overwhelming weight decreases significantly. Your massive bubble butt deflates, becoming notably smaller and less pronounced. \n\nMentally, you feel yourself returning to normal. Your vocabulary expands again - you can speak properly without the constant 'likes' and upward inflections. Serious topics become interesting again instead of boring. Your attention span returns, letting you focus on complex matters. The constant giggling and hair-twirling urges fade away. \n\nYou're no longer a bimbo - your intelligence and complexity of thought have returned fully."; } return imageHTML + transformationText; }>> /* ---------------------------------- */ /* --- HAIR COLOR TRANSFORMATION --- */ /* ---------------------------------- */ <<set setup.getHairColorTransformationText = function(oldColor, newColor) { return "You watch as your hair shifts from " + oldColor.toLowerCase() + " to " + newColor.toLowerCase() + ", the color bleeding through strand by strand until the transformation is complete."; }>> /* ---------------------------------- */ /* --- HAIR LENGTH TRANSFORMATION --- */ /* ---------------------------------- */ <<set setup.getHairLengthTransformationText = function(oldLength, newLength) { if (newLength === "long" || newLength === "Long") { return "Your hair grows rapidly, extending down past your shoulders in long, flowing locks."; } else { return "Your hair recedes, becoming much shorter and more manageable, sitting close to your head."; } }>> /* ---------------------------------- */ /* --- SKIN TONE TRANSFORMATION --- */ /* ---------------------------------- */ <<set setup.getSkinToneTransformationText = function(oldTone, newTone) { return "A tingling sensation spreads across your entire body as your skin tone shifts from " + oldTone.toLowerCase() + " to " + newTone.toLowerCase() + ", the change rippling outward from your core."; }>> /* ---------------------------------- */ /* --- SPECIAL TRANSFORMATIONS --- */ /* ---------------------------------- */ <<set setup.getWereCreatureTransformationText = function(isGaining, animalType) { if (isGaining) { return "A primal surge rushes through your body! Animal ears sprout from your head, pushing through your hair - sensitive, twitching, able to swivel and hear sounds you never could before. A tail extends from the base of your spine, growing rapidly - covered in fur, expressive, moving with your emotions. The animal within awakens - you feel more primal, more wild, more in tune with your instincts."; } else { return "The animal features begin to fade. Your ears recede back into your head, becoming human once more. Your tail withdraws, disappearing back into your spine. The primal wildness settles, the beast within calming."; } }>> <<set setup.getVampireTransformationText = function(isGaining) { if (isGaining) { return "A cold, otherworldly sensation floods through you. Your canines elongate, sharpening into elegant fangs. Your eyes gain an uncanny quality - deeper, more hypnotic, with an otherworldly gleam. Your skin takes on a porcelain quality, flawless and pale. Your features sharpen, becoming more striking, more beautiful in an unsettling way. Your nails grow slightly longer, harder, almost claw-like. A predatory aura settles around you - dangerous, alluring, unmistakably vampiric."; } else { return "The vampiric qualities fade from your being. Your fangs recede to normal teeth. The otherworldly gleam leaves your eyes. Your skin returns to its natural tone. The predatory aura dissipates. You're human once more."; } }>> <<set setup.getSunfishTransformationText = function(isGaining) { if (isGaining) { return "Something ineffable settles into your very essence. It's difficult to articulate - a quality that defies easy description. You feel... different. Changed in a way that's hard to put into words. There's a unique presence about you now, an otherworldly quality that wasn't there before. The essence of the Sunfish has become part of you."; } else { return "The essence of the Sunfish begins to fade from your being. That otherworldly quality dissipates, draining away. The unique presence diminishes until it's gone completely. You're back to normal, the Sunfish essence no longer part of you."; } }>> /* -------------------------------------------- */ /* --- FULL TRANSFORMATION TEXT --- */ /* -------------------------------------------- */ <<set setup.getFullTransformationText = function(transformationName, isGaining, playerGender) { // playerGender: "male" or "female" - the gender the player was BEFORE transforming // If not provided, defaults to female for female-locked and male for male-locked var texts = { /* DEMONIC */ "Succubus": { gain: { female: "Infernal heat floods through your veins, pooling intensely in your core. You moan as small, elegant horns push through your scalp, the sensation strangely pleasurable. Your shoulder blades burn as dark, bat-like wings unfurl from your back, each nerve ending singing with sensation.\n\nYour body reshapes itself - hips widening, waist cinching, breasts swelling to perfect, tempting fullness. Your skin becomes flawless, radiating an irresistible allure. Your eyes begin to glow with inner fire as sharp fangs descend.\n\nBut it's the hunger that truly defines the change. You can <i>taste</i> desire on the air - feel the arousal of everyone nearby like warmth on your skin. Your pussy throbs with need, already slick and wanting. <i>Mmmm... I can feel their lust... I need to feed... I need to fuck...</i> You have become a Succubus - a demon of insatiable desire.", male: "Infernal heat floods through your veins as your body begins to change dramatically. You groan as your frame shrinks, shoulders narrowing while your hips flare outward. Small, elegant horns push through your scalp as dark, bat-like wings unfurl from your back.\n\nYour chest swells, breasts growing heavy and sensitive as your waist cinches inward. Between your legs, you feel your cock shrinking, pulling inward, reshaping into slick feminine folds that pulse with demonic heat. Your skin becomes flawless, radiating an irresistible allure.\n\nThe hunger awakens - you can <i>taste</i> desire on the air. Your new pussy throbs with desperate need. <i>Mmmm... I'm... I'm a woman now... and I need to feed... I need cock... I need to fuck...</i> You have become a Succubus - transformed from man to demon seductress." }, lose: "The infernal power drains from your body, leaving you gasping. Your horns recede, wings wither away, fangs retract. The constant, delicious awareness of others' desires fades to nothing. The burning hunger in your core quiets. You feel... empty. Cold. But human once more." }, "Incubus": { gain: { male: "Dark power surges through you, making you groan as your body transforms. Curved horns emerge from your forehead while massive wings burst from your back. Your muscles define themselves perfectly, your cock thickening and lengthening impressively.\n\nYour eyes ignite with an otherworldly glow that makes others weak in the knees. You can sense arousal now - smell it, taste it. Every nearby desire calls to you like a siren song. Your shaft throbs with supernatural need, already hard and aching.\n\n<i>So many desires to fulfill... so many to claim... I'll fuck them all and feed on their pleasure...</i> You have become an Incubus - a demon of seduction and insatiable lust.", female: "Dark power surges through you as your body begins to shift dramatically. You gasp as your breasts flatten, your curves melting away as your frame grows taller, broader. Curved horns emerge from your forehead while massive wings burst from your back.\n\nBetween your legs, you feel pressure building as flesh extends outward, your pussy sealing shut as a thick, impressive cock grows in its place. Your muscles define themselves as your jaw squares, features becoming devastatingly handsome.\n\nYour new shaft throbs with supernatural hunger. You can sense arousal everywhere - smell it, taste it. <i>I'm... I have a cock now... and it needs to be inside someone... I'll fuck them all and feed on their pleasure...</i> You have become an Incubus - transformed from woman to demon seducer." }, lose: "The demonic essence drains away. Your horns dissolve, wings disappear, the supernatural magnetism fades. The intoxicating awareness of others' desires quiets. You're merely mortal once more - the hunger gone but not forgotten." }, "Imp": { gain: { female: "Mischievous, chaotic energy crackles through you! Your body shrinks slightly as impish horns sprout from your head. Your ears elongate to points, incredibly sensitive now. A thin tail extends from your lower back, the tip surprisingly erogenous - you gasp as it twitches.\n\nYour libido spikes dramatically - everything seems like an opportunity for naughty fun. Pranks and pleasure blur together in your mind. <i>Hehehe! So many fun games to play... so much trouble to cause... maybe I'll trick someone into bed~</i> You've become an Imp - horny, chaotic, and delightfully wicked!", male: "Mischievous, chaotic energy crackles through you as your body begins to shrink and change! Your frame becomes smaller, more petite as impish horns sprout from your head. Your ears elongate to points.\n\nYour chest swells into small, perky breasts as your waist narrows. Between your legs, your cock shrinks away, replaced by a tight little pussy that already tingles with mischief. A thin tail extends from your lower back, the tip surprisingly erogenous.\n\nYour new feminine form pulses with chaotic lust. <i>Hehehe! I'm a girl now~! So many fun games to play... so much trouble to cause... maybe I'll trick someone into fucking my new pussy~</i> You've become an Imp - transformed, horny, chaotic, and delightfully wicked!" }, lose: "The impish energy fades. Your horns shrink away, ears return to normal, tail withdraws. The constant urge for mischief and naughty fun dims to a manageable playfulness." }, "Hellhound": { gain: { female: "Primal, feral energy tears through you! Your teeth sharpen into fangs, nails extend into claws. Small horns emerge from your skull as savage instincts awaken.\n\nThe urge to hunt, to chase, to <i>claim</i> becomes overwhelming. You can smell arousal, fear, submission - and it makes you growl with need. Your body burns with the desire to be mounted, to mate, to be bred and marked.\n\n<i>*growl* Need... need to be claimed... need to be BRED... hunt me down and make me yours...</i> You have become a Hellhound - a feral bitch in heat!", male: "Primal, feral energy tears through you as your body begins to shift! Your frame shrinks and curves as fangs sharpen, nails extend into claws. Small horns emerge from your skull.\n\nYour chest swells with breasts as your cock shrinks away, replaced by a pussy that burns with feral heat. The urge to be hunted, to be chased, to be <i>claimed</i> becomes overwhelming. You can smell arousal everywhere and it makes you whine with desperate need.\n\n<i>*whimper* I'm... I'm a bitch now... need to be claimed... need to be BRED... hunt me down and mount me...</i> You have become a Hellhound - transformed into a feral bitch in heat!" }, lose: "The bestial fury subsides. Fangs dull, claws retract, horns fade. The primal mating urges calm, leaving you feeling more human, though the memory of the hunt lingers." }, /* DEMI-HUMAN */ "Werecat": { gain: { female: "A tingling warmth spreads through you as soft, fuzzy cat ears push through your hair. They twitch at every sound, so sensitive! A long, elegant tail extends from your spine - and oh, the base of it is surprisingly erogenous. You gasp as it swishes.\n\nYour body becomes lithe and graceful. You feel an urge to be petted, stroked, touched everywhere. The need to curl up against someone warm, to purr, to be pampered...\n\n<i>Nyaa~ Pet me... touch me... mmm, scratch right there... I'll be such a good kitty for you~</i> You've become a Werecat - playful, sensual, and craving affection!", male: "A tingling warmth spreads through you as your body begins to shift and change. Your frame shrinks, curves developing as soft breasts grow on your chest. Between your legs, your cock shrinks away, replaced by a tight, needy pussy.\n\nSoft, fuzzy cat ears push through your hair, twitching at every sound. A long, elegant tail extends from your spine - the base surprisingly erogenous. Your new feminine body becomes lithe and graceful.\n\n<i>Nyaa~ I'm... I'm a girl now... a kitty girl... Pet me... touch me everywhere... I'll be such a good kitty for you~</i> You've become a Werecat - transformed from man to playful catgirl, sensual and craving affection!" }, lose: "The feline traits gradually fade. Your ears shrink back, tail withdraws. The overwhelming need for petting and touch calms to normal levels." }, "Werewolf": { gain: { female: "Pack instincts surge through you as wolf ears emerge and a thick, fluffy tail grows from your lower back. Your body grows stronger, senses sharper. You can smell everything now - including arousal.\n\nAn overwhelming need for pack bonds fills you. Loyalty, protection, but also... mating. The urge to find a mate, to be claimed, to form deep, primal bonds. During certain times, you know heat will drive you nearly mad with need.\n\n<i>My pack... my mate... claim me... breed me when the moon rises...</i> You've become a Werewolf - fierce, loyal, and driven by primal urges!", male: "Pack instincts surge through you as your body begins to transform. Your frame shrinks and curves, breasts swelling on your chest as your cock retreats, replaced by a hungry pussy. Wolf ears emerge and a thick, fluffy tail grows from your lower back.\n\nYour new feminine body is strong, senses incredibly sharp. You can smell arousal everywhere. An overwhelming need for pack bonds fills you - loyalty, protection, and the desperate urge to be claimed, to be mated...\n\n<i>I'm... I'm a female now... need my pack... need a mate to claim me... breed me when the moon rises...</i> You've become a Werewolf - transformed from man to fierce she-wolf, loyal and driven by primal mating urges!" }, lose: "The wolf spirit recedes. Ears and tail disappear, the fierce pack loyalty and mating instincts dim to fond memories." }, "Werebunny": { gain: { female: "Soft warmth spreads through you as long, floppy bunny ears sprout from your head - oh god, they're so sensitive! Every touch sends shivers down your spine. A fluffy cottontail appears, and your body feels lighter, more... fertile.\n\nThe breeding instinct hits you like a wave. Your pussy clenches with need, desperate to be filled, to be bred. The thought of being mounted, of multiple partners, of carrying litter after litter...\n\n<i>Need to breed... need to be filled... so many people, need them all inside me... breed me breed me BREED ME...</i> You've become a Werebunny - adorable, insatiable, and obsessed with reproduction!", male: "Soft warmth spreads through you as your body begins to change dramatically. Your frame shrinks and softens, breasts growing perky and sensitive as your cock shrinks away, replaced by a fertile, needy pussy.\n\nLong, floppy bunny ears sprout from your head - oh god, they're so sensitive! A fluffy cottontail appears. Your new feminine body feels lighter, more... breedable. The breeding instinct hits you like a wave.\n\n<i>I'm... I'm a girl bunny now... need to breed... need to be filled... breed me breed me BREED ME...</i> You've become a Werebunny - transformed from man to adorable bunny girl, insatiable and obsessed with being bred!" }, lose: "The rabbit features slowly recede. Your sensitive ears shrink back, tail disappears. The overwhelming breeding obsession fades to manageable arousal." }, "Werefox": { gain: { female: "Cunning energy flows through you as sleek fox ears emerge and a magnificent fluffy tail grows from your spine. Your mind sharpens, seeing opportunities everywhere - especially for seduction.\n\nYou understand manipulation now, how to tease, how to make others want you desperately before giving them what they crave. Your tail swishes playfully as you consider all the fun games you could play...\n\n<i>Mmm, how delightful... I know exactly what you want... but you'll have to work for it~ Let's see how much I can make you beg...</i> You've become a Werefox - seductive, mischievous, and dangerously clever!", male: "Cunning energy flows through you as your body begins to transform. Your frame shrinks and curves seductively, breasts growing pert and tempting as your cock retreats, replaced by a sly little pussy.\n\nSleek fox ears emerge and a magnificent fluffy tail grows from your spine. Your mind sharpens, seeing opportunities for seduction everywhere. You understand manipulation now, how to tease, how to make others desperate for you...\n\n<i>Mmm, how delightful... I'm a vixen now... I know exactly what you want... but you'll have to work for it~ Let's see how much I can make you beg...</i> You've become a Werefox - transformed from man to seductive vixen, mischievous and dangerously clever!" }, lose: "The vulpine traits fade away. Ears and tail vanish, the sharp seductive cunning dulls - though some cleverness remains." }, "Weresheep": { gain: { female: "Gentle warmth envelops you as soft, curly sheep ears appear and your hair becomes fluffy like wool. A small tail emerges. Your personality softens completely - aggression melts away, replaced by sweet docility.\n\nAll you want is to be good, to follow, to please whoever leads you. The thought of being guided, controlled, used gently... it makes you so wet. Such a good sheep, so soft, so obedient...\n\n<i>I just want to be good... tell me what to do and I'll do it... use me however you want, I'm your soft, obedient little sheep...</i> You've become a Weresheep - gentle, submissive, and eager to please!", male: "Gentle warmth envelops you as your body begins to soften and change. Your frame shrinks, curves developing as soft breasts grow on your chest. Between your legs, your cock shrinks away, replaced by a docile, eager pussy.\n\nSoft, curly sheep ears appear and your hair becomes fluffy like wool. A small tail emerges. Your personality softens completely - aggression melts away, replaced by sweet feminine docility.\n\n<i>I'm... I'm a girl now... a soft, gentle sheep girl... I just want to be good... tell me what to do... use me however you want...</i> You've become a Weresheep - transformed from man to gentle ewe, submissive and eager to please!" }, lose: "The gentle sheep nature recedes. Your fluffy features return to normal, and some assertiveness gradually returns." }, "Hucow": { gain: { female: "The transformation is overwhelming and total. Your horns grow large, ears become fully bovine, tail extends and swishes constantly. But your breasts - god, your breasts - they swell to absolutely enormous proportions, constantly heavy with milk that drips from thick, puffy nipples.\n\nYour thoughts simplify dramatically. Complex ideas slip away, replaced by simple needs: breeding, milking, being a good cow. Your pussy stays slick and ready, your udders ache for attention.\n\n<i>Mooooo~ Need milking... need breeding... just a dumb happy cow... milk me, fuck me, fill me up... moooo~</i> You have become a Hucow - fully domesticated, constantly horny, and blissfully simple!", male: "The transformation is overwhelming and total. Your body shifts dramatically as horns grow large and ears become fully bovine. Your frame shrinks and curves as a tail extends and swishes.\n\nYour chest explodes outward - breasts swelling to absolutely enormous proportions, heavy with milk that drips from thick, puffy nipples. Between your legs, your cock shrinks away completely, replaced by a slick, needy pussy. Your thoughts simplify... complex ideas slip away...\n\n<i>Mooooo~ Was... was I a boy before? Don't remember... don't care... just a dumb happy cow now... need milking... need breeding... moooo~</i> You have become a Hucow - transformed from man to fully domesticated cow girl, constantly horny and blissfully simple!" }, lose: "Slowly, your mind clears. Complex thoughts return as bovine features recede. Your massive breasts shrink, milk production stops. You remember being human again." }, /* AESTHETIC */ "Trophy Wife": { gain: { female: "Everything about you becomes polished to perfection. Skin flawless, figure ideal, every feature arranged for maximum appeal. Designer tastes and expensive preferences fill your mind.\n\nYou exist to be admired, displayed, shown off. Your own pleasure comes from being valued for your beauty. The thought of being arm candy, of everyone wanting you while you belong to one person, makes you wet with anticipation...\n\n<i>Do I look perfect? I need to look perfect. Dress me up, show me off, let everyone see what you have... I'm your beautiful trophy...</i> You've become a Trophy Wife - stunning, pampered, and living to be admired.", male: "Everything about you begins to change as your body reshapes into feminine perfection. Your frame shrinks and curves, breasts growing perky and perfect, waist cinching, hips flaring. Your cock shrinks away, replaced by a pretty little pussy.\n\nYour skin becomes flawless, features delicate and beautiful. Designer tastes and expensive preferences fill your mind. You exist to be admired, displayed, shown off. The thought of being arm candy makes your new pussy wet with anticipation...\n\n<i>Do I look perfect? I'm... I'm a woman now. A beautiful woman. Dress me up, show me off... I'm your beautiful trophy wife...</i> You've become a Trophy Wife - transformed from man to stunning arm candy, pampered and living to be admired." }, lose: "The obsessive need for perfection fades. You remember there's more to life than being beautiful and admired." }, "Gym Bunny": { gain: { female: "Energy surges through your muscles as your body tightens into lean, athletic perfection! The pump, the burn, the sweat - it all feels incredible, almost sexual. You NEED to work out, to push your limits, to feel your body strain.\n\nYour ass firms into perfect roundness, abs define, body becomes a temple of fitness. But working out also makes you incredibly horny - endorphins flooding you, making you crave physical release after every session...\n\n<i>Just one more set... fuck, I'm so turned on... need to finish this workout and then find someone to fuck the energy out of me...</i> You've become a Gym Bunny - fit, obsessed, and perpetually worked up!", male: "Energy surges through you as your body begins to transform! Your bulky muscles streamline into lean, feminine athleticism. Your frame shrinks and curves, breasts firming into perky perfection as your waist tightens.\n\nBetween your legs, your cock shrinks away, replaced by a tight pussy that throbs with workout-induced arousal. Your ass firms into perfect roundness as you become a temple of feminine fitness.\n\n<i>Just one more set... fuck, this body feels amazing... I'm a girl now and I need to finish this workout and then find someone to fuck the energy out of me...</i> You've become a Gym Bunny - transformed into a fit goddess, obsessed, and perpetually worked up!" }, lose: "The fitness obsession dims. Your body remains athletic, but the overwhelming need to exercise and the post-workout horniness fade." }, "E-Girl": { gain: { female: "Your style transforms dramatically - colorful, trendy, designed for maximum online appeal. Social media instincts flood your mind. You know exactly what angles make you look hottest, what content gets thirsty comments.\n\nThe validation becomes addictive. Every like, every simp, every donation makes you tingle with pleasure. The thought of thousands watching you, wanting you, paying for glimpses of your body...\n\n<i>OMG this would get SO many views! Maybe I should show a little more... keep them wanting... my fans love when I tease~</i> You've become an E-Girl - chronically online, perpetually thirsty for attention, and loving every minute!", male: "Your body begins to transform as your style shifts dramatically! Your frame shrinks, curves developing as breasts grow perky and cute. Your face becomes adorable, feminine. Between your legs, your cock shrinks away, replaced by a pretty pussy.\n\nColorful, trendy style floods your wardrobe. Social media instincts fill your mind - you know exactly what angles make you look cutest, what content gets thirsty comments and donations.\n\n<i>OMG I'm like... a girl now! And I look SO cute! This would get SO many views! Maybe I should show a little more... my fans are gonna LOVE my new body~</i> You've become an E-Girl - transformed into a cute content creator, chronically online and loving every minute!" }, lose: "The need for constant content and validation fades. The internet feels less consuming, real life regains importance." }, "Punk": { gain: "RAGE floods through you! Your appearance transforms with piercings, tattoos, aggressive style. Authority makes you sick - rules exist to be broken, society to be defied.\n\nThe anger is intoxicating, the rebellion addictive. You want to fuck like you fight - rough, raw, leaving marks. Hate-fucking sounds perfect. Or fucking in public just to prove no one can tell you what to do...\n\n<i>Fuck the system, fuck authority, and fuck ME - hard enough to feel it tomorrow. I don't follow anyone's rules but my own.</i> You've become a Punk - angry, defiant, and aggressively horny!", lose: "The burning rage cools. The anti-establishment fervor fades to healthy skepticism." }, "Siren": { gain: { female: "Your voice transforms into something supernatural - hypnotic, irresistible, dripping with seduction. When you speak, people listen. When you sing, they become utterly entranced, unable to look away or resist.\n\nA predatory hunger awakens. The desire to lure, to entrap, to wrap others around your finger with nothing but your voice. You could make anyone do anything with the right words...\n\n<i>Come closer... that's it... listen to my voice... you want to please me, don't you? You'd do anything I asked... anything at all...</i> You've become a Siren - hypnotic, dangerous, and irresistible!", male: "Your body begins to change as your voice transforms into something supernatural. Your frame shrinks and curves beautifully, breasts growing full and alluring. Your cock retreats, replaced by a pussy that seems to pulse with hypnotic power.\n\nYour new voice is irresistible - dripping with seduction. When you speak, people listen. When you sing, they become utterly entranced. A predatory hunger awakens...\n\n<i>Come closer... that's it... listen to my voice... I'm a woman now, and you want to please me, don't you? You'd do anything I asked...</i> You've become a Siren - transformed into a hypnotic temptress, dangerous and irresistible!" }, lose: "Your voice returns to normal. The hypnotic power fades, the predatory instincts calm. Words no longer bend wills." }, "Living Doll": { gain: "Your body becomes perfect - porcelain smooth, flawlessly proportioned, like you were made in a factory to exacting specifications. Your movements become graceful, precise, almost mechanical.\n\nEmotions dull, replaced by serene emptiness. You exist to be beautiful, to be posed, to be played with. Obedience feels natural. Thoughts slow. Being dressed up, positioned, used however your owner desires - it all feels right...\n\n<i>I am pretty. I am perfect. I exist to be played with. Pose me however you want... use me however you want... I am your doll.</i> You've become a Living Doll - beautiful, empty, and perfectly obedient.", lose: "Life returns to your features. Emotions resurface, thoughts become your own. The doll-like perfection fades to human imperfection." }, "Dominatrix": { gain: { female: "Power. Control. Dominance. It floods through you like dark wine. You know instinctively how to command, how to punish, how to make them beg. Leather and latex feel like second skin against your body.\n\nThe sight of submission makes you wet with satisfaction. You want them on their knees, collared, desperate for your approval. The crack of a whip, the gasp of pain-pleasure - music to your ears.\n\n<i>Kneel. Eyes down. You exist for my pleasure now. Obey, and I might reward you. Disobey, and you'll learn why that was a mistake...</i> You've become a Dominatrix - commanding, cruel, and absolutely in control!", male: "Power. Control. Dominance. It floods through you as your body transforms. Your frame shrinks and curves dangerously, breasts growing firm and commanding. Your cock retreats, replaced by a pussy that throbs with authority.\n\nLeather and latex feel like second skin against your new feminine body. The sight of submission makes you wet with satisfaction. You want them on their knees, collared, desperate for your approval.\n\n<i>Kneel. Eyes down. I'm a woman now - your Mistress. You exist for my pleasure. Obey, and I might reward you. Disobey, and you'll learn why that was a mistake...</i> You've become a Dominatrix - transformed into a commanding goddess, cruel and absolutely in control!" }, lose: "The dominant power recedes. The need for control fades to normal levels. The leather stays in the closet more often." }, "Slut": { gain: { female: "All shame, all inhibition simply... evaporates. Sexual desire floods every thought, every cell of your body. Your pussy throbs constantly, your mind filled with nothing but need.\n\nThe idea of saying no becomes foreign - why would you? Everyone looks so good. Every moment is an opportunity to be filled, used, pleasured. More partners, more pleasure, more more <i>more</i>...\n\n<i>More... I need more... fuck me, all of you, anyone, everyone... I need cock, I need pussy, I need to be used until I can't think...</i> You've become an insatiable slut - shameless, desperate, and always craving more!", male: "All shame, all inhibition simply... evaporates as your body transforms. Your frame shrinks and curves into something irresistibly fuckable. Breasts swell on your chest as your cock shrinks away, replaced by a pussy that immediately begins throbbing with desperate need.\n\nThe idea of saying no becomes foreign - why would you? You're a girl now, a slutty girl, and everyone looks so good. Every moment is an opportunity to be filled, used, pleasured...\n\n<i>More... I need more... I have a pussy now and it needs to be FILLED... fuck me, all of you, anyone, everyone... I need cock so badly...</i> You've become an insatiable slut - transformed from man to shameless cock-hungry girl, desperate and always craving more!" }, lose: "Shame returns, along with boundaries. The overwhelming need fades to manageable desire. Selectivity returns." }, "Himbo": { gain: { male: "Your muscles swell impressively, body becoming a temple of gains! You look incredible - big, buff, and beautiful. But complex thoughts become harder... why think when you can lift? Why worry when you can smile?\n\nEveryone is a friend! Sex is fun and you love making people feel good. You're not too bright anymore, but who needs brains when you're this hot and this nice and this good at fucking?\n\n<i>Haha, yeah bro! Wanna work out? Wanna fuck? Both? I love both! You're really pretty! I'm not smart but I'm really good at making people feel good!</i> You've become a Himbo - dumb, sweet, and enthusiastically horny!", female: "Your body begins to shift and grow as muscles swell impressively! Your curves melt away as your frame becomes tall and broad. Your breasts flatten as your chest becomes a wall of pecs.\n\nBetween your legs, pressure builds as a thick, eager cock grows where your pussy once was. Your jaw squares, features becoming handsome in a dopey, friendly way. Complex thoughts become harder... why think when you can lift?\n\n<i>Haha, whoa! I'm like... a dude now! A big dude! Wanna work out? Wanna fuck? I love both! I'm not smart but I'm really good at making people feel good!</i> You've become a Himbo - transformed from woman to dumb, sweet, enthusiastically horny beefcake!" }, lose: "Intelligence slowly returns. Complex thoughts become possible again. The muscles remain, but the simple joy fades." }, "Gyaru": { gain: { female: "Your entire aesthetic transforms into something bold and unapologetically flashy! Your skin takes on a perfect, sun-kissed tan. Your hair lightens dramatically, styled in voluminous waves with extensions and accessories. Dramatic makeup becomes second nature - heavy eyeliner, false lashes, glossy lips.\n\nYour personality shifts to match - bubbly, confident, flirty, and completely shameless. Fashion becomes an obsession, the bolder and sexier the better. You want attention and you know exactly how to get it...\n\n<i>Like, oh my god~! Check out this outfit! I look SO hot right now. Everyone's gonna be staring at me and I LOVE it~!</i> You've become a Gyaru - tanned, flashy, and absolutely owning your sexy confidence!", male: "Your body begins to transform as your entire aesthetic shifts! Your frame shrinks and curves as breasts grow perky and attention-grabbing. Your cock shrinks away, replaced by a pretty pussy. Your skin takes on a perfect, sun-kissed tan.\n\nYour hair lightens dramatically, styled in voluminous waves with extensions and accessories. Dramatic makeup becomes second nature. Your personality shifts to match - bubbly, confident, flirty, and completely shameless.\n\n<i>Like, oh my god~! I'm a GIRL now! And I look SO hot! Check out this body! Everyone's gonna be staring at me and I LOVE it~!</i> You've become a Gyaru - transformed into a tanned, flashy babe, absolutely owning your sexy new confidence!" }, lose: "The gyaru energy fades. Your tan lightens, your style becomes more subdued. The bold, flashy confidence settles into something quieter." } }; var entry = texts[transformationName]; if (!entry) { // Fallback for transformations without custom text if (isGaining) { return "A powerful transformation washes over you. Your body shifts and changes, becoming something new. The essence of the " + transformationName + " takes hold, reshaping your very being. <i>I am... different now. Changed.</i>"; } else { return "The transformation fades from your body. You feel the " + transformationName + " essence leaving you, returning you to what you were before. The change is undone."; } } if (isGaining) { // Check if gain text is gender-specific (object) or simple (string) if (typeof entry.gain === "object") { // Gender-specific text - use playerGender to pick the right one var gender = playerGender || "female"; // Default to female if not specified return entry.gain[gender] || entry.gain.female || entry.gain.male; } else { // Simple string format (non-gender-locked transformations) return entry.gain; } } else { return entry.lose; } }>> /* -------------------------------------------- */ /* --- NPC COMPLETE TRANSFORMATION TEXT --- */ /* -------------------------------------------- */ <<set setup.generateNPCCompleteTransformation = function(npc, tradeResult) { if (!npc || !tradeResult || !tradeResult.npcReceived) { return ""; } var received = tradeResult.npcReceived; var descriptions = []; var npcName = npc.name || "The NPC"; // Check if NPC received any body part changes if (received.bodyParts && received.bodyParts.length > 0) { received.bodyParts.forEach(function(part) { // npcReceived uses newValue/oldValue; fallback to value for compatibility var partVal = (part.newValue !== undefined) ? part.newValue : part.value; if (part.name === "chest") { var chestText = ""; if (partVal >= 7) { chestText = npcName + " gasps as their chest begins to swell dramatically. Their breasts push outward in waves of growth, expanding larger and larger until they've become absolutely massive. The enormous mounds strain against their clothing, heavy and impossible to ignore, bouncing with every slight movement."; } else if (partVal >= 5) { chestText = npcName + "'s chest tingles intensely before swelling outward. Their breasts grow substantially larger, filling out into generous, heavy curves that reshape their silhouette completely. The new weight is immediately noticeable as they adjust to their enhanced bust."; } else if (partVal >= 3) { chestText = npcName + "'s chest warms as their breasts begin to expand. The growth is steady and noticeable, their bust filling out into a fuller, more prominent shape. Their clothing tightens as the transformation completes."; } else if (partVal >= 1) { chestText = npcName + "'s chest shifts subtly, their breasts adjusting to a modest but noticeable new size. The change is gentle, leaving them with a slightly different figure than before."; } else { chestText = npcName + "'s chest flattens gradually, breasts shrinking down until they're nearly flat. Their clothing hangs looser as the curves recede."; } descriptions.push(chestText); } else if (part.name === "butt") { var buttText = ""; if (partVal >= 7) { buttText = npcName + " feels an intense tingling in their rear before it begins expanding dramatically. Their ass swells outward in waves, each cheek growing rounder and fuller until they've developed an absolutely enormous bubble butt. The massive cheeks jiggle constantly with every movement, impossible to conceal."; } else if (partVal >= 5) { buttText = npcName + "'s rear begins to swell noticeably. Their ass expands outward, growing rounder and fuller, developing into generous, eye-catching curves. The new weight settles heavily, their pants straining to contain the enhanced backside."; } else if (partVal >= 3) { buttText = npcName + "'s behind warms as it begins to fill out. Their ass grows rounder, developing a pleasant fullness that wasn't there before. The change gives them noticeably curvier hips."; } else if (partVal >= 1) { buttText = npcName + "'s rear shifts subtly, adjusting to a slightly different shape. The change is modest but leaves their backside with a new contour."; } else { buttText = npcName + "'s rear flattens gradually, the curves receding until their backside is notably smaller and less prominent than before."; } descriptions.push(buttText); } else if (part.name === "gender") { var genderText = ""; if (partVal === "female") { genderText = npcName + "'s entire body begins to shift and soften. Their shoulders narrow while their hips widen, waist cinching inward. Facial features soften and become more delicate - lips fuller, cheekbones higher, jaw more refined. Body hair fades away as their skin becomes smoother. The transformation leaves them unmistakably feminine."; } else if (partVal === "male") { genderText = npcName + "'s body begins to shift and harden. Their shoulders broaden while their hips narrow, frame becoming more angular. Facial features sharpen and become more rugged - jaw squaring, brow becoming more prominent. The transformation leaves them unmistakably masculine."; } else { genderText = npcName + "'s features begin to blur and shift, settling into something between masculine and feminine. Their body takes on an androgynous quality, features becoming ambiguous and harder to categorize."; } descriptions.push(genderText); } else if (part.name === "genitals") { var genitalText = ""; if (partVal === "vagina" || partVal === "Vagina") { genitalText = "An intense sensation courses through " + npcName + "'s groin. Any existing male anatomy begins to retract and reshape, flesh folding inward as sensitive folds form. When the transformation completes, they possess a fully formed vagina, warm and sensitive."; } else if (partVal === "penis" || partVal === "Penis") { genitalText = "A strange pressure builds in " + npcName + "'s groin. Flesh begins to extend and reshape, forming into a shaft as testicles descend into place. The transformation leaves them with fully formed male genitalia."; } else if (partVal && partVal.toLowerCase().includes("both")) { genitalText = npcName + "'s groin tingles intensely as their anatomy reshapes dramatically. When the sensations fade, they discover they now possess both sets of genitalia - a unique transformation that leaves them with dual anatomy."; } else { genitalText = npcName + " shudders as their intimate anatomy shifts and transforms, settling into a new configuration: " + partVal + "."; } descriptions.push(genitalText); } else if (part.name === "age") { var ageText = ""; if (partVal === "Adult") { ageText = npcName + "'s features adjust subtly, settling into mature adulthood. Their appearance reflects someone in their prime years - fully developed, confident, with the look of established maturity."; } else if (partVal === "Mature Adult" || partVal === "Mature") { ageText = npcName + "'s appearance shifts toward distinguished maturity. Fine lines appear, hair perhaps gaining distinguished touches, their bearing becoming that of someone with years of experience. There's an attractive wisdom to their new look."; } else { ageText = npcName + "'s age shifts visibly, their features transforming until they appear to be " + partVal + "."; } descriptions.push(ageText); } else if (part.name === "hairColor") { descriptions.push(npcName + "'s hair begins to change color from the roots outward. The new hue spreads through each strand like ink through water until every lock has transformed to " + partVal.toLowerCase() + ", the change leaving them with an entirely different look."); } else if (part.name === "hairLength") { var hairText = ""; if (partVal === "long" || partVal === "Long") { hairText = npcName + "'s hair begins to grow rapidly, extending down past their shoulders in flowing locks. The strands lengthen and thicken until they possess a full mane of long, luxurious hair."; } else if (partVal === "short" || partVal === "Short") { hairText = npcName + "'s hair begins to retract, shortening gradually until it sits close to their head in a neat, short style."; } else if (partVal === "bald" || partVal === "Bald") { hairText = npcName + "'s hair begins to fall away, strand by strand, until their scalp is completely smooth and bare."; } else { hairText = npcName + "'s hair shifts and adjusts, settling into a " + partVal.toLowerCase() + " length."; } descriptions.push(hairText); } else if (part.name === "skinTone") { descriptions.push(npcName + "'s skin begins to shift in tone, the color changing gradually across their entire body. The transformation spreads from their core outward until their complexion has completely changed to " + partVal.toLowerCase() + ", giving them an entirely new appearance."); } }); } // Check if NPC received physical traits if (received.physical && received.physical.length > 0) { var physicalTraitDescriptions = { "Athletic Build": npcName + "'s body tightens and tones before your eyes. Muscles define themselves, fat melting away as their frame becomes lean and athletic. They move with a new efficiency, their body now built for performance.", "Attractive": npcName + "'s features shift subtly but noticeably. Their face becomes more symmetrical, skin clearer, proportions more pleasing to the eye. There's an undeniable magnetism to their new appearance.", "Curvy": npcName + "'s body reshapes itself into pronounced curves. Their waist cinches inward while hips and bust expand, creating a dramatic hourglass silhouette that draws the eye.", "Fit": npcName + "'s body tightens noticeably, excess softness firming up. They look healthier, more vital, their physique reflecting regular exercise and good health.", "Flexible": npcName + "'s joints seem to loosen, their movements becoming more fluid. They stretch experimentally, surprised at how easily their body bends and twists.", "Muscular": npcName + "'s muscles begin to swell and harden. Their arms thicken, chest broadens, every muscle group becoming visibly larger and more defined. Power radiates from their enhanced physique.", "Tall": npcName + "'s entire frame stretches upward. Bones lengthen, proportions adjusting as they gain significant height. They now tower over their previous stature.", "Short": npcName + "'s frame compresses gradually. They shrink downward, becoming notably shorter and more compact than before.", "Voluptuous": "Soft curves emerge across " + npcName + "'s body. Their figure fills out generously, developing a full, sensual shape with pronounced curves in all the right places.", "Scarred": "Scars begin to appear across " + npcName + "'s skin - marks of battles never fought, injuries never suffered. Each scar tells a story that never happened, etched permanently into their flesh.", "Tattooed": "Ink spreads across " + npcName + "'s skin like living art. Tattoos emerge from nowhere, patterns and images appearing as if they'd always been there.", "Pierced": "Small glints of metal appear on " + npcName + "'s body as piercings materialize - ears, perhaps nose or lip, the jewelry appearing already healed into place.", "Freckled": "A constellation of freckles spreads across " + npcName + "'s skin, dotting their face and shoulders with charming spots.", "Tanned": npcName + "'s skin darkens to a sun-kissed bronze, as if they'd spent weeks basking in summer sun.", "Pale": "Color drains from " + npcName + "'s skin, their complexion becoming notably pale, almost porcelain.", "Hairy": "Body hair spreads across " + npcName + "'s skin, growing in thick and dense across their chest, arms, and legs.", "Smooth": "All body hair falls away from " + npcName + ", leaving their skin perfectly smooth and bare everywhere.", "Feminine": npcName + "'s features soften noticeably, becoming more delicate and feminine. Their movements become more graceful, their entire bearing shifting toward femininity.", "Masculine": npcName + "'s features sharpen and harden, becoming more rugged and masculine. Their bearing becomes more assertive, posture more commanding.", "Androgynous": npcName + "'s features blur between masculine and feminine, settling into an ambiguous beauty that defies easy categorization.", "Pregnant": npcName + "'s belly begins to swell outward, growing round and full with the unmistakable shape of pregnancy. They place a hand on their new bump, looking surprised.", "Lactating": npcName + "'s breasts feel suddenly heavier, fuller. A damp spot appears on their clothing as their body begins producing milk.", "Strong": "Raw power floods into " + npcName + "'s muscles. They flex experimentally, surprised at the strength now coursing through their body.", "Weak": "Strength drains from " + npcName + "'s body. Their muscles atrophy slightly, leaving them notably weaker than before.", "Graceful": npcName + "'s movements become fluid and elegant, every gesture naturally graceful as if they were a trained dancer.", "Clumsy": npcName + " stumbles slightly, their coordination suddenly impaired. They've become notably more accident-prone." }; received.physical.forEach(function(trait) { if (physicalTraitDescriptions[trait]) { descriptions.push(physicalTraitDescriptions[trait]); } else { descriptions.push(npcName + "'s body transforms as the " + trait + " trait takes hold, reshaping them in subtle but noticeable ways."); } }); } // Check if NPC received mental traits if (received.mental && received.mental.length > 0) { var mentalTraitDescriptions = { "Bimbo": npcName + "'s expression goes slack for a moment before a vapid, happy smile spreads across their face. Their eyes become slightly unfocused, thoughts visibly simplifying. They giggle softly, playing with their hair as the bimbo transformation takes hold of their mind.", "Lucky": "A golden shimmer passes over " + npcName + ", leaving them with an almost visible aura of good fortune. Somehow, you know things will just... work out for them now.", "Confident": npcName + "'s posture straightens, chin lifting. Self-assurance radiates from them now, their entire bearing projecting newfound confidence.", "Shy": npcName + "'s gaze drops, shoulders hunching slightly. They seem to shrink into themselves, suddenly uncomfortable with attention.", "Intelligent": "A sharp focus enters " + npcName + "'s eyes. You can almost see the gears turning faster in their mind, their intelligence noticeably enhanced.", "Dumb": "A slight vacancy enters " + npcName + "'s expression. Complex thoughts seem to slip away from them, their intelligence diminished.", "Kind": "Warmth spreads across " + npcName + "'s features. Their expression softens with genuine compassion, kindness now a core part of their nature.", "Bitchy": npcName + "'s expression sharpens with a cruel edge. There's a meanness in their eyes now, a readiness to cut others down.", "Dominant": "Authority settles over " + npcName + " like a mantle. Their posture becomes commanding, their gaze expectant of obedience.", "Submissive": npcName + "'s posture shifts subtly, becoming more deferential. Their eyes seek approval, a desire to please now fundamental to their nature.", "Pervert": "A hungry look enters " + npcName + "'s eyes. Their gaze lingers on bodies, mind clearly dwelling on carnal thoughts.", "Nymphomaniac": "An intense, desperate hunger appears in " + npcName + "'s eyes. Their body language shifts, radiating need. Sexual desire now dominates their thoughts.", "Prude": npcName + " stiffens, averting their eyes from anything suggestive. A prudish disapproval now colors their view of anything sexual.", "Brave": "Fear seems to drain from " + npcName + ". They stand taller, ready to face any danger without hesitation.", "Cowardly": npcName + " flinches at nothing, suddenly jumpy and fearful. Courage has abandoned them entirely.", "Lazy": npcName + " visibly relaxes, perhaps too much. Motivation seems to drain from them, replaced by a desire to do as little as possible.", "Energetic": npcName + " practically vibrates with newfound energy. They seem unable to stand still, brimming with vitality." }; received.mental.forEach(function(trait) { if (mentalTraitDescriptions[trait]) { descriptions.push(mentalTraitDescriptions[trait]); } else { descriptions.push(npcName + "'s demeanor shifts noticeably as the " + trait + " trait takes hold, altering their personality in fundamental ways."); } }); } // Check if NPC received skills if (received.skills && received.skills.length > 0) { var knowledgeSkills = ["Accounting", "Coding", "Medicine", "Foreign Language", "Teaching", "Writing", "Occult Expert", "First Aid"]; var physicalSkills = ["Athletics", "Combat", "Dancing", "Swimming", "Yoga", "Stealth", "Modeling"]; var artisticSkills = ["Art", "Guitar", "Piano", "Acting", "Makeup"]; var practicalSkills = ["Cooking", "Baking", "Driving", "Plumbing", "Forklift Certified", "Sales"]; var intimateSkills = ["Oral Expert", "Anal Expert", "Rough Sex Enthusiast", "Sensual Lover", "BDSM Dom", "BDSM Sub", "Roleplay Expert", "Dirty Talker", "Tantric Master", "Exhibitionist", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]; received.skills.forEach(function(skill) { var skillText = ""; if (knowledgeSkills.indexOf(skill) !== -1) { skillText = npcName + "'s eyes widen momentarily as new knowledge floods their mind. Complex information about " + skill.toLowerCase() + " suddenly makes perfect sense to them, years of study compressed into an instant."; } else if (physicalSkills.indexOf(skill) !== -1) { skillText = npcName + "'s body shifts subtly, muscles and reflexes adjusting. Their posture changes as physical mastery of " + skill.toLowerCase() + " becomes instinctive, their body now knowing movements it never learned."; } else if (artisticSkills.indexOf(skill) !== -1) { skillText = npcName + " flexes their fingers experimentally, a new creative spark visible in their eyes. Artistic talent for " + skill.toLowerCase() + " now flows through them naturally, technique and vision merging seamlessly."; } else if (practicalSkills.indexOf(skill) !== -1) { skillText = npcName + " gains a look of practical confidence. Knowledge of " + skill.toLowerCase() + " settles into their mind - tools, techniques, and know-how becoming second nature."; } else if (intimateSkills.indexOf(skill) !== -1) { skillText = "A subtle flush crosses " + npcName + "'s features as intimate knowledge takes root. They now possess an instinctive understanding of " + skill.toLowerCase() + ", their body and mind attuned to pleasures they never knew before."; } else { skillText = npcName + " pauses as newfound expertise in " + skill.toLowerCase() + " crystallizes in their mind, knowledge and ability merging into genuine skill."; } descriptions.push(skillText); }); } // Check if NPC received a job if (received.job) { descriptions.push(npcName + " seems to settle into their new role as " + received.job + "."); } if (descriptions.length === 0) { return ""; } return descriptions.join(" "); }>> /* ---------------------------------- */ /* --- PHYSICAL TRAIT CHANGES --- */ /* ---------------------------------- */ <<set setup.getPhysicalTraitChangeText = function(trait, isGaining) { var descriptions = { "Athletic Build": isGaining ? "Your muscles tone and define themselves, your body becoming lean and athletic." : "Your athletic definition fades, your muscles becoming less defined.", "Attractive": isGaining ? "Your features shift subtly, becoming more conventionally attractive and pleasant." : "Your striking attractiveness diminishes to average.", "Curvy": isGaining ? "Your body develops pronounced curves, hips and waist creating an hourglass figure." : "Your curves diminish, your figure becoming straighter.", "Fit": isGaining ? "Your body tightens and tones, becoming noticeably fit and healthy." : "Your fitness fades, your body becoming less toned.", "Flexible": isGaining ? "Your joints loosen, your body becoming remarkably flexible and limber." : "Your flexibility decreases, your body becoming stiffer.", "Muscular": isGaining ? "Your muscles swell and harden, becoming visibly large and defined." : "Your muscles shrink, definition fading away.", "Tall": isGaining ? "Your entire skeleton stretches, bones lengthening as you grow taller." : "Your bones compress slightly, your height decreasing.", "Short": isGaining ? "Your skeleton compresses, your entire body becoming shorter and more compact." : "Your bones stretch, adding height to your frame.", "Voluptuous": isGaining ? "Soft curves emerge across your body, creating a full, voluptuous figure." : "Your voluptuous curves diminish, your figure becoming less full.", "Scarred": isGaining ? "Old injuries manifest as scars across your skin, telling stories of past pain." : "Your scars fade, skin smoothing as if the injuries never happened.", "Tattooed": isGaining ? "Ink appears on your skin, tattoos emerging as if you'd always had them." : "Your tattoos fade and disappear, leaving clean skin.", "Pierced": isGaining ? "Piercings appear in various places on your body, already healed." : "Your piercings close up, holes vanishing from your skin.", "Glasses": isGaining ? "Your vision blurs until you find yourself needing glasses." : "Your vision clears perfectly, no longer needing corrective lenses.", "Freckled": isGaining ? "Freckles appear across your skin, especially on your face and shoulders." : "Your freckles fade away, leaving unblemished skin.", "Tanned": isGaining ? "Your skin darkens as if you've spent weeks in the sun." : "Your tan fades, skin lightening to a less sun-kissed tone.", "Pale": isGaining ? "Your skin lightens dramatically, becoming very pale." : "Color returns to your skin, the paleness fading.", "Broad Shoulders": isGaining ? "Your shoulders widen substantially, frame broadening." : "Your shoulders narrow, frame becoming less broad.", "Narrow Waist": isGaining ? "Your waist cinches inward, becoming notably narrow." : "Your waist widens, losing its narrow definition.", "Wide Hips": isGaining ? "Your hips spread outward, pelvis widening substantially." : "Your hips narrow, becoming less wide.", "Long Legs": isGaining ? "Your legs lengthen proportionally, becoming notably long." : "Your legs shorten proportionally to your body.", "Hairy": isGaining ? "Body hair spreads across your skin, thick and dense." : "Your body hair falls out, leaving smooth skin.", "Smooth": isGaining ? "All body hair vanishes, leaving your skin perfectly smooth." : "Body hair begins growing in, your skin becoming less smooth.", "Androgynous": isGaining ? "Your features blur between masculine and feminine, becoming ambiguous." : "Your features sharpen into more clearly gendered characteristics.", "Feminine": isGaining ? "Your features soften, becoming decidedly feminine." : "Your feminine features harden, becoming less delicate.", "Masculine": isGaining ? "Your features sharpen and square, becoming distinctly masculine." : "Your masculine features soften, becoming less rugged.", "Pregnant": isGaining ? "Your belly swells outward, unmistakably pregnant with child." : "Your pregnancy vanishes instantly, belly flattening.", "Lactating": isGaining ? "Your breasts begin producing milk, ready to nurse." : "Milk production ceases, your breasts drying up.", "Big Hands": isGaining ? "Your hands grow substantially larger, fingers lengthening." : "Your hands shrink, becoming more delicate.", "Small Hands": isGaining ? "Your hands shrink, becoming delicate and small." : "Your hands grow larger, less petite.", "Big Feet": isGaining ? "Your feet grow several sizes larger." : "Your feet shrink several sizes.", "Small Feet": isGaining ? "Your feet shrink, becoming notably small." : "Your feet grow larger.", "Strong": isGaining ? "Raw strength floods your body, muscles becoming powerful." : "Your strength diminishes, muscles weakening.", "Weak": isGaining ? "Your muscles atrophy, becoming weak and feeble." : "Strength returns to your muscles.", "Graceful": isGaining ? "Your movements become fluid and graceful, naturally elegant." : "Your grace fades, movements becoming clumsier.", "Clumsy": isGaining ? "Your coordination fails, becoming accident-prone and clumsy." : "Your clumsiness fades, coordination improving.", "Quick": isGaining ? "Your reflexes sharpen, movements becoming lightning fast." : "Your speed decreases, reflexes slowing.", "Slow": isGaining ? "Your movements become sluggish, reflexes dulling." : "Your speed increases, no longer sluggish.", "Dexterous": isGaining ? "Your hands become remarkably dexterous, fingers nimble and precise." : "Your dexterity fades, fingers becoming less nimble.", "Ambidextrous": isGaining ? "Both hands become equally skilled, perfect ambidexterity." : "You lose ambidexterity, reverting to single-hand dominance.", "Night Vision": isGaining ? "Your eyes adapt, able to see clearly in darkness." : "Your night vision fades, darkness becoming impenetrable again.", "Acute Hearing": isGaining ? "Your hearing sharpens dramatically, catching sounds others miss." : "Your hearing dulls to normal levels.", "Acute Smell": isGaining ? "Your sense of smell intensifies, detecting scents with precision." : "Your sense of smell returns to normal.", "Colorblind": isGaining ? "Colors fade from your vision, the world becoming dull." : "Colors burst back into your vision.", "Tone Deaf": isGaining ? "Your ability to distinguish musical tones vanishes." : "Musical tones become clear and distinguishable.", "Perfect Pitch": isGaining ? "You gain the ability to identify any musical note instantly." : "Your perfect pitch disappears.", "Photographic Memory": isGaining ? "Your memory becomes perfect, able to recall anything you've seen." : "Your photographic memory fades.", "Eidetic Memory": isGaining ? "Your memory becomes flawless, recalling everything in perfect detail." : "Your eidetic memory vanishes." }; return descriptions[trait] || (isGaining ? "You gain the " + trait + " trait." : "You lose the " + trait + " trait."); }>> /* ---------------------------------- */ /* --- MENTAL TRAIT CHANGES --- */ /* ---------------------------------- */ <<set setup.getMentalTraitChangeText = function(trait, isGaining) { var descriptions = { "Confident": isGaining ? "Self-assurance floods through you. <i>I've got this. I can handle anything.</i>" : "Your confidence crumbles. <i>I'm not sure I can do this...</i>", "Shy": isGaining ? "Anxiety creeps in around others. <i>Everyone's looking at me. I should just stay quiet.</i>" : "Your shyness evaporates. <i>I can speak up. My voice matters.</i>", "Brave": isGaining ? "Fear loses its grip on you. <i>I can face this. Danger won't stop me.</i>" : "Courage drains away. <i>This is too risky. I should run.</i>", "Cowardly": isGaining ? "Fear overwhelms you easily. <i>Too dangerous. I need to get away.</i>" : "Your cowardice fades. <i>I can be brave.</i>", "Kind": isGaining ? "Compassion fills your heart. <i>I want to help them. Everyone deserves kindness.</i>" : "Your kindness hardens. <i>Why should I care about them?</i>", "Bitchy": isGaining ? "Cruelty comes naturally now. <i>They deserve that comment. It's just honesty.</i>" : "Your mean streak fades. <i>Why was I so cruel? That was wrong.</i>", "Intelligent": isGaining ? "Your mind sharpens dramatically. <i>I can solve this. The patterns are clear.</i>" : "Your intelligence dulls. <i>This is too complicated...</i>", "Dumb": isGaining ? "Thinking becomes difficult. <i>Ugh, this is too hard to understand.</i>" : "Mental clarity returns. <i>Oh! Now I get it!</i>", "Creative": isGaining ? "Ideas flow freely. <i>I can see new possibilities everywhere!</i>" : "Your creativity dries up. <i>I can't think of anything original.</i>", "Logical": isGaining ? "Cold logic dominates your thoughts. <i>The facts are clear. Emotions are irrelevant.</i>" : "Logic fades. <i>Maybe there's more than just facts...</i>", "Emotional": isGaining ? "Feelings overwhelm you. <i>I can't stop crying/laughing. It's too much!</i>" : "Emotional intensity fades. <i>I feel... calmer now.</i>", "Stoic": isGaining ? "Emotions become distant. <i>It doesn't matter. I feel nothing about this.</i>" : "Feelings return. <i>I... I actually care about this.</i>", "Curious": isGaining ? "Everything fascinates you. <i>I need to know more! How does this work?</i>" : "Curiosity dies. <i>Whatever. I don't really care.</i>", "Apathetic": isGaining ? "Nothing seems to matter. <i>Why bother? It's all pointless anyway.</i>" : "Passion returns. <i>I do care! This matters!</i>", "Energetic": isGaining ? "Boundless energy courses through you. <i>I could run a marathon! Let's go!</i>" : "Energy drains away. <i>I'm so tired...</i>", "Lazy": isGaining ? "Motivation disappears. <i>That's too much work. I'll do it later... maybe.</i>" : "Drive returns. <i>I want to accomplish things!</i>", "Patient": isGaining ? "Impatience melts away. <i>It's fine. I can wait. No rush.</i>" : "Patience vanishes. <i>This is taking too long!</i>", "Impatient": isGaining ? "Everything feels too slow. <i>Come on! Hurry up already!</i>" : "Impatience fades. <i>I can take my time.</i>", "Dominant": isGaining ? "Command comes naturally. <i>I'm in charge here. Do as I say.</i>" : "Your dominance fades. <i>Maybe I should follow instead...</i>", "Submissive": isGaining ? "Obedience feels right. <i>Tell me what to do. I'll follow.</i>" : "Submission fades. <i>I don't want to just follow orders.</i>", "Aggressive": isGaining ? "Hostility rises easily. <i>They're asking for a fight!</i>" : "Aggression calms. <i>I don't need to be hostile.</i>", "Passive": isGaining ? "Conflict becomes unbearable. <i>I just want peace. No fighting.</i>" : "Passivity fades. <i>I can stand up for myself.</i>", "Optimistic": isGaining ? "Everything seems bright. <i>It'll work out! Things will be great!</i>" : "Optimism dies. <i>What's the point? It'll probably fail.</i>", "Pessimistic": isGaining ? "Doom clouds everything. <i>This will go wrong. It always does.</i>" : "Pessimism lifts. <i>Maybe... maybe it could work out?</i>", "Extroverted": isGaining ? "People energize you. <i>I need to be around others! Let's socialize!</i>" : "Extroversion fades. <i>I need some time alone...</i>", "Introverted": isGaining ? "People drain you. <i>Too many people. I need to be alone.</i>" : "Introversion lessens. <i>Being around people isn't so bad.</i>", "Honest": isGaining ? "Truth matters above all. <i>I have to tell the truth, no matter what.</i>" : "Honesty becomes flexible. <i>A small lie won't hurt...</i>", "Deceptive": isGaining ? "Lies come easily. <i>They'll believe whatever I tell them.</i>" : "Deception becomes difficult. <i>I should just tell the truth.</i>", "Loyal": isGaining ? "Devotion becomes absolute. <i>I'll never betray them. Never.</i>" : "Loyalty wavers. <i>Maybe I should look out for myself first...</i>", "Treacherous": isGaining ? "Betrayal feels natural. <i>They'd do the same to me given the chance.</i>" : "Treachery fades. <i>I can be loyal.</i>", "Generous": isGaining ? "Giving feels wonderful. <i>I want to share what I have!</i>" : "Generosity tightens. <i>Why should I give them anything?</i>", "Greedy": isGaining ? "Possessiveness overwhelms you. <i>Mine. All mine. I need more.</i>" : "Greed loosens. <i>I have enough. I can share.</i>", "Humble": isGaining ? "Ego deflates. <i>I'm nothing special. Others deserve credit.</i>" : "Humility fades. <i>I am pretty great actually...</i>", "Arrogant": isGaining ? "Superiority is obvious. <i>I'm better than them. Clearly.</i>" : "Arrogance crumbles. <i>Maybe I'm not as special as I thought...</i>", "Disciplined": isGaining ? "Self-control becomes iron. <i>I can resist. I have willpower.</i>" : "Discipline weakens. <i>Just this once won't hurt...</i>", "Impulsive": isGaining ? "Restraint vanishes. <i>Do it now! Don't think, just act!</i>" : "Impulsiveness fades. <i>I should think before I act.</i>", "Organized": isGaining ? "Order becomes essential. <i>Everything has its place. Structure matters.</i>" : "Organization crumbles. <i>Who cares where it goes?</i>", "Chaotic": isGaining ? "Disorder feels right. <i>Plans? Structure? Boring! Let's be spontaneous!</i>" : "Chaos settles. <i>Maybe some order would be good...</i>", "Romantic": isGaining ? "Love fills your heart. <i>Everything is beautiful. I believe in true love!</i>" : "Romance dies. <i>Love is just chemicals. Nothing special.</i>", "Cynical": isGaining ? "Distrust becomes default. <i>Everyone has ulterior motives. Trust no one.</i>" : "Cynicism lifts. <i>Maybe people can be good...</i>", "Pervert": isGaining ? "Sexual thoughts dominate. <i>Everything makes me think of sex...</i>" : "Perverted thoughts fade. <i>I can think about other things now.</i>", "Prude": isGaining ? "Sexual content becomes revolting. <i>That's disgusting! How inappropriate!</i>" : "Prudishness eases. <i>It's not that bad...</i>", "Nymphomaniac": isGaining ? "Sexual need becomes overwhelming. <i>I need it. Now. Always.</i>" : "Sexual desperation fades. <i>I can control myself.</i>", "Masochist": isGaining ? "Pain becomes pleasure. <i>Yes! Hurt me! It feels so good!</i>" : "Masochism fades. <i>Pain just hurts now.</i>", "Sadist": isGaining ? "Others' pain arouses you. <i>Their suffering is beautiful.</i>" : "Sadism disappears. <i>I don't want to hurt anyone.</i>", "Exhibitionist": isGaining ? "Being watched excites you. <i>I want them to see me!</i>" : "Exhibitionism fades. <i>I prefer privacy.</i>", "Voyeur": isGaining ? "Watching others arouses you. <i>I need to see. I need to watch.</i>" : "Voyeurism disappears. <i>That's private.</i>" }; return descriptions[trait] || (isGaining ? "You gain the " + trait + " trait. <i>I feel... different.</i>" : "You lose the " + trait + " trait. <i>That feeling is gone.</i>"); }>> /* ---------------------------------- */ /* --- SKILL GAIN DESCRIPTIONS --- */ /* ---------------------------------- */ <<set setup.getSkillGainText = function(skill) { var descriptions = { "Accounting": "Numbers and financial records suddenly make perfect sense. You understand debits, credits, balance sheets, tax codes.", "Acting": "You know how to inhabit characters, project emotions, command a stage or camera with presence and technique.", "Art": "Artistic vision flows through you. You understand composition, color theory, technique across multiple mediums.", "Athletics": "Your body knows how to move efficiently - running, jumping, throwing, physical coordination perfected.", "Baking": "You understand temperatures, rising agents, dough consistency, timing. Perfect pastries are within your grasp.", "Coding": "Programming languages make sense. You can write clean code, debug efficiently, understand algorithms and data structures.", "Combat": "Fighting instincts awaken. You know strikes, blocks, positioning, how to hurt and how to defend.", "Cooking": "Flavors, techniques, timing - you understand how to create delicious meals from raw ingredients.", "Dancing": "Rhythm flows through you. Your body knows how to move to music with grace and precision.", "Driving": "Vehicle control becomes second nature. You understand handling, navigation, traffic flow.", "First Aid": "Medical knowledge floods in. You know how to treat injuries, perform CPR, stabilize patients.", "Foreign Language": "New words and grammar patterns settle into your mind. You can speak, read, and write fluently.", "Forklift Certified": "Operating forklifts becomes natural. You understand weight distribution, safety protocols, maneuvering.", "Guitar": "Your fingers know where to go. Chords, scales, rhythm, lead - music flows from strings.", "Makeup": "You understand contouring, color matching, application techniques, how to enhance or transform features.", "Medicine": "Medical knowledge expands dramatically. Diagnoses, treatments, anatomy, pharmacology all become clear.", "Modeling": "You know how to pose, move, work angles, project confidence for cameras and audiences.", "Piano": "Keys become an extension of your thoughts. Music theory, technique, performance - all mastered.", "Plumbing": "Pipes, water pressure, drainage systems - you understand how it all connects and how to fix problems.", "Sales": "Persuasion becomes natural. You read people, understand objections, close deals effortlessly.", "Stealth": "Moving silently, staying hidden, avoiding detection - you know how to be unseen and unheard.", "Swimming": "Water becomes your element. Strokes, breathing, endurance - you're a natural in water.", "Teaching": "You understand how to explain concepts clearly, engage students, adapt to different learning styles.", "Writing": "Words flow perfectly. Grammar, structure, storytelling, persuasive writing - all mastered.", "Yoga": "Poses, breathing, flexibility, meditation - your body and mind align in yogic practice.", "Occult Expert": "Esoteric knowledge floods your mind. Mystical traditions, rituals, hidden lore - you understand the occult.", // Sexual Skills - VERY EROTIC "Oral Expert": "Your mouth becomes an instrument of pleasure. You know exactly how to use your tongue, lips, suction - how to tease, how to intensify, how to bring someone to screaming climax with just your mouth. Every technique, every angle, every sensitive spot is instinctively known.", "Anal Expert": "You understand the art completely. Preparation, relaxation, angles, depth, rhythm - how to make anal intensely pleasurable rather than painful. You know how to open someone up gradually, how to hit the right spots, how to make them beg for more.", "Rough Sex Enthusiast": "Aggressive passion becomes your forte. You know how to dominate, how to use force and intensity in ways that are overwhelmingly pleasurable. Hair pulling, spanking, pinning, biting - delivering pain that transforms into ecstasy.", "Sensual Lover": "Slow, intimate passion is your art. You understand the power of gentle touches, building anticipation, emotional connection during sex. Every caress means something, pleasure building gradually to overwhelming heights.", "BDSM Dom": "Dominance flows naturally. You know how to command, control, push limits safely. Reading your partner's responses, delivering exactly what they need - pleasure through power.", "BDSM Sub": "Submission becomes ecstasy. You know how to surrender, how to please, how to endure for your dominant. Finding pleasure in service and obedience.", "Roleplay Expert": "Sexual scenarios come alive. You can inhabit characters, create scenes, make fantasies real through convincing roleplay.", "Dirty Talker": "Erotic words flow perfectly. You know exactly what to say, when to whisper, when to command, how to make someone ache with just your voice.", "Tantric Master": "Sexual energy becomes art. You understand breath, meditation, energy flow, how to extend arousal for hours, achieving transcendent states through sex.", "Exhibitionist": "Being watched becomes arousing. You know how to perform, how to make sex visually exciting for observers while increasing your own pleasure.", "Sexual Stamina Expert": "Endurance becomes exceptional. You can maintain arousal and performance for extended periods, satisfying partners repeatedly.", "Tit Worship Expert": "Breasts become your specialty. You know every way to pleasure them - touching, sucking, massaging, pinching - bringing intense pleasure through breast stimulation alone.", "Titfuck Master": "Using breasts for sex becomes an art. You understand pressure, angle, rhythm, lubrication - creating intense pleasure through breast sex." }; return descriptions[skill] || "You gain knowledge and proficiency in " + skill + "."; }>> /* ---------------------------------- */ /* --- JOB KNOWLEDGE DESCRIPTIONS --- */ /* ---------------------------------- */ <<set setup.getJobKnowledgeText = function(job) { var descriptions = { "Street Performer": "You understand crowd work, timing, how to draw attention, collect tips, perform under pressure in public spaces.", "Construction Worker": "Building knowledge floods in. You understand tools, materials, safety, how to construct and demolish structures.", "Security Guard": "Surveillance, threat assessment, patrol patterns, conflict de-escalation - security work becomes intuitive.", "Baker": "Commercial baking knowledge arrives. Production schedules, industrial ovens, consistency, food safety regulations.", "Maid": "Cleaning becomes systematic. You know products, techniques, efficiency, how to clean thoroughly and quickly.", "Hooker": "Street work knowledge settles in. Finding clients, negotiating, staying safe, dealing with law enforcement.", "Stripper": "Stage presence becomes natural. Working the pole, teasing, customer interaction, maximizing tips through performance.", "Prostitute": "Sex work professionalism arrives. Client management, services, pricing, boundaries, staying safe in the industry.", "Adult Store Clerk": "Product knowledge floods in. Toys, accessories, lubricants, customer guidance - helping people explore pleasure.", "Brothel Worker": "Establishment protocols become clear. Room management, client rotation, house rules, working within a managed environment.", "Model": "Professional modeling knowledge arrives. Agencies, portfolios, posing, working with photographers, building a career.", "Bouncer": "Door work becomes intuitive. Reading threats, physical intervention, de-escalation, controlling entry to venues.", "Porn Star": "Adult film industry knowledge floods in. Scenes, positions for camera, working with directors, contract negotiation.", "Social Media Influencer": "Content creation becomes natural. Algorithms, engagement, sponsorships, building audience, monetization strategies.", "Black Market Dealer": "Underground trade knowledge arrives. Connections, products, prices, avoiding law enforcement, maintaining secrecy.", "Police Officer": "Law enforcement knowledge floods in. Procedures, laws, investigation, arrests, report writing, working within the system.", "Detective": "Investigative skills sharpen. Evidence analysis, interrogation, case building, connecting patterns others miss.", "Brothel Owner": "Business management knowledge arrives. Staff management, legal issues, finances, reputation, maintaining operations.", "Mayor": "Municipal governance becomes clear. Politics, budgets, public relations, policy implementation, managing a city.", "Fitness Trainer": "Exercise science floods in. Programs, form, nutrition, motivation, helping clients achieve fitness goals.", "Barista": "Coffee expertise arrives. Espresso extraction, milk steaming, drink recipes, customer service, working efficiently under pressure.", "Streamer": "Content streaming knowledge floods in. Equipment, engagement, monetization, building community, entertaining audiences live.", "Adult Streamer": "Erotic streaming expertise arrives. Maintaining arousal, engaging sexual content, tip goals, platform rules, building subscriber base.", "Criminal": "Criminal operations become clear. Planning jobs, avoiding detection, fencing goods, working in illegal enterprises.", "Unemployed": "The weight of having no job settles on you. No specialized work knowledge, just... nothing." }; return descriptions[job] || "Knowledge of working as a " + job + " floods into your mind."; }>> /* ---------------------------------- */ /* --- MUTUALLY EXCLUSIVE TRAIT SWAPS --- */ /* ---------------------------------- */ <<set setup.getMutuallyExclusiveSwapText = function(oldTrait, newTrait) { var swaps = { "Dominant-Submissive": "The power dynamic flips completely in your mind. <i>I don't want to lead anymore... I want to be told what to do. Following feels right.</i>", "Submissive-Dominant": "Submission no longer appeals. <i>I don't want to follow anymore. I want to command. I want control.</i>", "Kind-Bitchy": "Compassion drains away, replaced by cruelty. <i>Why should I be nice? They deserve harsh honesty.</i>", "Bitchy-Kind": "Your mean streak melts. <i>Why was I so cruel? I want to be kind. I want to help people.</i>", "Confident-Shy": "Confidence evaporates, replaced by anxiety. <i>Everyone's judging me. I should just be quiet and invisible.</i>", "Shy-Confident": "Anxiety fades, replaced by self-assurance. <i>I don't need to hide. I can speak up. I'm good enough.</i>", "Energetic-Lazy": "Boundless energy drains away into lethargy. <i>Everything's too much effort. I'll do it later... or never.</i>", "Lazy-Energetic": "Motivation surges through you. <i>I could run a marathon! Let's accomplish everything!</i>", "Extroverted-Introverted": "People suddenly drain you. <i>Too many people. I need to be alone. This is exhausting.</i>", "Introverted-Extroverted": "Solitude becomes uncomfortable. <i>I want to be around people! I need social interaction!</i>", "Optimistic-Pessimistic": "Hope dies, replaced by doom. <i>It won't work out. It never does. Why bother trying?</i>", "Pessimistic-Optimistic": "Darkness lifts into light. <i>It could work out! Things might actually be great!</i>", "Brave-Cowardly": "Courage crumbles into fear. <i>Too dangerous. I need to run. I can't face this.</i>", "Cowardly-Brave": "Fear loses its grip. <i>I can face danger. I can be courageous. I won't run.</i>", "Aggressive-Passive": "Hostility fades into avoidance. <i>I don't want conflict. Let's just keep the peace.</i>", "Passive-Aggressive": "Passivity becomes hostility. <i>I'm done avoiding confrontation. Time to fight back.</i>", "Honest-Deceptive": "Truth becomes flexible. <i>A lie won't hurt. They don't need to know everything.</i>", "Deceptive-Honest": "Lies become difficult. <i>I need to tell the truth. Deception feels wrong now.</i>", "Loyal-Treacherous": "Devotion becomes treachery. <i>Why stay loyal? I should look out for myself first.</i>", "Treacherous-Loyal": "Betrayal becomes unthinkable. <i>I won't betray them. Loyalty matters.</i>", "Generous-Greedy": "Giving becomes taking. <i>Why should I share? I need more for myself. Mine.</i>", "Greedy-Generous": "Possessiveness loosens. <i>I have enough. I want to share. Giving feels good.</i>", "Humble-Arrogant": "Humility becomes superiority. <i>I'm clearly better than them. Obviously.</i>", "Arrogant-Humble": "Ego deflates dramatically. <i>I'm not as special as I thought. Others deserve recognition.</i>", "Disciplined-Impulsive": "Self-control shatters. <i>Just do it! Don't think, act! Restraint is boring!</i>", "Impulsive-Disciplined": "Restraint becomes natural. <i>I can control myself. I can resist temptation.</i>", "Organized-Chaotic": "Order becomes chaos. <i>Who cares about structure? Let's be spontaneous!</i>", "Chaotic-Organized": "Chaos becomes uncomfortable. <i>Everything needs its place. Order matters.</i>", "Romantic-Cynical": "Love becomes cynicism. <i>Romance is fake. Love is just chemicals. Nothing special.</i>", "Cynical-Romantic": "Cynicism melts into romance. <i>Love is real! Life is beautiful!</i>", "Pervert-Prude": "Sexual thoughts become revolting. <i>That's disgusting! How inappropriate!</i>", "Prude-Pervert": "Prudishness becomes perversion. <i>Everything makes me think of sex...</i>" }; var key1 = oldTrait + "-" + newTrait; var key2 = newTrait + "-" + oldTrait; return swaps[key1] || swaps[key2] || ("You lose " + oldTrait + " and gain " + newTrait + " - your entire perspective shifts."); }>> /* ---------------------------------- */ /* --- HELPER FUNCTION --- */ /* ---------------------------------- */ <<set setup.getConflictingTrait = function(trait, traitList) { var conflicts = { "Dominant": "Submissive", "Submissive": "Dominant", "Kind": "Bitchy", "Bitchy": "Kind", "Confident": "Shy", "Shy": "Confident", "Energetic": "Lazy", "Lazy": "Energetic", "Extroverted": "Introverted", "Introverted": "Extroverted", "Optimistic": "Pessimistic", "Pessimistic": "Optimistic", "Brave": "Cowardly", "Cowardly": "Brave", "Aggressive": "Passive", "Passive": "Aggressive", "Honest": "Deceptive", "Deceptive": "Honest", "Loyal": "Treacherous", "Treacherous": "Loyal", "Generous": "Greedy", "Greedy": "Generous", "Humble": "Arrogant", "Arrogant": "Humble", "Disciplined": "Impulsive", "Impulsive": "Disciplined", "Organized": "Chaotic", "Chaotic": "Organized", "Romantic": "Cynical", "Cynical": "Romantic", "Pervert": "Prude", "Prude": "Pervert" }; var conflictingTrait = conflicts[trait]; if (conflictingTrait && traitList.includes(conflictingTrait)) { return conflictingTrait; } return null; }>> /* ====================================================================== */ /* NPC DYNAMIC PERSONALITY & BEHAVIOR SYSTEM */ /* ====================================================================== */ /* Recalculate NPC's primary personality based on their current mental traits */ <<set setup.recalculateNPCPersonality = function(npc) { if (!npc || !npc.mentalTraits) return null; // Store old personality for tracking changes var oldPersonality = npc.primaryPersonality || null; // Priority order for personality calculation (most impactful first) var personalityPriority = [ "Dominant", "Submissive", "Bimbo", "Bitchy", "Arrogant", "Diva", "Confident", "Shy", "Awkward", "Flirty", "Seductive", "Kind", "Warm", "Friendly", "Empathetic", "Nurturing", "Cold", "Cynical", "Rude", "Mean", "Energetic", "Outgoing", "Excited", "Calm", "Patient", "Chill", "Nonchalant", "Creative", "Curious", "Intelligent", "Simple", "Jock", "Goth", "Nerd", "Femboy" ]; var newPersonality = null; for (var i = 0; i < personalityPriority.length; i++) { if (npc.mentalTraits.includes(personalityPriority[i])) { newPersonality = personalityPriority[i]; break; } } // Default to first trait if no priority match if (!newPersonality && npc.mentalTraits.length > 0) { newPersonality = npc.mentalTraits[0]; } // Store personality history if changed if (newPersonality !== oldPersonality) { if (!npc.personalityHistory) { npc.personalityHistory = []; } npc.personalityHistory.push({ from: oldPersonality, to: newPersonality, day: State.variables.dayNumber || 0 }); } npc.primaryPersonality = newPersonality; return newPersonality; }>> /* Update NPC behavior based on all their current traits */ <<set setup.updateNPCBehavior = function(npc) { if (!npc) return; var v = State.variables; var originalName = npc.originalName || npc.name; // Recalculate personality first setup.recalculateNPCPersonality(npc); // Update schedule based on traits setup.updateNPCScheduleFromTraits(npc); // Update skill usage likelihood setup.updateNPCSkillUsage(npc); // Update appearance behavior (makeup, grooming, etc) setup.updateNPCAppearanceBehavior(npc); // Calculate and store trait combination effects setup.calculateTraitCombinationEffects(npc); }>> /* Calculate personality modifier effects from trait combinations */ <<set setup.calculateTraitCombinationEffects = function(npc) { if (!npc) return; // Initialize behavior modifiers if not present if (!npc.behaviorModifiers) { npc.behaviorModifiers = {}; } var mods = npc.behaviorModifiers; var mental = npc.mentalTraits || []; var physical = npc.physicalTraits || []; // Reset modifiers mods.flirtiness = 0; mods.aggression = 0; mods.helpfulness = 0; mods.talkativeness = 0; mods.trustworthiness = 0; mods.confidence = 0; // Flirtiness modifiers if (mental.includes("Flirty")) mods.flirtiness += 30; if (mental.includes("Seductive")) mods.flirtiness += 25; if (mental.includes("Confident")) mods.flirtiness += 10; if (mental.includes("Extroverted")) mods.flirtiness += 10; if (mental.includes("Shy")) mods.flirtiness -= 20; if (mental.includes("Awkward")) mods.flirtiness -= 15; if (physical.includes("Attractive")) mods.flirtiness += 15; // Confident + Flirty = Bold advances if (mental.includes("Confident") && mental.includes("Flirty")) { mods.flirtiness += 20; mods.boldAdvances = true; } // Aggression modifiers if (mental.includes("Aggressive")) mods.aggression += 30; if (mental.includes("Short Tempered")) mods.aggression += 20; if (mental.includes("Bitchy")) mods.aggression += 15; if (mental.includes("Arrogant")) mods.aggression += 10; if (mental.includes("Calm")) mods.aggression -= 25; if (mental.includes("Patient")) mods.aggression -= 20; if (mental.includes("Kind")) mods.aggression -= 15; // Helpfulness modifiers if (mental.includes("Kind")) mods.helpfulness += 30; if (mental.includes("Nurturing")) mods.helpfulness += 25; if (mental.includes("Empathetic")) mods.helpfulness += 20; if (mental.includes("Friendly")) mods.helpfulness += 15; if (mental.includes("Selfish")) mods.helpfulness -= 25; if (mental.includes("Cold")) mods.helpfulness -= 15; // Shy + Kind = Gentle, hesitant helpfulness if (mental.includes("Shy") && mental.includes("Kind")) { mods.helpfulness += 10; mods.gentleHelper = true; } // Arrogant + Intelligent = Condescending expertise if (mental.includes("Arrogant") && mental.includes("Intelligent")) { mods.condescending = true; } // Lazy + Friendly = Casual, low-effort friendliness if (mental.includes("Lazy") && mental.includes("Friendly")) { mods.casualFriendly = true; } // Talkativeness modifiers if (mental.includes("Talkative")) mods.talkativeness += 30; if (mental.includes("Extroverted")) mods.talkativeness += 20; if (mental.includes("Energetic")) mods.talkativeness += 15; if (mental.includes("Quiet")) mods.talkativeness -= 30; if (mental.includes("Introverted")) mods.talkativeness -= 20; if (mental.includes("Shy")) mods.talkativeness -= 15; // Confidence modifiers if (mental.includes("Confident")) mods.confidence += 30; if (mental.includes("Arrogant")) mods.confidence += 25; if (mental.includes("Brave")) mods.confidence += 15; if (mental.includes("Insecure")) mods.confidence -= 30; if (mental.includes("Shy")) mods.confidence -= 20; if (mental.includes("Anxious")) mods.confidence -= 15; // Trust modifiers if (mental.includes("Trusting")) mods.trustworthiness += 25; if (mental.includes("Honest")) mods.trustworthiness += 20; if (mental.includes("Paranoid")) mods.trustworthiness -= 30; if (mental.includes("Deceitful")) mods.trustworthiness -= 25; // Special combo: Dominant + Confident = Commanding presence if (mental.includes("Dominant") && mental.includes("Confident")) { mods.commandingPresence = true; } // Special combo: Submissive + Shy = Easily flustered if (mental.includes("Submissive") && mental.includes("Shy")) { mods.easilyFlustered = true; } // Special combo: Intelligent + Curious = Knowledge seeker if (mental.includes("Intelligent") && mental.includes("Curious")) { mods.knowledgeSeeker = true; } // Clamp values mods.flirtiness = Math.max(-50, Math.min(100, mods.flirtiness)); mods.aggression = Math.max(-50, Math.min(100, mods.aggression)); mods.helpfulness = Math.max(-50, Math.min(100, mods.helpfulness)); mods.talkativeness = Math.max(-50, Math.min(100, mods.talkativeness)); mods.confidence = Math.max(-50, Math.min(100, mods.confidence)); mods.trustworthiness = Math.max(-50, Math.min(100, mods.trustworthiness)); }>> /* Get NPC behavior modifier for a specific trait type */ <<set setup.getNPCBehaviorModifier = function(npc, modType) { if (!npc || !npc.behaviorModifiers) return 0; return npc.behaviorModifiers[modType] || 0; }>> /* Check if NPC has a specific behavior flag from trait combinations */ <<set setup.hasNPCBehaviorFlag = function(npc, flagName) { if (!npc || !npc.behaviorModifiers) return false; return npc.behaviorModifiers[flagName] === true; }>> /* Update NPC schedule based on current traits */ <<set setup.updateNPCScheduleFromTraits = function(npc) { if (!npc) return; var v = State.variables; var originalName = npc.originalName || npc.name; // Initialize schedule if needed if (!v.npcLocationSchedules) { v.npcLocationSchedules = {}; } if (!v.npcLocationSchedules[originalName]) { v.npcLocationSchedules[originalName] = { defaultLocation: null, customSchedule: {}, traitOverrides: [] }; } var schedule = v.npcLocationSchedules[originalName]; if (!schedule.traitOverrides) { schedule.traitOverrides = []; } // Clear old trait-based overrides schedule.traitOverrides = []; // Athletic/Muscular/Fit NPCs go to gym if (npc.physicalTraits.includes("Athletic") || npc.physicalTraits.includes("Muscular") || npc.mentalTraits.includes("Jock") || npc.physicalTraits.includes("Fit")) { schedule.traitOverrides.push({ location: "OpahFitness", day: ["Monday", "Wednesday", "Friday"], start: 18, end: 20, reason: "gym workout" }); } // Intelligent/Curious NPCs visit library if (npc.mentalTraits.includes("Intelligent") || npc.mentalTraits.includes("Curious") || npc.mentalTraits.includes("Nerd")) { schedule.traitOverrides.push({ location: "Library", day: ["Tuesday", "Thursday"], start: 16, end: 18, reason: "reading/studying" }); } // Outgoing/Flirty/Seductive NPCs go to social locations if (npc.mentalTraits.includes("Outgoing") || npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { schedule.traitOverrides.push({ location: "StripClub", day: ["Friday", "Saturday"], start: 20, end: 23, reason: "socializing" }); } // Goth/Creative/Introverted NPCs visit alternative spots if (npc.mentalTraits.includes("Goth") || (npc.mentalTraits.includes("Creative") && npc.mentalTraits.includes("Introverted"))) { schedule.traitOverrides.push({ location: "EcentricShop", day: ["Saturday"], start: 14, end: 16, reason: "browsing" }); } // Bimbo trait - frequent beauty salon visits if (npc.mentalTraits.includes("Bimbo")) { schedule.traitOverrides.push({ location: "BeautySalon", day: ["Monday", "Wednesday", "Friday"], start: 11, end: 13, reason: "beauty maintenance" }); } // Lazy/Chill NPCs frequent park in afternoons if (npc.mentalTraits.includes("Lazy") || npc.mentalTraits.includes("Chill") || npc.mentalTraits.includes("Nonchalant")) { schedule.traitOverrides.push({ location: "Park", day: ["Sunday"], start: 14, end: 17, reason: "relaxing" }); } // Ambitious/Workaholic NPCs stay late at their job location if (npc.mentalTraits.includes("Ambitious") || npc.mentalTraits.includes("Workaholic") || npc.mentalTraits.includes("Hardworking")) { schedule.traitOverrides.push({ location: "BusinessDistrict", day: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], start: 17, end: 20, reason: "working late" }); } // Foodie/Gluttonous NPCs visit food locations if (npc.mentalTraits.includes("Foodie") || npc.mentalTraits.includes("Gluttonous")) { schedule.traitOverrides.push({ location: "Restaurant", day: ["Wednesday", "Saturday"], start: 18, end: 20, reason: "dining out" }); } // Spiritual/Meditative NPCs visit peaceful locations if (npc.mentalTraits.includes("Spiritual") || npc.mentalTraits.includes("Meditative") || npc.mentalTraits.includes("Calm")) { schedule.traitOverrides.push({ location: "Park", day: ["Tuesday", "Thursday"], start: 6, end: 8, reason: "morning meditation" }); } // Party-loving NPCs frequent clubs on weekends if (npc.mentalTraits.includes("Partier") || npc.mentalTraits.includes("Extroverted") && npc.mentalTraits.includes("Energetic")) { schedule.traitOverrides.push({ location: "StripClub", day: ["Friday", "Saturday"], start: 21, end: 24, reason: "partying" }); } // Beach-loving NPCs visit beach on weekends if (npc.physicalTraits.includes("Athletic") || npc.mentalTraits.includes("Outgoing")) { schedule.traitOverrides.push({ location: "Beach", day: ["Saturday", "Sunday"], start: 10, end: 14, reason: "beach time" }); } // Shopaholic NPCs visit shopping areas if (npc.mentalTraits.includes("Shopaholic") || npc.mentalTraits.includes("Materialistic")) { schedule.traitOverrides.push({ location: "ShoppingMall", day: ["Saturday"], start: 12, end: 17, reason: "shopping" }); } // Rich/Wealthy NPCs visit upscale areas if (npc.mentalTraits.includes("Wealthy") || npc.mentalTraits.includes("Rich") || npc.mentalTraits.includes("Snobby")) { schedule.traitOverrides.push({ location: "BusinessDistrict", day: ["Monday", "Wednesday", "Friday"], start: 12, end: 14, reason: "business lunch" }); } }>> /* Determine how likely an NPC is to use their skills in personal life */ <<set setup.updateNPCSkillUsage = function(npc) { if (!npc || !npc.skills) return; if (!npc.skillUsageLikelihood) { npc.skillUsageLikelihood = {}; } // Sexual skills - always used in personal life if NPC is outgoing/flirty/seductive var sexualSkills = ["Sexually Skilled", "High Heels Proficient", "Seduction"]; sexualSkills.forEach(function(skill) { if (npc.skills.includes(skill)) { var likelihood = 0.3; // Base 30% if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { likelihood = 0.8; // 80% if flirty/seductive } else if (npc.mentalTraits.includes("Outgoing") || npc.mentalTraits.includes("Confident")) { likelihood = 0.6; // 60% if outgoing/confident } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward") || npc.mentalTraits.includes("Prude")) { likelihood = 0.1; // Only 10% if shy/awkward/prude } npc.skillUsageLikelihood[skill] = likelihood; } }); // Makeup skill - depends on personality and gender if (npc.skills.includes("Makeup")) { var makeupChance = 0.5; // Base 50% if (npc.mentalTraits.includes("Vain") || npc.mentalTraits.includes("Diva") || npc.physicalTraits.includes("Fashionable")) { makeupChance = 0.9; // 90% if vain/diva/fashionable } else if (npc.mentalTraits.includes("Bimbo") || npc.mentalTraits.includes("Prep")) { makeupChance = 0.95; // 95% if bimbo/prep } else if (npc.mentalTraits.includes("Tomboy") || npc.mentalTraits.includes("Jock")) { makeupChance = 0.1; // 10% if tomboy/jock } else if (npc.mentalTraits.includes("Goth")) { makeupChance = 0.7; // 70% if goth (dark makeup) } else if (npc.bodyParts.gender === "male" && !npc.mentalTraits.includes("Femboy")) { makeupChance = 0.05; // 5% for masculine males } else if (npc.mentalTraits.includes("Femboy")) { makeupChance = 0.6; // 60% for femboys } npc.skillUsageLikelihood["Makeup"] = makeupChance; } // Creative skills (Art, Painting, Music, Writing) - used if creative/curious var creativeSkills = ["Art", "Painting", "Music", "Writing", "Dancing"]; creativeSkills.forEach(function(skill) { if (npc.skills.includes(skill)) { var chance = 0.3; // Base 30% if (npc.mentalTraits.includes("Creative") || npc.mentalTraits.includes("Artistic")) { chance = 0.9; // 90% if creative } else if (npc.mentalTraits.includes("Curious")) { chance = 0.6; // 60% if curious } npc.skillUsageLikelihood[skill] = chance; } }); // Athletic skills (Athletics, Heavy Lifting, Combat, Yoga) - used if athletic/energetic var athleticSkills = ["Athletics", "Heavy Lifting", "Combat", "Yoga"]; athleticSkills.forEach(function(skill) { if (npc.skills.includes(skill)) { var chance = 0.4; // Base 40% if (npc.physicalTraits.includes("Athletic") || npc.physicalTraits.includes("Muscular") || npc.mentalTraits.includes("Jock")) { chance = 0.95; // 95% if athletic/muscular/jock } else if (npc.mentalTraits.includes("Energetic") || npc.mentalTraits.includes("Active")) { chance = 0.7; // 70% if energetic } else if (npc.mentalTraits.includes("Lazy")) { chance = 0.05; // Only 5% if lazy } npc.skillUsageLikelihood[skill] = chance; } }); // Cooking/Baking - depends on traits if (npc.skills.includes("Cooking") || npc.skills.includes("Baking")) { var cookingChance = 0.5; // Base 50% if (npc.mentalTraits.includes("Nurturing") || npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Warm")) { cookingChance = 0.8; // 80% if nurturing/kind } if (npc.skills.includes("Cooking")) npc.skillUsageLikelihood["Cooking"] = cookingChance; if (npc.skills.includes("Baking")) npc.skillUsageLikelihood["Baking"] = cookingChance; } }>> /* Update NPC appearance behavior based on traits and skills */ <<set setup.updateNPCAppearanceBehavior = function(npc) { if (!npc) return; if (!npc.appearanceBehavior) { npc.appearanceBehavior = {}; } // Grooming frequency var groomingFreq = "moderate"; // Base if (npc.mentalTraits.includes("Vain") || npc.mentalTraits.includes("Diva") || npc.mentalTraits.includes("Bimbo") || npc.physicalTraits.includes("Fashionable")) { groomingFreq = "very high"; } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Professional") || npc.mentalTraits.includes("Prep")) { groomingFreq = "high"; } else if (npc.mentalTraits.includes("Lazy") || npc.mentalTraits.includes("Sloppy")) { groomingFreq = "low"; } else if (npc.mentalTraits.includes("Goth") || npc.mentalTraits.includes("Nerd")) { groomingFreq = "moderate"; } npc.appearanceBehavior.grooming = groomingFreq; // Fashion consciousness var fashionLevel = "casual"; // Base if (npc.physicalTraits.includes("Fashionable") || npc.mentalTraits.includes("Diva") || npc.mentalTraits.includes("Prep")) { fashionLevel = "high"; } else if (npc.mentalTraits.includes("Vain") || npc.mentalTraits.includes("Confident")) { fashionLevel = "moderate"; } else if (npc.mentalTraits.includes("Tomboy") || npc.mentalTraits.includes("Jock")) { fashionLevel = "athletic"; } else if (npc.mentalTraits.includes("Goth")) { fashionLevel = "alternative"; } else if (npc.mentalTraits.includes("Simple") || npc.mentalTraits.includes("Lazy")) { fashionLevel = "minimal"; } npc.appearanceBehavior.fashion = fashionLevel; // Fitness routine var fitnessLevel = "occasional"; // Base if (npc.physicalTraits.includes("Athletic") || npc.physicalTraits.includes("Muscular") || npc.mentalTraits.includes("Jock") || npc.mentalTraits.includes("Disciplined")) { fitnessLevel = "dedicated"; } else if (npc.mentalTraits.includes("Energetic") || npc.mentalTraits.includes("Active")) { fitnessLevel = "regular"; } else if (npc.mentalTraits.includes("Lazy") || npc.mentalTraits.includes("Bimbo")) { fitnessLevel = "rare"; } npc.appearanceBehavior.fitness = fitnessLevel; }>>
/* ---------------------------------- */ /* --- NPC TRANSFORMATION DESCRIPTIONS --- */ /* ---------------------------------- */ /* Generate NPC transformation description for body part changes */ < 0) { desc = npc.name + " ages before your eyes. "; if (ageDiff >= 20) { desc += "Years pass rapidly across their face. Wrinkles form, skin loses elasticity. "; desc += "Their body matures significantly, growing older and more mature."; } else if (ageDiff >= 10) { desc += "They age noticeably, their features maturing as years pass in moments."; } else { desc += "They grow slightly older, their appearance maturing subtly."; } } else if (ageDiff < 0) { desc = npc.name + " grows younger. "; if (ageDiff <= -20) { desc += "Years melt away from their face. Wrinkles smooth out, skin tightens. "; desc += "Their body becomes significantly younger and more youthful."; } else if (ageDiff <= -10) { desc += "They grow noticeably younger, years falling away from their appearance."; } else { desc += "They become slightly younger, their features growing more youthful."; } } } // SKIN TONE transformations else if (partName === "skinTone") { desc = npc.name + "'s skin tone shifts. "; desc += "Their " + oldValue + " skin gradually changes, transforming to " + newValue + "."; } // HAIR COLOR transformations else if (partName === "hairColor") { desc = npc.name + "'s hair color transforms. "; desc += "The " + oldValue + " strands ripple with change, shifting to " + newValue + "."; } // HAIR LENGTH transformations else if (partName === "hairLength") { if ((newValue === "long" || newValue === "very long") && (oldValue === "short" || oldValue === "medium")) { desc = npc.name + "'s hair begins to grow. "; desc += "The strands lengthen rapidly, cascading down past their shoulders"; if (newValue === "very long") { desc += " and continuing to grow until it reaches their lower back."; } else { desc += "."; } } else if (newValue === "short" && (oldValue === "long" || oldValue === "very long" || oldValue === "medium")) { desc = npc.name + "'s hair shortens dramatically. "; desc += "The long strands retract and shrink, pulling back until their hair is cropped short."; } else if (newValue === "medium") { desc = npc.name + "'s hair adjusts in length. "; if (oldValue === "short") { desc += "It grows out to a medium, shoulder-length style."; } else { desc += "It shortens to a medium, shoulder-length style."; } } } descriptions.push(desc); }); return descriptions.join(" "); }>>; /* Generate NPC transformation description for physical trait changes */ < 0) { gainedTraits.forEach(function(trait) { var desc = ""; if (trait === "Muscular") { desc = npc.name + "'s body begins to transform. Muscles swell and bulge beneath their skin. "; desc += "Their arms thicken with defined biceps and triceps. Their chest becomes hard and sculpted. "; desc += "Abs appear, forming a tight six-pack. Their legs grow powerful and defined. "; desc += "The transformation leaves them impressively muscular."; } else if (trait === "Athletic") { desc = npc.name + "'s body becomes leaner and more toned. "; desc += "Muscle definition increases across their frame, creating an athletic, fit appearance. "; desc += "They look ready to sprint or leap at any moment."; } else if (trait === "Curvy") { desc = npc.name + "'s body becomes more curvaceous. "; desc += "Their hips widen, waist narrows, creating an hourglass figure. "; desc += "Soft curves appear in all the right places."; } else if (trait === "Voluptuous") { desc = npc.name + "'s body transforms into a voluptuous figure. "; desc += "Curves expand dramatically - hips widen, waist cinches, creating an exaggerated hourglass. "; desc += "Their body becomes soft and plush with sensual curves."; } else if (trait === "Fit") { desc = npc.name + " becomes noticeably more fit. "; desc += "Their body tightens and tones, excess fat melting away to reveal lean muscle underneath."; } else if (trait === "Chubby") { desc = npc.name + "'s body softens and fills out. "; desc += "They gain a layer of soft padding, becoming pleasantly chubby."; } else if (trait === "Fat") { desc = npc.name + " gains significant weight. "; desc += "Their body expands, becoming soft and heavy with fat."; } else if (trait === "Obese") { desc = npc.name + " gains massive amounts of weight. "; desc += "Their body swells dramatically, becoming extremely obese."; } else if (trait === "Skinny") { desc = npc.name + " becomes very thin. "; desc += "Fat melts away from their frame, leaving them quite skinny."; } else if (trait === "Flexible") { desc = npc.name + "'s body becomes more limber. "; desc += "Their joints loosen, movements becoming fluid and graceful. They test their new flexibility with ease."; } else if (trait === "Attractive") { desc = npc.name + "'s features shift subtly. "; desc += "Their face becomes more symmetrical, more pleasing to the eye. "; desc += "They're now noticeably attractive."; } else if (trait === "Beautiful" || trait === "Gorgeous") { desc = npc.name + " becomes stunningly beautiful. "; desc += "Their features perfect themselves, creating breathtaking beauty. "; desc += "They're the kind of person who turns heads everywhere they go."; } else if (trait === "Ugly") { desc = npc.name + "'s features become less attractive. "; desc += "Asymmetries appear, their face becoming notably unappealing."; } else if (trait === "Tall") { desc = npc.name + " begins to grow taller. "; desc += "Their body stretches upward, bones lengthening until they stand notably tall."; } else if (trait === "Short") { desc = npc.name + " shrinks in height. "; desc += "Their body compresses, growing shorter until they're noticeably small."; } else if (trait === "Busty") { desc = npc.name + "'s chest swells significantly. "; desc += "Their breasts grow larger, becoming quite busty."; } else if (trait === "Lean") { desc = npc.name + "'s body becomes lean and efficient. "; desc += "Excess fat vanishes, leaving behind a slim, efficient physique."; } else if (trait === "Graceful") { desc = npc.name + " begins to move with newfound grace. "; desc += "Every motion becomes smooth and elegant, as if they're dancing through life."; } else if (trait === "Clumsy") { desc = npc.name + " becomes noticeably clumsier. "; desc += "They stumble slightly, their coordination deteriorating."; } else if (trait === "Pierced") { desc = npc.name + "'s body suddenly gains piercings. "; desc += "Metal studs and rings appear on their ears, nose, and other visible areas."; } else if (trait === "Tattooed") { desc = npc.name + "'s skin becomes decorated with tattoos. "; desc += "Ink spreads across their skin, forming intricate designs and patterns."; } else if (trait === "Smooth Skin") { desc = npc.name + "'s skin becomes perfectly smooth. "; desc += "All blemishes, scars, and imperfections fade away, leaving flawless skin."; } else if (trait === "Youthful") { desc = npc.name + " looks younger. "; desc += "Years seem to melt away from their face, leaving them looking more youthful and vibrant."; } else if (trait === "Mature") { desc = npc.name + " looks more mature. "; desc += "Their features age slightly, gaining a mature, distinguished appearance."; } if (desc) { descriptions.push(desc); } }); } // Handle LOST physical traits if (lostTraits && lostTraits.length > 0) { lostTraits.forEach(function(trait) { var desc = ""; if (trait === "Muscular") { desc = npc.name + "'s muscles begin to shrink. "; desc += "Their impressive physique deflates, losing definition and bulk. "; desc += "Within moments, their muscular body is gone."; } else if (trait === "Athletic") { desc = npc.name + " loses their athletic build. "; desc += "Muscle tone fades, their body becoming less defined and fit."; } else if (trait === "Curvy") { desc = npc.name + "'s curves flatten out. "; desc += "Their hourglass figure straightens, becoming less curvy."; } else if (trait === "Flexible") { desc = npc.name + " loses their flexibility. "; desc += "Their joints stiffen, movements becoming less fluid."; } else if (trait === "Attractive") { desc = npc.name + " becomes less attractive. "; desc += "Their appealing features fade to something more average."; } if (desc) { descriptions.push(desc); } }); } return descriptions.length > 0 ? descriptions.join(" ") : null; }>>; /* Generate NPC transformation description for mental trait changes */ < 0 ? npc.personalityHistory[npc.personalityHistory.length - 1].from : null; var newPersonality = npc.primaryPersonality; // Handle GAINED mental traits if (gainedTraits && gainedTraits.length > 0) { gainedTraits.forEach(function(trait) { var desc = ""; if (trait === "Dominant") { desc = npc.name + "'s demeanor shifts dramatically. "; desc += "Their posture straightens, shoulders back. Their eyes gain a commanding gleam. "; desc += "Confidence radiates from them - they now exude dominance and authority."; } else if (trait === "Submissive") { desc = npc.name + "'s presence softens considerably. "; desc += "Their eyes lower slightly, body language becoming more yielding. "; desc += "They seem more compliant, more eager to please."; } else if (trait === "Bimbo") { desc = npc.name + "'s expression becomes vacant for a moment. "; desc += "Then they giggle, eyes brightening with a new ditzy sparkle. "; desc += "Their posture shifts - chest out, hips cocked. They twirl their hair absently. "; desc += "'Like, omigod!' they squeal, their transformation into a bimbo complete."; } else if (trait === "Confident") { desc = npc.name + " stands taller, shoulders back. "; desc += "Their eyes gain a bold, self-assured gleam. Confidence flows through them."; } else if (trait === "Shy") { desc = npc.name + " becomes noticeably more reserved. "; desc += "They look down, cheeks flushing. Their voice drops to barely above a whisper."; } else if (trait === "Awkward") { desc = npc.name + " shifts uncomfortably. "; desc += "They fidget nervously, suddenly unsure of themselves. Social anxiety washes over them."; } else if (trait === "Flirty") { desc = npc.name + "'s eyes gain a playful, seductive sparkle. "; desc += "They smile with new mischief, their body language becoming inviting and teasing."; } else if (trait === "Intelligent") { desc = npc.name + "'s eyes sharpen with newfound clarity. "; desc += "You can almost see the gears turning as their mind quickens, thoughts becoming clearer and faster."; } else if (trait === "Simple") { desc = npc.name + "'s expression becomes more vacant. "; desc += "Complex thoughts seem to slip away, leaving them with a simpler outlook."; } else if (trait === "Kind") { desc = npc.name + "'s expression softens with warmth. "; desc += "Genuine kindness radiates from them, their eyes full of compassion."; } else if (trait === "Mean") { desc = npc.name + "'s expression hardens. "; desc += "Their eyes gain a cruel edge, lips curling into a slight sneer."; } else if (trait === "Bitchy") { desc = npc.name + "'s entire demeanor shifts. "; desc += "They roll their eyes, crossing their arms. Attitude radiates from their every pore. "; desc += "'Ugh, whatever,' they mutter with newfound bitchiness."; } else if (trait === "Arrogant") { desc = npc.name + " begins to look down on everything around them. "; desc += "Their nose tilts up slightly, expression dripping with superiority."; } else if (trait === "Energetic") { desc = npc.name + " becomes noticeably more energetic. "; desc += "They bounce on their toes, unable to stand still. Energy radiates from them."; } else if (trait === "Calm") { desc = npc.name + " becomes much calmer. "; desc += "Tension melts from their body, movements becoming slow and deliberate."; } else if (trait === "Creative") { desc = npc.name + "'s eyes light up with imagination. "; desc += "You can almost see ideas flowing through their mind as creativity blooms within them."; } else if (trait === "Curious") { desc = npc.name + " looks around with newfound curiosity. "; desc += "Everything seems to interest them now, their eyes wide with wonder."; } else if (trait === "Jock") { desc = npc.name + "'s entire demeanor shifts to that of a jock. "; desc += "They crack their knuckles, rolling their shoulders. 'Bro,' they say, grinning with athletic enthusiasm."; } else if (trait === "Goth") { desc = npc.name + "'s expression becomes more cynical and dark. "; desc += "They seem to embrace a darker, more alternative outlook on life."; } else if (trait === "Nerd") { desc = npc.name + " becomes noticeably nerdier. "; desc += "They push up invisible glasses, eyes brightening at the thought of knowledge and facts."; } else if (trait === "Femboy") { desc = npc.name + "'s mannerisms become more feminine and delicate. "; desc += "They move with graceful, soft gestures, embracing a more feminine presentation."; } if (desc) { descriptions.push(desc); } }); } // Handle LOST mental traits if (lostTraits && lostTraits.length > 0) { lostTraits.forEach(function(trait) { var desc = ""; if (trait === "Dominant") { desc = npc.name + "'s commanding presence fades. "; desc += "The authority drains from their posture, leaving them less imposing."; } else if (trait === "Submissive") { desc = npc.name + " becomes less submissive. "; desc += "Their yielding nature fades, replaced with more assertiveness."; } else if (trait === "Bimbo") { desc = npc.name + "'s vacant expression clears. "; desc += "Intelligence returns to their eyes. 'Wait, what was I saying?' they ask, "; desc += "their voice no longer that high-pitched squeal. The bimbo persona fades away completely."; } else if (trait === "Shy") { desc = npc.name + " becomes less shy. "; desc += "They make eye contact more easily, their voice growing stronger."; } else if (trait === "Intelligent") { desc = npc.name + "'s sharp mind dulls slightly. "; desc += "Complex thoughts become harder to grasp."; } if (desc) { descriptions.push(desc); } }); } // Add personality change commentary if applicable if (newPersonality && oldPersonality && newPersonality !== oldPersonality) { var transitionDesc = ""; if (newPersonality === "Bimbo") { transitionDesc = npc.name + " giggles, their old " + oldPersonality.toLowerCase() + " personality completely replaced by their new bimbo mindset."; } else if (oldPersonality === "Bimbo") { transitionDesc = npc.name + " shakes their head, the bimbo fog lifting. They're now clearly " + newPersonality.toLowerCase() + "."; } else { transitionDesc = npc.name + " is no longer " + oldPersonality.toLowerCase() + " - they're now distinctly " + newPersonality.toLowerCase() + "."; } descriptions.push(transitionDesc); } return descriptions.length > 0 ? descriptions.join(" ") : null; }>>; /* Generate complete NPC transformation description */ < 0 ? transformations.join("") : null; }>>;
/* ---------------------------------- */ /* --- MONEY SYSTEM FUNCTIONS --- */ /* ---------------------------------- */ /* Format money display */ <<set setup.formatMoney = function(amount) { return "$" + amount.toLocaleString(); }>> /* Add money to player */ <<set setup.addMoney = function(amount) { var v = State.variables; amount = Number(amount); if (!Number.isNaN(amount) && amount > 0) { v.money += amount; /* Check for $10 million achievement */ if (v.money >= 10000000) { setup.achievements.unlock("earn_10_million"); } return true; } return false; }>> /* Remove money from player */ <<set setup.removeMoney = function(amount) { var v = State.variables; amount = Number(amount); if (!Number.isNaN(amount) && amount > 0 && v.money >= amount) { v.money -= amount; return true; } return false; }>> /* Check if player can afford something */ <<set setup.canAfford = function(amount) { var v = State.variables; amount = Number(amount); return !Number.isNaN(amount) && v.money >= amount; }>>
/* ---------------------------------- */ /* --- NPC DIALOGUE SYSTEM --- */ /* ---------------------------------- */ /* ====================================================================== */ /* DYNAMIC CONVERSATION OPTIONS SYSTEM */ /* ====================================================================== */ /* Conversation Options Data Structure */ <<set setup.conversationOptions = { /* CORE OPTIONS - Available to most NPCs */ core: { compliment: { id: "compliment", label: "Give them a compliment", color: "#51cf66", basePoints: 1, minRelLevel: -1, maxRelLevel: 4, category: "core", traitModifiers: { boosted: ["Insecure", "Shy", "Vain", "Attention Seeker"], reduced: ["Arrogant", "Cynical", "Cold"], blocked: [] } }, smalltalk: { id: "smalltalk", label: "Make small talk", color: "#667eea", basePoints: 0, minRelLevel: -1, maxRelLevel: 4, category: "core", traitModifiers: { boosted: ["Friendly", "Talkative", "Outgoing", "Warm"], reduced: ["Bitchy", "Impatient", "Cold", "Antisocial"], blocked: [] } }, askJob: { id: "job", label: "Ask about their job", color: "#17a2b8", basePoints: 0, minRelLevel: 0, maxRelLevel: 4, category: "core", traitModifiers: { boosted: ["Workaholic", "Ambitious", "Proud"], reduced: ["Lazy", "Unmotivated"], blocked: [] } }, askOpinion: { id: "opinion", label: "Ask what they think of you", color: "#9b59b6", basePoints: 1, minRelLevel: 0, maxRelLevel: 4, category: "core", traitModifiers: { boosted: ["Arrogant", "Vain", "Confident", "Honest"], reduced: ["Shy", "Reserved"], blocked: [] } }, askTrading: { id: "trading", label: "Ask what they're interested in trading", color: "#ffc107", basePoints: 0, minRelLevel: 0, maxRelLevel: 4, category: "core", traitModifiers: { boosted: ["Greedy", "Shrewd", "Ambitious"], reduced: ["Generous"], blocked: [] } } }, /* PERSONALITY-SPECIFIC OPTIONS - Require matching NPC traits */ personality: { debate: { id: "debate", label: "Debate ideas with them", color: "#00bcd4", basePoints: 1, minRelLevel: 1, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Nerd", "Intelligent", "Analytical", "Philosophical", "Curious"] }, traitModifiers: { boosted: ["Intelligent", "Competitive", "Confident"], reduced: ["Stubborn", "Impatient"], blocked: [] } }, fitness: { id: "fitness", label: "Talk about fitness and sports", color: "#ff5722", basePoints: 1, minRelLevel: 0, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Jock", "Athletic", "Competitive", "Energetic"] }, traitModifiers: { boosted: ["Jock", "Competitive", "Energetic"], reduced: ["Lazy", "Nerd"], blocked: [] } }, gossip: { id: "gossip", label: "Share some gossip", color: "#ff9800", basePoints: 1, minRelLevel: 1, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Gossipy", "Nosy", "Social Butterfly", "Talkative", "Diva", "Prep"] }, traitModifiers: { boosted: ["Gossipy", "Nosy", "Social Butterfly"], reduced: ["Honest", "Loyal", "Reserved"], blocked: [] } }, darkTopics: { id: "darkTopics", label: "Discuss deeper, darker topics", color: "#4a0080", basePoints: 2, minRelLevel: 1, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Goth", "Pessimistic", "Cynical", "Depressed", "Philosophical"] }, traitModifiers: { boosted: ["Goth", "Cynical", "Philosophical"], reduced: ["Optimistic", "Bubbly", "Naive"], blocked: [] } }, beSubmissive: { id: "beSubmissive", label: "Let them take the lead in conversation", color: "#9c27b0", basePoints: 2, minRelLevel: 0, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Dominant", "Arrogant", "Bossy", "Alpha"] }, traitModifiers: { boosted: ["Dominant", "Arrogant", "Bossy"], reduced: [], blocked: [] } }, takeCharge: { id: "takeCharge", label: "Take charge of the conversation", color: "#673ab7", basePoints: 2, minRelLevel: 0, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Submissive", "Shy", "Timid", "Nervous"] }, traitModifiers: { boosted: ["Submissive", "Shy", "Timid"], reduced: ["Rebellious"], blocked: [] } }, playAlong: { id: "playAlong", label: "Play along with their energy", color: "#ff69b4", basePoints: 2, minRelLevel: 0, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Bimbo", "Airhead", "Ditzy", "Bubbly"] }, traitModifiers: { boosted: ["Bimbo", "Airhead", "Bubbly"], reduced: ["Intelligent", "Analytical"], blocked: [] } }, fashion: { id: "fashion", label: "Talk about fashion and style", color: "#e91e63", basePoints: 1, minRelLevel: 0, maxRelLevel: 4, category: "personality", requiredNPCTraits: { any: ["Prep", "Diva", "Vain", "Fashionable"] }, traitModifiers: { boosted: ["Vain", "Diva", "Prep"], reduced: ["Practical", "Simple"], blocked: [] } } }, /* RELATIONSHIP-GATED OPTIONS - Unlock at friendship levels */ relationship: { askAdvice: { id: "advice", label: "Ask for their advice", color: "#4dabf7", basePoints: 2, minRelLevel: 1, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Kind", "Wise", "Experienced", "Nurturing"], reduced: ["Selfish", "Impatient"], blocked: [] } }, shareSecrets: { id: "secrets", label: "Share a secret with them", color: "#9b59b6", basePoints: 3, minRelLevel: 2, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Trustworthy", "Loyal", "Kind", "Empathetic"], reduced: ["Gossipy", "Untrustworthy", "Manipulative"], blocked: [] }, riskLevel: "high" }, emotionalSupport: { id: "support", label: "Offer emotional support", color: "#e91e63", basePoints: 3, minRelLevel: 2, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Sensitive", "Anxious", "Insecure", "Depressed"], reduced: ["Cold", "Arrogant", "Dominant"], blocked: [] } }, planTogether: { id: "plan", label: "Make plans to hang out together", color: "#00bcd4", basePoints: 2, minRelLevel: 2, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Friendly", "Outgoing", "Social Butterfly"], reduced: ["Antisocial", "Busy", "Reserved"], blocked: [] } }, deepConversation: { id: "deep", label: "Have a deep, meaningful conversation", color: "#3f51b5", basePoints: 4, minRelLevel: 3, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Empathetic", "Philosophical", "Intelligent", "Sensitive"], reduced: ["Shallow", "Impatient", "Cold"], blocked: [] } }, confide: { id: "confide", label: "Confide your worries", color: "#795548", basePoints: 3, minRelLevel: 3, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Kind", "Nurturing", "Empathetic", "Patient"], reduced: ["Impatient", "Selfish", "Cold"], blocked: [] } }, bestFriendExclusive: { id: "bestFriend", label: "Share your deepest thoughts", color: "#ff6b9d", basePoints: 5, minRelLevel: 4, maxRelLevel: 4, category: "relationship", traitModifiers: { boosted: ["Loyal", "Trustworthy", "Kind"], reduced: [], blocked: [] } } }, /* RISKY OPTIONS - Can backfire */ risky: { flirt: { id: "flirt", label: "Flirt with them", color: "#e91e63", basePoints: 2, minRelLevel: 0, maxRelLevel: 4, category: "risky", traitModifiers: { boosted: ["Flirty", "Seductive", "Romantic", "Charming"], reduced: ["Prudish", "Cold", "Reserved"], blocked: [] }, riskLevel: "medium", alwaysAvailable: true }, tease: { id: "tease", label: "Tease them playfully", color: "#ffc107", basePoints: 1, minRelLevel: 1, maxRelLevel: 4, category: "risky", traitModifiers: { boosted: ["Playful", "Witty", "Confident", "Flirty"], reduced: ["Sensitive", "Serious", "Insecure"], blocked: [] }, riskLevel: "low" }, challenge: { id: "challenge", label: "Challenge their beliefs", color: "#ff5722", basePoints: 0, minRelLevel: 0, maxRelLevel: 4, category: "risky", traitModifiers: { boosted: ["Competitive", "Confident", "Intelligent", "Respectful"], reduced: ["Hot-Headed", "Stubborn", "Arrogant"], blocked: [] }, riskLevel: "medium" }, pushBoundaries: { id: "pushBoundaries", label: "Push the conversation further...", color: "#9c27b0", basePoints: 0, minRelLevel: 2, maxRelLevel: 4, category: "risky", requiredNPCTraits: { any: ["Flirty", "Seductive", "Perverted", "Lustful"] }, traitModifiers: { boosted: ["Flirty", "Seductive", "Perverted"], reduced: ["Prudish", "Reserved", "Shy"], blocked: [] }, riskLevel: "high" }, insult: { id: "insult", label: "Say something mean", color: "#ff6b6b", basePoints: -5, minRelLevel: -1, maxRelLevel: 4, category: "risky", traitModifiers: { boosted: ["Sensitive", "Insecure", "Anxious", "Emotional", "Shy", "Timid"], reduced: ["Thick-Skinned"], blocked: [] }, riskLevel: "high", alwaysAvailable: true } } }>> /* ====================================================================== */ /* ORIENTATION COMPATIBILITY CHECK */ /* ====================================================================== */ <<set setup.checkOrientationCompatibility = function(npc, playerGender) { var npcGender = npc.gender; var orientation = null; /* Find NPC's orientation from their mental traits */ var orientations = ["Straight", "Gay", "Lesbian", "Bisexual", "Pansexual", "Asexual", "Demisexual", "Questioning", "Fluid"]; for (var i = 0; i < npc.mentalTraits.length; i++) { if (orientations.includes(npc.mentalTraits[i])) { orientation = npc.mentalTraits[i]; break; } } /* Default to Bisexual if no orientation set (most flexible) */ if (!orientation) orientation = "Bisexual"; var sameGender = (npcGender === playerGender); switch(orientation) { case "Straight": return sameGender ? "incompatible" : "compatible"; case "Gay": return (npcGender === "male" && sameGender) ? "compatible" : "incompatible"; case "Lesbian": return (npcGender === "female" && sameGender) ? "compatible" : "incompatible"; case "Bisexual": case "Pansexual": return "compatible"; case "Asexual": return "asexual"; case "Demisexual": return "demisexual"; case "Questioning": return "questioning"; case "Fluid": return Math.random() > 0.5 ? "compatible" : "incompatible"; default: return "compatible"; } }>> /* ====================================================================== */ /* FLIRT OUTCOME CALCULATION */ /* ====================================================================== */ <<set setup.calculateFlirtOutcome = function(npc, relLevel) { var v = State.variables; var playerGender = v.bodyParts.gender; var compatibility = setup.checkOrientationCompatibility(npc, playerGender); var result = { success: false, points: 0, responseType: "neutral", message: "" }; /* Handle special orientations */ if (compatibility === "asexual") { if (relLevel >= 3 && (npc.mentalTraits.includes("Romantic") || npc.mentalTraits.includes("Kind"))) { result.responseType = "polite_decline"; result.points = 0; result.message = "appreciates_attention"; } else { result.responseType = "uncomfortable"; result.points = -1; result.message = "not_interested"; } return result; } if (compatibility === "demisexual") { if (relLevel >= 3) { compatibility = "compatible"; } else { result.responseType = "confused"; result.points = -1; result.message = "too_soon"; return result; } } if (compatibility === "questioning") { compatibility = Math.random() > 0.3 ? "compatible" : "incompatible"; } /* Incompatible orientation */ if (compatibility === "incompatible") { if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Polite") || npc.mentalTraits.includes("Friendly")) { result.responseType = "polite_rejection"; result.points = 0; } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { result.responseType = "harsh_rejection"; result.points = -3; } else if (npc.mentalTraits.includes("Awkward") || npc.mentalTraits.includes("Shy")) { result.responseType = "awkward_rejection"; result.points = -1; } else { result.responseType = "standard_rejection"; result.points = -1; } return result; } /* Compatible orientation - check other factors */ result.success = true; /* Base points - successful flirts always give at least +5 */ var basePoints = 5; /* Check for sexual/erotic traits on both sides for more explicit responses */ var playerSexualTraits = ["Seductive", "Flirty", "Lustful", "Nymphomaniac", "Perverted", "Lewd"]; var npcSexualTraits = ["Seductive", "Flirty", "Lustful", "Nymphomaniac", "Perverted", "Lewd"]; var playerHasSexualTrait = playerSexualTraits.some(function(trait) { return v.mentalTraits && v.mentalTraits.includes(trait); }); var npcHasSexualTrait = npcSexualTraits.some(function(trait) { return npc.mentalTraits && npc.mentalTraits.includes(trait); }); /* Both have sexual traits - unlock erotic responses */ var enableEroticResponse = playerHasSexualTrait && npcHasSexualTrait && relLevel >= 1; /* Even more explicit at higher relationship levels */ var enableExplicitResponse = playerHasSexualTrait && npcHasSexualTrait && relLevel >= 3; /* Set intensity level for response generation */ result.sexualIntensity = 0; if (enableExplicitResponse) { result.sexualIntensity = 2; /* Very explicit */ basePoints += 3; } else if (enableEroticResponse) { result.sexualIntensity = 1; /* Moderately erotic */ basePoints += 2; } /* Personality modifiers */ if (npc.mentalTraits.includes("Nymphomaniac") || npc.mentalTraits.includes("Lustful")) { basePoints += 3; result.responseType = enableExplicitResponse ? "explicit_eager" : (enableEroticResponse ? "sexual_eager" : "flirty_response"); } else if (npc.mentalTraits.includes("Seductive")) { basePoints += 2; result.responseType = enableExplicitResponse ? "explicit_seductive" : (enableEroticResponse ? "sexual_seductive" : "flirty_response"); } else if (npc.mentalTraits.includes("Flirty")) { basePoints += 2; result.responseType = enableEroticResponse ? "sexual_flirty" : "flirty_response"; } else if (npc.mentalTraits.includes("Romantic")) { basePoints += 1; result.responseType = enableEroticResponse ? "sexual_romantic" : "romantic_response"; } else if (npc.mentalTraits.includes("Shy")) { result.responseType = enableEroticResponse ? "sexual_shy" : "flustered_response"; } else if (npc.mentalTraits.includes("Confident")) { result.responseType = enableEroticResponse ? "sexual_confident" : "confident_response"; } else if (npc.mentalTraits.includes("Dominant")) { result.responseType = enableEroticResponse ? "sexual_dominant" : "confident_response"; basePoints += 1; } else if (npc.mentalTraits.includes("Submissive")) { result.responseType = enableEroticResponse ? "sexual_submissive" : "flustered_response"; basePoints += 1; } else if (npc.mentalTraits.includes("Cold")) { basePoints -= 1; result.responseType = "cool_response"; } else if (npc.mentalTraits.includes("Prudish")) { basePoints -= 1; result.responseType = "reserved_response"; } else { result.responseType = enableEroticResponse ? "sexual_positive" : "positive_response"; } /* Strangers might find it too forward */ if (relLevel <= 0) { if (!npc.mentalTraits.includes("Flirty") && !npc.mentalTraits.includes("Outgoing")) { if (Math.random() < 0.3) { result.success = false; result.responseType = "too_forward"; basePoints = -2; } } } /* Ensure successful flirts always give at least +5 points */ if (result.success && basePoints < 5) { basePoints = 5; } result.points = basePoints; return result; }>> /* ====================================================================== */ /* GET AVAILABLE CONVERSATION OPTIONS */ /* ====================================================================== */ <<set setup.getAvailableConversationOptions = function(npc, relLevel) { var options = []; var npcTraits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); /* Helper to check trait requirements */ function meetsTraitRequirements(option) { if (option.requiredNPCTraits) { if (option.requiredNPCTraits.any) { var hasAny = option.requiredNPCTraits.any.some(function(trait) { return npc.mentalTraits && npc.mentalTraits.includes(trait); }); if (!hasAny) return false; } if (option.requiredNPCTraits.all) { var hasAll = option.requiredNPCTraits.all.every(function(trait) { return npc.mentalTraits && npc.mentalTraits.includes(trait); }); if (!hasAll) return false; } } if (option.requiredNPCPhysical) { if (option.requiredNPCPhysical.any) { var hasAnyPhysical = option.requiredNPCPhysical.any.some(function(trait) { return npc.physicalTraits && npc.physicalTraits.includes(trait); }); if (!hasAnyPhysical) return false; } } return true; } /* Helper to check if blocked */ function isBlocked(option) { if (!option.traitModifiers || !option.traitModifiers.blocked) return false; return option.traitModifiers.blocked.some(function(trait) { return npcTraits.includes(trait); }); } /* Process each category */ var categories = ["core", "personality", "relationship", "risky"]; categories.forEach(function(category) { var categoryOptions = setup.conversationOptions[category]; for (var key in categoryOptions) { var option = categoryOptions[key]; /* Check relationship level requirements */ if (relLevel < option.minRelLevel || relLevel > option.maxRelLevel) { continue; } /* Check trait requirements (except for always available options) */ if (!option.alwaysAvailable && !meetsTraitRequirements(option)) { continue; } /* Check if blocked */ if (isBlocked(option)) { continue; } options.push({ option: option, category: category }); } }); return options; }>> /* ====================================================================== */ /* CALCULATE DYNAMIC RELATIONSHIP CHANGE */ /* ====================================================================== */ <<set setup.calculateDynamicRelationshipChange = function(npc, optionId, relLevel) { var option = null; var categories = ["core", "personality", "relationship", "risky"]; /* Find the option */ for (var i = 0; i < categories.length; i++) { var cat = setup.conversationOptions[categories[i]]; for (var key in cat) { if (cat[key].id === optionId) { option = cat[key]; break; } } if (option) break; } if (!option) return { points: 0, backfired: false }; var npcTraits = (npc.mentalTraits || []).concat(npc.physicalTraits || []); var change = option.basePoints; var backfired = false; /* Apply trait modifiers */ if (option.traitModifiers) { if (option.traitModifiers.boosted) { var boostCount = option.traitModifiers.boosted.filter(function(trait) { return npcTraits.includes(trait); }).length; if (change > 0) { change += boostCount; } else if (change < 0) { change += Math.floor(boostCount / 2); } } if (option.traitModifiers.reduced) { var reduceCount = option.traitModifiers.reduced.filter(function(trait) { return npcTraits.includes(trait); }).length; if (change > 0) { change = Math.max(0, change - reduceCount); } else if (change < 0) { change -= reduceCount; } } } /* Relationship level bonus for positive interactions */ if (relLevel >= 3 && change > 0) { change += 1; } if (relLevel >= 4 && change > 0) { change += 1; } /* Risk mechanics for risky options */ if (option.riskLevel && option.category === "risky") { var backfireChance = 0; if (option.riskLevel === "low") backfireChance = 0.10; else if (option.riskLevel === "medium") backfireChance = 0.20; else if (option.riskLevel === "high") backfireChance = 0.30; if (Math.random() < backfireChance && option.id !== "flirt" && option.id !== "insult") { backfired = true; change = -Math.abs(change) - 1; } } return { points: change, backfired: backfired }; }>> /* ====================================================================== */ /* ORIGINAL NPC GREETING FUNCTION */ /* ====================================================================== */ <<set setup.getNPCGreeting = function(npc, relLevel) { var v = State.variables; // Check for unique dialogue first (for special 7 key NPCs only) if (npc.uniqueDialogue && npc.uniqueDialogue.greetings) { var relKey; if (relLevel === -1) { relKey = "disliked"; } else if (relLevel === 0) { relKey = "stranger"; } else if (relLevel === 1) { relKey = "acquaintance"; } else if (relLevel === 2) { relKey = "friend"; } else if (relLevel === 3) { relKey = "closeFriend"; } else { relKey = "bestFriend"; } if (npc.uniqueDialogue.greetings[relKey] && npc.uniqueDialogue.greetings[relKey].length > 0) { var uniqueGreetings = npc.uniqueDialogue.greetings[relKey]; return uniqueGreetings[Math.floor(Math.random() * uniqueGreetings.length)]; } } // Use trait-based dialogue generation for all other NPCs return setup.generateTraitBasedGreeting(npc, relLevel); }>> /* ====================================================================== */ /* TRAIT-BASED DIALOGUE GENERATION SYSTEM */ /* ====================================================================== */ /* Generate greeting based on NPC's current trait combination */ <<set setup.generateTraitBasedGreeting = function(npc, relLevel) { if (!npc || !npc.mentalTraits) return "Hello."; var v = State.variables; var greeting = ""; var addOn = ""; // Determine relationship level text var relLevels = ["stranger", "acquaintance", "friend", "closeFriend", "bestFriend"]; var relKey = relLevel === -1 ? "disliked" : (relLevels[Math.min(relLevel, 4)] || "stranger"); // Get dominant personality traits (top 3 mental traits) var dominantTraits = npc.mentalTraits.slice(0, 3); // GREETING OPENER - Based on primary personality trait var primaryTrait = npc.primaryPersonality || npc.mentalTraits[0]; // Generate greeting based on personality + relationship if (relKey === "disliked") { greeting = setup.generateDislikedGreeting(npc, primaryTrait, dominantTraits); } else if (relKey === "stranger") { greeting = setup.generateStrangerGreeting(npc, primaryTrait, dominantTraits); } else if (relKey === "acquaintance") { greeting = setup.generateAcquaintanceGreeting(npc, primaryTrait, dominantTraits); } else if (relKey === "friend") { greeting = setup.generateFriendGreeting(npc, primaryTrait, dominantTraits); } else if (relKey === "closeFriend") { greeting = setup.generateCloseFriendGreeting(npc, primaryTrait, dominantTraits); } else { greeting = setup.generateBestFriendGreeting(npc, primaryTrait, dominantTraits); } // Add physical trait observations (if relationship level allows) if (relLevel >= 1) { var physicalComment = setup.generatePhysicalTraitComment(npc, v); if (physicalComment) { addOn = " " + physicalComment; } } // Add job-related comment (if applicable and relationship allows) if (relLevel >= 1 && Math.random() < 0.3) { var jobComment = setup.generateJobRelatedComment(npc, dominantTraits); if (jobComment && !addOn) { addOn = " " + jobComment; } } return greeting + addOn; }>> /* Generate DISLIKED greeting based on traits - they actively dislike the player */ <<set setup.generateDislikedGreeting = function(npc, primaryTrait, traits) { var greetings = []; // Aggressive/Violent types if (traits.includes("Aggressive") || traits.includes("Violent") || traits.includes("Short Tempered")) { greetings.push("*glares menacingly* What the hell do YOU want? Get out of my face before I make you."); greetings.push("*clenches fists* Oh, it's YOU. You've got some nerve showing your face around here."); greetings.push("*steps forward aggressively* I suggest you leave. Now. Before I do something I won't regret."); } // Bitchy/Rude types else if (traits.includes("Bitchy") || traits.includes("Rude") || traits.includes("Mean")) { greetings.push("*rolls eyes dramatically* Oh god, not you again. Don't you have anyone else to annoy?"); greetings.push("*sneers* Well, well... if it isn't my least favorite person. What do you want?"); greetings.push("*scoffs* Ugh. I was having a decent day until you showed up."); greetings.push("*looks at you with disgust* Can you just... not? I really don't want to deal with you."); } // Cold/Cynical types else if (traits.includes("Cold") || traits.includes("Cynical") || traits.includes("Emotionless")) { greetings.push("*expressionless stare* You. Leave."); greetings.push("*flat tone* I have nothing to say to you. Goodbye."); greetings.push("*looks through you* We have no business together. Stop wasting my time."); } // Shy/Sensitive types (hurt rather than angry) else if (traits.includes("Shy") || traits.includes("Sensitive") || traits.includes("Insecure")) { greetings.push("*avoids eye contact* Oh... it's you. I... I'd rather not talk to you right now..."); greetings.push("*looks away, hurt* Why are you talking to me? Haven't you done enough?"); greetings.push("*voice trembling* Please just... leave me alone. Please."); } // Kind/Warm types (disappointed rather than hostile) else if (traits.includes("Kind") || traits.includes("Warm") || traits.includes("Friendly")) { greetings.push("*sighs sadly* I really hoped things between us would be different. What do you want?"); greetings.push("*looks at you with disappointment* I don't understand why you act the way you do. Is there something I can help you with?"); greetings.push("*crosses arms* Look, I try to see the best in people, but you make it really hard sometimes."); } // Confident/Arrogant types else if (traits.includes("Confident") || traits.includes("Arrogant") || traits.includes("Dominant")) { greetings.push("*looks at you with contempt* Oh, it's you. Still haven't learned to stay in your lane, I see."); greetings.push("*dismissive wave* What could you possibly want from me? Make it quick, I have better things to do."); greetings.push("*smirks coldly* You're brave, I'll give you that. Stupid, but brave. What is it?"); } // Flirty/Seductive types (weaponized charm) else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*icy smile* Oh, sweetie... I'd rather kiss a dumpster than waste my time on you."); greetings.push("*looks you up and down dismissively* Hmm, no. Not interested. Try someone with lower standards."); greetings.push("*laughs coldly* You? Talking to me? After everything? That's adorable."); } // Default hostile greeting else { greetings.push("*frowns* Oh. It's you. What do you want?"); greetings.push("*sighs heavily* I thought I made it clear I don't want to talk to you."); greetings.push("*crosses arms* We're not friends. What is it?"); greetings.push("*turns away slightly* Honestly, I'd rather not deal with you right now."); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> /* Generate stranger greeting based on traits */ <<set setup.generateStrangerGreeting = function(npc, primaryTrait, traits) { var greetings = []; // Dominant/Arrogant/Diva if (traits.includes("Dominant") || traits.includes("Arrogant") || traits.includes("Diva")) { greetings.push("*looks you over* And you are?"); greetings.push("I don't believe we've met. Make it quick."); greetings.push("*barely glances up* Yes? What do you want?"); if (traits.includes("Bitchy") || traits.includes("Rude")) { greetings.push("*sighs* Another stranger wasting my time."); greetings.push("Do I look like I have time for random people?"); } } // Submissive/Shy/Awkward else if (traits.includes("Submissive") || traits.includes("Shy") || traits.includes("Awkward")) { greetings.push("*looks down nervously* H-hi... um..."); greetings.push("Oh! Um... c-can I help you with something?"); greetings.push("*fidgets* Hello... I don't think we've... um... met?"); if (traits.includes("Kind") || traits.includes("Warm")) { greetings.push("*smiles shyly* Hi there... welcome..."); } } // Flirty/Seductive else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*smiles playfully* Well hello there... new face?"); greetings.push("Mmm, I like what I see. What brings you to me?"); greetings.push("*leans in* Hey gorgeous. I don't think we've been... properly introduced."); if (traits.includes("Confident")) { greetings.push("*looks you up and down with a grin* You're interesting. I'm " + npc.name + "."); } } // Bimbo else if (traits.includes("Bimbo")) { greetings.push("*giggles* Hiiii! Like, who are you? You're cute!"); greetings.push("Omigod, hi! I, like, totally don't know you yet!"); greetings.push("*twirls hair* Heyyy there! I'm " + npc.name + "! What's your name?"); } // Cold/Cynical else if (traits.includes("Cold") || traits.includes("Cynical")) { greetings.push("*expressionless* What is it?"); greetings.push("*barely acknowledges you* Something you need?"); greetings.push("Yeah? State your business."); if (traits.includes("Intelligent")) { greetings.push("I don't have time for pleasantries. What do you want?"); } } // Bitchy/Rude/Mean else if (traits.includes("Bitchy") || traits.includes("Rude") || traits.includes("Mean")) { greetings.push("What? Can't you see I'm busy?"); greetings.push("*rolls eyes* Great. Another person bothering me."); greetings.push("Do I know you? No? Then why are you in my space?"); } // Kind/Warm/Friendly else if (traits.includes("Kind") || traits.includes("Warm") || traits.includes("Friendly")) { greetings.push("*smiles warmly* Hello! I don't think we've met. I'm " + npc.name + "!"); greetings.push("Hi there! Welcome! How can I help you today?"); greetings.push("*friendly wave* Hey! New around here? Nice to meet you!"); if (traits.includes("Nurturing")) { greetings.push("Hello dear. You look like you could use some kindness. What brings you here?"); } } // Energetic/Excited/Outgoing else if (traits.includes("Energetic") || traits.includes("Excited") || traits.includes("Outgoing")) { greetings.push("*bounces over* Hey! Oh wow, a new person! Hi hi hi!"); greetings.push("Yo! What's up! I'm " + npc.name + "! Who are you?!"); greetings.push("*enthusiastically* HEY THERE! New face! That's so cool!"); if (traits.includes("Jock")) { greetings.push("Yo bro! Haven't seen you around! You here to work out?"); } } // Calm/Patient/Chill else if (traits.includes("Calm") || traits.includes("Patient") || traits.includes("Chill")) { greetings.push("*nods calmly* Hello. Something I can do for you?"); greetings.push("Hey. Don't think we've met. What's up?"); greetings.push("*relaxed smile* Hi there. New around here?"); } // Goth else if (traits.includes("Goth")) { greetings.push("*looks up from book* Mmm? Need something?"); greetings.push("*barely interested* Yeah, hi. What do you want?"); greetings.push("Another normie. Great. What is it?"); } // Nerd else if (traits.includes("Nerd")) { greetings.push("*adjusts glasses* Oh, hello. Can I help you with something?"); greetings.push("Hi! I don't believe we've been introduced. I'm " + npc.name + "."); greetings.push("*looks up curiously* Oh, a new person. Interesting."); } // Default else { greetings.push("Hi there. Something I can do for you?"); greetings.push("Hello. Don't think we've met."); greetings.push("Hey. What brings you here?"); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> /* Generate acquaintance, friend, close friend, and best friend greetings */ <<set setup.generateAcquaintanceGreeting = function(npc, primaryTrait, traits) { var greetings = []; if (traits.includes("Dominant") || traits.includes("Arrogant")) { greetings.push("*acknowledges with a nod* You again. What is it this time?"); greetings.push("Ah yes, I remember you. What do you need?"); if (traits.includes("Confident")) greetings.push("Back for more? I suppose you've proven you're not completely useless."); } else if (traits.includes("Submissive") || traits.includes("Shy")) { greetings.push("*smiles nervously* Oh, hi again... nice to see you..."); greetings.push("*waves shyly* H-hey... you came back..."); } else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*playful smile* Well well, look who's back. Couldn't stay away?"); greetings.push("Hey gorgeous. Miss me already?"); } else if (traits.includes("Bimbo")) { greetings.push("*giggles* Omigod hiiii! You came back! That's so sweet!"); greetings.push("Heyyyy! I remember you! Like, totally!"); } else if (traits.includes("Friendly") || traits.includes("Warm")) { greetings.push("Hey! Good to see you again! How have you been?"); greetings.push("*smiles warmly* Oh hello again! Welcome back!"); } else if (traits.includes("Cold") || traits.includes("Cynical")) { greetings.push("*glances up* Oh. You again."); greetings.push("Back already? What now?"); } else if (traits.includes("Energetic")) { greetings.push("Hey hey! You're back! What's up!"); greetings.push("*enthusiastic wave* Yo! Good to see you again!"); } else { greetings.push("Hey, I remember you. What's up?"); greetings.push("Oh hey. Back again?"); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> <<set setup.generateFriendGreeting = function(npc, primaryTrait, traits) { var greetings = []; if (traits.includes("Dominant")) { greetings.push("*approving nod* There you are. I was wondering when you'd show up."); greetings.push("Good. Someone competent finally arrives."); } else if (traits.includes("Submissive")) { greetings.push("*lights up* Oh! You're here! I'm so happy to see you!"); greetings.push("*blushes* Hi... I was hoping you'd come by..."); } else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*grins* There's my favorite person. Come here."); greetings.push("Hey sexy. Been thinking about you."); } else if (traits.includes("Bimbo")) { greetings.push("OMIGOD! *squeals and bounces* You're here! Yaaay!"); greetings.push("*hugs excitedly* Hiii bestie! I missed you soooo much!"); } else if (traits.includes("Warm") || traits.includes("Kind")) { greetings.push("*warm hug* There you are! I've missed you!"); greetings.push("Hey friend! It's so good to see you! How have you been?"); } else if (traits.includes("Cold") || traits.includes("Cynical")) { greetings.push("*slight smile* You. Good. At least there's one tolerable person here."); greetings.push("Finally, someone with a brain. Hey."); } else if (traits.includes("Energetic") || traits.includes("Jock")) { greetings.push("YO! My buddy! *enthusiastic fist bump* Let's DO this!"); greetings.push("There's my bro! What's good! Ready to crush it?"); } else if (traits.includes("Calm")) { greetings.push("*genuine smile* Hey. Always good to see you."); greetings.push("There you are. Good timing."); } else { greetings.push("Hey friend! Good to see you!"); greetings.push("*smiles* There you are. I was hoping you'd stop by."); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> <<set setup.generateCloseFriendGreeting = function(npc, primaryTrait, traits) { var greetings = []; if (traits.includes("Dominant")) { greetings.push("*rare genuine smile* There you are. I've been wanting to discuss something with you."); greetings.push("Finally, someone I can actually rely on. Come here."); } else if (traits.includes("Submissive")) { greetings.push("*practically glowing* You came! I... I really needed to see you today."); greetings.push("*runs over happily* You're here! Everything's better when you're around..."); } else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*pulls you close* There you are. I've been thinking about you all day."); greetings.push("*intimate smile* Finally. Come here, I want you close."); } else if (traits.includes("Bimbo")) { greetings.push("*squeals and tackles you in a hug* OMG OMG OMG! You're here! I have SO much to tell you!"); greetings.push("BABE! *grabs your hands* Like, where have you BEEN? I missed you so so so much!"); } else if (traits.includes("Kind") || traits.includes("Warm")) { greetings.push("*emotional embrace* There you are. You know you're one of the most important people in my life, right?"); greetings.push("*beaming* My dear friend! I'm so happy you're here!"); } else if (traits.includes("Cold") || traits.includes("Cynical")) { greetings.push("*genuine emotion breaks through* You. Thank fuck. Everyone else is insufferable."); greetings.push("*drops the cold act* Finally. Someone I can actually talk to."); } else if (traits.includes("Energetic")) { greetings.push("YES! THERE YOU ARE! Dude I have SO MUCH to tell you!"); greetings.push("MY PERSON! *excited* I was literally just about to text you!"); } else { greetings.push("*genuine warmth* There you are. I'm really glad you're here."); greetings.push("Hey you. Perfect timing. I really wanted to see you."); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> <<set setup.generateBestFriendGreeting = function(npc, primaryTrait, traits) { var greetings = []; if (traits.includes("Dominant")) { greetings.push("*completely drops façade* Finally. You're the only person who truly understands me."); greetings.push("*rare vulnerability* Thank god you're here. I need your counsel on something important."); } else if (traits.includes("Submissive")) { greetings.push("*tears up with happiness* You're here... You always know when I need you most..."); greetings.push("*emotional* I don't know what I'd do without you. You mean everything to me."); } else if (traits.includes("Flirty") || traits.includes("Seductive")) { greetings.push("*intimate and genuine* There's no one I'd rather see right now. Come here, beautiful."); greetings.push("*drops all pretense* You know you're special, right? Like, actually special to me."); } else if (traits.includes("Bimbo")) { greetings.push("*literally squeals* MY BESTIE! MY FAVORITE PERSON IN THE WHOLE WORLD! *won't let go of hug*"); greetings.push("YOU! Like, seriously, you're literally the BEST thing in my life! I love you SO much!"); } else if (traits.includes("Kind") || traits.includes("Warm")) { greetings.push("*overcome with emotion* You... You're family to me. You know that, right?"); greetings.push("*tight hug* There's my person. I love you so much."); } else if (traits.includes("Cold") || traits.includes("Cynical")) { greetings.push("*all walls down* You're the only real thing in this fake-ass city. Get over here."); greetings.push("*actually smiles* Took you long enough. I was starting to think you'd abandoned me to these idiots."); } else if (traits.includes("Energetic")) { greetings.push("THERE'S MY BEST FRIEND! *tackles you* Dude, DUDE! I love you so much!"); greetings.push("MY PERSON! The BEST person! You make everything better just by existing!"); } else { greetings.push("*completely genuine* You're here. You're my best friend. Thank you for existing."); greetings.push("*emotional* I don't say this enough, but you mean the world to me."); } return greetings[Math.floor(Math.random() * greetings.length)]; }>> /* Generate physical trait observation comments */ <<set setup.generatePhysicalTraitComment = function(npc, playerVars) { if (!npc || !playerVars) return null; var comments = []; var traits = npc.mentalTraits; if (playerVars.physicalTraits.includes("Attractive")) { if (traits.includes("Flirty") || traits.includes("Seductive")) { comments.push("Damn, you're looking fine today."); comments.push("You know you're hot, right?"); } else if (traits.includes("Shy")) { comments.push("You... um... you look really nice..."); } else if (traits.includes("Bimbo")) { comments.push("Omigod, you're like, SO pretty!"); } else if (traits.includes("Confident")) { comments.push("Looking good as always."); } } if (playerVars.physicalTraits.includes("Muscular")) { if (traits.includes("Jock") || npc.physicalTraits.includes("Muscular")) { comments.push("Bro, those gains! Looking swole!"); comments.push("Been hitting the gym hard, I can tell!"); } else if (traits.includes("Flirty")) { comments.push("*touches your arm* Mmm, someone's been working out..."); } } if (playerVars.physicalTraits.includes("Curvy") || playerVars.physicalTraits.includes("Voluptuous") || playerVars.mentalTraits.includes("Succubus") || playerVars.mentalTraits.includes("Hucow")) { if (traits.includes("Flirty") || traits.includes("Seductive")) { comments.push("Those curves though... damn."); } else if (traits.includes("Bimbo")) { comments.push("Your body is like, totally amazing!"); } } if (playerVars.physicalTraits.includes("Fashionable")) { if (traits.includes("Diva") || traits.includes("Prep") || npc.physicalTraits.includes("Fashionable")) { comments.push("Love your outfit. You have great taste."); } else if (traits.includes("Bimbo")) { comments.push("Your clothes are SO cute!"); } } if (playerVars.physicalTraits.includes("Tattooed")) { if (traits.includes("Goth") || npc.physicalTraits.includes("Tattooed")) { comments.push("Digging the ink."); } else if (traits.includes("Arrogant")) { comments.push("Tattoos? Interesting choice."); } } return comments.length > 0 ? comments[Math.floor(Math.random() * comments.length)] : null; }>> /* Generate job-related comments */ <<set setup.generateJobRelatedComment = function(npc, traits) { if (!npc || !npc.jobs || npc.jobs.length === 0) return null; var job = npc.jobs[0]; var comments = []; if (traits.includes("Hardworking") || traits.includes("Workaholic")) { comments.push("Work's been crazy busy lately."); comments.push("Been putting in extra hours at " + job + "."); } else if (traits.includes("Lazy")) { comments.push("Ugh, don't even get me started on work."); comments.push("Can't wait until this shift is over."); } else if (traits.includes("Passionate") || traits.includes("Dedicated")) { comments.push("I actually love this job, you know?"); comments.push("Being a " + job + " is really fulfilling."); } return comments.length > 0 ? comments[Math.floor(Math.random() * comments.length)] : null; }>> /* OLD CODE BELOW - TO BE REMOVED */ <<if false>> // Base greeting on relationship level AND personality if (relLevel === 0) { // Stranger greetings - personality driven if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { greetings.push("What? Can't you see I'm busy?"); greetings.push("Do I know you? No? Then why are you talking to me?"); greetings.push("*sighs* What do you want?"); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { greetings.push("Oh... um, hi. Can I... help you with something?"); greetings.push("H-hello there..."); greetings.push("Um... yes?"); } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Diva")) { greetings.push("Yes? Make it quick, I have places to be."); greetings.push("You have my attention. For now."); greetings.push("I don't believe we've been introduced. You are...?"); } else if (npc.mentalTraits.includes("Cold") || npc.mentalTraits.includes("Cynical")) { greetings.push("Yeah? What is it?"); greetings.push("Something you need?"); greetings.push("I'm listening."); } else if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { greetings.push("Oh, hi there! I don't think we've met. I'm " + npc.name + "!"); greetings.push("Hey! New face around here? Nice to meet you!"); greetings.push("Hello! How can I help you today?"); } else { greetings.push("Hi there. Something I can do for you?"); greetings.push("Yeah? Can I help you with something?"); greetings.push("Oh, it's you. What's up?"); } } else if (relLevel === 1) { // Acquaintance greetings if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Outgoing")) { greetings.push("Hey! Good to see you again! How've you been?"); greetings.push("Oh hey! What brings you by today?"); greetings.push("There you are! Was just thinking about you the other day."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { greetings.push("Oh, hi again... nice to see you..."); greetings.push("Hey... um, how are things?"); greetings.push("*waves nervously* Hi there..."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { greetings.push("Oh hey, what's up?"); greetings.push("Yo. How's it going?"); greetings.push("Sup. Need something?"); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Cynical")) { greetings.push("Oh. You again. What now?"); greetings.push("Back already? This should be interesting."); greetings.push("*looks up* Yeah?"); } else { greetings.push("Hey! Good to see you again."); greetings.push("Oh hey, what's up?"); greetings.push("Nice to see a familiar face."); } } else if (relLevel === 2) { // Friend greetings if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Friendly")) { greetings.push("Hey friend! I'm so glad you stopped by! How have you been?"); greetings.push("There's my favorite person! Come here, tell me everything!"); greetings.push("Perfect timing! I was hoping I'd see you today!"); } else if (npc.mentalTraits.includes("Excited") || npc.mentalTraits.includes("Energetic")) { greetings.push("Omg hey!! How are you?! I have so much to tell you!"); greetings.push("YES! You're here! Okay so you won't believe what happened!"); greetings.push("Hey hey hey! Finally! I've been dying to talk to you!"); } else if (npc.mentalTraits.includes("Calm") || npc.mentalTraits.includes("Chill")) { greetings.push("Hey there. Always good to see you."); greetings.push("What's up, friend? How's life treating you?"); greetings.push("Good to see you. Want to hang out for a bit?"); } else if (npc.mentalTraits.includes("Shy")) { greetings.push("Oh! Hi! I'm... I'm really happy you're here..."); greetings.push("*smiles warmly* Hey... I was hoping you'd come by..."); greetings.push("You came! That makes me really happy..."); } else { greetings.push("Hey friend! How have you been?"); greetings.push("Always happy to see you!"); greetings.push("There you are! I was hoping you'd stop by."); } } else { // Best friend/Close friend greetings if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Loyal")) { greetings.push("There's my best friend! I've missed you so much! Come sit, we have catching up to do!"); greetings.push("You! Oh my god, finally! I always feel better when you're around!"); greetings.push("Hey you! You know you can always brighten my day just by showing up, right?"); } else if (npc.mentalTraits.includes("Excited") || npc.mentalTraits.includes("Energetic")) { greetings.push("THERE YOU ARE!! I have been WAITING for you! So much to talk about!!"); greetings.push("Finally!! Okay okay, sit down, you NEED to hear this!"); greetings.push("YES! My favorite person in the whole city! Get over here!"); } else if (npc.mentalTraits.includes("Chill") || npc.mentalTraits.includes("Calm")) { greetings.push("Hey bestie. You know I'm always glad when you show up."); greetings.push("There's my person. What's new with you?"); greetings.push("Perfect timing as always. Want to chill for a bit?"); } else if (npc.mentalTraits.includes("Cynical")) { greetings.push("Well well, if it isn't my favorite person. One of the few people in this city worth talking to."); greetings.push("You're here. Good. At least now I have someone interesting to talk to."); greetings.push("Finally, someone with a brain. How are you?"); } else { greetings.push("My dear friend! It's wonderful to see you!"); greetings.push("You! I'm so glad you're here!"); greetings.push("If it isn't my favorite person! Come, sit with me."); } } var baseGreeting = greetings[Math.floor(Math.random() * greetings.length)]; // Add reactions based on player's physical traits and NPC personality var reactions = []; // React to attractive/ugly based on personality if (v.physicalTraits.includes("Attractive") && relLevel >= 1) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { reactions.push(" Looking good today... like always."); reactions.push(" Damn, you look fine."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { reactions.push(" You... you look really nice today..."); } else if (!npc.mentalTraits.includes("Cold") && !npc.mentalTraits.includes("Insensitive")) { reactions.push(" You're looking good today."); } } else if (v.physicalTraits.includes("Ugly")) { if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { if (relLevel === 0) { reactions.push(" ...Rough day?"); reactions.push(" Yikes."); } } else if (npc.mentalTraits.includes("Insensitive") || npc.mentalTraits.includes("Blunt")) { reactions.push(" You uh... you alright? You look tired."); } } // React to muscular based on NPC's own physique if (v.physicalTraits.includes("Muscular") && npc.physicalTraits.includes("Muscular") && relLevel >= 1) { if (npc.mentalTraits.includes("Competitive")) { reactions.push(" Been hitting the gym hard, I see. Trying to catch up to me?"); } else if (npc.mentalTraits.includes("Jock")) { reactions.push(" Looking swole! Keep up the gains, bro!"); } else { reactions.push(" Been hitting the gym, I see. Nice work."); } } // React to curvy/voluptuous if ((v.physicalTraits.includes("Curvy") || v.physicalTraits.includes("Voluptuous") || v.mentalTraits.includes("Succubus") || v.mentalTraits.includes("Hucow"))) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { reactions.push(" Those curves though... damn."); reactions.push(" Looking like a whole meal, as always."); } else if (npc.jobs.includes("Brothel Worker") && relLevel >= 2) { reactions.push(" You've got that body that makes heads turn everywhere."); } } // React to fashionable if (v.physicalTraits.includes("Fashionable")) { if (npc.mentalTraits.includes("Prep") || npc.mentalTraits.includes("Diva") || npc.physicalTraits.includes("Fashionable")) { reactions.push(" Love the outfit! You've got great style!"); } else if (npc.mentalTraits.includes("Goth") && v.physicalTraits.includes("Tattooed")) { reactions.push(" Digging the look."); } } // React to shared job if (v.jobs.length > 0 && npc.jobs.includes(v.jobs[0]) && relLevel >= 1) { if (npc.mentalTraits.includes("Workaholic") || npc.mentalTraits.includes("Hardworking")) { reactions.push(" How's work been treating you? Staying busy?"); } else if (npc.mentalTraits.includes("Lazy")) { reactions.push(" Another day at the grind, huh? Ugh."); } else { reactions.push(" How's work been?"); } } // React to player being well-dressed and NPC being prep/diva if (v.mentalTraits.includes("Prep") && npc.mentalTraits.includes("Prep") && relLevel >= 1) { reactions.push(" You're looking very put-together today. I appreciate that."); } // React to shared stereotypes if (v.mentalTraits.includes("Nerd") && npc.mentalTraits.includes("Nerd") && relLevel >= 1) { reactions.push(" Hey, did you see that new tech release?"); } if (v.mentalTraits.includes("Goth") && npc.mentalTraits.includes("Goth") && relLevel >= 1) { reactions.push(" Dark aesthetic today. I respect it."); } if (reactions.length > 0) { baseGreeting += reactions[Math.floor(Math.random() * reactions.length)]; } return baseGreeting; }>> <</if>> <<set setup.getNPCResponse = function(npc, topic, relLevel) { var v = State.variables; var prefs = setup.getNPCPreferences(npc.name); var responses = []; if (topic === "job") { var job = npc.jobs.length > 0 ? npc.jobs[0] : "Unemployed"; if (job === "Unemployed") { if (npc.mentalTraits.includes("Lazy")) { responses.push("Job? Nah, I'm good. Work is overrated anyway. Why slave away when you can just... not? Life's too short for all that stress."); } else if (npc.mentalTraits.includes("Ambitious")) { responses.push("Between jobs right now. I'm looking for the right opportunity, something that matches my potential. I'm not going to settle for just anything - I have goals, you know?"); } else if (npc.mentalTraits.includes("Anxious") || npc.mentalTraits.includes("Insecure")) { responses.push("I... I've been trying to find work. It's tough out there. The rejections are... *sighs* they really get to you after a while. I'm trying to stay positive but..."); } else if (npc.mentalTraits.includes("Depressed") || npc.mentalTraits.includes("Pessimistic")) { responses.push("Not working at the moment. The job market is terrible, and honestly, does any of it even matter? We work to live, live to work... it's all a cycle."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { responses.push("Not working right now. Taking some time to figure things out, you know? No rush."); } else { responses.push("I'm... currently between opportunities. Looking for work, you know? Something will turn up eventually."); } } else { var jobResponse = ""; // Opening based on personality if (npc.mentalTraits.includes("Hardworking") || npc.mentalTraits.includes("Workaholic")) { jobResponse = "I work as a " + job + ". Long hours, demanding work, but I take pride in what I do. Hard work pays off, you know? I'm usually the first one in and the last one out. That's just how I operate."; } else if (npc.mentalTraits.includes("Lazy") || npc.mentalTraits.includes("Unmotivated")) { jobResponse = "Technically I'm a " + job + ". It's a paycheck, that's all I really care about. I do the bare minimum to get by. Why stress myself out for a job that doesn't care about me anyway?"; } else if (npc.mentalTraits.includes("Ambitious") || npc.mentalTraits.includes("Determined")) { jobResponse = "I'm a " + job + " right now, but it's just a stepping stone. I've got bigger plans. Way bigger. I'm not staying in this position forever - I'm going places."; } else if (npc.mentalTraits.includes("Passionate") || npc.mentalTraits.includes("Enthusiastic")) { jobResponse = "I'm a " + job + " and I absolutely love it! Every day is exciting. I wake up looking forward to getting to work. Not everyone can say that about their job, right?"; } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Cynical")) { jobResponse = "Ugh, I'm stuck being a " + job + ". It's not great, but what choice do I have? Bills don't pay themselves. The people are annoying, the pay could be better, but whatever. It is what it is."; } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Anxious")) { jobResponse = "I, um, work as a " + job + ". It's... it's okay. Sometimes stressful, but I manage. The people are mostly nice... I think..."; } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { jobResponse = "I'm a " + job + ", and I'm damn good at it. Probably one of the best, actually. I know my worth and I make sure everyone else knows it too."; } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { jobResponse = "I work as a " + job + ". It's alright, you know? Keeps me busy, pays the bills. Can't really complain."; } else { jobResponse = "I work as a " + job + ". It's decent work, pays the bills. Can't complain too much."; } // Add job-specific flavor based on actual job if (job === "Brothel Worker" || job === "Prostitute" || job === "Hooker") { if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Seductive")) { jobResponse += " I'm good at what I do, and the money's great. Plus, I meet interesting people."; } else if (npc.mentalTraits.includes("Shy")) { jobResponse += " It... it's not what I thought I'd be doing, but the money helps..."; } else if (npc.mentalTraits.includes("Practical") || npc.mentalTraits.includes("Pragmatic")) { jobResponse += " It pays well, that's what matters. People can judge all they want."; } } else if (job === "Stripper") { if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Flirty")) { jobResponse += " The stage is my home. I love performing, feeling all eyes on me."; } else if (npc.mentalTraits.includes("Ambitious")) { jobResponse += " It's temporary. I'm building up my savings for bigger things."; } } else if (job === "Construction Worker" || job === "Dock Worker") { if (npc.mentalTraits.includes("Jock") || npc.mentalTraits.includes("Strong")) { jobResponse += " It's hard physical work, but that's what I'm built for. Keeps me in shape too."; } else if (npc.mentalTraits.includes("Hardworking")) { jobResponse += " Honest work for honest pay. That's all I need."; } } else if (job.includes("Clerk") || job.includes("Salon")) { if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Outgoing")) { jobResponse += " I love interacting with customers. Meeting new people every day is the best part."; } else if (npc.mentalTraits.includes("Tired") || npc.mentalTraits.includes("Frustrated")) { jobResponse += " Dealing with customers all day can be exhausting though. People can be so demanding."; } } else if (job === "City Mayor" || job === "Mayor's Secretary") { if (npc.mentalTraits.includes("Ambitious") || npc.mentalTraits.includes("Arrogant")) { jobResponse += " I have real power here. I shape this city's future."; } else if (npc.mentalTraits.includes("Stressed") || npc.mentalTraits.includes("Overworked")) { jobResponse += " The responsibility is immense. Everyone wants something from you in this position."; } } // Add comment about player's job if they share it if (v.jobs.length > 0 && v.jobs[0] === job) { if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { jobResponse += " Hey, you work there too, right? That's awesome! How are you finding it? We should swap stories sometime."; } else if (npc.mentalTraits.includes("Competitive")) { jobResponse += " Oh, you work there too? Interesting. May the best worker win."; } else if (npc.mentalTraits.includes("Nonchalant")) { jobResponse += " Oh yeah, you're there too. Cool."; } else { jobResponse += " Hey, you work there too, right? How are you finding it?"; } } responses.push(jobResponse); } } else if (topic === "opinion") { var opinions = []; // React to player's physical appearance with personality filters if (v.physicalTraits.includes("Attractive")) { if (relLevel >= 2) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { opinions.push(`You? You're gorgeous, honestly. Like seriously stunning. I could look at you all day`); } else if (npc.mentalTraits.includes("Shy")) { opinions.push(`You're... you're really attractive. I hope that's okay to say...`); } else if (npc.mentalTraits.includes("Direct") || npc.mentalTraits.includes("Blunt")) { opinions.push(`You're good-looking. That's just a fact`); } else { opinions.push(`You? You're gorgeous, honestly`); } } else { if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Awkward")) { opinions.push(`You... you look nice`); } else { opinions.push(`You look... nice`); } } } else if (v.physicalTraits.includes("Ugly")) { if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Warm")) { opinions.push(`You have a nice personality. That's what really matters in the end, you know?`); } else if (npc.mentalTraits.includes("Blunt") || npc.mentalTraits.includes("Insensitive")) { if (relLevel === 0) { opinions.push(`You want my honest opinion? ...Maybe work on your appearance a bit. I'm just being real with you`); } } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { if (relLevel === 0) { opinions.push(`Honestly? You could use some work. But hey, at least you asked`); } } } // React to shared traits with personality if (v.physicalTraits.includes("Muscular") && npc.physicalTraits.includes("Muscular")) { if (npc.mentalTraits.includes("Competitive")) { opinions.push(`I respect the muscle, even if I'm clearly more built. You put in work though`); } else if (npc.mentalTraits.includes("Jock")) { opinions.push(`Bro! The gains are real! Respect! You clearly put in the work at the gym`); } else { opinions.push(`I respect the muscle. You clearly put in the work`); } } // React to fashionable if (v.physicalTraits.includes("Fashionable")) { if (npc.physicalTraits.includes("Fashionable") || npc.mentalTraits.includes("Prep")) { opinions.push(`Your fashion sense? Immaculate. You clearly care about your appearance and it shows`); } else if (npc.mentalTraits.includes("Goth")) { opinions.push(`I see you've got your own style. I can respect that`); } } // React to body types if (v.physicalTraits.includes("Curvy") || v.physicalTraits.includes("Voluptuous") || v.mentalTraits.includes("Succubus") || v.mentalTraits.includes("Hucow")) { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { opinions.push(`Your curves? Absolutely stunning. You must turn heads everywhere you go. I know I'm looking`); } else if (npc.mentalTraits.includes("Jealous") && npc.physicalTraits.includes("Flat")) { opinions.push(`You've got... quite the figure. Lucky you`); } else { opinions.push(`You've got a great figure`); } } // React to personality matches if (v.mentalTraits.includes("Kind") && npc.mentalTraits.includes("Kind")) { opinions.push(`You're one of the genuinely good people in this city. I really appreciate that about you. We need more people like you around here`); } if (v.mentalTraits.includes("Ambitious") && npc.mentalTraits.includes("Ambitious")) { opinions.push(`I like your drive and determination. You're going places, I can tell. People like us, we don't stop until we get what we want`); } if (v.mentalTraits.includes("Nerd") && npc.mentalTraits.includes("Nerd")) { opinions.push(`You actually understand what I'm talking about when I get technical. That's... rare. It's refreshing`); } if (v.mentalTraits.includes("Goth") && npc.mentalTraits.includes("Goth")) { opinions.push(`You get the aesthetic. Most people don't understand it, but you do`); } if (v.mentalTraits.includes("Jock") && npc.mentalTraits.includes("Jock")) { opinions.push(`You're athletic and competitive. I respect that. We should work out together sometime`); } if (v.mentalTraits.includes("Bitchy") && !npc.mentalTraits.includes("Patient") && !npc.mentalTraits.includes("Kind")) { opinions.push(`You can be pretty abrasive sometimes, not gonna lie. But at least you're real about it`); } // React to job matches/differences if (v.jobs.length > 0 && npc.jobs.length > 0) { if (v.jobs[0] === npc.jobs[0]) { if (npc.mentalTraits.includes("Friendly")) { opinions.push(`Fellow ${v.jobs[0]}! It's nice having someone who actually gets what the job is like. We should share war stories`); } else if (npc.mentalTraits.includes("Competitive")) { opinions.push(`So we're both ${v.jobs[0]}s. May the best one succeed`); } else { opinions.push(`Fellow ${v.jobs[0]}! It's nice having someone who gets the job`); } } } // Relationship-based closing if (opinions.length > 0) { var response = opinions[Math.floor(Math.random() * opinions.length)] + ". "; if (relLevel >= 3) { if (npc.mentalTraits.includes("Warm") || npc.mentalTraits.includes("Loyal")) { response += `Overall? I think you're pretty amazing. One of the best people I know, honestly.`; } else if (npc.mentalTraits.includes("Chill") || npc.mentalTraits.includes("Nonchalant")) { response += `You're cool. That's about it.`; } else { response += `Overall? I think you're pretty amazing.`; } } else if (relLevel >= 2) { if (npc.mentalTraits.includes("Friendly")) { response += `You're good people. I'm glad we're friends.`; } else { response += `You're good people.`; } } else { response += `That's my honest take.`; } responses.push(response); } else { if (relLevel >= 3) { if (npc.mentalTraits.includes("Warm")) { responses.push(`What do I think? I think you're wonderful. One of my favorite people, honestly. I'm really glad we met.`); } else { responses.push(`What do I think? I think you're wonderful. One of my favorite people, honestly.`); } } else if (relLevel >= 2) { responses.push(`You're cool. I like hanging out with you. We should do it more often.`); } else { responses.push(`We haven't talked enough for me to have a strong opinion yet. You seem okay though.`); } } } else if (topic === "smalltalk") { if (npc.mentalTraits.includes("Talkative") || npc.mentalTraits.includes("Outgoing") || npc.mentalTraits.includes("Energetic")) { responses.push("Oh man, you know what I was thinking about the other day? The weather's been absolutely crazy lately! Like, one day it's hot, next day it's cold - make up your mind, nature! But hey, that's Sunfish City for you! Never a dull moment in this place!"); } else if (npc.mentalTraits.includes("Introverted") || npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Quiet")) { responses.push("Um... yeah, things are... fine. Weather's been okay. So... yeah. *awkward silence*"); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude") || npc.mentalTraits.includes("Impatient")) { responses.push("Small talk? Really? Fine. Yes, the weather exists. The city is still standing. Congratulations on stating the obvious. There, happy?"); } else if (npc.mentalTraits.includes("Nerd") || npc.mentalTraits.includes("Intelligent")) { responses.push("Did you hear about the new development project in the business district? Fascinating urban planning implications. The way they're redesigning the traffic flow could reduce congestion by up to 30%. I could talk about city infrastructure for hours if you're interested."); } else if (npc.mentalTraits.includes("Nonchalant") || npc.mentalTraits.includes("Chill")) { responses.push("Yeah, things have been pretty normal. Same routine, you know? Can't complain. Life's just... happening."); } else if (npc.mentalTraits.includes("Goth") || npc.mentalTraits.includes("Cynical")) { responses.push("Small talk. The ultimate display of social conformity. We talk about meaningless things to avoid the void of existence. But sure, the weather's fine, I guess."); } else if (npc.mentalTraits.includes("Jock")) { responses.push("Bro, did you catch the game last night? That final play was INSANE! Also hit a new PR at the gym yesterday. Things are going pretty good!"); } else if (npc.mentalTraits.includes("Prep") || npc.mentalTraits.includes("Fashionable")) { responses.push("Oh, things have been fabulous! Did you see the new collection that just dropped downtown? I'm thinking about picking up a few pieces. Fashion waits for no one!"); } else { responses.push("Yeah, things have been pretty normal. Same old routine, you know? How about you? Anything interesting going on?"); } } else if (topic === "insult") { if (npc.mentalTraits.includes("Aggressive") || npc.mentalTraits.includes("Short Tempered") || npc.mentalTraits.includes("Violent")) { responses.push("Excuse me? You want to say that again? Get the hell out of my face RIGHT NOW before I make you regret it. I'm not playing around. Try me and see what happens."); } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Rude")) { responses.push("Oh, that's rich coming from YOU. You've got some nerve. Get out of my sight before I really let you have it."); } else if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Patient") || npc.mentalTraits.includes("Sensitive")) { responses.push("That... that really hurt. I don't know what I did to deserve that, but... *tears up* I think you should just go. Please."); } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { responses.push("Wow, really? That's the best you've got? I've heard worse from better people. You're going to have to try a LOT harder than that to actually hurt my feelings. Try harder next time."); } else if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Insecure")) { responses.push("What? Why would you... *voice shaking* That's really mean... I... I need you to leave. Please. Just... just go..."); } else if (npc.mentalTraits.includes("Cold") || npc.mentalTraits.includes("Emotionless")) { responses.push("...Is that all? Are you done? Okay. Leave."); } else if (npc.mentalTraits.includes("Sarcastic") || npc.mentalTraits.includes("Witty")) { responses.push("Oh wow, what a devastating insult. I'm so hurt. Really. Can't you tell how wounded I am? Please, spare me your brilliant wit."); } else { responses.push("What the hell? Why would you say that? Just... just leave me alone. Seriously."); } } else if (topic === "compliment") { if (npc.mentalTraits.includes("Shy") || npc.mentalTraits.includes("Insecure")) { responses.push("Oh... um... thank you. That's... that's really nice of you to say..."); responses.push("Really? You think so? That... that means a lot..."); } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { responses.push("Well, obviously. But it's nice to hear you recognize it."); responses.push("I know. But thanks for noticing."); } else if (npc.mentalTraits.includes("Confident")) { responses.push("Hey, thanks! I appreciate that!"); responses.push("That's kind of you to say. Thank you!"); } else if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Warm")) { responses.push("Aww, that's so sweet of you! Thank you so much!"); responses.push("You're so kind! That really made my day!"); } else { responses.push("Oh, thank you. That's nice of you to say."); responses.push("I appreciate that. Thanks."); } } else if (topic === "trading" && prefs) { var mentions = []; if (prefs.desires && relLevel >= 1) { if (prefs.desires.skills && prefs.desires.skills.length > 0) { mentions.push("I've been wanting to learn " + prefs.desires.skills[0]); } if (prefs.desires.mental && prefs.desires.mental.length > 0) { mentions.push("I wish I could be more " + prefs.desires.mental[0].toLowerCase()); } } if (mentions.length > 0) { var mainMention = mentions[Math.floor(Math.random() * mentions.length)]; if (npc.mentalTraits.includes("Honest") || npc.mentalTraits.includes("Direct")) { responses.push("Well, to be honest, " + mainMention + ". But I'm open to hearing offers!"); } else if (npc.mentalTraits.includes("Shrewd")) { responses.push("Hmm, let's just say " + mainMention + ". But everything has a price, doesn't it?"); } else { responses.push("Trading? Sure. " + mainMention.charAt(0).toUpperCase() + mainMention.slice(1) + "."); } } else { responses.push("I'm open to trading, depends on what you're offering."); } } /* ====================================================================== */ /* NEW DYNAMIC CONVERSATION TOPIC RESPONSES */ /* ====================================================================== */ else if (topic === "flirt") { /* Flirt responses are handled by calculateFlirtOutcome */ var flirtResult = setup.calculateFlirtOutcome(npc, relLevel); /* EXPLICIT/VERY EROTIC RESPONSES (sexualIntensity 2) - requires mutual sexual traits + Close Friend+ */ if (flirtResult.responseType === "explicit_eager") { responses.push("*pulls you close, eyes hungry* Mmm... I've been waiting for you to make a move. Let's skip the small talk and find somewhere private..."); responses.push("*bites lip seductively* You have no idea how badly I want you right now. My body is aching for your touch..."); responses.push("*presses against you* God, the things I want to do to you... I can't stop thinking about how good you'd feel..."); } else if (flirtResult.responseType === "explicit_seductive") { responses.push("*runs finger down your chest* I've been fantasizing about this... about us... about what I'd do if I got you alone..."); responses.push("*whispers in your ear* I want to taste every inch of you. I want to hear you moan my name..."); responses.push("*locks eyes with intense desire* Why don't we continue this somewhere more... comfortable? I promise to make it worth your while..."); } /* EROTIC RESPONSES (sexualIntensity 1) - requires mutual sexual traits + Acquaintance+ */ else if (flirtResult.responseType === "sexual_eager") { responses.push("*eyes roam over you hungrily* Mmm, I like what I see. Very much. I wonder what you look like without those clothes..."); responses.push("*licks lips* You're making it very hard to behave. My mind is going to some very dirty places right now..."); responses.push("*moves closer* I've been thinking about you... thinking about what we could do together..."); } else if (flirtResult.responseType === "sexual_seductive") { responses.push("*traces your jawline* I love how you look at me. It makes me want to give you a private show..."); responses.push("*voice drops to a sultry whisper* Keep talking like that and I might just have to show you what else I can do with my mouth..."); responses.push("*presses close* I want to feel your hands on me. Everywhere."); } else if (flirtResult.responseType === "sexual_flirty") { responses.push("*winks* Careful, keep flirting like that and I might have to drag you somewhere private..."); responses.push("*playfully bites lower lip* You're turning me on, you know that? In all the right ways..."); responses.push("*giggles seductively* Someone's being naughty. I like it. A lot."); } else if (flirtResult.responseType === "sexual_romantic") { responses.push("*blushes but moves closer* You make me feel things... intense things. I want to be closer to you..."); responses.push("*takes your hand, places it on their hip* My heart races when you look at me like that. Among other things..."); responses.push("*soft moan* The way you talk to me... it does things to me. Makes me want more..."); } else if (flirtResult.responseType === "sexual_shy") { responses.push("*face bright red, squirming* I... oh god... I've been thinking about you too... about us... *voice drops to whisper* ...together..."); responses.push("*stammers* You... you make me feel... *quietly* ...really aroused... sorry, that's embarrassing..."); responses.push("*can't meet your eyes* W-when you say things like that I... I want... *trails off, trembling*"); } else if (flirtResult.responseType === "sexual_confident") { responses.push("*smirks knowingly* I like your confidence. I bet you know how to use that body of yours..."); responses.push("*looks you up and down approvingly* Not bad. Not bad at all. I'd definitely be interested in exploring this further..."); responses.push("*leans in* You've got my attention now. Show me what else you've got..."); } else if (flirtResult.responseType === "sexual_dominant") { responses.push("*grabs you firmly* Mmm, I like when you flirt with me. But remember, I'm the one in control here..."); responses.push("*commanding tone* Get over here. I want to see if you're as good as you think you are..."); responses.push("*pulls you close by the waist* Such a tease. Maybe I need to teach you who's boss..."); } else if (flirtResult.responseType === "sexual_submissive") { responses.push("*whimpers softly* Y-yes... I'll do whatever you want... just tell me what you need..."); responses.push("*looks up at you with need* Please... I want you to take charge... use me however you like..."); responses.push("*trembling* I... I'm yours. Completely. Just... please touch me..."); } else if (flirtResult.responseType === "sexual_positive") { responses.push("*pulls you closer* I've been hoping you'd say something like that. Want to take this somewhere more private?"); responses.push("*breathing heavier* The way you look at me... it's making me very distracted... in a good way..."); responses.push("*smiles seductively* I think we both know where this is heading. And I am very much into it."); } /* STANDARD FLIRT RESPONSES (non-sexual/lower intensity) */ else if (flirtResult.responseType === "flirty_response") { responses.push("*leans in with a smile* Well, aren't you bold? I like that..."); responses.push("*twirls hair* Mmm, I like where this is going..."); responses.push("*bites lip* You know just what to say, don't you?"); } else if (flirtResult.responseType === "romantic_response") { responses.push("*blushes slightly* That's... really sweet of you to say."); responses.push("*smiles warmly* You're quite charming, aren't you?"); } else if (flirtResult.responseType === "flustered_response") { responses.push("*face turns red* I-I... um... *fidgets nervously* ...thank you?"); responses.push("W-what? You... you can't just SAY things like that... *looks away*"); responses.push("*stammers* I... oh... um... *mumbles incoherently*"); } else if (flirtResult.responseType === "confident_response") { responses.push("*smirks* Smooth. Real smooth. I might just be interested."); responses.push("*raises eyebrow* Bold move. I can respect that."); } else if (flirtResult.responseType === "cool_response") { responses.push("*raises an eyebrow* Noted. Was there something else?"); responses.push("*unimpressed* That was... adequate. I suppose."); } else if (flirtResult.responseType === "reserved_response") { responses.push("*looks away* That's... inappropriate. But... not entirely unwelcome."); responses.push("*stiffens* I... let's not go there. Yet."); } /* REJECTION RESPONSES */ else if (flirtResult.responseType === "polite_rejection") { responses.push("That's flattering, but I'm not really interested in that way. No offense!"); responses.push("*smiles politely* I appreciate the thought, but I don't swing that way."); responses.push("Oh, that's sweet, but I'm afraid you're not my type. Nothing personal!"); } else if (flirtResult.responseType === "harsh_rejection") { responses.push("*scoffs* Seriously? Not a chance. You're not my type. At all."); responses.push("Ew, no. Just... no. What made you think that was a good idea?"); responses.push("*laughs* Oh, that's precious. You actually thought I'd be interested?"); } else if (flirtResult.responseType === "awkward_rejection") { responses.push("Oh... um... I don't... I mean... it's not you, it's just..."); responses.push("*awkward silence* ...I'm... going to pretend that didn't happen."); } else if (flirtResult.responseType === "too_forward") { responses.push("*steps back* Whoa, we just met. Maybe slow down a bit?"); responses.push("*uncomfortable* That's... a bit much, don't you think? We barely know each other."); } else if (flirtResult.responseType === "confused") { responses.push("I... I need to know someone better before I can feel that way about them."); responses.push("*puzzled* That's... we don't know each other well enough for that."); } else if (flirtResult.responseType === "uncomfortable") { responses.push("*uncomfortable* I'm... not really interested in that kind of thing. Sorry."); responses.push("*shifts away* I don't really feel attraction like that. It's nothing personal."); } else if (flirtResult.responseType === "polite_decline") { responses.push("*soft smile* I appreciate the attention, really. But that's not something I'm looking for."); } else { responses.push("*chuckles* That's flattering, I suppose."); responses.push("*amused* Smooth. Real smooth."); } } else if (topic === "debate") { if (npc.mentalTraits.includes("Nerd") || npc.mentalTraits.includes("Intelligent")) { responses.push("*eyes light up* Oh, you want to discuss ideas? Finally, someone with intellectual curiosity!"); responses.push("Interesting perspective. However, have you considered the counterargument...?"); responses.push("*adjusts glasses* This is exactly the kind of stimulating conversation I've been craving."); } else if (npc.mentalTraits.includes("Competitive")) { responses.push("*grins* A debate? Prepare to lose. I'm very well-read on this topic."); responses.push("Oh, you want to challenge me? Bring it on!"); } else if (npc.mentalTraits.includes("Stubborn")) { responses.push("*crosses arms* I know what I know. You're not changing my mind."); responses.push("My opinion is my opinion. But sure, let's 'debate'."); } else { responses.push("*shrugs* I guess we can talk about that. What's your angle?"); responses.push("Hmm, that's an interesting topic to explore. What do you think?"); } } else if (topic === "fitness") { if (npc.mentalTraits.includes("Jock") || npc.physicalTraits.includes("Muscular")) { responses.push("*flexes* You wanna talk gains? Let's GO! I've been crushing it at the gym lately."); responses.push("Bro, my workout routine is insane right now. You lifting? What's your max?"); responses.push("Finally someone who gets it! Fitness isn't just a hobby, it's a lifestyle."); } else if (npc.mentalTraits.includes("Competitive")) { responses.push("*sizing you up* You look like you work out. Bet I could still outrun you though."); } else if (npc.mentalTraits.includes("Lazy")) { responses.push("*yawns* Sports? Exercise? Hard pass. I get tired just thinking about it."); } else { responses.push("I'm not super athletic, but I try to stay active. What about you?"); } } else if (topic === "gossip") { if (npc.mentalTraits.includes("Gossipy") || npc.mentalTraits.includes("Nosy")) { responses.push("*leans in excitedly* Oh my god, you have to tell me EVERYTHING. I heard the craziest thing the other day..."); responses.push("Spill the tea! I've been dying for some good gossip. Did you hear about...?"); responses.push("*eyes widen* Ooh, gossip? I know SO much about everyone in this city!"); } else if (npc.mentalTraits.includes("Honest") || npc.mentalTraits.includes("Loyal")) { responses.push("*frowns* I'm not really into gossip. It can hurt people, you know?"); responses.push("I try not to talk about people behind their backs. It just feels wrong."); } else { responses.push("*glances around* Okay, but you didn't hear this from me..."); } } else if (topic === "darkTopics") { if (npc.mentalTraits.includes("Goth") || npc.mentalTraits.includes("Philosophical")) { responses.push("*eyes soften* Finally, someone who gets it. Life is fleeting, existence is meaningless, and yet... here we are."); responses.push("*nods thoughtfully* The darkness is where truth lives. Most people are too afraid to look."); responses.push("Death, entropy, the void... these are the topics that truly matter. I appreciate your depth."); } else if (npc.mentalTraits.includes("Optimistic") || npc.mentalTraits.includes("Bubbly")) { responses.push("*uncomfortable* Um... that's kind of heavy? Can we talk about something happier?"); responses.push("*shifts uncomfortably* I don't really like thinking about sad stuff..."); } else if (npc.mentalTraits.includes("Depressed") || npc.mentalTraits.includes("Pessimistic")) { responses.push("*sighs deeply* Yeah... I think about this stuff a lot. Too much, probably."); responses.push("*looks away* The futility of it all... sometimes I wonder what the point is."); } else { responses.push("*pauses* That's... deep. I don't usually think about stuff like that."); } } else if (topic === "beSubmissive") { if (npc.mentalTraits.includes("Dominant") || npc.mentalTraits.includes("Bossy")) { responses.push("*smirks* Good. I like when people know their place. Now, let me tell you what I think..."); responses.push("*nods approvingly* Smart move, letting me take charge. As I was saying..."); responses.push("*straightens up* Finally, someone who respects the natural order of things."); } else if (npc.mentalTraits.includes("Arrogant")) { responses.push("*pleased* Obviously I should be leading this conversation. So, as I was saying..."); } else { responses.push("*surprised* Oh, you want me to take the lead? Alright then..."); } } else if (topic === "takeCharge") { if (npc.mentalTraits.includes("Submissive") || npc.mentalTraits.includes("Shy")) { responses.push("*relaxes visibly* Oh, that's... actually nice. I'm not great at leading conversations..."); responses.push("*nods quietly* I appreciate you taking charge. What did you want to talk about?"); } else if (npc.mentalTraits.includes("Timid")) { responses.push("*looks grateful* Thank you... I always feel so awkward deciding what to talk about."); } else { responses.push("*shrugs* Sure, go ahead. I'm listening."); } } else if (topic === "playAlong") { if (npc.mentalTraits.includes("Bimbo") || npc.mentalTraits.includes("Airhead")) { responses.push("*giggles* Oh my gosh, you totally get me! Like, we're vibing so hard right now!"); responses.push("*bounces excitedly* Yay! You're like, SO fun to talk to! This is amazing!"); responses.push("*twirls hair* Right?! I know, right?! Omigosh, we should hang out more!"); } else if (npc.mentalTraits.includes("Bubbly")) { responses.push("*beams* You're so positive! I love your energy! This is great!"); } else { responses.push("*smiles* You're fun to be around!"); } } else if (topic === "fashion") { if (npc.mentalTraits.includes("Prep") || npc.mentalTraits.includes("Diva")) { responses.push("*eyes light up* Oh my god, YES! Fashion is EVERYTHING. Have you seen the latest trends?"); responses.push("*looks you over approvingly* Finally, someone who appreciates style. Your outfit is..."); responses.push("*excitedly* Okay so I was just looking at this amazing designer piece and..."); } else if (npc.mentalTraits.includes("Vain")) { responses.push("*preens* Of course you want to talk about fashion. It's one of my specialties."); } else if (npc.mentalTraits.includes("Goth")) { responses.push("*nods* Fashion as self-expression? The aesthetic of darkness? Now we're talking."); } else { responses.push("*shrugs* I try to look good. What's your style like?"); } } else if (topic === "advice") { if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Nurturing")) { responses.push("*softens* Of course I'll help. What's on your mind? I'm here for you."); responses.push("*concerned* Tell me everything. I want to help if I can."); } else if (npc.mentalTraits.includes("Wise")) { responses.push("*nods thoughtfully* I may have some insight. What's the situation?"); } else { responses.push("*considers* I can try to help. What do you need advice about?"); } } else if (topic === "secrets") { if (npc.mentalTraits.includes("Trustworthy") || npc.mentalTraits.includes("Loyal")) { responses.push("*moves closer* Your secrets are safe with me. I'd never betray your trust."); responses.push("*serious expression* I appreciate that you trust me with this. I won't let you down."); } else if (npc.mentalTraits.includes("Gossipy")) { responses.push("*eyes widen* Ooh, a secret? Tell me, tell me! *already thinking about who to tell*"); } else if (npc.mentalTraits.includes("Manipulative")) { responses.push("*files information away* How... interesting. I appreciate your candor."); } else { responses.push("*listens intently* Wow, that's... thank you for trusting me with that."); } } else if (topic === "support") { if (npc.mentalTraits.includes("Sensitive") || npc.mentalTraits.includes("Anxious")) { responses.push("*tears up slightly* That means so much to me... I really needed to hear that."); responses.push("*voice wavers* Thank you... I don't get much support usually."); } else if (npc.mentalTraits.includes("Cold")) { responses.push("*uncomfortable* I... appreciate the thought. This is awkward."); } else { responses.push("*touched* That's really kind of you. Thank you."); } } else if (topic === "plan") { if (npc.mentalTraits.includes("Friendly") || npc.mentalTraits.includes("Outgoing")) { responses.push("*excited* Yes! We should totally hang out! What did you have in mind?"); responses.push("*beams* I'd love that! Let's make it happen!"); } else if (npc.mentalTraits.includes("Antisocial") || npc.mentalTraits.includes("Reserved")) { responses.push("*hesitant* I don't know... I'm not really a 'going out' kind of person."); } else { responses.push("*nods* Sure, that could be fun. What were you thinking?"); } } else if (topic === "deep") { if (npc.mentalTraits.includes("Empathetic") || npc.mentalTraits.includes("Philosophical")) { responses.push("*takes your hand* These conversations are what real connection is about. I feel like I really understand you."); responses.push("*thoughtful* I've been thinking about life a lot lately too. It's nice to have someone to really talk to."); } else if (npc.mentalTraits.includes("Shallow")) { responses.push("*fidgets* This is getting really heavy. Can we talk about something else?"); } else { responses.push("*nods slowly* I never really open up like this. But with you... it feels right."); } } else if (topic === "confide") { if (npc.mentalTraits.includes("Kind") || npc.mentalTraits.includes("Nurturing")) { responses.push("*puts arm around you* I'm here for you. Whatever you're going through, you don't have to face it alone."); responses.push("*concerned* Tell me what's bothering you. I want to help."); } else if (npc.mentalTraits.includes("Impatient")) { responses.push("*sighs* Okay, what is it? Just tell me."); } else { responses.push("*listens carefully* I'm glad you feel comfortable enough to tell me this."); } } else if (topic === "bestFriend") { responses.push("*emotional* You mean so much to me. I can't imagine my life without you in it."); responses.push("*hugs you* We've been through so much together. You're like family to me."); responses.push("*teary-eyed* I don't know what I'd do without you. Seriously."); } else if (topic === "tease") { if (npc.mentalTraits.includes("Playful") || npc.mentalTraits.includes("Witty")) { responses.push("*laughs* Oh, you think you're funny? Two can play at that game!"); responses.push("*grins* Getting cheeky, are we? I like it."); } else if (npc.mentalTraits.includes("Sensitive") || npc.mentalTraits.includes("Insecure")) { responses.push("*hurt* That's... why would you say that?"); responses.push("*looks away* I know you're joking, but... that kind of stings."); } else if (npc.mentalTraits.includes("Serious")) { responses.push("*unamused* I don't really appreciate that kind of humor."); } else { responses.push("*chuckles* Alright, alright. Laugh it up."); } } else if (topic === "challenge") { if (npc.mentalTraits.includes("Competitive") || npc.mentalTraits.includes("Confident")) { responses.push("*stands straighter* You want to challenge me? Interesting. I respect that."); responses.push("*grins* Finally, someone with the guts to push back. I like it."); } else if (npc.mentalTraits.includes("Hot-Headed") || npc.mentalTraits.includes("Stubborn")) { responses.push("*bristles* What did you just say? You think you know better than me?!"); responses.push("*angry* Don't you DARE question me. I know what I'm talking about!"); } else { responses.push("*considers* Hmm, you make an interesting point. I'll have to think about it."); } } else if (topic === "pushBoundaries") { if (npc.mentalTraits.includes("Flirty") || npc.mentalTraits.includes("Seductive")) { responses.push("*leans in closer* Oh? And just how far are you willing to go...?"); responses.push("*smoldering look* I was hoping you'd say something like that..."); } else if (npc.mentalTraits.includes("Perverted") || npc.mentalTraits.includes("Lustful")) { responses.push("*eyes darken* Now we're getting to the good stuff..."); } else { responses.push("*intrigued* Well this got interesting..."); } } // Default fallback if (responses.length === 0) { if (npc.mentalTraits.includes("Thoughtful") || npc.mentalTraits.includes("Analytical")) { responses.push("Hmm, interesting question. I'll have to think about that for a while."); } else if (npc.mentalTraits.includes("Nonchalant")) { responses.push("Sure, whatever."); } else { responses.push("Hmm, interesting. I'll have to think about that."); } } return responses[Math.floor(Math.random() * responses.length)]; }>> <<set setup.calculateTalkRelationshipChange = function(npc, topic, relLevel) { var change = 0; }>> /* Function to add relationship bonus from trading */ <<set setup.addTradeRelationshipBonus = function(npc, playerPackage, npcPackage) { var v = State.variables; var prefs = setup.getNPCPreferences(npc); if (!prefs) { return 0; } var pointsGain = 0; // Check if player gave desired traits (+5 points per desired item) if (prefs.desires) { if (prefs.desires.skills && playerPackage.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsGain += 5; } }); } if (prefs.desires.mental && playerPackage.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.physical && playerPackage.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.bodyParts && playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsGain += 5; } }); } } // Check if player took reluctant traits (-1 point per reluctant item) if (prefs.reluctantToTrade && npcPackage) { if (prefs.reluctantToTrade.skills && npcPackage.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.mental && npcPackage.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.physical && npcPackage.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.bodyParts && npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsGain -= 1; } }); } } return pointsGain; }>> <<set setup.calculateTalkRelationshipChange = function(npc, topic, relLevel) { var change = 0; if (topic === "compliment") { // Compliments - modified by personality if (npc.mentalTraits.includes("Insecure") || npc.mentalTraits.includes("Shy")) { change = relLevel >= 3 ? 3 : 2; // Extra impact on insecure people (Friend+) } else if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { change = 1; // They expect compliments } else { change = relLevel >= 3 ? 2 : 1; // Friend+ } } else if (topic === "insult") { // Insults - personality determines severity if (npc.mentalTraits.includes("Sensitive") || npc.mentalTraits.includes("Insecure")) { change = relLevel === 1 ? -5 : (relLevel === 2 ? -4 : -2); // Stranger, Acquaintance, Friend+ } else if (npc.mentalTraits.includes("Confident") || npc.mentalTraits.includes("Arrogant")) { change = relLevel === 1 ? -2 : (relLevel === 2 ? -1 : -1); // Less impact if confident } else if (npc.mentalTraits.includes("Aggressive") || npc.mentalTraits.includes("Short Tempered")) { change = -4; // They don't forgive easily } else { change = relLevel === 1 ? -3 : (relLevel === 2 ? -2 : -1); } } else if (topic === "opinion") { // Asking opinion - modified by personality if (npc.mentalTraits.includes("Arrogant") || npc.mentalTraits.includes("Vain")) { change = relLevel === 1 ? 2 : 1; // They LOVE talking about themselves at Stranger level } else if (npc.mentalTraits.includes("Shy")) { change = relLevel === 1 ? 0 : 1; // Uncomfortable at Stranger level } else { change = relLevel === 1 ? 1 : 0; // Stranger gives +1, higher levels give 0 } } else if (topic === "trading") { // Trading interest - modified by personality if (npc.mentalTraits.includes("Greedy") || npc.mentalTraits.includes("Shrewd")) { change = 1; // They like business talk } else if (npc.mentalTraits.includes("Generous")) { change = relLevel === 1 ? 1 : 0; // Stranger gives +1 } else { change = relLevel === 1 ? 1 : 0; // Stranger gives +1 } } else if (topic === "smalltalk") { // Small talk - personality heavily influences if (npc.mentalTraits.includes("Talkative") || npc.mentalTraits.includes("Friendly")) { change = 1; // They enjoy it } else if (npc.mentalTraits.includes("Bitchy") || npc.mentalTraits.includes("Impatient")) { change = -1; // They hate it } else { change = 0; // Neutral } } else if (topic === "job") { // Job talk doesn't change relationship change = 0; } else { // Default fallback for unknown topics change = 0; } return change; }>> /* Function to add relationship bonus from trading */ <<set setup.addTradeRelationshipBonus = function(npc, playerPackage, npcPackage) { var v = State.variables; var prefs = setup.getNPCPreferences(npc); if (!prefs) { return 0; } var pointsGain = 0; // Check if player gave desired traits (+5 points per desired item) if (prefs.desires) { if (prefs.desires.skills && playerPackage.skills) { playerPackage.skills.forEach(function(skill) { if (prefs.desires.skills.includes(skill)) { pointsGain += 5; } }); } if (prefs.desires.mental && playerPackage.mental) { playerPackage.mental.forEach(function(trait) { if (prefs.desires.mental.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.physical && playerPackage.physical) { playerPackage.physical.forEach(function(trait) { if (prefs.desires.physical.includes(trait)) { pointsGain += 5; } }); } if (prefs.desires.bodyParts && playerPackage.bodyParts) { playerPackage.bodyParts.forEach(function(part) { if (prefs.desires.bodyParts.includes(part.name)) { pointsGain += 5; } }); } } // Check if player took reluctant traits (-1 point per reluctant item) if (prefs.reluctantToTrade && npcPackage) { if (prefs.reluctantToTrade.skills && npcPackage.skills) { npcPackage.skills.forEach(function(skill) { if (prefs.reluctantToTrade.skills.includes(skill)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.mental && npcPackage.mental) { npcPackage.mental.forEach(function(trait) { if (prefs.reluctantToTrade.mental.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.physical && npcPackage.physical) { npcPackage.physical.forEach(function(trait) { if (prefs.reluctantToTrade.physical.includes(trait)) { pointsGain -= 1; } }); } if (prefs.reluctantToTrade.bodyParts && npcPackage.bodyParts) { npcPackage.bodyParts.forEach(function(part) { if (prefs.reluctantToTrade.bodyParts.includes(part.name)) { pointsGain -= 1; } }); } } return pointsGain; }>>
/* ---------------------------------- */ /* --- JOB WORK BONUS/PENALTY SYSTEM --- */ /* ---------------------------------- */ <<set setup.jobWorkConfig = { "Fitness Shop Clerk": { statRequirement: {stat: "strength", value: 25}, possibleGains: ["Fit", "Confident", "Patient", "Sales", "Retail", "Chill"], bonuses: { small: ["Fit", "Flexible", "Broad-shouldered", "Sturdy", "Tall", "Optimistic", "Patient", "Sales", "Werewolf", "Hellhound"], medium: ["Attractive", "Athletic Build", "Extroverted", "Heavy Lifting", "Athletics", "Yoga"], big: ["Muscular", "Friendly", "Outgoing", "Energetic", "Chill"] }, negativeRemovable: ["Ugly", "Overweight", "Underweight", "Weak", "Soft"], negativeReplacements: { "Overweight": "Fit", "Underweight": "Fit", "Weak": "Strong" }, traitUpgrades: { "Strong": "Muscular" }, negativePermanent: ["Messy Hair"] }, "Adult Store Clerk": { statRequirement: {stat: "charisma", value: 20}, possibleGains: ["Patient", "Sales", "Retail", "Chill"], bonuses: { small: ["Optimistic", "Patient", "Outgoing", "Energetic", "Accounting"], medium: ["Attractive", "Creative", "Huge Chest", "Curvy", "Voluptuous", "Huge Butt", "Giant Butt"], big: ["Friendly", "Sexually Skilled", "Sales", "Giant Chest", "Chill"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] }, "Ecentric Shop Worker": { statRequirement: {stat: "charisma", value: 20}, possibleGains: ["Patient", "Sales", "Sarcastic", "Artistic", "Retail", "Chill", "Humorous"], bonuses: { small: ["Dominant", "Creative", "Patient", "Accounting", "Deep Thinker", "Sarcastic", "Humorous", "Black Hair"], medium: ["Attractive", "Optimistic", "Honest", "Pierced", "Artistic", "Relaxed"], big: ["Introverted", "Pessimistic", "Sales", "Monotone Expression", "Retail", "Chill"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: { "Relaxed": "Chill" }, negativePermanent: ["Messy Hair"] }, "Dock Worker": { statRequirement: {stat: "strength", value: 15}, possibleGains: ["Patient", "Forklift Certified", "Relaxed", "Humorous"], bonuses: { small: ["Friendly", "Outgoing", "Energetic", "Relaxed"], medium: ["Attractive", "Optimistic", "Patient", "Honest", "Chill", "Humorous"], big: ["Hardworking", "Muscular", "Forklift Certified"] }, negativeRemovable: ["Ugly", "Impatient"], negativeReplacements: { "Impatient": "Patient" }, traitUpgrades: { "Relaxed": "Chill" }, negativePermanent: [] }, "Tech Store Clerk": { statRequirement: {stat: "intelligence", value: 20}, possibleGains: ["Confident", "Patient", "Intelligent", "Analytical", "Persuasion", "Sales", "Tech-Savvy", "Troubleshooting"], bonuses: { small: ["Outgoing", "Introverted", "Deep Thinker"], medium: ["Attractive", "Optimistic", "Creative", "Patient", "Persuasion", "Sales", "Accounting", "Retail"], big: ["Friendly", "Logical", "Intelligent", "Analytical", "Tech-Savvy", "Troubleshooting"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] }, "Beauty Salon Stylist": { statRequirement: {stat: "dexterity", value: 30}, possibleGains: ["Confident", "Optimistic", "Patient", "Outgoing", "Makeup", "Hair Styling", "Cleaning"], bonuses: { small: ["Hardworking", "Creative", "Energetic", "Cleaning", "Retail"], medium: ["Attractive", "Optimistic", "Makeup"], big: ["Extroverted", "Friendly", "Patient", "Outgoing", "Hair Styling"] }, negativeRemovable: ["Ugly"], negativeReplacements: {}, traitUpgrades: {}, negativePermanent: ["Messy Hair"] } }>> /* Helper function to check if player has any trait/skill */ <<set setup.playerHasTrait = function(traitName) { var v = State.variables; // Check body parts for special cases if (traitName === "Black Hair") { return v.hairColor === "Black"; } if (traitName === "Messy Hair") { return v.hairLength === "Messy Hair"; } // Check chest/butt sizes var sizeTraits = ["Huge Chest", "Giant Chest", "Huge Butt", "Giant Butt"]; if (sizeTraits.includes(traitName)) { var bodyPart = traitName.includes("Chest") ? "chest" : "butt"; var size = traitName.split(" ")[0].toLowerCase(); // "huge" or "giant" return v[bodyPart] && v[bodyPart].toLowerCase() === size; } return v.physicalTraits.includes(traitName) || v.mentalTraits.includes(traitName) || v.skills.includes(traitName); }>> /* Calculate pay multiplier based on stat deficit */ <<set setup.getJobPayMultiplier = function(jobName) { var v = State.variables; var config = setup.jobWorkConfig[jobName]; if (!config || !config.statRequirement) { return 1.0; // No penalty if job not in system } var requiredStat = config.statRequirement.stat; var requiredValue = config.statRequirement.value; var playerStat = setup.getTotalStat(requiredStat); // Use total stat with bonuses // If player meets or exceeds requirement, full pay (100%) if (playerStat >= requiredValue) { return 1.0; } // Calculate how far below the requirement the player is // Formula: (playerStat / requiredValue) gives us the percentage // This naturally scales: // - If you have 6/15 strength = 40% pay (60% penalty) // - If you have 5/70 charisma = 7.14% pay (92.86% penalty) // - If you have 0 stats = 0% pay (100% penalty) var multiplier = playerStat / requiredValue; // Ensure minimum is 0 (can't go negative) if (multiplier < 0) multiplier = 0; return multiplier; }>> /* Calculate bonus pay from traits */ <<set setup.getJobBonusMultiplier = function(jobName) { var config = setup.jobWorkConfig[jobName]; if (!config) return 0; var bonusPercent = 0; // Check small bonuses (2% each) for (var i = 0; i < config.bonuses.small.length; i++) { if (setup.playerHasTrait(config.bonuses.small[i])) { bonusPercent += 2; } } // Check medium bonuses (5% each) for (var i = 0; i < config.bonuses.medium.length; i++) { if (setup.playerHasTrait(config.bonuses.medium[i])) { bonusPercent += 5; } } // Check big bonuses (15% each) for (var i = 0; i < config.bonuses.big.length; i++) { if (setup.playerHasTrait(config.bonuses.big[i])) { bonusPercent += 15; } } return bonusPercent / 100; // Convert to multiplier }>> /* Calculate penalty from negative traits */ <<set setup.getJobNegativePenalty = function(jobName) { var config = setup.jobWorkConfig[jobName]; if (!config) return 0; var penaltyPercent = 0; // Check removable negatives (10% penalty each) for (var i = 0; i < config.negativeRemovable.length; i++) { if (setup.playerHasTrait(config.negativeRemovable[i])) { penaltyPercent += 10; } } // Check permanent negatives (5% penalty each) for (var i = 0; i < config.negativePermanent.length; i++) { if (setup.playerHasTrait(config.negativePermanent[i])) { penaltyPercent += 5; } } return penaltyPercent / 100; // Convert to multiplier }>> /* Process trait gains/losses/upgrades after work */ <<set setup.processJobTraitChanges = function(jobName) { var v = State.variables; var config = setup.jobWorkConfig[jobName]; if (!config) return []; var changes = []; // 5% chance to gain a new trait from possibleGains if (Math.random() < 0.05) { var availableGains = config.possibleGains.filter(function(trait) { return !setup.playerHasTrait(trait); }); if (availableGains.length > 0) { var newTrait = availableGains[Math.floor(Math.random() * availableGains.length)]; // Determine where to add it if (setup.traitBonuses[newTrait]) { // Determine if physical or mental var physicalTraits = ["Fit", "Muscular", "Attractive"]; var mentalTraits = ["Confident", "Patient", "Optimistic", "Sarcastic", "Artistic", "Humorous", "Intelligent", "Analytical"]; if (physicalTraits.includes(newTrait)) { v.physicalTraits.push(newTrait); } else if (mentalTraits.includes(newTrait)) { v.mentalTraits.push(newTrait); } } else if (setup.skillBonuses[newTrait]) { v.skills.push(newTrait); } changes.push({type: "gain", trait: newTrait}); } } // 1% chance to upgrade existing traits if (Math.random() < 0.01) { for (var oldTrait in config.traitUpgrades) { if (setup.playerHasTrait(oldTrait)) { var newTrait = config.traitUpgrades[oldTrait]; // Remove old trait v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== oldTrait; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== oldTrait; }); v.skills = v.skills.filter(function(t) { return t !== oldTrait; }); // Add new trait var physicalTraits = ["Muscular"]; var mentalTraits = ["Chill"]; if (physicalTraits.includes(newTrait)) { v.physicalTraits.push(newTrait); } else if (mentalTraits.includes(newTrait)) { v.mentalTraits.push(newTrait); } else if (setup.skillBonuses[newTrait]) { v.skills.push(newTrait); } changes.push({type: "upgrade", oldTrait: oldTrait, newTrait: newTrait}); break; // Only one upgrade per work session } } } // 5% chance to remove a negative trait if (Math.random() < 0.05) { var removableNegatives = config.negativeRemovable.filter(function(trait) { return setup.playerHasTrait(trait); }); if (removableNegatives.length > 0) { var traitToRemove = removableNegatives[Math.floor(Math.random() * removableNegatives.length)]; v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== traitToRemove; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== traitToRemove; }); changes.push({type: "remove", trait: traitToRemove}); } } // 1% chance to replace negative trait with positive if (Math.random() < 0.01) { for (var negativeTrait in config.negativeReplacements) { if (setup.playerHasTrait(negativeTrait)) { var positiveTrait = config.negativeReplacements[negativeTrait]; // Remove negative v.physicalTraits = v.physicalTraits.filter(function(t) { return t !== negativeTrait; }); v.mentalTraits = v.mentalTraits.filter(function(t) { return t !== negativeTrait; }); // Add positive var physicalTraits = ["Fit", "Strong", "Muscular"]; var mentalTraits = ["Patient"]; if (physicalTraits.includes(positiveTrait)) { v.physicalTraits.push(positiveTrait); } else if (mentalTraits.includes(positiveTrait)) { v.mentalTraits.push(positiveTrait); } else if (setup.skillBonuses[positiveTrait]) { v.skills.push(positiveTrait); } changes.push({type: "replace", oldTrait: negativeTrait, newTrait: positiveTrait}); break; // Only one replacement per work session } } } return changes; }>>
/* ================================== */ /* === LAMPREY TOMES BOOKSHOP === */ /* ================================== */ <<set setup.lampreyTraits = { common: { price: 500, chance: 0.90, traits: [ {trait: "Broad-shouldered", type: "physical"}, {trait: "Freckled", type: "physical"}, {trait: "Tattooed", type: "physical"}, {trait: "Risk Taker", type: "mental"}, {trait: "Overthinker", type: "mental"}, {trait: "Quiet", type: "mental"}, {trait: "Clingy", type: "mental"}, {trait: "Impulsive", type: "mental"}, {trait: "Disorganized", type: "mental"}, {trait: "Forgetful", type: "mental"}, {trait: "Cowardly", type: "mental"}, {trait: "Insecure", type: "mental"}, {trait: "Brave", type: "mental"}, {trait: "Witty", type: "mental"}, {trait: "Passive", type: "mental"}, {trait: "Stubborn", type: "mental"}, {trait: "Paranoid", type: "mental"}, {trait: "Bitchy", type: "mental"}, {trait: "Foolish", type: "mental"}, {trait: "Flat Chest", type: "physical"}, {trait: "Flat Butt", type: "physical"}, {trait: "Flat Masculine Chest", type: "physical"}, {trait: "Flat Masculine Butt", type: "physical"} ] }, uncommon: { price: 2000, chance: 0.20, traits: [ {trait: "Submissive", type: "mental"}, {trait: "Sturdy", type: "physical"}, {trait: "Artistic", type: "mental"}, {trait: "Small Chest", type: "physical"}, {trait: "Small Butt", type: "physical"} ] }, rare: { price: 5000, chance: 0.05, traits: [ {trait: "Youthful", type: "physical"}, {trait: "Attractive", type: "physical"}, {trait: "Sly", type: "mental"}, {trait: "Curvy", type: "physical"}, {trait: "Voluptuous", type: "physical"}, {trait: "Perceptive", type: "mental"}, {trait: "Large Chest", type: "physical"}, {trait: "Large Butt", type: "physical"}, {trait: "Medium Chest", type: "physical"}, {trait: "Medium Butt", type: "physical"}, {trait: "Lactating", type: "physical"} ] }, aethereal: { price: 10000, chance: 0.01, traits: [ {trait: "Giant Chest", type: "physical"}, {trait: "Giant Butt", type: "physical"}, {trait: "Huge Chest", type: "physical"}, {trait: "Huge Butt", type: "physical"}, {trait: "Goth", type: "mental"}, {trait: "Nerd", type: "mental"}, {trait: "Jock", type: "mental"}, {trait: "Prep", type: "mental"}, {trait: "Dominant", type: "mental"} ] }, legendary: { price: 50000, chance: 0.001, traits: [ {trait: "Were-Creature", type: "physical"}, {trait: "Lucky", type: "mental"}, {trait: "Occult Expert", type: "skill"}, {trait: "Gigantic Chest", type: "physical"}, {trait: "Gigantic Butt", type: "physical"} ] } }>> /* ===== INVENTORY GENERATION ===== */ <<set setup.generateLampreyInventory = function() { var inventory = []; // Guaranteed common tome var guaranteedCommon = setup.lampreyTraits.common.traits.random(); inventory.push({ trait: guaranteedCommon.trait, type: guaranteedCommon.type, rarity: 'common', price: setup.lampreyTraits.common.price }); // Base number of additional tomes var additionalTomes = 3; // ===== SKILL TREE: Daily Tome Bonus ===== var skillTreeTomeBonus = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { skillTreeTomeBonus = setup.skillTree.getEffect("dailyTomeBonus") || 0; } if (skillTreeTomeBonus > 0) { additionalTomes += skillTreeTomeBonus; } for (var i = 0; i < additionalTomes; i++) { var selectedRarity = null; var roll = Math.random(); if (roll < setup.lampreyTraits.legendary.chance) { selectedRarity = 'legendary'; } else if (roll < setup.lampreyTraits.aethereal.chance) { selectedRarity = 'aethereal'; } else if (roll < setup.lampreyTraits.rare.chance) { selectedRarity = 'rare'; } else if (roll < setup.lampreyTraits.uncommon.chance) { selectedRarity = 'uncommon'; } else { selectedRarity = 'common'; } var rarityData = setup.lampreyTraits[selectedRarity]; var traitData = rarityData.traits.random(); if (!inventory.some(function(item) { return item.trait === traitData.trait; })) { inventory.push({ trait: traitData.trait, type: traitData.type, rarity: selectedRarity, price: rarityData.price }); } else { i--; } } return inventory; }>> /* ===== INVENTORY REFRESH CHECK ===== */ <<set setup.shouldRefreshLampreyInventory = function() { var v = State.variables; var currentDay = v.dayNumber; var lastRefreshDay = v.lampreyLastRefreshDay || -1; var lastRefreshWasAfterNoon = v.lampreyLastRefreshAfterNoon || false; var currentHour = Math.floor(v.timeInMinutes / 60) % 24; var isAfterNoon = currentHour >= 12; // Refresh if it's a new day and we're at or past noon if (currentDay > lastRefreshDay && isAfterNoon) { return true; } // Refresh if it's the same day but last refresh was before noon and now it's noon or later if (currentDay === lastRefreshDay && !lastRefreshWasAfterNoon && isAfterNoon) { return true; } // Also refresh if skill tree tome bonus changed since last generation var currentBonus = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { currentBonus = setup.skillTree.getEffect("dailyTomeBonus") || 0; } var lastBonus = v.lampreyLastTomeBonus; if (typeof lastBonus === "undefined" || currentBonus !== lastBonus) { return true; } return false; }>> /* ===== RARITY HELPERS ===== */ <<set setup.getRarityColor = function(rarity) { var colors = { common: '#aaa', uncommon: '#51cf66', rare: '#339af0', aethereal: '#b19cd9', legendary: '#ffd700' }; return colors[rarity] || '#aaa'; }>> <<set setup.getRarityName = function(rarity) { var names = { common: 'Common', uncommon: 'Uncommon', rare: 'Rare', aethereal: 'Aethereal', legendary: 'Legendary' }; return names[rarity] || 'Unknown'; }>> /* ===== BODY PART TRAIT APPLICATION ===== */ <<set setup.applyLampreyBodyTrait = function(trait) { var v = State.variables; // Handle chest size traits if (trait === "Gigantic Chest") { v.bodyParts.chest = "gigantic"; return true; } if (trait === "Giant Chest") { v.bodyParts.chest = "giant"; return true; } if (trait === "Huge Chest") { v.bodyParts.chest = "huge"; return true; } if (trait === "Large Chest") { v.bodyParts.chest = "large"; return true; } if (trait === "Medium Chest") { v.bodyParts.chest = "medium"; return true; } if (trait === "Small Chest") { v.bodyParts.chest = "small"; return true; } if (trait === "Flat Chest") { v.bodyParts.chest = "flat"; return true; } if (trait === "Flat Masculine Chest") { v.bodyParts.chest = "flat masculine"; return true; } // Handle butt size traits if (trait === "Gigantic Butt") { v.bodyParts.butt = "gigantic"; return true; } if (trait === "Giant Butt") { v.bodyParts.butt = "giant"; return true; } if (trait === "Huge Butt") { v.bodyParts.butt = "huge"; return true; } if (trait === "Large Butt") { v.bodyParts.butt = "large"; return true; } if (trait === "Medium Butt") { v.bodyParts.butt = "medium"; return true; } if (trait === "Small Butt") { v.bodyParts.butt = "small"; return true; } if (trait === "Flat Butt") { v.bodyParts.butt = "flat"; return true; } if (trait === "Flat Masculine Butt") { v.bodyParts.butt = "flat masculine"; return true; } return false; }>> /* ===== CHECK IF PLAYER HAS TRAIT ===== */ <<set setup.hasLampreyTrait = function(trait) { var v = State.variables; // Check chest size traits - only allow if it would change current value if (trait === "Gigantic Chest") { return v.bodyParts.chest === "gigantic"; } if (trait === "Giant Chest") { return v.bodyParts.chest === "giant"; } if (trait === "Huge Chest") { return v.bodyParts.chest === "huge"; } if (trait === "Large Chest") { return v.bodyParts.chest === "large"; } if (trait === "Medium Chest") { return v.bodyParts.chest === "medium"; } if (trait === "Small Chest") { return v.bodyParts.chest === "small"; } if (trait === "Flat Chest") { return v.bodyParts.chest === "flat"; } if (trait === "Flat Masculine Chest") { return v.bodyParts.chest === "flat masculine"; } // Check butt size traits - only allow if it would change current value if (trait === "Gigantic Butt") { return v.bodyParts.butt === "gigantic"; } if (trait === "Giant Butt") { return v.bodyParts.butt === "giant"; } if (trait === "Huge Butt") { return v.bodyParts.butt === "huge"; } if (trait === "Large Butt") { return v.bodyParts.butt === "large"; } if (trait === "Medium Butt") { return v.bodyParts.butt === "medium"; } if (trait === "Small Butt") { return v.bodyParts.butt === "small"; } if (trait === "Flat Butt") { return v.bodyParts.butt === "flat"; } if (trait === "Flat Masculine Butt") { return v.bodyParts.butt === "flat masculine"; } // Check physical traits array if (v.physicalTraits && v.physicalTraits.includes(trait)) { return true; } // Check mental traits array if (v.mentalTraits && v.mentalTraits.includes(trait)) { return true; } // Check skills array if (v.skills && v.skills.includes(trait)) { return true; } // Check voice traits array if (v.voiceTraits && v.voiceTraits.includes(trait)) { return true; } return false; }>> /* ===== ADD TRAIT TO PLAYER ===== */ <<set setup.addLampreyTrait = function(trait, type) { var v = State.variables; // Check if trait is blocked by current transformation if (setup.isTraitBlockedByTransformation) { if (setup.isTraitBlockedByTransformation(trait, "physical") || setup.isTraitBlockedByTransformation(trait, "mental")) { return; // Trait is blocked by transformation, don't add } } // Check if it's a body part modification trait if (setup.applyLampreyBodyTrait(trait)) { return; // Body part was modified, no need to add to trait arrays } // Handle conflicts for regular traits var allTraits = v.physicalTraits.concat(v.mentalTraits).concat(v.skills); if (v.voiceTraits) allTraits = allTraits.concat(v.voiceTraits); var conflict = setup.getConflictingTrait(trait, allTraits); if (conflict) { // Remove conflicting trait v.physicalTraits.delete(conflict); v.mentalTraits.delete(conflict); v.skills.delete(conflict); if (v.voiceTraits) v.voiceTraits.delete(conflict); } // Add the new trait if (type === "physical") { v.physicalTraits.push(trait); } else if (type === "mental") { v.mentalTraits.push(trait); } else if (type === "skill") { v.skills.push(trait); } else if (type === "voice") { if (!v.voiceTraits) v.voiceTraits = []; v.voiceTraits.push(trait); } }>> /* ===== TOME NAME MAPPINGS ===== */ <<set setup.traitTomeNames = { // Physical Traits "Broad-shouldered": "Tome of Titan's Frame", "Freckled": "Chronicle of Sun Kisses", "Tattooed": "Book of Living Ink", "Sturdy": "Codex of Endurance", "Youthful": "Manuscript of Eternal Youth", "Attractive": "Grimoire of Allure", "Curvy": "Scroll of Flowing Form", "Voluptuous": "Testament of Abundance", "Gigantic Chest": "Primordial Tome of Divine Endowment", "Gigantic Butt": "Ancient Chronicle of Legendary Curves", "Giant Chest": "Tome of Magnificent Proportions", "Giant Butt": "Chronicle of Grand Curves", "Huge Chest": "Chronicle of Bountiful Curves", "Huge Butt": "Testament of Voluptuous Depths", "Large Chest": "Grimoire of Generous Form", "Large Butt": "Tome of Ample Proportions", "Medium Chest": "Scroll of Balanced Figure", "Medium Butt": "Manuscript of Balanced Curves", "Small Chest": "Book of Modest Proportions", "Small Butt": "Scroll of Petite Form", "Flat Chest": "Manual of Sleek Lines", "Flat Butt": "Book of Athletic Lines", "Flat Masculine Chest": "Codex of Chiseled Pecs", "Flat Masculine Butt": "Guide to Firm Glutes", "Were-Creature": "Forbidden Bestiary", "Lactating": "Tome of Flowing Bounty", // Voice Traits "Deep Voice": "Book of Resonant Depths", "Emotionless Tone": "Manual of Stoic Speech", "Grim Tone": "Diary of Dark Words", "Articulate Speech": "Lexicon of Eloquence", // Mental Traits "Risk Taker": "Journal of Bold Ventures", "Overthinker": "Compendium of Endless Thoughts", "Quiet": "Whisper Manuscript", "Clingy": "Book of Attachment", "Impulsive": "Scroll of Rash Actions", "Disorganized": "Chaotic Chronicles", "Forgetful": "Fading Memoir", "Cowardly": "Tome of Fearful Hearts", "Insecure": "Journal of Self-Doubt", "Brave": "Codex of Courage", "Witty": "Book of Quick Minds", "Passive": "Manual of Peaceful Ways", "Stubborn": "Testament of Unyielding Will", "Paranoid": "Scroll of Eternal Vigilance", "Bitchy": "Grimoire of Sharp Tongues", "Foolish": "Chronicle of Poor Judgment", "Submissive": "Book of Obedience", "Artistic": "Canvas of Creation", "Sly": "Tome of Cunning Shadows", "Perceptive": "All-Seeing Manuscript", "Goth": "Grimoire of Darkness", "Nerd": "Encyclopedia of Knowledge", "Jock": "Manual of Athletic Prowess", "Prep": "Guide to Social Grace", "Dominant": "Tome of Command", "Lucky": "Scroll of Fortune's Favor", // Skills "Occult Expert": "Necronomicon Fragment" }>> <<set setup.getTraitTomeName = function(trait) { return setup.traitTomeNames[trait] || "Mysterious Tome of " + trait; }>> /* ===== PRICING AND DISCOUNTS ===== */ <<set setup.getLampreyDiscount = function() { var relationship = State.variables.relationships["Revna McKraken"] || {level: 1, points: 0}; var discounts = { 1: 0, // Stranger - no discount 2: 0.03, // Acquaintance - 3% discount 3: 0.07, // Friend - 7% discount 4: 0.12, // Close Friend - 12% discount 5: 0.20 // Best Friend - 20% discount }; return discounts[relationship.level] || 0; }>> <<set setup.calculateLampreyPrice = function(basePrice) { var v = State.variables; // ===== LIVING DOLL SPECIAL DISCOUNT ===== // Living Dolls get 60% off all tomes by default var livingDollDiscount = 0; if (v.physicalTraits && v.physicalTraits.includes("Living Doll")) { livingDollDiscount = 0.60; } // Get relationship discount var relationshipDiscount = setup.getLampreyDiscount(); // ===== SKILL TREE: Tome Discount ===== var skillTreeDiscount = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { skillTreeDiscount = setup.skillTree.getEffect("tomeDiscount") || 0; } // Convert percentage to decimal (e.g., 5 -> 0.05) var skillTreeDiscountDecimal = skillTreeDiscount / 100; // Combine discounts (additive) - Living Doll discount is separate/base var totalDiscount = livingDollDiscount + relationshipDiscount + skillTreeDiscountDecimal; // Cap total discount at 90% (Living Doll 60% + other bonuses can stack but not fully free) totalDiscount = Math.min(totalDiscount, 0.90); return Math.floor(basePrice * (1 - totalDiscount)); }>> /* Helper function to get just the skill tree discount for display */ <<set setup.getSkillTreeTomeDiscount = function() { var skillTreeDiscount = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { skillTreeDiscount = setup.skillTree.getEffect("tomeDiscount") || 0; } return skillTreeDiscount; // Return as percentage (e.g., 5 for 5%) }>> /* Helper function to get skill tree tome bonus for display */ <<set setup.getSkillTreeTomeBonus = function() { var bonus = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { bonus = setup.skillTree.getEffect("dailyTomeBonus") || 0; } return bonus; }>>
<<nobr>> <<set $lastLocation = "StripClubWorkStripper">> <!-- Achievement for working at strip club --> <<run setup.achievements.unlock("work_stripclub")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Stripper")>> <<run $jobsWorked.push("Stripper")>> <</if>> <!-- Initialize strip club work system --> <<if !$stripClubLastWorkDay>> <<set $stripClubLastWorkDay = 0>> <<set $stagePerformancesToday = 0>> <<set $mingleSessionsToday = 0>> <<set $privateShowsToday = 0>> <<set $maxStagePerformancesPerDay = 3>> <<set $maxMingleSessionsPerDay = 3>> <<set $maxPrivateShowsPerDay = 3>> <</if>> <!-- Reset daily counters if new day --> <<if $stripClubLastWorkDay !== $dayNumber>> <<set $stagePerformancesToday = 0>> <<set $mingleSessionsToday = 0>> <<set $privateShowsToday = 0>> <<set $stripClubLastWorkDay = $dayNumber>> <</if>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(157, 0, 255, 0.8), 0 0 40px rgba(255, 20, 147, 0.6);">💃 Stripper Shift</h1> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #9D00FF; box-shadow: 0 0 30px rgba(157, 0, 255, 0.4), inset 0 0 20px rgba(255, 20, 147, 0.2);"> <p style="color: #fff; font-size: 20px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The Electric Jelly Revue pulses with life. Bass throbs through the floor, lights sweep across eager faces in the crowd. The smell of perfume, alcohol, and excitement fills the air. </p> <p style="color: #D8BFD8; font-size: 18px; margin: 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> You're on the clock. Time to make some money. </p> </div> <!-- Daily Activity Tracker --> <div style="background: #1a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 30px; border: 3px solid #9D00FF; box-shadow: 0 0 20px rgba(157, 0, 255, 0.3);"> <h3 style="color: #9D00FF; margin: 0 0 15px 0; text-align: center; font-size: 20px;">Today's Activity</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Stage Performances --> <div style="background: #0a0a1a; padding: 15px; border-radius: 8px; border: 2px solid #9D00FF;"> <p style="color: #9D00FF; margin: 0 0 8px 0; font-weight: bold; font-size: 14px;">🎭 Stage Shows</p> <p style="color: #fff; margin: 0; font-size: 20px; font-weight: bold;"> <<print $stagePerformancesToday>> / <<print $maxStagePerformancesPerDay>> </p> <<if $stagePerformancesToday >= $maxStagePerformancesPerDay>> <p style="color: #ff6b6b; margin: 5px 0 0 0; font-size: 12px;">Exhausted</p> <<else>> <p style="color: #51cf66; margin: 5px 0 0 0; font-size: 12px;"><<print $maxStagePerformancesPerDay - $stagePerformancesToday>> remaining</p> <</if>> </div> <!-- Floor Mingling --> <div style="background: #0a0a1a; padding: 15px; border-radius: 8px; border: 2px solid #FFD700;"> <p style="color: #FFD700; margin: 0 0 8px 0; font-weight: bold; font-size: 14px;">💬 Floor Work</p> <p style="color: #fff; margin: 0; font-size: 20px; font-weight: bold;"> <<print $mingleSessionsToday>> / <<print $maxMingleSessionsPerDay>> </p> <<if $mingleSessionsToday >= $maxMingleSessionsPerDay>> <p style="color: #ff6b6b; margin: 5px 0 0 0; font-size: 12px;">Exhausted</p> <<else>> <p style="color: #51cf66; margin: 5px 0 0 0; font-size: 12px;"><<print $maxMingleSessionsPerDay - $mingleSessionsToday>> remaining</p> <</if>> </div> <!-- Private Shows --> <div style="background: #0a0a1a; padding: 15px; border-radius: 8px; border: 2px solid #FF1493;"> <p style="color: #FF1493; margin: 0 0 8px 0; font-weight: bold; font-size: 14px;">👤 Private Shows</p> <p style="color: #fff; margin: 0; font-size: 20px; font-weight: bold;"> <<print $privateShowsToday>> / <<print $maxPrivateShowsPerDay>> </p> <<if $privateShowsToday >= $maxPrivateShowsPerDay>> <p style="color: #ff6b6b; margin: 5px 0 0 0; font-size: 12px;">Exhausted</p> <<else>> <p style="color: #51cf66; margin: 5px 0 0 0; font-size: 12px;"><<print $maxPrivateShowsPerDay - $privateShowsToday>> remaining</p> <</if>> </div> </div> </div> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💋 Work Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 20px; margin-bottom: 30px;"> <!-- Dance on Stage --> <div style="border: 3px solid #9D00FF; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 20px rgba(157, 0, 255, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9D00FF, transparent); opacity: 0.6;"></div> <h4 style="color: #9D00FF; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(157, 0, 255, 0.8);">🎭 Dance on Stage</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Take the main stage under the spotlight. Choose your performance style and give the crowd a show they'll remember. The bigger the performance, the bigger the tips. </p> <<if $stagePerformancesToday >= $maxStagePerformancesPerDay>> <div style='background: linear-gradient(135deg, #666 0%, #444 100%); color: #999; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 16px; margin-top: 15px; border: 2px solid #555; cursor: not-allowed;'>Too Exhausted (<<print $stagePerformancesToday>>/<<print $maxStagePerformancesPerDay>>)</div> <<else>> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(157, 0, 255, 0.5); transition: all 0.3s;'>✨ Take the Stage (<<print $maxStagePerformancesPerDay - $stagePerformancesToday>> left)</div>">> <<goto "StripClubStagePerformance">> <</link>> <</if>> </div> <!-- Private Shows --> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 25px rgba(255, 20, 147, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h4 style="color: #FF1493; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);">👤 Private Shows</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Perform exclusive one-on-one shows in private rooms. More intimate, more intense, and much more lucrative. VIP customers pay top dollar for your personal attention. </p> <<if $privateShowsToday >= $maxPrivateShowsPerDay>> <div style='background: linear-gradient(135deg, #666 0%, #444 100%); color: #999; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 16px; margin-top: 15px; border: 2px solid #555; cursor: not-allowed;'>Too Exhausted (<<print $privateShowsToday>>/<<print $maxPrivateShowsPerDay>>)</div> <<else>> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6); transition: all 0.3s;'>🔥 Check for Requests (<<print $maxPrivateShowsPerDay - $privateShowsToday>> left)</div>">> <<goto "StripClubPrivateShows">> <</link>> <</if>> </div> <!-- Mingle with Customers --> <div style="border: 3px solid #FFD700; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); box-shadow: 0 0 20px rgba(255, 215, 0, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, transparent); opacity: 0.6;"></div> <h4 style="color: #FFD700; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 215, 0, 0.8);">💬 Mingle with Customers</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Work the floor with charm and charisma. Flirt, tease, and chat with patrons. Let your personality shine and watch the tips roll in from admirers who can't resist you. </p> <<if $mingleSessionsToday >= $maxMingleSessionsPerDay>> <div style='background: linear-gradient(135deg, #666 0%, #444 100%); color: #999; padding: 12px; border-radius: 8px; text-align: center; font-weight: bold; font-size: 16px; margin-top: 15px; border: 2px solid #555; cursor: not-allowed;'>Too Exhausted (<<print $mingleSessionsToday>>/<<print $maxMingleSessionsPerDay>>)</div> <<else>> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 215, 0, 0.5); transition: all 0.3s;'>🌟 Work the Floor (<<print $maxMingleSessionsPerDay - $mingleSessionsToday>> left)</div>">> <<goto "StripClubMingleCustomers">> <</link>> <</if>> </div> </div> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← End Shift</div>">> <<goto "StripClub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<workShift>> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubStagePerformance">> <!-- Initialize stage performance counter --> <<if !$stagePerformancesToday>> <<set $stagePerformancesToday = 0>> <<set $maxStagePerformancesPerDay = 3>> <</if>> <<set _canPerform = $stagePerformancesToday < $maxStagePerformancesPerDay>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FF1493; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8), 0 0 40px rgba(157, 0, 255, 0.6);">🎭 Take The Stage</h1> <!-- Atmospheric Scene Setting --> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.4), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <p style="color: #fff; font-size: 20px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The moment you step through the curtain, the bass pounds through your chest. Multicolored lights sweep across the stage in hypnotic patterns—purple, pink, electric blue. The pole gleams under the spotlight, beckoning. </p> <p style="color: #FFB6C1; font-size: 18px; margin: 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Eyes turn toward you from the crowd. Some hungry, some curious, all waiting. The music builds, heavy and sensual. Your skin tingles with anticipation. How will you seduce them tonight? </p> </div> <!-- Performance Counter --> <div style="background: #2a2a2a; border: 3px solid <<if _canPerform>>#4ade80<<else>>#ff6b6b<</if>>; padding: 20px; border-radius: 12px; margin-bottom: 25px; text-align: center; box-shadow: 0 0 20px <<if _canPerform>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <h3 style="color: <<if _canPerform>>#4ade80<<else>>#ff6b6b<</if>>; margin: 0 0 10px 0; text-shadow: 0 0 10px <<if _canPerform>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> Stage Performances Today: <<print $stagePerformancesToday>> / <<print $maxStagePerformancesPerDay>> </h3> <<if !_canPerform>> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> You've performed enough for today. The stage needs a rest, and so do you. </p> <</if>> </div> <<if _canPerform>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💋 Choose Your Performance</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-top: 20px; margin-bottom: 30px;"> <!-- Remove Top --> <div style="border: 3px solid #FF69B4; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); box-shadow: 0 0 20px rgba(255, 105, 180, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; transition: all 0.3s; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF69B4, transparent); opacity: 0.6;"></div> <h4 style="color: #FF69B4; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 105, 180, 0.8);">👚 Tease & Reveal</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Slowly peel away your top while grinding to the rhythm. Let them see glimpses of skin, building their desire with every teasing movement. Your hands trace your curves as fabric slides away... </p> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid rgba(255, 105, 180, 0.3);"> <p style="color: #FFB6C1; font-size: 13px; margin: 0 0 5px 0; font-style: italic;"> ⭐ Moderate tips • Charisma 40+ • Dexterity 35+ </p> <p style="color: #FFD700; font-size: 14px; margin: 0; font-weight: bold;"> 💰 Potential: $30-90 </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF69B4 0%, #FF1493 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 12px; box-shadow: 0 0 15px rgba(255, 105, 180, 0.5); transition: all 0.3s;'>💕 Tease Them</div>">> <<goto "StripClubPerformRemoveTop">> <</link>> </div> <!-- Strip Completely --> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 25px rgba(255, 20, 147, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; transition: all 0.3s; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h4 style="color: #FF1493; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);">🔥 Full Exposure</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Give them everything. Strip down piece by piece until you're completely bare, body glistening under the lights. Show them your most intimate curves while moving with uninhibited sensuality. No holding back. </p> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid rgba(255, 20, 147, 0.3);"> <p style="color: #FFB6C1; font-size: 13px; margin: 0 0 5px 0; font-style: italic;"> ⭐⭐⭐ Maximum tips • Charisma 60+ • Dexterity 50+ </p> <p style="color: #FFD700; font-size: 14px; margin: 0; font-weight: bold;"> 💰 Potential: $75-300 </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 12px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6); transition: all 0.3s;'>🔥 Strip Naked</div>">> <<goto "StripClubPerformStripFull">> <</link>> </div> <!-- Pole Dance --> <div style="border: 3px solid #9D00FF; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 20px rgba(157, 0, 255, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; transition: all 0.3s; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9D00FF, transparent); opacity: 0.6;"></div> <h4 style="color: #9D00FF; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(157, 0, 255, 0.8);">💫 Acrobatic Seduction</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Grip the chrome pole and let your body become art. Spin, climb, and arch your back in gravity-defying moves. Every muscle flexing, every curve on display as you twist and spiral with athletic grace. </p> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid rgba(157, 0, 255, 0.3);"> <p style="color: #D8BFD8; font-size: 13px; margin: 0 0 5px 0; font-style: italic;"> ⭐⭐ High tips • Dexterity 70+ • Strength 65+ </p> <p style="color: #FFD700; font-size: 14px; margin: 0; font-weight: bold;"> 💰 Potential: $50-250 </p> </div> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 12px; box-shadow: 0 0 15px rgba(157, 0, 255, 0.5); transition: all 0.3s;'>✨ Work The Pole</div>">> <<goto "StripClubPerformPole">> <</link>> </div> <!-- Freestyle --> <div style="border: 3px solid #FFD700; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); box-shadow: 0 0 20px rgba(255, 215, 0, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; transition: all 0.3s; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, transparent); opacity: 0.6;"></div> <h4 style="color: #FFD700; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 215, 0, 0.8);">✨ Improvised Desire</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 auto 0; line-height: 1.5;"> Let the music flow through you. No routine, just raw sensuality and instinct. Sway your hips, arch your back, lock eyes with the audience. Make them feel like you're dancing only for them, responding to their energy. </p> <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid rgba(255, 215, 0, 0.3);"> <p style="color: #FFE4B5; font-size: 13px; margin: 0 0 5px 0; font-style: italic;"> ⭐⭐ Variable tips • Charisma 55+ • Dexterity 45+ </p> <p style="color: #FFD700; font-size: 14px; margin: 0; font-weight: bold;"> 💰 Potential: $40-200 </p> </div> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 12px; box-shadow: 0 0 15px rgba(255, 215, 0, 0.5); transition: all 0.3s;'>🌟 Let Loose</div>">> <<goto "StripClubPerformFreestyle">> <</link>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 0 20px rgba(255, 107, 107, 0.3); text-align: center;"> <p style="color: #ff6b6b; font-size: 18px; margin: 0;"> You've performed on stage enough for today. Your body needs rest. </p> </div> <</if>> <!-- Pulsing light effect --> <style> @keyframes glow-pulse { 0%, 100% { box-shadow: 0 0 20px rgba(255, 20, 147, 0.3); } 50% { box-shadow: 0 0 35px rgba(255, 20, 147, 0.6); } } </style> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← Step Off Stage</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPrivateShows">> <!-- Initialize private show variables --> <<if !$privateShowsToday>> <<set $privateShowsToday = 0>> <<set $maxPrivateShowsPerDay = 3>> <</if>> <<set _canTakeShow = $privateShowsToday < $maxPrivateShowsPerDay>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FF1493; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8), 0 0 40px rgba(157, 0, 255, 0.6);">👤 Private Shows</h1> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.4), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <p style="color: #fff; font-size: 20px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The VIP section is where the real money gets made. Behind velvet curtains and locked doors, wealthy clients pay premium prices for your exclusive attention. No crowd, no distractions—just you and them. </p> <p style="color: #FFB6C1; font-size: 18px; margin: 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> What they do with that time is up to you... and what you're willing to offer. </p> </div> <!-- Shows Performed Today Counter --> <div style="background: #2a2a2a; border: 3px solid <<if _canTakeShow>>#4ade80<<else>>#ff6b6b<</if>>; padding: 20px; border-radius: 12px; margin-bottom: 25px; text-align: center; box-shadow: 0 0 20px <<if _canTakeShow>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <h3 style="color: <<if _canTakeShow>>#4ade80<<else>>#ff6b6b<</if>>; margin: 0 0 10px 0; text-shadow: 0 0 10px <<if _canTakeShow>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> Private Shows Today: <<print $privateShowsToday>> / <<print $maxPrivateShowsPerDay>> </h3> <<if !_canTakeShow>> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> You've reached your daily limit. Your body needs rest. </p> <</if>> </div> <<if _canTakeShow>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">💎 Available Show Types</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 30px;"> <!-- Lap Dance - REDUCED --> <div style="border: 3px solid #FF69B4; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); box-shadow: 0 0 20px rgba(255, 105, 180, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF69B4, transparent); opacity: 0.6;"></div> <h4 style="color: #FF69B4; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 105, 180, 0.8);">💋 Lap Dance</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Grind on their lap, run your hands over your body, let them feel the heat radiating off you. Close contact, no touching (unless you allow it). </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $50-150 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Charisma 35, Dexterity 30 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 15 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF69B4 0%, #FF1493 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 105, 180, 0.5);'>💕 Accept Request</div>">> <<set $privateShowType = "lapdance">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <!-- Intimate Dance - REDUCED --> <div style="border: 3px solid #FFD700; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); box-shadow: 0 0 20px rgba(255, 215, 0, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, transparent); opacity: 0.6;"></div> <h4 style="color: #FFD700; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 215, 0, 0.8);">✨ Intimate Dance</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Dance close, bodies nearly touching. Eye contact, whispered words, sensual movements. More connection than performance. The lines blur between dancer and client. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $60-175 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Charisma 35, Dexterity 35 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 20 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 215, 0, 0.5);'>💛 Accept Request</div>">> <<set $privateShowType = "intimate">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <!-- Sensual Tease --> <div style="border: 3px solid #C71585; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 20px rgba(199, 21, 133, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #C71585, transparent); opacity: 0.6;"></div> <h4 style="color: #C71585; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(199, 21, 133, 0.8);">🌹 Sensual Tease</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> A slow, intimate striptease just for them. Remove each piece deliberately, touch yourself sensually, make them ache with want. Pure visual seduction. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $100-250 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Charisma 55, Dexterity 50 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 20 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #C71585 0%, #8B008B 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(199, 21, 133, 0.5);'>🌹 Accept Request</div>">> <<set $privateShowType = "tease">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <!-- Pole Performance --> <div style="border: 3px solid #9D00FF; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 20px rgba(157, 0, 255, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9D00FF, transparent); opacity: 0.6;"></div> <h4 style="color: #9D00FF; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(157, 0, 255, 0.8);">💫 Private Pole Show</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Give them an exclusive acrobatic performance. Spins, inversions, floor work—show off your athletic prowess in an intimate setting with just one set of eyes watching. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $125-300 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Dexterity 65, Strength 60 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 20 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(157, 0, 255, 0.5);'>✨ Accept Request</div>">> <<set $privateShowType = "pole">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <!-- Roleplay Fantasy --> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); box-shadow: 0 0 25px rgba(255, 20, 147, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h4 style="color: #FF1493; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);">🎭 Roleplay Fantasy</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Become their fantasy. Play a character, act out a scenario. This is equal parts performance art and seduction. Requires creativity and acting skills. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $150-350 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Charisma 75, Intelligence 70 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 30 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6);'>🎭 Accept Request</div>">> <<set $privateShowType = "roleplay">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <!-- Full Service (Optional Sex) --> <div style="border: 3px solid #DC143C; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a0a 0%, #2a0a0a 100%); box-shadow: 0 0 25px rgba(220, 20, 60, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #DC143C, transparent); opacity: 0.6;"></div> <h4 style="color: #DC143C; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(220, 20, 60, 0.8);">🔥 Full Experience</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Everything they desire. Dance, touch, and more if you're willing. The rules are yours to set, but they're paying for complete satisfaction. This is where boundaries get negotiated. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Base Pay:</span> $200-500 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Requirements:</span> Charisma 90 </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Duration:</span> 45 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #DC143C 0%, #8B0000 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(220, 20, 60, 0.6);'>🔥 Accept Request</div>">> <<set $privateShowType = "fullservice">> <<goto "StripClubPrivateShowPerform">> <</link>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 0 20px rgba(255, 107, 107, 0.3); text-align: center;"> <p style="color: #ff6b6b; font-size: 18px; margin: 0;"> You've completed your maximum number of private shows for today. Rest up and come back tomorrow. </p> </div> <</if>> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← Back to Shift</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubMingleCustomers">> <!-- Initialize mingling variables - REDUCED TO 3 --> <<if !$mingleSessionsToday>> <<set $mingleSessionsToday = 0>> <<set $maxMingleSessionsPerDay = 3>> <</if>> <<set _canMingle = $mingleSessionsToday < $maxMingleSessionsPerDay>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 215, 0, 0.8), 0 0 40px rgba(255, 165, 0, 0.6);">💬 Work the Floor</h1> <div style="padding: 30px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FFD700; box-shadow: 0 0 30px rgba(255, 215, 0, 0.4), inset 0 0 20px rgba(255, 165, 0, 0.2);"> <p style="color: #fff; font-size: 20px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The club floor buzzes with activity. Customers nurse their drinks, eyes roaming hungrily. This is where charm and conversation translate directly into cash. Make them laugh, make them feel special, and watch the tips accumulate. </p> <p style="color: #FFE4B5; font-size: 18px; margin: 0; line-height: 1.6; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Every smile, every touch, every whispered word is an opportunity. Work smart, work sexy. </p> </div> <!-- Sessions Counter --> <div style="background: #2a2a2a; border: 3px solid <<if _canMingle>>#4ade80<<else>>#ff6b6b<</if>>; padding: 20px; border-radius: 12px; margin-bottom: 25px; text-align: center; box-shadow: 0 0 20px <<if _canMingle>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <h3 style="color: <<if _canMingle>>#4ade80<<else>>#ff6b6b<</if>>; margin: 0 0 10px 0; text-shadow: 0 0 10px <<if _canMingle>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> Floor Sessions Today: <<print $mingleSessionsToday>> / <<print $maxMingleSessionsPerDay>> </h3> <<if !_canMingle>> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> You've worked the floor enough for today. Your charm needs recharging. </p> <</if>> </div> <<if _canMingle>> <h2 style="color: #FF69B4; text-align: center; font-size: 28px; margin-bottom: 25px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.6);">👥 Available Customers</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 30px;"> <!-- Shy Regular - REDUCED --> <div style="border: 3px solid #87CEEB; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #0a1a2a 100%); box-shadow: 0 0 20px rgba(135, 206, 235, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #87CEEB, transparent); opacity: 0.6;"></div> <h4 style="color: #87CEEB; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(135, 206, 235, 0.8);">😊 Shy Regular</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> A nervous customer who's been here a few times but never really talked to anyone. Gentle conversation and reassurance. Easy to please, modest tips. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $13-38 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 30+ </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 10 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #87CEEB 0%, #4682B4 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(135, 206, 235, 0.5);'>💙 Approach Them</div>">> <<set $mingleCustomerType = "shy">> <<goto "StripClubMingleInteraction">> <</link>> </div> <!-- Big Spender --> <div style="border: 3px solid #FFD700; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); box-shadow: 0 0 25px rgba(255, 215, 0, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FFD700, transparent); opacity: 0.6;"></div> <h4 style="color: #FFD700; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 215, 0, 0.8);">💎 Big Spender</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Well-dressed, confident, expensive watch. They know what they want and have money to burn. Flirt hard, be impressive, and you'll be rewarded generously. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $75-200 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 50+, Attractive trait </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 15 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.6);'>✨ Approach Them</div>">> <<set $mingleCustomerType = "spender">> <<goto "StripClubMingleInteraction">> <</link>> </div> <!-- Bachelor Party - REDUCED --> <div style="border: 3px solid #FF6347; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a0a 0%, #2a0a0a 100%); box-shadow: 0 0 20px rgba(255, 99, 71, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF6347, transparent); opacity: 0.6;"></div> <h4 style="color: #FF6347; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 99, 71, 0.8);">🎉 Bachelor Party</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> Rowdy group celebrating. They're loud, drunk, and looking for a good time. Entertain the whole table, play along with their energy. Group tips can add up fast. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $25-75 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 40+, High energy </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 20 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF6347 0%, #DC143C 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 99, 71, 0.5);'>🎊 Approach Them</div>">> <<set $mingleCustomerType = "bachelor">> <<goto "StripClubMingleInteraction">> <</link>> </div> <!-- Lonely Businessman - REDUCED --> <div style="border: 3px solid #9370DB; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); box-shadow: 0 0 20px rgba(147, 112, 219, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #9370DB, transparent); opacity: 0.6;"></div> <h4 style="color: #9370DB; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(147, 112, 219, 0.8);">💼 Lonely Businessman</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> In town for business, stressed and isolated. They want connection more than sex. Listen, empathize, make them feel understood. Good conversation pays. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $30-88 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 45+, Intelligence 35+ </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 15 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #9370DB 0%, #6A5ACD 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(147, 112, 219, 0.5);'>💜 Approach Them</div>">> <<set $mingleCustomerType = "businessman">> <<goto "StripClubMingleInteraction">> <</link>> </div> <!-- Couple --> <div style="border: 3px solid #FF69B4; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); box-shadow: 0 0 20px rgba(255, 105, 180, 0.3), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF69B4, transparent); opacity: 0.6;"></div> <h4 style="color: #FF69B4; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 105, 180, 0.8);">💕 Adventurous Couple</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> They're here together, looking to spice things up. Navigate carefully—flirt with both, make neither jealous. Threeway conversation dynamics. High risk, high reward. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $90-225 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 65+, Seductive trait </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 20 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF69B4 0%, #FF1493 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 15px rgba(255, 105, 180, 0.5);'>💕 Approach Them</div>">> <<set $mingleCustomerType = "couple">> <<goto "StripClubMingleInteraction">> <</link>> </div> <!-- VIP High Roller --> <div style="border: 3px solid #FF1493; border-radius: 15px; padding: 20px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); box-shadow: 0 0 25px rgba(255, 20, 147, 0.4), 0 8px 16px rgba(0,0,0,0.6); display: flex; flex-direction: column; position: relative; overflow: hidden;"> <div style="position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, #FF1493, transparent); opacity: 0.6;"></div> <h4 style="color: #FF1493; margin: 0 0 12px 0; font-size: 22px; text-shadow: 0 0 10px rgba(255, 20, 147, 0.8);">👑 VIP High Roller</h4> <p style="color: #ddd; font-size: 15px; margin: 0 0 15px 0; line-height: 1.5;"> The club's biggest whale. Demanding, particular, expects perfection. You need to be at your absolute best. Fail and you get nothing. Succeed and you'll make bank. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: auto;"> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #FFD700;">💰 Potential Tips:</span> $125-300 </p> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0;"> <span style="color: #60a5fa;">📊 Best Approach:</span> Charisma 80+, Multiple traits </p> <p style="color: #aaa; font-size: 13px; margin: 0;"> <span style="color: #9D00FF;">⏱️ Time:</span> 25 minutes </p> </div> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; margin-top: 15px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6);'>👑 Approach Them</div>">> <<set $mingleCustomerType = "vip">> <<goto "StripClubMingleInteraction">> <</link>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 0 20px rgba(255, 107, 107, 0.3); text-align: center;"> <p style="color: #ff6b6b; font-size: 18px; margin: 0;"> You've worked the floor enough for today. Give yourself a break. </p> </div> <</if>> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 14px 35px; border-radius: 10px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #888;'>← Back to Shift</div>">> <<goto "StripClubWorkStripper">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Brothel">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #007FFF; text-align: center;">👑 Brothel Management</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/BrothelOffice.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Management Office"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 18px; margin: 0;"> Your private office overlooks the main floor through one-way glass. Leather furniture, a polished mahogany desk, and walls lined with financial reports and security monitors. From here, you control every aspect of the Azure Angelfish Lounge. </p> </div> <h2 style="color: #007FFF;">Management Options</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- View Finances --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">💰 View Finances</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Review income, expenses, and overall profitability of your establishment.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Staff Management --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">👥 Staff Management</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Hire, fire, and manage your workers. Review their performance and assign schedules.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Upgrade Facilities --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">🏗️ Upgrade Facilities</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Improve rooms, add amenities, and expand your establishment to attract higher-paying clients.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Set Pricing --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">💵 Set Pricing</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Adjust service prices to maximize profit while maintaining clientele.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Performance Reviews --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">📊 Performance Reviews</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Analyze worker performance metrics, client satisfaction, and revenue per employee.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Marketing & Advertising --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">📢 Marketing</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Run advertising campaigns and promotions to attract new clients and boost reputation.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Security & Discretion --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">🔒 Security</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Manage security systems, background checks, and maintain client discretion protocols.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Special Services --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; min-height: 180px;"> <h4 style="color: #888; margin: 0 0 10px 0;">✨ Special Services</h4> <p style="color: #777; font-size: 14px; margin: 0 0 auto 0; line-height: 1.4;">Develop and manage premium, exclusive services for VIP clientele.</p> <div style='background: #555; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Brothel Floor</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Get Mayor's Gender --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _mayorGender = "unknown">> <<if _mayorNPCs.length > 0>> <<set _mayorGender = _mayorNPCs[0].bodyParts.gender>> <</if>> <!-- Calculate Attractiveness Score --> <<set _attractiveTraits = ["Attractive", "Curvy", "Voluptuous", "Charming", "Seductive", "Alluring", "Flirty", "Smooth Skin", "Youthful", "Graceful", "Fashionable", "Warm", "Charismatic Voice", "Smooth Voice"]>> <<set _masculineTraits = ["Muscular", "Broad-shouldered", "Strong", "Athletic Build", "Sturdy", "Jock", "Fit", "Lean"]>> <<set _feminineTraits = ["Curvy", "Voluptuous", "Soft", "Graceful", "Petite", "Youthful", "Smooth Skin"]>> <<set _attractivenessScore = 0>> <<set _masculinityScore = 0>> <<set _femininityScore = 0>> <<for _trait range _attractiveTraits>> <<if $physicalTraits.includes(_trait) || $mentalTraits.includes(_trait)>> <<set _attractivenessScore += 1>> <</if>> <</for>> <<for _trait range _masculineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _masculinityScore += 1>> <</if>> <</for>> <<for _trait range _feminineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _femininityScore += 1>> <</if>> <</for>> <!-- Check for sexual traits --> <<set _sexualTraits = ["Oral Expert", "Anal Expert", "Dirty Talker", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Exhibitionist", "Rough Sex Enthusiast", "Sensual Lover", "Roleplay Expert", "Tantric Master", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]>> <<set _hasSexualTraits = false>> <<set _sexualTraitCount = 0>> <<for _trait range _sexualTraits>> <<if $skills.includes(_trait)>> <<set _hasSexualTraits = true>> <<set _sexualTraitCount += 1>> <</if>> <</for>> <!-- Chest size bonus for female player with male mayor --> <<set _chestBonus = 0>> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _chestSizes = ["flat", "small", "medium", "large", "huge", "giant"]>> <<set _chestIndex = _chestSizes.indexOf($bodyParts.chest.toLowerCase())>> <<if _chestIndex >= 0>> <<set _chestBonus = _chestIndex * 5>> <</if>> <</if>> <!-- Calculate base erotic task chance --> <<set _eroticChance = 20>> <!-- Sexual traits increase erotic chance --> <<if _hasSexualTraits>> <<set _eroticChance += (_sexualTraitCount * 5)>> <</if>> <!-- Gender-based modifiers --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticChance += (_attractivenessScore * 5) + (_femininityScore * 5) + _chestBonus>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticChance += (_attractivenessScore * 5) + (_masculinityScore * 8)>> <<elseif $bodyParts.gender === _mayorGender>> <!-- Same gender - requires high attractiveness + specific traits --> <<if $bodyParts.gender === "male" && $mentalTraits.includes("Femboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<elseif $bodyParts.gender === "female" && $mentalTraits.includes("Tomboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<else>> <<set _eroticChance = 0>> <</if>> <!-- Add sexual trait bonus for same gender --> <<if _eroticChance > 0 && _hasSexualTraits>> <<set _eroticChance += (_sexualTraitCount * 5)>> <</if>> <</if>> <!-- Sunfish trait override --> <<if $skills.includes("Sunfish")>> <<set _eroticChance = 95>> <<else>> <!-- Cap at 85% for non-Sunfish players --> <<if _eroticChance > 85>> <<set _eroticChance = 85>> <</if>> <</if>> <!-- Determine task type --> <<set _taskRoll = random(1, 100)>> <<set _isEroticTask = _taskRoll <= _eroticChance>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<run setup.achievements.unlock("stalked_10_times")>> <<goto "TheAlter">> <</if>> <!-- Calculate erotic payment based on traits (75-250) --> <<set _traitPaymentScore = _attractivenessScore + _masculinityScore + _femininityScore + (_chestBonus / 5)>> <<set _eroticPay = Math.floor(75 + (_traitPaymentScore * 12))>> <<if _eroticPay > 250>> <<set _eroticPay = 250>> <</if>> <!-- Generate Task --> <<if !_isEroticTask>> <!-- NORMAL TASK --> <<set _normalTasks = [ {desc: "file paperwork and organize the mayor's schedule", pay: 30}, {desc: "answer phone calls and respond to emails", pay: 25}, {desc: "prepare meeting notes and agendas", pay: 35}, {desc: "coordinate with other city departments", pay: 40}, {desc: "review and proofread city documents", pay: 30}, {desc: "manage the mayor's calendar and appointments", pay: 35}, {desc: "order office supplies and maintain inventory", pay: 25}, {desc: "greet visitors and direct them appropriately", pay: 30} ]>> <<set _task = _normalTasks.random()>> <<set _taskType = "normal">> <<else>> <!-- EROTIC TASK --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticTasks = [ {desc: "sit on the mayor's lap during a 'private meeting'", pay: _eroticPay, passage: "SecretaryEroticLap", taskId: "lap"}, {desc: "massage the mayor's shoulders while he works", pay: _eroticPay, passage: "SecretaryEroticMassage", taskId: "massage"}, {desc: "wear a more 'professional' outfit the mayor has selected", pay: _eroticPay, passage: "SecretaryEroticOutfit", taskId: "outfit"}, {desc: "take dictation while sitting very close to the mayor", pay: _eroticPay, passage: "SecretaryEroticDictation", taskId: "dictation"}, {desc: "help the mayor 'relieve stress' under his desk", pay: _eroticPay, passage: "SecretaryEroticDesk", taskId: "desk"}, {desc: "model the new 'city uniform' for the mayor's approval", pay: _eroticPay, passage: "SecretaryEroticModel", taskId: "modeling"}, {desc: "give the mayor a 'special presentation' behind closed doors", pay: _eroticPay, passage: "SecretaryEroticPresentation", taskId: "presentation"} ]>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticTasks = [ {desc: "let the mayor admire your physique during a 'fitness consultation'", pay: _eroticPay, passage: "SecretaryEroticPhysique", taskId: "fitness"}, {desc: "assist the mayor with 'personal stress relief'", pay: _eroticPay, passage: "SecretaryEroticRelief", taskId: "relief"}, {desc: "provide the mayor with a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageFemale", taskId: "massage2"}, {desc: "model swimwear for the mayor's 'aquatics initiative review'", pay: _eroticPay, passage: "SecretaryEroticSwimwear", taskId: "swimwear"}, {desc: "help the mayor with 'personal satisfaction' in her private office", pay: _eroticPay, passage: "SecretaryEroticSatisfaction", taskId: "satisfaction"}, {desc: "demonstrate your strength by lifting the mayor", pay: _eroticPay, passage: "SecretaryEroticLift", taskId: "strength"}, {desc: "provide 'intimate assistance' as requested", pay: _eroticPay, passage: "SecretaryEroticAssist", taskId: "assistance"} ]>> <<else>> <!-- Same gender tasks --> <<set _eroticTasks = [ {desc: "help the mayor with a 'private wardrobe consultation'", pay: _eroticPay, passage: "SecretaryEroticWardrobe", taskId: "wardrobe"}, {desc: "provide the mayor with 'personal companionship'", pay: _eroticPay, passage: "SecretaryEroticCompanion", taskId: "companionship"}, {desc: "give the mayor a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageSame", taskId: "massage3"}, {desc: "model clothing for the mayor's review", pay: _eroticPay, passage: "SecretaryEroticModelSame", taskId: "fashion"}, {desc: "assist with the mayor's 'special needs'", pay: _eroticPay, passage: "SecretaryEroticNeeds", taskId: "needs"} ]>> <</if>> <<set _task = _eroticTasks.random()>> <<set _taskType = "erotic">> <!-- Apply sexual trait bonuses to payment --> <<set _paymentBonus = 0>> <!-- Check for trait-specific bonuses based on task type --> <<if _task.taskId === "lap" || _task.taskId === "dictation">> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 30>> <</if>> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 25>> <</if>> <<elseif _task.taskId === "massage" || _task.taskId === "massage2" || _task.taskId === "massage3">> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "outfit" || _task.taskId === "modeling" || _task.taskId === "presentation" || _task.taskId === "fitness" || _task.taskId === "swimwear" || _task.taskId === "wardrobe" || _task.taskId === "fashion">> <<if $skills.includes("Exhibitionist")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "desk" || _task.taskId === "relief">> <<if $skills.includes("Oral Expert")>> <<set _paymentBonus += 45>> <</if>> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 25>> <</if>> <<elseif _task.taskId === "satisfaction" || _task.taskId === "needs">> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 30>> <</if>> <<if $skills.includes("Rough Sex Enthusiast")>> <<set _paymentBonus += 35>> <</if>> <<elseif _task.taskId === "strength">> <<if $skills.includes("Sexual Stamina Expert")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "assistance">> <<if $skills.includes("Rough Sex Enthusiast")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "companionship">> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 35>> <</if>> <</if>> <!-- Apply bonus to task payment --> <<set _task.pay += _paymentBonus>> <!-- Trophy Wife 2x cash bonus for secretary sexual acts --> <<if $physicalTraits.includes("Trophy Wife")>> <<set _task.pay = _task.pay * 2>> <</if>> <!-- Slut 2x cash bonus for secretary sexual acts --> <<if $physicalTraits.includes("Slut")>> <<set _task.pay = _task.pay * 2>> <</if>> <!-- Cap at 1400 (increased to accommodate Slut bonus) --> <<if _task.pay > 1400>> <<set _task.pay = 1400>> <</if>> <</if>> <!-- Store task info globally for sub-passages --> <<set $currentTask = _task>> <<set $currentTaskType = _taskType>> <!-- Check for forced acceptance (Bimbo/Submissive) --> <<set _canRefuse = true>> <<set _forceAcceptChance = 0>> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 75>> <<elseif $mentalTraits.includes("Bimbo") || $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 50>> <</if>> <<set _forcedAcceptance = false>> <<if _forceAcceptChance > 0 && random(1, 100) <= _forceAcceptChance>> <<set _forcedAcceptance = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✨ Special Assignment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> You enter the mayor's private office. The door closes behind you with a soft click. </p> </div> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of the office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Task Description --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; margin-top: 0;">The Mayor's Request</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 16px; margin: 0;"> The mayor asks you to <strong style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>;"><<print _task.desc>></strong>. </p> <<if _taskType === "erotic">> <p style="color: #ffc107; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> This definitely wasn't in your job description... </p> <</if>> </div> <div style="margin-top: 20px; padding: 15px; background: #1a1a1a; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0;"> Payment: <strong>$<<print _task.pay>></strong> </p> <<if _taskType === "erotic">> <p style="color: #ff6b6b; font-size: 14px; margin: 5px 0 0 0;"> Refusing will result in reduced pay ($<<print Math.floor(_task.pay * 0.3)>>) </p> <</if>> </div> </div> <!-- Decision Options --> <<if _forcedAcceptance && _taskType === "erotic">> <!-- Forced Acceptance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ff6b6b; font-size: 16px; text-align: center; margin: 0 0 15px 0; font-style: italic;"> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> Your submissive nature and scattered thoughts make it impossible to refuse. You find yourself nodding automatically. <<else>> Something about the request makes you unable to say no. Your body moves on its own. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Comply</div>">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Secretary")>> <<run $jobsWorked.push("Secretary")>> <</if>> <<goto _task.passage>> <</link>> </div> <<else>> <!-- Normal Choice --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Accept --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ Accept</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Do as the mayor requests </p> <<if _taskType === "erotic">> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Secretary")>> <<run $jobsWorked.push("Secretary")>> <</if>> <<goto _task.passage>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Secretary")>> <<run $jobsWorked.push("Secretary")>> <</if>> <<set $money += _task.pay>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<goto "SecretaryTaskResult">> <</link>> <</if>> </div> <!-- Refuse --> <<if _taskType === "erotic">> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">✗ Refuse</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Politely decline </p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Refuse Task</div>">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Secretary")>> <<run $jobsWorked.push("Secretary")>> <</if>> <<set $money += Math.floor(_task.pay * 0.3)>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<set $refusedTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> <</if>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Initialize daily mayor work hours if it doesn't exist --> <<if !$mayorHoursWorkedToday>> <<set $mayorHoursWorkedToday = 0>> <</if>> <!-- Initialize mayor salary if it doesn't exist --> <<if !$mayorWeeklySalaryAvailable>> <<set $mayorWeeklySalaryAvailable = 0>> <</if>> <!-- Check for midnight Sunday Alter event (BEFORE time advances) --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <<if $dayOfWeek === "Sunday" && _currentHour === 0 && random(1, 100) <= 10>> <<goto "TheAlter">> <</if>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<run setup.achievements.unlock("stalked_10_times")>> <<goto "TheAlter">> <</if>> <!-- Only advance time and increment hours if coming from outside (not from task result) --> <<set _justWorked = false>> <<if !$comingFromTaskResult>> <<run window.advanceTime(60)>> <<set $mayorHoursWorkedToday += 1>> <<set _justWorked = true>> <</if>> <<set $comingFromTaskResult = false>> <!-- Check for Corrupt trait gain (5% chance when completing 4th hour) --> <<set _gainedCorrupt = false>> <<if _justWorked && $mayorHoursWorkedToday === 4>> <<if random(1, 100) <= 5>> <<if !$mentalTraits.includes("Corrupt")>> <<set $mentalTraits.push("Corrupt")>> <<set _gainedCorrupt = true>> <</if>> <</if>> <</if>> <!-- Generate fake work task --> <<set _fakeWorkTasks = [ "create a comprehensive report on the city's imaginary budget surplus", "organize files that are already perfectly organized", "schedule meetings that will never actually happen", "proofread documents that don't need proofreading", "draft memos about initiatives that don't exist", "compile statistics on non-existent city projects", "review proposals that have already been approved", "research topics that aren't relevant to anything", "prepare presentations for cancelled meetings", "file paperwork in triplicate for no reason" ]>> <<set _assignedTask = _fakeWorkTasks.random()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👑 Mayoral Duties</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> You sit in your luxurious office, contemplating what meaningless busywork to assign today. The leather chair is comfortable. The view is excellent. The salary is generous. </p> </div> <!-- Corrupt Trait Gained Notification --> <<if _gainedCorrupt>> <div style="background: #3a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255,107,107,0.3);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">⚠️ TRAIT GAINED ⚠️</h3> <p style="color: #ff8787; font-size: 16px; margin: 0; text-align: center; font-weight: bold;"> You've gained the "Corrupt" trait! </p> <p style="color: #ffc9c9; font-size: 14px; margin: 10px 0 0 0; text-align: center; font-style: italic;"> All this power and no oversight... it's starting to affect you. </p> </div> <</if>> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of your office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Weekly Salary Withdrawal --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _baseSalary = $mayorWeeklySalaryAvailable>> <<set _displaySalary = _pearlActive && _baseSalary > 0 ? 1500 : (_baseSalary > 0 ? 1000 : 0)>> <<set _pearlBonus = _pearlActive && _baseSalary > 0 ? 500 : 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#666<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#888<</if>>; margin-top: 0;">💰 Weekly Salary</h2> <<if _pearlActive && $mayorWeeklySalaryAvailable > 0>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 12px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #7dd3fc; box-shadow: 0 0 15px rgba(125, 211, 252, 0.4);"> <p style="color: white; margin: 0; text-align: center; font-size: 14px; font-weight: bold;"> 🐚 The Pearl of Abundance increases your salary by $500! 🐚 </p> </div> <</if>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 18px; text-align: center; margin: 0 0 10px 0;"> Available to Withdraw: <strong style="color: <<if $mayorWeeklySalaryAvailable > 0>>#51cf66<<else>>#888<</if>>;">$<<print _displaySalary>></strong> <<if _pearlActive && $mayorWeeklySalaryAvailable > 0>> <span style="color: #7dd3fc; font-size: 14px;">(+$500)</span> <</if>> </p> <<if $mayorWeeklySalaryAvailable > 0>> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Your weekly salary of $1,000 + Pearl Bonus $500 is ready to collect. </p> <<else>> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Your weekly salary of $1,000 is ready to collect. </p> <</if>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Withdraw Salary</div>">> <<if _pearlActive>> <<set $money += 1500>> <<else>> <<set $money += $mayorWeeklySalaryAvailable>> <</if>> <<set $mayorWeeklySalaryAvailable = 0>> <<goto "MayorWork">> <</link>> <<else>> <p style="color: #888; font-size: 14px; text-align: center; margin: 0; font-style: italic;"> Your next salary will be available on Monday. </p> <</if>> </div> </div> <!-- Work Completed --> <<if _justWorked>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #FFD700; margin-top: 0;">Task Assigned</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid #FFD700; text-align: center;"> <p style="color: #ccc; font-size: 16px; margin: 0; line-height: 1.6;"> You assigned your secretary to <strong style="color: #FFD700;"><<print _assignedTask>></strong>. </p> <p style="color: #888; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> They don't question it. They just nod and get to work on the pointless task. </p> </div> </div> <</if>> <!-- Hours Worked Today --> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid <<if $mayorHoursWorkedToday >= 4>>#ff6b6b<<else>>#4dabf7<</if>>;"> <p style="color: <<if $mayorHoursWorkedToday >= 4>>#ff6b6b<<else>>#4dabf7<</if>>; font-size: 18px; text-align: center; margin: 0;"> Hours "Worked" Today: <strong>$mayorHoursWorkedToday/4</strong> </p> <<if $mayorHoursWorkedToday >= 4>> <p style="color: #ffc107; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> You've reached your daily quota of appearing busy. </p> <</if>> </div> <!-- Action Buttons --> <<if $mayorHoursWorkedToday < 4>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Continue Working --> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #FFD700; margin: 0 0 10px 0; text-align: center;">🔄 Assign More Busywork</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Keep up appearances </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Delegate More Work</div>">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("City Mayor")>> <<run $jobsWorked.push("City Mayor")>> <</if>> <<goto "MayorWork">> <</link>> </div> <!-- End Shift --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">🚪 End Shift</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Leave for the day </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <<else>> <!-- Daily Limit Reached --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">Daily Work Limit Reached</h3> <p style="color: #ccc; text-align: center; margin: 0;"> You've already "worked" your 4 hours today. Time to go home and relax. </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Town Hall</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("TheAlter")>> <<run $visitedLocations.push("TheAlter")>> <<run setup.achievements.unlock("find_altar")>> <</if>> <<set $sunfishSightings = 0>> <div style="background: #0a1a2a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4fd1c5; text-align: center; text-shadow: 0 0 20px #4fd1c5, 0 0 40px #4fd1c5;">🐟 The Altar</h1> <<if $comingFromSunfishTank>> <!-- Special intro for transforming back from sunfish --> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a5a 0%, #0a2a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4fd1c5; box-shadow: 0 8px 16px rgba(79, 209, 197, 0.3), 0 0 30px rgba(79, 209, 197, 0.2);"> <p style="color: #a5d8ff; font-size: 18px; margin: 0 0 15px 0; text-align: center; line-height: 1.6;"> You swim through the blue-green passage, drawn by an irresistible pull. The tunnel opens into a circular chamber carved from ancient stone, walls covered in intricate carvings of mola mola - ocean sunfish rendered in exquisite detail. </p> <p style="color: #a5d8ff; font-size: 18px; margin: 0; text-align: center; line-height: 1.6;"> The moment you enter, your body begins to shift. Your fins elongate into arms and legs, your flat body reshapes itself into human form. The transformation is swift and painless, guided by the ancient power of this place. </p> </div> <div style="background: #152535; padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 20px rgba(76, 175, 80, 0.3);"> <p style="color: #4caf50; font-size: 18px; margin: 0; text-align: center; font-weight: bold; text-shadow: 0 0 10px #4caf50;"> You're human again. </p> </div> <<set $comingFromSunfishTank = false>> <<elseif $comingFromParkPond>> <!-- Special intro for diving through the park pond --> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a5a 0%, #0a2a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4fd1c5; box-shadow: 0 8px 16px rgba(79, 209, 197, 0.3), 0 0 30px rgba(79, 209, 197, 0.2);"> <p style="color: #a5d8ff; font-size: 18px; margin: 0 0 15px 0; text-align: center; line-height: 1.6;"> You plunge into the glowing pond. The water is impossibly warm, and instead of the muddy bottom you expected, you find yourself pulled deeper and deeper through luminescent currents. Fish-shaped shadows dart around you, guiding your descent. </p> <p style="color: #a5d8ff; font-size: 18px; margin: 0; text-align: center; line-height: 1.6;"> The watery tunnel opens suddenly into a circular chamber carved from ancient stone. You emerge dry, as if the water simply decided not to cling to you. The walls are covered in intricate carvings of mola mola - ocean sunfish rendered in exquisite detail, their eyes seeming to follow your every movement. </p> </div> <<set $comingFromParkPond = false>> <<else>> <!-- Normal Altar intro --> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a5a 0%, #0a2a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4fd1c5; box-shadow: 0 8px 16px rgba(79, 209, 197, 0.3), 0 0 30px rgba(79, 209, 197, 0.2);"> <p style="color: #a5d8ff; font-size: 18px; margin: 0; text-align: center; line-height: 1.6;"> Reality shifts. The office dissolves into impossible geometry. You stand in a circular chamber carved from ancient stone, walls covered in intricate carvings of mola mola - ocean sunfish rendered in exquisite detail. </p> </div> <</if>> <div style="background: linear-gradient(135deg, #152535 0%, #0a1a2a 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4fd1c5; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px rgba(79, 209, 197, 0.4), inset 0 0 30px rgba(79, 209, 197, 0.1);"> <p style="color: #74c0fc; font-size: 16px; margin: 0 0 20px 0; text-align: center; text-shadow: 0 0 10px rgba(116, 192, 252, 0.5);"> In the center of the chamber sits a massive jewel, pulsing with an otherworldly turquoise light. Sunfish symbols swirl across its surface like living things, glowing with ethereal energy. </p> <p style="color: #4fd1c5; font-size: 16px; margin: 0; text-align: center; font-style: italic; text-shadow: 0 0 15px #4fd1c5;"> The jewel whispers to you: it hungers for essence. Sacrifice your traits, and it will grant you something in return. What that something is... you cannot know until the bargain is sealed. </p> </div> <!-- Trait Sacrifice Interface --> <<if !$altarSelectedTraits>> <<set $altarSelectedTraits = []>> <</if>> <div style="background: linear-gradient(135deg, #1a2a3a 0%, #0f1a2a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(156, 39, 176, 0.3);"> <h2 style="color: #9c27b0; text-align: center; margin: 0 0 20px 0; text-shadow: 0 0 15px #9c27b0;">⚗️ Trait Sacrifice</h2> <!-- Calculate available traits --> <<set _availableTraits = []>> <<set _physicalTraits = $physicalTraits || []>> <<set _mentalTraits = $mentalTraits || []>> <<set _skills = $skills || []>> <!-- Add physical traits (excluding Sunfish and body parts) --> <<for _i = 0; _i < _physicalTraits.length; _i++>> <<set _trait = _physicalTraits[_i]>> <<if _trait !== "Sunfish">> <<set _availableTraits.push({name: _trait, type: "physical", value: setup.getTraitValue("physical", _trait)})>> <</if>> <</for>> <!-- Add mental traits --> <<for _i = 0; _i < _mentalTraits.length; _i++>> <<set _trait = _mentalTraits[_i]>> <<set _availableTraits.push({name: _trait, type: "mental", value: setup.getTraitValue("mental", _trait)})>> <</for>> <!-- Add skills (excluding Sunfish) --> <<for _i = 0; _i < _skills.length; _i++>> <<set _trait = _skills[_i]>> <<if _trait !== "Sunfish">> <<set _availableTraits.push({name: _trait, type: "skill", value: setup.getTraitValue("skill", _trait)})>> <</if>> <</for>> <!-- Calculate current total --> <<set _currentTotal = 0>> <<for _i = 0; _i < $altarSelectedTraits.length; _i++>> <<set _currentTotal += $altarSelectedTraits[_i].value>> <</for>> <!-- Display current selection --> <div style="background: #0a1a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #4fd1c5; box-shadow: 0 0 20px rgba(79, 209, 197, 0.2);"> <p style="color: #4fd1c5; margin: 0 0 10px 0; font-weight: bold; text-shadow: 0 0 10px rgba(79, 209, 197, 0.5);">Selected Traits for Sacrifice:</p> <<if $altarSelectedTraits.length === 0>> <p style="color: #888; margin: 0; font-style: italic;">None selected</p> <<else>> <<for _i = 0; _i < $altarSelectedTraits.length; _i++>> <<capture _i>> <<set _selected = $altarSelectedTraits[_i]>> <div style="background: #152535; padding: 8px; border-radius: 4px; margin-bottom: 5px; display: flex; justify-content: space-between; align-items: center; border: 1px solid rgba(79, 209, 197, 0.3);"> <span style="color: #a5d8ff;">_selected.name (_selected.value points)</span> <<link "<span style='color: #ff6b6b; cursor: pointer;'>✖ Remove</span>">> <<set $altarSelectedTraits.deleteAt(_i)>> <<goto "TheAlter">> <</link>> </div> <</capture>> <</for>> <p style="color: #4caf50; margin: 15px 0 0 0; font-weight: bold; font-size: 18px; text-shadow: 0 0 10px rgba(76, 175, 80, 0.5);">Total Value: _currentTotal points</p> <</if>> </div> <!-- Available Traits List --> <div style="background: #0a1a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #666; max-height: 400px; overflow-y: auto; box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.5);"> <p style="color: #888; margin: 0 0 10px 0; font-weight: bold;">Available Traits:</p> <<if _availableTraits.length === 0>> <p style="color: #666; margin: 0; font-style: italic;">No traits available to sacrifice</p> <<else>> <<for _i = 0; _i < _availableTraits.length; _i++>> <<set _trait = _availableTraits[_i]>> <<set _alreadySelected = false>> <<for _j = 0; _j < $altarSelectedTraits.length; _j++>> <<if $altarSelectedTraits[_j].name === _trait.name>> <<set _alreadySelected = true>> <</if>> <</for>> <<if !_alreadySelected>> <<capture _trait>> <div style="background: #152535; padding: 8px; border-radius: 4px; margin-bottom: 5px; display: flex; justify-content: space-between; align-items: center; border: 1px solid rgba(102, 102, 102, 0.3);"> <span style="color: #a5d8ff;">_trait.name (_trait.value points)</span> <<link "<span style='color: #4caf50; cursor: pointer;'>✚ Add</span>">> <<run $altarSelectedTraits.push(_trait)>> <<goto "TheAlter">> <</link>> </div> <</capture>> <</if>> <</for>> <</if>> </div> <!-- Sacrifice Button --> <<if $altarSelectedTraits.length > 0 && _currentTotal >= 50>> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%); color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.3), 0 0 25px rgba(156, 39, 176, 0.5); text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);'>🔥 Perform Sacrifice (_currentTotal points)</div>">> <<set $altarSacrificeValue = _currentTotal>> <<goto "AltarSacrifice">> <</link>> </div> <<elseif $altarSelectedTraits.length > 0>> <p style="color: #ff6b6b; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(255, 107, 107, 0.3);">The jewel requires at least 50 points to accept your sacrifice (currently: _currentTotal)</p> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Alter")>> <h2 style="color: #4fd1c5; text-shadow: 0 0 15px #4fd1c5;">🌙 Visitors to the Altar</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: linear-gradient(135deg, #1a2a3a 0%, #0f1a2a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4fd1c5; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(79, 209, 197, 0.3);"> <p style="color: #74c0fc; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(116, 192, 252, 0.5);"> You sense another presence in this otherworldly space... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #4fd1c5; border-radius: 10px; padding: 15px; background: #0a1a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(79, 209, 197, 0.2);"> <h3 style="color: #4fd1c5; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(79, 209, 197, 0.5);">_npc.name</h3> <p style="font-size: 14px; color: #74c0fc; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #a5d8ff; font-size: 14px; margin: 5px 0;"><strong style="color: #4caf50;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: linear-gradient(135deg, #4fd1c5 0%, #339af0 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 15px rgba(79, 209, 197, 0.3);'>💬 Speak with _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: linear-gradient(135deg, #1a2a3a 0%, #0f1a2a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #74c0fc; margin: 0; font-style: italic; text-shadow: 0 0 10px rgba(116, 192, 252, 0.3);"> You are alone in this sacred space. The jewel pulses with patient hunger. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #4fd1c5 0%, #339af0 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.3), 0 0 20px rgba(79, 209, 197, 0.4); text-shadow: 0 0 8px rgba(255, 255, 255, 0.5);'>Leave The Altar</div>">> <<set $altarSelectedTraits = []>> <<goto "SeabassPark">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "lap">> <!-- Increase relationship with mayor --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💋 Private Meeting</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> The mayor gestures to his lap with a knowing smile. "Come here, we have important city business to discuss..." </p> </div> <!-- Player Image --> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Lap.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="On the Mayor's Lap"> </div> <</if>> <!-- Detailed Erotic Description --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You slide onto the mayor's lap, your <<print $bodyParts.butt>> settling against his thighs. His hands immediately claim your waist, fingers digging into your <<if $physicalTraits.includes("Soft")>>soft<<elseif $physicalTraits.includes("Fit")>>toned<</if>> flesh possessively. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Let's review the budget," he murmurs, though you feel his hardness growing beneath you. One hand slides along your stocking-clad thigh, pushing your skirt higher, while the other traces up your ribs<<if $bodyParts.chest !== "flat">>. His palm cups your <<print $bodyParts.chest>> breast through your blouse, thumb circling your nipple until it stiffens<</if>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He grinds you down against his erection as he pretends to read documents, his breath hot against your neck. His hand slips higher up your thigh, fingers finding the dampness between your legs through your panties. "Such a dedicated secretary," he groans, fingers slipping beneath your blouse. You feel him throb against your ass as his other hand teases your <<print $bodyParts.genitals>>, making you squirm on his lap. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Let's review the budget," he murmurs, though you feel his hardness growing beneath you. One hand slides along your thigh, pushing your skirt higher. His other hand traces up your ribs<<if $bodyParts.chest !== "flat">>, palm cupping your <<print $bodyParts.chest>> chest through your blouse<</if>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He grinds you down against his erection as he pretends to read documents, his breath hot against your neck. His hand slips higher up your thigh, discovering your own growing arousal beneath your skirt. "Interesting," he chuckles darkly, fingers wrapping around your <<print $bodyParts.genitals>> through the fabric. "My secretary seems to be enjoying this meeting." You feel him throb against your ass as his hands explore freely, stroking you while you're expected to maintain professional composure. </p> <</if>> <<if $physicalTraits.includes("Curvy") || $physicalTraits.includes("Voluptuous") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Hucow")>> <p style="color: #ffc107; font-size: 16px; line-height: 1.8; margin: 0;"> Your curves drive him wild. He grabs handfuls of your body greedily, groaning about how perfect you feel on his lap. </p> <</if>> </div> <!-- Payment --> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> for this 'meeting' </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "desk">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💼 Under the Desk</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I have a very important meeting in ten minutes. Help me relieve some stress first..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Desk.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Under His Desk"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> He gestures beneath his mahogany desk. You sink to your knees on the plush carpet, crawling into the confined space between his spread legs. His bulge strains against his expensive slacks, already hard with anticipation. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Good girl," he purrs, stroking your <<print $appearance.hairColor.toLowerCase()>> hair. His belt buckle clinks as he frees himself. You're face-to-face with his throbbing cock, thick and demanding. "Show me what a dedicated secretary you are." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your lips wrap around him as he groans, one hand gripping your hair to guide you. He rocks his hips, pushing deeper. Above, you hear him answer his phone—discussing city budgets while you service him beneath his desk. Between your own legs, your <<print $bodyParts.genitals>> grows wet from the degradation. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Good girl," he purrs, stroking your <<print $appearance.hairColor.toLowerCase()>> hair. His belt buckle clinks as he frees himself. You're face-to-face with his throbbing cock—but when his hand slides down to grope you, he discovers your own hardness straining against your skirt. "Well, well," he chuckles darkly. "What do we have here?" </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your lips wrap around him as he groans, one hand gripping your hair while the other reaches under your skirt to stroke your <<print $bodyParts.genitals>>. He rocks his hips, pushing deeper. Above, you hear him answer his phone—discussing city budgets while you service him beneath his desk, your own arousal throbbing in his grip. "My special secretary," he mutters. </p> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> His grip tightens as his voice remains professionally calm. "Yes, councilman... the proposal looks excellent..." He thrusts harder, using your mouth roughly. When he finally finishes, groaning quietly, he keeps you down there for several more minutes—his way of showing who's really in control. </p> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "modeling">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👙 Uniform Modeling</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm considering new uniforms for city employees. Model these options for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling Outfits"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "uniforms" become progressively more revealing. First, a tight pencil skirt and blouse. Then a dress that hugs every curve. Finally, lingerie barely passing as "professional attire"—lace and silk that leaves nothing to the imagination. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Each time you emerge from behind the changing screen, the mayor circles you slowly. His eyes devour every inch of exposed skin. "Turn around. Bend over. Walk toward me." His commands grow bolder, his bulge more obvious. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>In the sheer lace bra, your <<print $bodyParts.chest>> breasts are fully visible, nipples hard from his hungry stare. <</if>>The matching panties barely cover your ass, the damp spot at your crotch revealing your arousal. He approaches, running his hands over the fabric—and what lies beneath. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Perfect fit," he growls, pulling you against him. His erection presses into your stomach as he gropes you thoroughly, hands roaming over your nearly-naked body. His fingers slip beneath the lace panties, finding your wet <<print $bodyParts.genitals>>. "I think we need more 'testing' to ensure quality..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>In the sheer lace bra, your <<print $bodyParts.chest>> chest is fully visible. <</if>>The matching panties struggle to contain your growing arousal, your <<print $bodyParts.genitals>> straining obviously against the delicate fabric. His eyes widen with interest. "Interesting," he murmurs, approaching slowly. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Perfect fit," he growls, pulling you against him. His erection presses into your stomach as he gropes you thoroughly, hands roaming over your nearly-naked body. One hand wraps around your hardness through the lace. "My secretary has some extra... equipment. How delightful." His fingers slip beneath the lace, stroking your <<print $bodyParts.genitals>> directly. "I think we need more 'testing' to ensure quality..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "massage">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Stress Relief Massage</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm so tense from all this paperwork. Be a dear and help me relax..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massaging the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You stand behind his chair, your hands working into his shoulders. He groans appreciatively, leaning back into your touch. "Lower," he instructs, and you comply, working down his back. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> As you lean forward to reach, he tilts his head back<<if $bodyParts.chest !== "flat">>—right between your breasts. You feel his breath on your cleavage as he "accidentally" nuzzles against your <<print $bodyParts.chest>> chest<</if>>. His hands reach back, grabbing your hips and pulling you closer. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "You have magic hands," he purrs, spinning his chair around suddenly. Now you're standing between his spread legs, his face level with your body. His hands slide up the backs of your thighs, under your skirt, gripping your ass. "But I think I need a more... thorough massage." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> He pulls you down onto his lap, guiding your hands to his chest while his roam over your body. What started as a shoulder rub becomes something much more intimate, his arousal pressing insistently against you. His fingers slip beneath your panties, exploring your <<print $bodyParts.genitals>> as you gasp. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "You have magic hands," he purrs, spinning his chair around suddenly. Now you're standing between his spread legs, his face level with your body. His hands slide up the backs of your thighs, under your skirt, gripping your ass. "But I think I need a more... thorough massage." His hand discovers your stiffening arousal through your underwear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> He pulls you down onto his lap, guiding your hands to his chest while his roam over your body. What started as a shoulder rub becomes something much more intimate. "My secretary has their own tension to work out," he growls, hand slipping beneath your skirt to stroke your <<print $bodyParts.genitals>> directly, matching the rhythm of his own arousal grinding against you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "satisfaction">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">😈 Personal Satisfaction</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Lock the door. I have very specific needs that require your immediate attention." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Satisfaction.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Satisfying the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The door clicks locked. The mayor is already unbuttoning her blouse, eyes dark with need. "Strip. Everything." Her voice brooks no argument. You obey, clothes falling to the floor until you stand naked before her. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She circles you hungrily, one finger trailing over your skin. "Perfect." She pushes you back onto her desk, scattering papers. Climbing on top of you, she positions herself above your hardening <<print $bodyParts.genitals>>. "I'm going to use you properly now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She sinks down on you with a moan, taking you to the hilt. Her hips move frantically, using your body for her pleasure. She's wild, desperate—nails scratching your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, hands groping your <<print $bodyParts.chest>> breasts<</if>>, riding you hard and fast. "Yes... fuck... just like that..." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She comes multiple times before she's satisfied, milking every drop from you. Afterwards, she dismounts calmly, adjusting her clothes. "Same time tomorrow," she says casually, as if she didn't just fuck you raw on her desk. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She circles you hungrily, one finger trailing over your skin, sliding between your legs to discover your <<print $bodyParts.genitals>>. Her eyes light up. "Oh, even better." She pushes you back onto her desk, scattering papers. Positioning herself between your spread legs, she grins wickedly. "I'm going to use you properly now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her mouth and fingers work you frantically, using your body for her pleasure. She's wild, desperate—nails digging into your thighs<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, one hand reaching up to grope your <<print $bodyParts.chest>> breasts<</if>>, tongue and fingers working you hard and fast. "Yes... taste so good... just like that..." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She makes you come multiple times before she's satisfied, wringing every orgasm from you. Afterwards, she stands calmly, adjusting her clothes and wiping her mouth. "Same time tomorrow," she says casually, as if she didn't just devour you on her desk. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "presentation">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🎭 Private Presentation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> The door locks with a decisive click. "Give me a show. Just for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Presentation.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Private Performance"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor settles into his leather chair, already palming his growing erection through his slacks. "Strip. Slowly." His voice is thick with lust. Music plays softly from hidden speakers—your cue to perform. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You sway to the rhythm, unbuttoning your blouse with deliberate slowness. Each revealed inch of skin makes him grip the armrests tighter. The blouse falls. Your bra follows.<<if $bodyParts.chest !== "flat">> Your <<print $bodyParts.chest>> breasts bounce free, and he groans.<</if>> </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The skirt slides down your hips. You stand before him in just your panties and heels, gyrating, touching yourself as he watches hungrily. His cock is fully out now, his hand working it as he devours you with his eyes. The wet spot on your panties grows as you perform. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Come here," he commands when you're completely naked. You straddle his lap, feeling his hardness between your thighs, pressing against your wet <<print $bodyParts.genitals>>. His hands grab your <<print $bodyParts.butt>> ass roughly, grinding you against him. "Such a perfect little performer. Now finish the show properly..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The skirt slides down your hips. You stand before him in just your panties and heels—but your own arousal is obvious, your <<print $bodyParts.genitals>> tenting the fabric. His eyes widen with surprise then darken with lust. "Well, well," he growls. His cock is fully out now, his hand working it as you continue to dance, your own hardness on display. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Come here," he commands when you're completely naked, both of you fully exposed and hard. You straddle his lap, feeling his cock pressing against your ass while yours stands between you. His hands grab your <<print $bodyParts.butt>> ass roughly, grinding you against him, one hand wrapping around your <<print $bodyParts.genitals>>. "Such a perfect little performer. My special secretary. Now finish the show properly..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "swimwear">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🏊 Aquatics Review</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm reviewing the city pool initiative. Model these swimsuits for me..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Swimwear.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling Swimwear"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "swimsuits" are impossibly small—tight speedos that leave absolutely nothing to the imagination. You emerge from the bathroom, barely covered<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>—the speedo revealing not just your bulge but also your <<print $bodyParts.chest>> chest<</if>>, and the mayor's eyes go wide with hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." She circles you like a predator, drinking in every angle. The speedos cling to your body, outlining everything. <<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>Your <<print $bodyParts.chest>> chest is fully on display, and she licks her lips. <</if>><<if $physicalTraits.includes("Muscular") || $physicalTraits.includes("Athletic Build")>>Your muscles flex as you move, and she bites her lip.<</if>> </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her hands reach out, tracing over the fabric—and your body beneath. "Very impressive," she purrs, palming your <<print $bodyParts.genitals>> through the thin material. You start to harden, the speedo doing nothing to hide your arousal. She strokes you through the fabric, watching you grow. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need to test... durability." She yanks the speedo down, freeing your erection. "On the desk. Now." She's on you before you can think, riding you hard while praising your "excellent fit for city standards." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "swimsuits" are impossibly small—a tiny bikini bottom that barely covers anything. You emerge from the bathroom, barely covered<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>—wearing just the bikini bottom, your <<print $bodyParts.chest>> chest completely exposed<</if>>, and the mayor's eyes go wide with hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." She circles you like a predator, drinking in every angle. The bikini bottom clings to your body, the fabric already damp. <<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>Your <<print $bodyParts.chest>> breasts are fully on display, and she licks her lips. <</if>><<if $physicalTraits.includes("Muscular") || $physicalTraits.includes("Athletic Build")>>Your muscles flex as you move, and she bites her lip.<</if>> </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Her hands reach out, tracing over the fabric—and your body beneath. "Very impressive," she purrs, fingers sliding beneath the bikini to find your wet <<print $bodyParts.genitals>>. You gasp as she touches you, the thin material providing no protection. She strokes you, making you wetter. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need to test... durability." She yanks the bikini aside, fingers pushing inside you. "On the desk. Now." She has you spread out before her, working you with hands and tongue while praising your "excellent fit for city standards." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "massage2">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Private Massage</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm so tense. Those strong hands of yours... I need them on me." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massaging the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor lies face-down on her office couch, her blouse already unbuttoned and pulled aside. Your <<if $physicalTraits.includes("Strong")>>powerful<<elseif $physicalTraits.includes("Muscular")>>strong<</if>> hands work into her shoulders, kneading the tension from her muscles. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Lower," she moans. You work down her spine, and she reaches back to unhook her bra completely. "Don't be shy." Your hands slide over her bare back, feeling her skin warm beneath your touch. She arches into your massage, sighing with pleasure. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The backs of my thighs too," she instructs, hiking up her skirt. Your hands move lower, massaging her legs. She spreads them slightly, giving you access. "Higher..." Your fingers brush against her panties, and you feel how wet she is. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rolls over suddenly, bare-chested and flushed<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen as she sees your shirt has come off too, revealing your <<print $bodyParts.chest>> chest. "Interesting," she purrs, reaching up to touch you<</if>>. "I think the front needs attention now." She pulls you down on top of her, hands fumbling with your belt, discovering your hardening <<print $bodyParts.genitals>>. "Use those hands for something even better..." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rolls over suddenly, bare-chested and flushed<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen as she sees your shirt has come off too, revealing your <<print $bodyParts.chest>> chest. "Interesting," she purrs, reaching up to touch you<</if>>. "I think the front needs attention now." She pulls you down on top of her, hands fumbling with your pants. When she discovers your <<print $bodyParts.genitals>>, her eyes light up with delight. "Oh, this is even better than I imagined," she moans, fingers already exploring. "Use those hands on me while I use mine on you..." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "outfit">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👗 Professional Attire</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I've selected a more appropriate outfit for my secretary. Go change." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Outfit.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="New Outfit"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "professional" outfit turns out to be a scandal—a skirt so short it barely covers your ass, and a blouse cut low enough to show<<if $bodyParts.chest !== "flat">> generous cleavage<<else>> your flat chest provocatively<</if>>. Sheer stockings with garters complete the ensemble. The underwear provided is a mere scrap of lace that leaves nothing to the imagination. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The "professional" outfit turns out to be a scandal—a skirt so short it barely covers your ass, and a blouse cut provocatively<<if $bodyParts.chest !== "flat">> to show off your <<print $bodyParts.chest>> chest<</if>>. Sheer stockings with garters complete the ensemble. The underwear provided is impossibly tight, doing nothing to hide your <<print $bodyParts.genitals>> and everything to accentuate the bulge. </p> <</if>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you emerge from the bathroom, the mayor's eyes darken with lust. "Perfect. Come here." He has you bend over to "pick up" dropped papers, stand on tiptoe to reach high shelves, sit with your legs crossed and uncrossed repeatedly. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Every movement is designed to show off your body. He circles you like prey, adjusting the blouse lower, smoothing the skirt higher. His hands linger everywhere—your hips, your thighs<<if $bodyParts.chest !== "flat">>, cupping your breasts to "fix the fit"<</if>>. When you bend over, you know he can see your barely-covered <<print $bodyParts.genitals>> through the flimsy panties. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "You'll wear this every day," he commands, pulling you against him. You feel his hardness pressing into your barely-covered ass. "My perfect little secretary." His hands slide under the skirt, fingers finding your wetness, exploring freely. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Every movement is designed to show off your body. He circles you like prey, adjusting the blouse, smoothing the skirt higher. His hands linger everywhere—your hips, your thighs<<if $bodyParts.chest !== "flat">>, groping your chest<</if>>. The tight underwear makes your arousal obvious, your <<print $bodyParts.genitals>> clearly outlined for his viewing pleasure. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "You'll wear this every day," he commands, pulling you against him. You feel his hardness pressing into your barely-covered ass, while yours presses against his thigh. "My perfect little secretary." His hands slide under the skirt, one gripping your ass while the other wraps around your <<print $bodyParts.genitals>>, stroking through the thin fabric. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "fitness">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💪 Fitness Consultation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Take off your shirt. I want to see your... physical conditioning." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Physique.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Showing Your Body"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You strip off your shirt, standing bare-chested before the mayor. Her eyes rake over your <<if $physicalTraits.includes("Muscular")>>sculpted muscles<<elseif $physicalTraits.includes("Fit")>>toned physique<<else>>body<</if>>, tongue darting out to wet her lips. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Come closer," she purrs. Her hands explore your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, fingers tracing over your <<print $bodyParts.chest>> chest with particular interest. "How unexpected," she murmurs, cupping them<<else>>, tracing your pecs<</if>>, trailing down your abs. She circles you slowly, admiring every angle. Her fingers dig into your <<if $physicalTraits.includes("Strong")>>solid<</if>> muscles appreciatively. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She presses against your back, hands sliding around your waist, lower and lower. "Very impressive," she breathes in your ear. Her palms cup the bulge in your pants, squeezing your hardening <<print $bodyParts.genitals>>. "I want to see all of you. Everything." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're completely naked as she examines you thoroughly, hands everywhere—gripping your ass, stroking your cock until you're rock hard<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, playing with your chest<</if>>. "Perfect specimen," she moans, pushing you back onto her desk. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She presses against your back, hands sliding around your waist, lower and lower. "Very impressive," she breathes in your ear. Her palms slide to your crotch, then pause with surprise. "Well now," she purrs with delight, fingers exploring the unexpected anatomy beneath your pants. "What a delightful surprise. I want to see all of you. Everything." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're completely naked as she examines you thoroughly, hands everywhere—gripping your ass, fingers teasing your wet <<print $bodyParts.genitals>><<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, playing with your chest<</if>>. "Perfect specimen," she moans, spreading your legs wider. "Such a rare treat." She pushes you back onto her desk, hands already between your thighs. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "strength">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💪 Strength Demonstration</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Show me how strong you really are. Lift me up..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Lift.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Lifting the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You wrap your <<if $physicalTraits.includes("Muscular")>>powerful<<elseif $physicalTraits.includes("Strong")>>strong<</if>> arms around her waist and lift her effortlessly. She gasps, wrapping her legs around you instinctively. "Oh my..." Her face is level with yours now, breathing heavily. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Higher," she demands. You hoist her up, her legs tightening around your torso. She's grinding against you now, her skirt hiked up, feeling your strength<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her hands find your <<print $bodyParts.chest>> chest through your shirt, squeezing<</if>>. "So strong..." She's getting wet, you can feel it through your shirt. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She kisses you hard, tongue invading your mouth. Her hands fumble with your belt while you hold her up. "Don't put me down," she orders breathlessly. You brace her against the wall, supporting her weight easily. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She frees your <<print $bodyParts.genitals>> and guides you inside her, moaning as you fill her. You fuck her standing up, using your strength to bounce her on your shaft. She clings to you, screaming her pleasure, loving how you manhandle her with such ease. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She kisses you hard, tongue invading your mouth. Her hands fumble with your pants while you hold her up. "Don't put me down," she orders breathlessly. When she discovers your <<print $bodyParts.genitals>>, she groans. "Oh fuck yes. Against the wall. Now." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> You brace her against the wall, supporting her weight easily while she works her hand between your legs, fingers pushing inside your wet heat. You grind against her hand, using your strength to control the pace. She clings to you, moaning her pleasure, loving how strong you are, how you can hold her up while she fingers you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "dictation">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">📝 Taking Dictation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Sit close. I need you to take these notes personally..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Female_Dictation.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Taking Dictation"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You pull your chair next to his, notepad ready. But he pulls you even closer—so close your thigh presses against his, your shoulder touching his arm. His cologne fills your senses as he leans in, lips nearly brushing your ear. </p> <<if _hasVagina>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Regarding the city infrastructure project..." he begins, but his hand finds your knee, sliding slowly up your thigh. His whispers tickle your neck, making you shiver. The "dictation" becomes increasingly nonsensical as his hand ventures higher, fingers teasing the hem of your skirt before slipping beneath it to find your dampening panties. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>His other arm wraps around your back, hand cupping your breast through your blouse. He squeezes in rhythm with his words, thumb circling your nipple. <</if>>You try to write but your pen trembles as he touches you, fingers rubbing against your <<print $bodyParts.genitals>> through the thin fabric, his breath hot and heavy in your ear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Are you getting all this?" he growls, pulling you onto his lap. The notepad falls forgotten as he grinds you against his obvious arousal, his fingers pushing your panties aside to stroke you directly. "I think you need to take better notes. Much more... hands-on study." </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Regarding the city infrastructure project..." he begins, but his hand finds your knee, sliding slowly up your thigh. His whispers tickle your neck, making you shiver. The "dictation" becomes increasingly nonsensical as his hand ventures higher, fingers teasing the hem of your skirt before discovering your growing arousal straining against your underwear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.chest !== "flat">>His other arm wraps around your back, hand groping your <<print $bodyParts.chest>> chest. <</if>>You try to write but your pen trembles as he touches you, fingers wrapping around your <<print $bodyParts.genitals>> through the fabric, stroking in slow, deliberate movements, his breath hot and heavy in your ear. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "Are you getting all this?" he growls, pulling you onto his lap. The notepad falls forgotten as he grinds against your ass, his hand slipping beneath your underwear to stroke your hardness directly. "My secretary seems very... attentive today. I think you need to take better notes. Much more... hands-on study." </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "relief">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">😌 Stress Relief</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need to unwind. Help me relax... properly." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Relief.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Providing Relief"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor reclines on her office couch, hiking up her skirt. "Come here," she commands, spreading her legs. You kneel between her thighs, her scent filling your nose as she guides your head where she wants it. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your tongue finds her wet heat, and she gasps, fingers tangling in your hair. "Yes... just like that..." She grinds against your face, using your mouth for her pleasure. Her thighs clamp around your head as you work. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She comes hard, crying out without caring who might hear. But she's not done. "Stand up. Take off your pants." When you're exposed, your <<print $bodyParts.genitals>> hard and ready, she pulls you down onto the couch with surprising strength. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She rides you aggressively, nails raking down your chest<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, groping your <<print $bodyParts.chest>> chest roughly<</if>>, taking her pleasure from your body. "Good boy," she purrs, moving faster. "Such a dedicated secretary..." You're just a toy for her relief. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> She comes hard, crying out without caring who might hear. But she's not done. "Stand up. Take off your pants." When you comply, she sees your wet <<print $bodyParts.genitals>> and grins wickedly. "Oh, this is even better," she purrs. She pulls you down onto the couch with surprising strength. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She positions herself between your legs, fingers and tongue working your <<print $bodyParts.genitals>> with skill. Her nails rake down your thighs<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>, one hand reaching up to grope your <<print $bodyParts.chest>> chest roughly<</if>>. "Good boy," she purrs against your sensitive flesh. "Such a dedicated secretary... with such a delicious surprise." She takes her pleasure from your body, making you come again and again until you're trembling. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "assistance">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🔥 Intimate Assistance</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need you. Right now. Don't make me wait..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Jobs/MayorSecretary/Male_Assist.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Assisting the Mayor"> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor is already half-undressed when you enter, her need obvious. She practically attacks you, tearing at your clothes with desperate hands. "I've been thinking about you all morning," she pants, yanking your shirt off<<if $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">>. Her eyes widen when she sees your <<print $bodyParts.chest>> chest. "Perfect," she gasps, hands immediately cupping them<</if>>. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your pants hit the floor and she's on her knees immediately, taking your <<print $bodyParts.genitals>> in her mouth. She sucks you hungrily, moaning around your length. Her hand works what doesn't fit, stroking and sucking until you're rock hard. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Bend me over the desk," she commands, standing. You comply, pushing her forward. She arches her back, presenting herself. "Fuck me hard. I need it rough." You grab her hips and thrust into her wet heat. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> You pound into her relentlessly, the desk shaking with each thrust. She screams your name, not caring who might hear. "Harder! Yes!" Her walls clench around you as she comes, but you keep going—giving her exactly what she demanded. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your pants hit the floor and she gasps when she sees your <<print $bodyParts.genitals>>. "Even better," she groans, pushing you back onto her desk. She spreads your legs wide, positioning herself between them. Her mouth descends on you hungrily, tongue and lips working you with desperate need. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "So wet for me," she moans against you. Her fingers push inside while her tongue works your most sensitive spots. She's relentless, making you writhe and buck against her face. "I need to taste you come." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> She works you frantically, the desk creaking beneath you with each movement. You scream her name, not caring who might hear. "Yes! Don't stop!" Your body clenches around her fingers as you come, but she keeps going—giving you exactly what you both need, making you come again and again. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "wardrobe">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👔 Wardrobe Consultation</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Help me choose an outfit. I value your... close opinion." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Wardrobe.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Wardrobe Consultation"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Wardrobe.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Wardrobe Consultation"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You follow the mayor into the private changing room adjacent to the office. It's intimate—just the two of you in close quarters. The mayor strips without hesitation, completely comfortable being naked in front of you. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "What do you think of this one?" Each outfit requires your hands-on assessment—smoothing fabric, adjusting fits, standing close enough to smell the mayor's cologne. The touches linger, become more deliberate. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Your turn. I need to see how you look." The mayor insists you try on clothing too, hands roaming as they "help" you change. Fingers trail over your skin, adjusting collars, smoothing wrinkles, finding excuses to touch. When your pants come off, the mayor's eyes linger on your <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're pressed against the mirror, the mayor's body flush against yours, both of you hard and wanting. "I think we need to... test the durability," the mayor breathes, hand wrapping around both your cocks, stroking together. The consultation becomes something much more intimate. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Your turn. I need to see how you look." The mayor insists you try on clothing too, hands roaming as they "help" you change. Fingers trail over your skin, adjusting fabric, smoothing wrinkles, finding excuses to touch. When your pants come off, the mayor's eyes widen with surprise and delight at your <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Soon you're pressed against the mirror, the mayor's body flush against yours. "What a delightful surprise," the mayor breathes, fingers already sliding between your legs, exploring your wetness. "I think we need to... test compatibility." The consultation becomes something much more intimate as the mayor's fingers work inside you. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "massage3">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💆 Private Massage Session</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I'm incredibly tense. Your hands... I need them on me." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massage Session"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Massage.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Massage Session"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor lies on the office couch, already shirtless. "Start with my shoulders." Your hands work into tense muscles, kneading and pressing. The mayor groans appreciatively, body relaxing under your touch. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Lower... yes, there." You work down the spine, and the mayor shifts, making room for you to reach better. Your position is intimate now—straddling the mayor's hips to get better leverage. You feel body heat through your clothes. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The front needs attention too," the mayor says, rolling over beneath you. Now you're straddling a half-naked mayor who's looking up at you with obvious desire. "Don't stop..." Hands reach up, pulling you down. You can feel both of you hardening, cocks pressing together through fabric. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The massage becomes something else entirely. Lips meet in a heated kiss. Remaining clothes are torn away. Two bodies grinding together on the couch, hands everywhere, both your <<print $bodyParts.genitals>> hard and leaking, seeking pleasure rather than relaxation. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "The front needs attention too," the mayor says, rolling over beneath you. Now you're straddling a half-naked mayor who's looking up at you with obvious desire. "Don't stop..." Hands reach up, pulling you down, then sliding between your legs to discover your <<print $bodyParts.genitals>>. Eyes widen with surprise and hunger. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The massage becomes something else entirely. Lips meet in a heated kiss. Remaining clothes are torn away. The mayor flips you onto your back, settling between your legs, mouth descending to taste your wetness while fingers work inside you, seeking pleasure rather than relaxation. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "companionship">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">💕 Personal Companionship</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "I need more than just a secretary today. Keep me company. Close company." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Companion.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Companionship"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Companion.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Companionship"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The mayor pulls you down onto the leather couch, uncomfortably close. An arm drapes around your shoulders, fingers playing with your <<print $appearance.hairColor.toLowerCase()>> hair. "You're more than just an employee to me," the mayor murmurs. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The touching becomes bolder—a hand on your thigh, sliding higher. The mayor leans in, breath hot against your neck. "I've wanted this for so long..." Lips brush your skin, testing your reaction. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you don't pull away, the mayor becomes more aggressive. You're pulled into a deep kiss, tongue invading your mouth. Hands roam over your body, claiming, exploring. "You're so <<if $physicalTraits.includes("Attractive")>>beautiful<<else>>perfect<</if>>," the mayor groans, hand finding your hardening <<print $bodyParts.genitals>>. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Clothes are stripped away piece by piece. The mayor's mouth trails down your body, hands everywhere at once. What started as companionship becomes raw need—two bodies moving together, cocks grinding, hands stroking, taking pleasure from each other without pretense. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> When you don't pull away, the mayor becomes more aggressive. You're pulled into a deep kiss, tongue invading your mouth. Hands roam over your body, claiming, exploring. When fingers slip between your legs and discover your <<print $bodyParts.genitals>>, the mayor gasps with delight. "Oh, this is perfect," the mayor breathes. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> Clothes are stripped away piece by piece. The mayor's mouth trails down your body, settling between your spread legs. What started as companionship becomes raw need—tongue and fingers working you expertly, taking pleasure from making you moan and writhe without pretense. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "fashion">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">👗 Fashion Review</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Model these outfits for me. I want to see how they look on someone... attractive." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Model.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The outfits grow progressively more revealing. What starts as formal wear devolves into barely-there clothing that shows far too much skin. You change in the private bathroom, emerging each time to the mayor's hungry stare. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> "Turn around. Slowly." The mayor circles you, eyes devouring every inch. Hands reach out, adjusting fabric—or so the excuse goes. Really, it's just an opportunity to touch your body, to feel your <<if $physicalTraits.includes("Fit")>>toned<<elseif $physicalTraits.includes("Soft")>>soft<</if>> skin. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> By the final "outfit"—lingerie that barely counts as clothing—the mayor's arousal is obvious, matching your own. "Perfect fit," the mayor breathes, pulling you close. Hands slide over the thin fabric, both your cocks straining visibly against the delicate material. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need a more thorough examination." The lingerie is stripped away, and you're pressed against the wall. The mayor's mouth is on yours, hands groping, wrapping around both your hardnesses, stroking together while grinding against you. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> By the final "outfit"—lingerie that barely counts as clothing—the mayor's arousal is obvious. "Perfect fit," the mayor breathes, pulling you close. Hands slide over the thin fabric, then beneath it, discovering your wet <<print $bodyParts.genitals>> with obvious delight. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> "I think we need a more thorough examination." The lingerie is stripped away, and you're pressed against the wall. The mayor's mouth is on yours, hands groping, fingers pushing inside your heat while lips travel down your body to taste you directly. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $currentEroticTask = "needs">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <<run setup.addRelationshipPoints(_mayorName, 1)>> <</if>> <!-- Check player genitals --> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center;">🔒 Special Needs</h1> <div style="padding: 20px; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #FFD700;"> <p style="color: white; font-size: 18px; margin: 0;"> "Lock the door. What I'm about to ask requires complete discretion..." </p> </div> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <<if $bodyParts.gender === "male">> <img src="Images/Jobs/MayorSecretary/MaleMale_Needs.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Special Needs"> <<else>> <img src="Images/Jobs/MayorSecretary/FemaleFemale_Needs.webp" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Special Needs"> <</if>> </div> <</if>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> The door clicks locked. The mayor's eyes are dark with need, voice thick with desire. "I've been thinking about this all week." Hands grab you roughly, pulling you close. "About you. About us." </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You're kissed hard, desperately. The mayor's hands are everywhere—tearing at your clothes, groping, claiming. "I need you naked. Now." There's no pretense anymore, no excuses. Just raw want. </p> <<if _hasPenis>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Soon you're both stripped bare, bodies pressed together. The mayor pushes you down—onto the desk, the couch, the floor—it doesn't matter. What matters is skin on skin, mouths tasting, hands wrapping around both your hard cocks, stroking together in desperate rhythm. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The mayor takes you roughly, no holding back. Grinding, stroking, sucking—taking pleasure from every part of your body. It's intense, primal—two people giving in completely to forbidden desire. "Yes... god, yes..." The mayor's voice echoes in the office as pleasure consumes you both. </p> <<else>> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Soon you're both stripped bare, bodies pressed together. When the mayor's hands slide between your legs and discover your <<print $bodyParts.genitals>>, the gasp is one of pure hunger. "Even better than I imagined," the mayor groans, pushing you down—onto the desk, the couch, the floor—it doesn't matter. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> The mayor devours you roughly, no holding back. Mouth, fingers, tongue—taking pleasure from every part of your body, making you writhe and scream. It's intense, primal—two people giving in completely to forbidden desire. "Yes... god, yes... so perfect..." The mayor's voice echoes in the office as pleasure consumes you both, making you come again and again. </p> <</if>> </div> <<set $money += $currentTask.pay>> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0;"> You earned <strong>$<<print $currentTask.pay>></strong> </p> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Work</div>">> <<set $acceptedEroticTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- SAVE CASH/BANK AT THE VERY START TO PREVENT DOUBLE ADDITIONS --> <<set _savedMoney = $money>> <<set _savedBankBalance = $bankAccount ? $bankAccount.balance : 0>> <!-- Initialize flags if they don't exist --> <<if !$acceptedEroticTask>> <<set $acceptedEroticTask = false>> <</if>> <<if !$refusedTask>> <<set $refusedTask = false>> <</if>> <!-- Ensure currentTask exists --> <<if !$currentTask>> <<set $currentTask = {pay: 30, desc: "complete miscellaneous office work"}>> <</if>> <!-- Initialize secretary hours tracking --> <<if !$secretaryHoursWorkedToday>> <<set $secretaryHoursWorkedToday = 0>> <</if>> <!-- Increment hours worked --> <<set $secretaryHoursWorkedToday += 1>> <!-- Initialize sexual skills if player has the trait but system isn't initialized --> <<if ($skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")) && !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Relationship Point Gain System --> <<set _relationshipGained = false>> <<set _baseRelationshipPoints = 0>> <<set _finalRelationshipPoints = 0>> <<set _mayorName = "">> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<if _mayorNPCs && _mayorNPCs.length > 0>> <<set _mayorName = _mayorNPCs[0].name>> <!-- Calculate BASE relationship points based on task type --> <<if $acceptedEroticTask>> <<set _baseRelationshipPoints = 5>> <!-- Erotic task: 5 base points --> <<elseif !$refusedTask>> <<set _baseRelationshipPoints = 1>> <!-- Regular task: 1 base points --> <<else>> <<set _baseRelationshipPoints = -5>> <!-- Refused task: -1 points --> <</if>> <!-- Apply Gentle Giant's Heart multiplier (4x) BEFORE adding --> <<if $currentArtifact === "The Gentle Giant's Heart">> <<set _finalRelationshipPoints = _baseRelationshipPoints * 4>> <<else>> <<set _finalRelationshipPoints = _baseRelationshipPoints>> <</if>> <!-- Add the relationship points --> <<if _finalRelationshipPoints !== 0>> <<run setup.addRelationshipPoints(_mayorName, _finalRelationshipPoints)>> <<set _relationshipGained = true>> <</if>> <</if>> <!-- Sexual Skill XP Gain System --> <<set _sexualXPGains = []>> <<if ($skills.includes("Sexually Skilled") || $physicalTraits.includes("Succubus") || $physicalTraits.includes("Slut")) && $acceptedEroticTask && $currentEroticTask>> <<set _hasVagina = $bodyParts.genitals.includes("vagina")>> <<set _hasPenis = $bodyParts.genitals.includes("penis")>> <<set _hasBreasts = false>> <!-- Check for small or bigger chest --> <<set _chestSizes = ["small", "medium", "large", "huge", "gigantic"]>> <<for _size range _chestSizes>> <<if $bodyParts.chest.includes(_size)>> <<set _hasBreasts = true>> <<break>> <</if>> <</for>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<set _finalXP = _baseXP>> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <</if>> <!-- Apply XP based on which erotic task was completed --> <<if $currentEroticTask === "lap">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "massage">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "outfit">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "dictation">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "desk">> <<run setup.addSexualSkillExp("oralGiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Giving)", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<elseif $currentEroticTask === "modeling">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "presentation">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<if _hasBreasts>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "fitness">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "relief">> <<run setup.addSexualSkillExp("oralGiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Giving)", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<if _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "massage2">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasPenis>> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run _sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "swimwear">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasPenis>> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run _sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <<elseif _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "satisfaction">> <<run setup.addSexualSkillExp("submission", _finalXP)>> <<run _sexualXPGains.push({skill: "Submission", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasPenis>> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run _sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <<elseif _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "strength">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("stamina", _finalXP)>> <<run _sexualXPGains.push({skill: "Stamina", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasPenis>> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run _sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "assistance">> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <<run setup.addSexualSkillExp("rough", _finalXP)>> <<run _sexualXPGains.push({skill: "Rough", amount: _finalXP})>> <<set _hasNonFlatChest = $bodyParts.chest !== "flat" && $bodyParts.chest !== "flat masculine">> <<if _hasNonFlatChest>> <<run setup.addSexualSkillExp("titWorship", _finalXP)>> <<run _sexualXPGains.push({skill: "Tit Worship", amount: _finalXP})>> <</if>> <<if _hasPenis>> <<run setup.addSexualSkillExp("vaginal", _finalXP)>> <<run _sexualXPGains.push({skill: "Vaginal", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "wardrobe">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<if _hasPenis>> <<run setup.addSexualSkillExp("handjobs", _finalXP)>> <<run _sexualXPGains.push({skill: "Handjobs", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "companionship">> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualXPGains.push({skill: "Sensual", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<if _hasPenis>> <<run setup.addSexualSkillExp("handjobs", _finalXP)>> <<run _sexualXPGains.push({skill: "Handjobs", amount: _finalXP})>> <<elseif _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "massage3">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualXPGains.push({skill: "Sensual", amount: _finalXP})>> <<if _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "fashion">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualXPGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualXPGains.push({skill: "Teasing", amount: _finalXP})>> <<if _hasPenis>> <<run setup.addSexualSkillExp("handjobs", _finalXP)>> <<run _sexualXPGains.push({skill: "Handjobs", amount: _finalXP})>> <<elseif _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <<elseif $currentEroticTask === "needs">> <<run setup.addSexualSkillExp("rough", _finalXP)>> <<run _sexualXPGains.push({skill: "Rough", amount: _finalXP})>> <<if _hasPenis>> <<run setup.addSexualSkillExp("oralGiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Giving)", amount: _finalXP})>> <<elseif _hasVagina>> <<run setup.addSexualSkillExp("oralReceiving", _finalXP)>> <<run _sexualXPGains.push({skill: "Oral (Receiving)", amount: _finalXP})>> <</if>> <</if>> <</if>> <!-- Check if reached daily limit --> <<if $secretaryHoursWorkedToday >= 8>> <<set $showWorkLimitNext = true>> <</if>> <!-- Calculate base pay with Pearl of Abundance bonus --> <<set _basePay = $currentTask.pay>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_basePay * 0.5)>> <<set _basePay = _basePay + _pearlBonus>> <</if>> <!-- Check if player has bank account for direct deposit --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<set _totalDeposited = 0>> <!-- RESTORE CASH/BANK TO PREVENT DOUBLE ADDITIONS FROM ANY HELPER FUNCTIONS --> <<set $money = _savedMoney>> <<if $bankAccount>> <<set $bankAccount.balance = _savedBankBalance>> <</if>> <<if _hasBankAccount>> <!-- Calculate 5% direct deposit bonus --> <<set _creditBonus = Math.floor(_basePay * 0.05)>> <<set _totalDeposited = _basePay + _creditBonus>> <!-- Add directly to bank account --> <<set $bankAccount.balance += _totalDeposited>> <<else>> <!-- No bank account - pay base in cash --> <<set $money += _basePay>> <</if>> <!-- Lucky bonus money check (ALWAYS GOES TO CASH) --> <<set _bonusMoneyChance = 3>> <<if $mentalTraits.includes("Lucky") || $physicalTraits.includes("Hellhound")>> <<set _bonusMoneyChance = 10>> <<elseif $mentalTraits.includes("Unlucky")>> <<set _bonusMoneyChance = 0>> <</if>> <<set _bonusMoney = 0>> <<if random(1, 100) <= _bonusMoneyChance>> <<set _bonusMoney = random(50, 150)>> <<set $money += _bonusMoney>> <!-- Bonus money ALWAYS goes to cash --> <</if>> <!-- Trait gain system --> <<set _traitGained = false>> <<set _gainedTraitName = "">> <<set _replacedTrait = "">> <<set _isSkill = false>> <<if random(1, 100) <= 3>> <<if $acceptedEroticTask>> <!-- Erotic task trait pool --> <<set _eroticTraitPool = { physical: ["Graceful", "Fashionable"], mental: ["Customer-Focused", "Soft-Spoken", "Hushed Intimate Voice", "Loyal", "High Stamina", "Flirty", "Seductive", "Alluring", "Perfectionist", "Perverted", "Hardworking", "Quick Learner"], skills: ["Sexually Skilled", "Modeling", "Makeup"] }>> <!-- Flatten into single array with type info --> <<set _availableTraits = []>> <<for _pt range _eroticTraitPool.physical>> <<run _availableTraits.push({name: _pt, type: "physical"})>> <</for>> <<for _mt range _eroticTraitPool.mental>> <<run _availableTraits.push({name: _mt, type: "mental"})>> <</for>> <<for _st range _eroticTraitPool.skills>> <<run _availableTraits.push({name: _st, type: "skill"})>> <</for>> <<set _chosenTrait = _availableTraits.random()>> <<elseif !$refusedTask>> <!-- Regular task trait pool --> <<set _regularTraitPool = { mental: ["Perceptive", "Detail-Oriented", "Punctual", "Friendly Tone", "Clear Pronunciation", "Diplomatic", "Organized", "Resourceful", "Focused", "Determined", "Considerate", "Polite", "Reassuring", "Direct", "Efficient", "Workaholic", "Warm", "Logical", "Patient", "Intelligent", "Quick Learner"], skills: ["Public Speaking", "Accounting", "Customer Service"] }>> <!-- Flatten into single array with type info --> <<set _availableTraits = []>> <<for _mt range _regularTraitPool.mental>> <<run _availableTraits.push({name: _mt, type: "mental"})>> <</for>> <<for _st range _regularTraitPool.skills>> <<run _availableTraits.push({name: _st, type: "skill"})>> <</for>> <<set _chosenTrait = _availableTraits.random()>> <</if>> <!-- Process trait gain if one was selected --> <<if _chosenTrait>> <<if _chosenTrait.type === "skill">> <!-- Check if player already has this skill --> <<if !$skills.includes(_chosenTrait.name)>> <<run $skills.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <<set _isSkill = true>> <!-- Initialize sexual skills if Sexually Skilled was just gained --> <<if _chosenTrait.name === "Sexually Skilled">> <<run setup.initializeSexualSkills()>> <</if>> <</if>> <<elseif _chosenTrait.type === "physical">> <!-- Check for conflicts in physical traits --> <<if !$physicalTraits.includes(_chosenTrait.name)>> <<set _conflict = setup.getConflictingTrait(_chosenTrait.name, $physicalTraits)>> <<if _conflict>> <<run $physicalTraits.delete(_conflict)>> <<set _replacedTrait = _conflict>> <</if>> <<run $physicalTraits.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <</if>> <<elseif _chosenTrait.type === "mental">> <!-- Check for conflicts in mental traits --> <<if !$mentalTraits.includes(_chosenTrait.name)>> <<set _conflict = setup.getConflictingTrait(_chosenTrait.name, $mentalTraits)>> <<if _conflict>> <<run $mentalTraits.delete(_conflict)>> <<set _replacedTrait = _conflict>> <</if>> <<run $mentalTraits.push(_chosenTrait.name)>> <<set _traitGained = true>> <<set _gainedTraitName = _chosenTrait.name>> <</if>> <</if>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✓ Task Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if $acceptedEroticTask>> You've fulfilled the mayor's request. The office door unlocks with a soft click as the mayor dismisses you with a satisfied smile. <<elseif $refusedTask>> You politely but firmly declined the mayor's request. The mayor looks disappointed but waves you away dismissively, handing you a reduced payment. <<else>> You complete the task efficiently and professionally. The mayor nods in approval, satisfied with your work. <</if>> </p> </div> <!-- Relationship Change Display --> <<if _relationshipGained && _mayorName !== "">> <<if $relationships[_mayorName]>> <<if $refusedTask>> <div style="background: linear-gradient(135deg, #2a0a0a 0%, #1a0505 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 0 25px rgba(255, 107, 107, 0.4); text-align: center; animation: pulse-red 2s infinite;"> <p style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(255, 107, 107, 0.6);"> 💔 Relationship Damaged </p> <p style="color: #ff8787; font-size: 16px; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Your relationship with <<print _mayorName>> has suffered. <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Penalty!)</span> <</if>> </p> <p style="color: #ff6b6b; font-size: 20px; font-weight: bold; margin: 10px 0 0 0;"> <<print _finalRelationshipPoints>> Relationship Points </p> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> (Level <<print $relationships[_mayorName].level>>, <<print $relationships[_mayorName].points>> points) </p> </div> <style> @keyframes pulse-red { 0%, 100% { box-shadow: 0 0 25px rgba(255, 107, 107, 0.4); } 50% { box-shadow: 0 0 35px rgba(255, 107, 107, 0.7); } } </style> <<else>> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 0 25px rgba(81, 207, 102, 0.4); text-align: center; animation: pulse-green 2s infinite;"> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(81, 207, 102, 0.6);"> 💕 Connection Deepened </p> <p style="color: #4ade80; font-size: 16px; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Your relationship with <<print _mayorName>> has improved! <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Bonus!)</span> <</if>> </p> <p style="color: #51cf66; font-size: 20px; font-weight: bold; margin: 10px 0 0 0;"> +<<print _finalRelationshipPoints>> Relationship Points </p> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> (Level <<print $relationships[_mayorName].level>>, <<print $relationships[_mayorName].points>> points) </p> </div> <style> @keyframes pulse-green { 0%, 100% { box-shadow: 0 0 25px rgba(81, 207, 102, 0.4); } 50% { box-shadow: 0 0 35px rgba(81, 207, 102, 0.7); } } </style> <</if>> <</if>> <</if>> <!-- Aftermath based on task type --> <<if $acceptedEroticTask>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #FFD700; margin-top: 0; text-align: center;">💋 Intimate Service Rendered</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> You straighten your clothes and catch your breath. The mayor is already back at work, as if nothing happened. But the knowing glances say otherwise. </p> </div> <<elseif $refusedTask>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin-top: 0; text-align: center;">✗ Request Declined</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> The atmosphere is awkward. The mayor clearly expected compliance. Your refusal has been noted, and the reduced payment reflects their displeasure. </p> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #9b59b6; margin-top: 0; text-align: center;">✓ Professional Task Completed</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> Another task done. The work is straightforward, if unremarkable. The mayor thanks you and returns to their paperwork. </p> </div> <</if>> <!-- Sexual XP Gained Event --> <<if _sexualXPGains.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h2 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if _sexSkillXPBonus > 0>> <span style="color: #CE93D8;">⭐ +<<print _sexSkillXPBonus>></span> <</if>> <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-top: 15px;"> <<for _xp range _sexualXPGains>> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px; border: 2px solid #ff69b4; text-align: center;"> <p style="color: #ff69b4; font-size: 14px; font-weight: bold; margin: 0;"><<print _xp.skill>></p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 5px 0 0 0;">+<<print _xp.amount>> XP</p> </div> <</for>> </div> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 15px 0 0 0; font-style: italic;"> <<if $currentArtifact === "The Basking Charm">> The Basking Charm amplifies every sensation, every lesson learned... <<else>> Your intimate experiences are refining your skills... <</if>> </p> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- Trait Gained Event --> <<if _traitGained>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 8px 16px rgba(81, 207, 102, 0.3); animation: glow 2s infinite;"> <h2 style="color: #51cf66; margin-top: 0; text-align: center;">✨ New <<if _isSkill>>Skill<<else>>Trait<</if>> Gained!</h2> <p style="color: #51cf66; font-size: 20px; text-align: center; margin: 0 0 10px 0; font-weight: bold;"> <<if _isSkill>>🎯<<elseif _chosenTrait.type === "physical">>💪<<else>>🧠<</if>> _gainedTraitName </p> <<if _replacedTrait !== "">> <p style="color: #ff6b6b; font-size: 14px; text-align: center; margin: 0 0 10px 0;"> (Replaced: _replacedTrait) </p> <</if>> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> <<if $acceptedEroticTask>> The intimate work is changing you in unexpected ways... <<else>> Your professional dedication is paying off! <</if>> </p> </div> <style> @keyframes glow { 0%, 100% { box-shadow: 0 8px 16px rgba(81, 207, 102, 0.3); } 50% { box-shadow: 0 8px 24px rgba(81, 207, 102, 0.6); } } </style> <</if>> <!-- Bonus Money Event (ALWAYS CASH) --> <<if _bonusMoney > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 8px 16px rgba(255, 215, 0, 0.3); animation: pulse 2s infinite;"> <h2 style="color: #FFD700; margin-top: 0; text-align: center;">💰 Unexpected Cash Bonus!</h2> <p style="color: #51cf66; font-size: 18px; text-align: center; margin: 0 0 10px 0; font-weight: bold;"> +$<<print _bonusMoney>> (Cash) </p> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> <<if $acceptedEroticTask>> "For going above and beyond," the mayor says with a wink, sliding extra cash across the desk. <<else>> "You've been doing excellent work lately," the mayor says, handing you extra cash with a smile. <</if>> </p> <<if $mentalTraits.includes("Lucky")>> <p style="color: #ffc107; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> Your luck really pays off sometimes! </p> <</if>> </div> <style> @keyframes pulse { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 215, 0, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 215, 0, 0.6); } } </style> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your base earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Credit Bonus Notification --> <<if _hasBankAccount && _creditBonus > 0>> <div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #667eea; box-shadow: 0 0 20px rgba(102, 126, 234, 0.4); animation: pulse-credit 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 💳 Direct Deposit Bonus: +<<print setup.formatMoney(_creditBonus)>> (5%)! 💳 </p> </div> <style> @keyframes pulse-credit { 0%, 100% { box-shadow: 0 0 20px rgba(102, 126, 234, 0.4); } 50% { box-shadow: 0 0 30px rgba(102, 126, 234, 0.7); } } </style> <</if>> <!-- Payment Summary --> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin-top: 0; text-align: center;">💰 Payment Summary</h3> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #aaa; margin: 0 0 10px 0; text-align: center; font-size: 14px;">Base Task Pay:</p> <<if _pearlActive>> <p style="color: #51cf66; margin: 0; text-align: center; font-size: 20px; font-weight: bold;"> <<print setup.formatMoney(_basePay)>> <span style="color: #7dd3fc; font-size: 14px;">(+50% Pearl)</span> </p> <p style="color: #aaa; margin: 5px 0 0 0; text-align: center; font-size: 12px;"> Original: <<print setup.formatMoney($currentTask.pay)>> + Pearl: <span style="color: #7dd3fc;"><<print setup.formatMoney(_pearlBonus)>></span> </p> <<else>> <p style="color: #51cf66; margin: 0; text-align: center; font-size: 20px; font-weight: bold;"> <<print setup.formatMoney(_basePay)>> </p> <</if>> </div> <<if _hasBankAccount>> <!-- Show direct deposit breakdown --> <div style="background: #2a2a4a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #667eea;"> <p style="color: #667eea; margin: 0 0 10px 0; font-size: 16px; font-weight: bold; text-align: center;">💳 Direct Deposit to Bank</p> <<if _creditBonus > 0>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-top: 10px;"> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 13px;">Base Deposit:</p> <p style="color: #51cf66; margin: 0; font-size: 18px; font-weight: bold;"><<print setup.formatMoney(_basePay)>></p> </div> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 13px;">Credit Bonus (5%):</p> <p style="color: #667eea; margin: 0; font-size: 18px; font-weight: bold;">+<<print setup.formatMoney(_creditBonus)>></p> </div> </div> <hr style="border: 0; border-top: 1px solid #667eea; margin: 10px 0;"> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Deposited:</p> <p style="color: #51cf66; margin: 0; font-size: 22px; font-weight: bold;"><<print setup.formatMoney(_totalDeposited)>></p> </div> <<else>> <div style="text-align: center; margin-top: 10px;"> <p style="color: #51cf66; margin: 0; font-size: 22px; font-weight: bold;"><<print setup.formatMoney(_basePay)>> deposited</p> </div> <</if>> </div> <<else>> <!-- Cash payment only --> <div style="background: #2a4a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <p style="color: #51cf66; margin: 0 0 10px 0; font-size: 16px; font-weight: bold; text-align: center;">💵 Paid in Cash</p> <div style="text-align: center; margin-top: 10px;"> <p style="color: #51cf66; margin: 0; font-size: 22px; font-weight: bold;"><<print setup.formatMoney(_basePay)>></p> </div> <p style="color: #ffc107; margin: 10px 0 0 0; font-size: 13px; text-align: center;"> 💡 Open a bank account to receive a 5% direct deposit bonus! </p> </div> <</if>> <<if _bonusMoney > 0>> <!-- Bonus money (always cash) --> <div style="background: #4a3a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #FFD700;"> <p style="color: #FFD700; margin: 0 0 10px 0; font-size: 16px; font-weight: bold; text-align: center;">💵 Lucky Bonus (Cash)</p> <div style="text-align: center;"> <p style="color: #FFD700; margin: 0; font-size: 20px; font-weight: bold;">+<<print setup.formatMoney(_bonusMoney)>></p> </div> </div> <</if>> <hr style="border: 0; border-top: 1px solid #666; margin: 15px 0;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Cash on Hand:</p> <p style="color: #51cf66; margin: 0; font-size: 20px; font-weight: bold;"><<print setup.formatMoney($money)>></p> </div> <<if _hasBankAccount>> <div style="text-align: center;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Bank Balance:</p> <p style="color: #667eea; margin: 0; font-size: 20px; font-weight: bold;"><<print setup.formatMoney($bankAccount.balance)>></p> </div> <</if>> </div> <<if _hasBankAccount>> <div style="text-align: center; margin-top: 10px; padding-top: 10px; border-top: 1px solid #666;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Funds:</p> <p style="color: #ffd43b; margin: 0; font-size: 24px; font-weight: bold;"><<print setup.formatMoney($money + $bankAccount.balance)>></p> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <p style="color: #4dabf7; font-size: 14px; margin: 0;"> Hours worked today: <strong>$secretaryHoursWorkedToday/8</strong> </p> </div> </div> <!-- Action Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Continue Working --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 10px 0; text-align: center;">🔄 Continue Working</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> See if the mayor has more tasks </p> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Keep Working</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<if $showWorkLimitNext>> <<set $showWorkLimitNext = false>> <<goto "SecretaryWorkLimitReached">> <<else>> <<goto "SecretarySpecialTasks">> <</if>> <</link>> </div> <!-- End Shift --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">🚪 End Shift</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Leave Town Hall for the day </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<goto "TownHall">> <</link>> </div> </div> <!-- Quick Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Return to Secretary Work</div>">> <<set $acceptedEroticTask = false>> <<set $refusedTask = false>> <<goto "SecretaryWork">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; align-items: center; justify-content: center;"> <div style="max-width: 700px; width: 100%;"> <div style="background: #2a1a1a; padding: 30px; border-radius: 15px; border: 3px solid #ff6b6b; box-shadow: 0 8px 16px rgba(255, 107, 107, 0.4);"> <h1 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0;">⚠️ Content Warning</h1> <div style="background: #1a1a1a; padding: 25px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <strong style="color: #ff6b6b;">Warning:</strong> The Mayor's Secretary job contains explicit adult content. </p> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> This job involves sexual scenarios that may include: </p> <ul style="color: #aaa; font-size: 15px; line-height: 1.6; margin: 0 0 15px 20px;"> <li>Explicit sexual content and descriptions</li> <li>Workplace power dynamics</li> <li>Sexual harassment themes</li> <li>Adult situations across various gender combinations</li> <li>Coercion (with certain character traits)</li> </ul> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> This content is intended for mature audiences only. You can refuse inappropriate requests from the mayor, though this may affect your payment. </p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <!-- Continue --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #1a2a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ I Understand</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Continue to work </p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Proceed</div>">> <<set $hasSeenSecretaryWarning = true>> <<goto "SecretaryWork">> <</link>> </div> <!-- Go Back --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #888; margin: 0 0 10px 0; text-align: center;">✗ Go Back</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Return to Town Hall </p> <<link "<div style='background: linear-gradient(135deg, #666 0%, #555 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Leave</div>">> <<goto "TownHall">> <</link>> </div> </div> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize Sunfish counter if it doesn't exist --> <<if !$sunfishSightings>> <<set $sunfishSightings = 0>> <</if>> <!-- Get Mayor's Gender --> <<set _mayorNPCs = setup.getNPCsByJob("City Mayor")>> <<set _mayorGender = "unknown">> <<if _mayorNPCs.length > 0>> <<set _mayorGender = _mayorNPCs[0].bodyParts.gender>> <</if>> <!-- Calculate Attractiveness Score --> <<set _attractiveTraits = ["Attractive", "Curvy", "Voluptuous", "Charming", "Seductive", "Alluring", "Flirty", "Smooth Skin", "Youthful", "Graceful", "Fashionable", "Warm", "Charismatic Voice", "Smooth Voice"]>> <<set _masculineTraits = ["Muscular", "Broad-shouldered", "Strong", "Athletic Build", "Sturdy", "Jock", "Fit", "Lean"]>> <<set _feminineTraits = ["Curvy", "Voluptuous", "Soft", "Graceful", "Petite", "Youthful", "Smooth Skin"]>> <<set _attractivenessScore = 0>> <<set _masculinityScore = 0>> <<set _femininityScore = 0>> <<for _trait range _attractiveTraits>> <<if $physicalTraits.includes(_trait) || $mentalTraits.includes(_trait)>> <<set _attractivenessScore += 1>> <</if>> <</for>> <<for _trait range _masculineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _masculinityScore += 1>> <</if>> <</for>> <<for _trait range _feminineTraits>> <<if $physicalTraits.includes(_trait)>> <<set _femininityScore += 1>> <</if>> <</for>> <!-- Check for sexual traits --> <<set _sexualTraits = ["Oral Expert", "Anal Expert", "Dirty Talker", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Exhibitionist", "Rough Sex Enthusiast", "Sensual Lover", "Roleplay Expert", "Tantric Master", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]>> <<set _hasSexualTraits = false>> <<set _sexualTraitCount = 0>> <<for _trait range _sexualTraits>> <<if $skills.includes(_trait)>> <<set _hasSexualTraits = true>> <<set _sexualTraitCount += 1>> <</if>> <</for>> <!-- Chest size bonus for female player with male mayor --> <<set _chestBonus = 0>> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _chestSizes = ["flat", "small", "medium", "large", "huge", "giant"]>> <<set _chestIndex = _chestSizes.indexOf($bodyParts.chest.toLowerCase())>> <<if _chestIndex >= 0>> <<set _chestBonus = _chestIndex * 5>> <</if>> <</if>> <!-- Calculate base erotic task chance --> <<set _eroticChance = 20>> <!-- Sexual traits increase erotic chance --> <<if _hasSexualTraits>> <<set _eroticChance += (_sexualTraitCount * 5)>> <</if>> <!-- Gender-based modifiers --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticChance += (_attractivenessScore * 5) + (_femininityScore * 5) + _chestBonus>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticChance += (_attractivenessScore * 5) + (_masculinityScore * 8)>> <<elseif $bodyParts.gender === _mayorGender>> <!-- Same gender - requires high attractiveness + specific traits --> <<if $bodyParts.gender === "male" && $mentalTraits.includes("Femboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<elseif $bodyParts.gender === "female" && $mentalTraits.includes("Tomboy")>> <<set _eroticChance = (_attractivenessScore >= 5) ? 40 : 0>> <<else>> <<set _eroticChance = 0>> <</if>> <!-- Add sexual trait bonus for same gender --> <<if _eroticChance > 0 && _hasSexualTraits>> <<set _eroticChance += (_sexualTraitCount * 5)>> <</if>> <</if>> <!-- Sunfish trait override --> <<if $skills.includes("Sunfish")>> <<set _eroticChance = 95>> <<else>> <!-- Cap at 85% for non-Sunfish players --> <<if _eroticChance > 85>> <<set _eroticChance = 85>> <</if>> <</if>> <!-- Determine task type --> <<set _taskRoll = random(1, 100)>> <<set _isEroticTask = _taskRoll <= _eroticChance>> <!-- Check for Sunfish trait event (1% chance) --> <<set _sunfishEvent = false>> <<if $skills.includes("Sunfish") && random(1, 100) === 1>> <<set _sunfishEvent = true>> <<set $sunfishSightings += 1>> <</if>> <!-- Check if going to The Alter --> <<if $sunfishSightings >= 10>> <<run setup.achievements.unlock("stalked_10_times")>> <<goto "TheAlter">> <</if>> <!-- Calculate erotic payment based on traits (75-250) --> <<set _traitPaymentScore = _attractivenessScore + _masculinityScore + _femininityScore + (_chestBonus / 5)>> <<set _eroticPay = Math.floor(75 + (_traitPaymentScore * 12))>> <<if _eroticPay > 250>> <<set _eroticPay = 250>> <</if>> <!-- Generate Task --> <<if !_isEroticTask>> <!-- NORMAL TASK --> <<set _normalTasks = [ {desc: "File paperwork and organize the mayor's schedule", pay: 30}, {desc: "answer phone calls and respond to emails", pay: 25}, {desc: "prepare meeting notes and agendas", pay: 35}, {desc: "coordinate with other city departments", pay: 40}, {desc: "review and proofread city documents", pay: 30}, {desc: "manage the mayor's calendar and appointments", pay: 35}, {desc: "order office supplies and maintain inventory", pay: 25}, {desc: "greet visitors and direct them appropriately", pay: 30} ]>> <<set _task = _normalTasks.random()>> <<set _taskType = "normal">> <<else>> <!-- EROTIC TASK --> <<if $bodyParts.gender === "female" && _mayorGender === "male">> <<set _eroticTasks = [ {desc: "sit on the mayor's lap during a 'private meeting'", pay: _eroticPay, passage: "SecretaryEroticLap", taskId: "lap"}, {desc: "massage the mayor's shoulders while he works", pay: _eroticPay, passage: "SecretaryEroticMassage", taskId: "massage"}, {desc: "wear a more 'professional' outfit the mayor has selected", pay: _eroticPay, passage: "SecretaryEroticOutfit", taskId: "outfit"}, {desc: "take dictation while sitting very close to the mayor", pay: _eroticPay, passage: "SecretaryEroticDictation", taskId: "dictation"}, {desc: "help the mayor 'relieve stress' under his desk", pay: _eroticPay, passage: "SecretaryEroticDesk", taskId: "desk"}, {desc: "model the new 'city uniform' for the mayor's approval", pay: _eroticPay, passage: "SecretaryEroticModel", taskId: "modeling"}, {desc: "give the mayor a 'special presentation' behind closed doors", pay: _eroticPay, passage: "SecretaryEroticPresentation", taskId: "presentation"} ]>> <<elseif $bodyParts.gender === "male" && _mayorGender === "female">> <<set _eroticTasks = [ {desc: "let the mayor admire your physique during a 'fitness consultation'", pay: _eroticPay, passage: "SecretaryEroticPhysique", taskId: "fitness"}, {desc: "assist the mayor with 'personal stress relief'", pay: _eroticPay, passage: "SecretaryEroticRelief", taskId: "relief"}, {desc: "provide the mayor with a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageFemale", taskId: "massage2"}, {desc: "model swimwear for the mayor's 'aquatics initiative review'", pay: _eroticPay, passage: "SecretaryEroticSwimwear", taskId: "swimwear"}, {desc: "help the mayor with 'personal satisfaction' in her private office", pay: _eroticPay, passage: "SecretaryEroticSatisfaction", taskId: "satisfaction"}, {desc: "demonstrate your strength by lifting the mayor", pay: _eroticPay, passage: "SecretaryEroticLift", taskId: "strength"}, {desc: "provide 'intimate assistance' as requested", pay: _eroticPay, passage: "SecretaryEroticAssist", taskId: "assistance"} ]>> <<else>> <!-- Same gender tasks --> <<set _eroticTasks = [ {desc: "help the mayor with a 'private wardrobe consultation'", pay: _eroticPay, passage: "SecretaryEroticWardrobe", taskId: "wardrobe"}, {desc: "provide the mayor with 'personal companionship'", pay: _eroticPay, passage: "SecretaryEroticCompanion", taskId: "companionship"}, {desc: "give the mayor a private massage", pay: _eroticPay, passage: "SecretaryEroticMassageSame", taskId: "massage3"}, {desc: "model clothing for the mayor's review", pay: _eroticPay, passage: "SecretaryEroticModelSame", taskId: "fashion"}, {desc: "assist with the mayor's 'special needs'", pay: _eroticPay, passage: "SecretaryEroticNeeds", taskId: "needs"} ]>> <</if>> <<set _task = _eroticTasks.random()>> <<set _taskType = "erotic">> <!-- Apply sexual trait bonuses to payment --> <<set _paymentBonus = 0>> <!-- Check for trait-specific bonuses based on task type --> <<if _task.taskId === "lap" || _task.taskId === "dictation">> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 30>> <</if>> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 25>> <</if>> <<elseif _task.taskId === "massage" || _task.taskId === "massage2" || _task.taskId === "massage3">> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "outfit" || _task.taskId === "modeling" || _task.taskId === "presentation" || _task.taskId === "fitness" || _task.taskId === "swimwear" || _task.taskId === "wardrobe" || _task.taskId === "fashion">> <<if $skills.includes("Exhibitionist")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "desk" || _task.taskId === "relief">> <<if $skills.includes("Oral Expert")>> <<set _paymentBonus += 45>> <</if>> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 25>> <</if>> <<elseif _task.taskId === "satisfaction" || _task.taskId === "needs">> <<if $skills.includes("BDSM Enthusiast - Sub")>> <<set _paymentBonus += 30>> <</if>> <<if $skills.includes("Rough Sex Enthusiast")>> <<set _paymentBonus += 35>> <</if>> <<elseif _task.taskId === "strength">> <<if $skills.includes("Sexual Stamina Expert")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "assistance">> <<if $skills.includes("Rough Sex Enthusiast")>> <<set _paymentBonus += 40>> <</if>> <<elseif _task.taskId === "companionship">> <<if $skills.includes("Sensual Lover")>> <<set _paymentBonus += 35>> <</if>> <</if>> <!-- Apply bonus to task payment --> <<set _task.pay += _paymentBonus>> <!-- Trophy Wife 2x cash bonus for secretary sexual acts --> <<if $physicalTraits.includes("Trophy Wife")>> <<set _task.pay = _task.pay * 2>> <</if>> <!-- Slut 2x cash bonus for secretary sexual acts --> <<if $physicalTraits.includes("Slut")>> <<set _task.pay = _task.pay * 2>> <</if>> <!-- Cap at 1400 (increased to accommodate Slut bonus) --> <<if _task.pay > 1400>> <<set _task.pay = 1400>> <</if>> <</if>> <!-- Store task info globally for sub-passages --> <<set $currentTask = _task>> <<set $currentTaskType = _taskType>> <!-- Check for forced acceptance (Bimbo/Submissive) --> <<set _canRefuse = true>> <<set _forceAcceptChance = 0>> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 75>> <<elseif $mentalTraits.includes("Bimbo") || $mentalTraits.includes("Submissive")>> <<set _forceAcceptChance = 50>> <</if>> <<set _forcedAcceptance = false>> <<if _forceAcceptChance > 0 && random(1, 100) <= _forceAcceptChance>> <<set _forcedAcceptance = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9b59b6; text-align: center;">✨ Special Assignment</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0;"> You enter the mayor's private office. The door closes behind you with a soft click. </p> </div> <!-- Sunfish Event --> <<if _sunfishEvent>> <div style="background: #1a3a4a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4a9eff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> For a brief moment, you catch a glimpse of something in your peripheral vision - a shadowy figure that appears to be made of several sunfish stacked in a trench coat. When you turn to look, there's nothing there. Just an empty corner of the office. </p> <p style="color: #74c0fc; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> (Strange sightings: $sunfishSightings/10) </p> </div> <</if>> <!-- Task Description --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>; margin-top: 0;">The Mayor's Request</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; border: 2px solid <<if _taskType === 'erotic'>>#FFD700<<else>>#666<</if>>;"> <p style="color: #ccc; font-size: 16px; margin: 0;"> The mayor asks you to <strong style="color: <<if _taskType === 'erotic'>>#FFD700<<else>>#9b59b6<</if>>;"><<print _task.desc>></strong>. </p> <<if _taskType === "erotic">> <p style="color: #ffc107; font-size: 14px; margin: 15px 0 0 0; font-style: italic;"> This definitely wasn't in your job description... </p> <</if>> </div> <div style="margin-top: 20px; padding: 15px; background: #1a1a1a; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0;"> Payment: <strong>$<<print _task.pay>></strong> </p> <<if _taskType === "erotic">> <p style="color: #ff6b6b; font-size: 14px; margin: 5px 0 0 0;"> Refusing will result in reduced pay ($<<print Math.floor(_task.pay * 0.3)>>) </p> <</if>> </div> </div> <!-- Decision Options --> <<if _forcedAcceptance && _taskType === "erotic">> <!-- Forced Acceptance --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ff6b6b; font-size: 16px; text-align: center; margin: 0 0 15px 0; font-style: italic;"> <<if $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> Your submissive nature and scattered thoughts make it impossible to refuse. You find yourself nodding automatically. <<else>> Something about the request makes you unable to say no. Your body moves on its own. <</if>> </p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Comply</div>">> <<goto _task.passage>> <</link>> </div> <<else>> <!-- Normal Choice --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 30px;"> <!-- Accept --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✓ Accept</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Do as the mayor requests </p> <<if _taskType === "erotic">> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<goto _task.passage>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Task</div>">> <<set $money += _task.pay>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<goto "SecretaryTaskResult">> <</link>> <</if>> </div> <!-- Refuse --> <<if _taskType === "erotic">> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">✗ Refuse</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0 0 15px 0;"> Politely decline </p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Refuse Task</div>">> <<set $money += Math.floor(_task.pay * 0.3)>> <<run window.advanceTime(60)>> <<set $acceptedEroticTask = false>> <<set $refusedTask = true>> <<goto "SecretaryTaskResult">> <</link>> </div> <</if>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Office</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">⏰ Daily Work Limit Reached</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b6b 0%, #ee5a52 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> You've already worked 8 hours today as the mayor's secretary. That's enough for one day. You also might have worked 9 hours, but let's just say that's now a feature. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0; line-height: 1.6;"> The mayor waves you away. "You've done plenty today. Go home and rest. I'll see you tomorrow." </p> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 2px solid #4dabf7;"> <p style="color: #4dabf7; font-size: 16px; text-align: center; margin: 0;"> Hours Worked Today: <strong>$secretaryHoursWorkedToday/8</strong> </p> <p style="color: #888; font-size: 14px; text-align: center; margin: 10px 0 0 0;"> Come back tomorrow for more work. </p> </div> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Town Hall</div>">> <<goto "TownHall">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Current Time Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; margin-bottom: 20px;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <strong style="color: #4dabf7; font-size: 14px;">Current Time</strong><br> <span id="currentTime" style="color: #51cf66; font-size: 24px; font-weight: bold;"><<= getTimeString()>></span> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <strong style="color: #4dabf7; font-size: 14px;">Day of Week</strong><br> <span id="currentDayOfWeek" style="color: #ffd43b; font-size: 24px; font-weight: bold;">$dayOfWeek</span> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <strong style="color: #4dabf7; font-size: 14px;">Day Number</strong><br> <span id="currentDayNumber" style="color: #ff8787; font-size: 24px; font-weight: bold;">$dayNumber</span> </div> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <strong style="color: #4dabf7; font-size: 14px;">Week Number</strong><br> <span id="currentWeekNumber" style="color: #da77f2; font-size: 24px; font-weight: bold;">$weekNumber</span> </div> </div> </div> <!-- Quick Time Adjustments --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #51cf6644; margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">⏱️ Quick Time Adjustments</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+15 Minutes</div>">> <<run window.advanceTime(15)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+30 Minutes</div>">> <<run window.advanceTime(30)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1 Hour</div>">> <<run window.advanceTime(60)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+3 Hours</div>">> <<run window.advanceTime(180)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+6 Hours</div>">> <<run window.advanceTime(360)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+12 Hours</div>">> <<run window.advanceTime(720)>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> </div> </div> <!-- Set Specific Time --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd43b44; margin-bottom: 20px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0; text-align: center;">🕐 Set Specific Time</h2> <!-- Morning Times --> <div style="margin-bottom: 15px;"> <h3 style="color: #ffd43b; margin: 0 0 10px 0; font-size: 16px;">☀️ Morning</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: 8px;"> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(6) + "</div>"`>> <<set $timeInMinutes = 360>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(7) + "</div>"`>> <<set $timeInMinutes = 420>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(8) + "</div>"`>> <<set $timeInMinutes = 480>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(9) + "</div>"`>> <<set $timeInMinutes = 540>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(10) + "</div>"`>> <<set $timeInMinutes = 600>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(11) + "</div>"`>> <<set $timeInMinutes = 660>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> <!-- Afternoon Times --> <div style="margin-bottom: 15px;"> <h3 style="color: #ff8787; margin: 0 0 10px 0; font-size: 16px;">🌤️ Afternoon</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: 8px;"> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(12) + "</div>"`>> <<set $timeInMinutes = 720>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(13) + "</div>"`>> <<set $timeInMinutes = 780>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(14) + "</div>"`>> <<set $timeInMinutes = 840>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(15) + "</div>"`>> <<set $timeInMinutes = 900>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(16) + "</div>"`>> <<set $timeInMinutes = 960>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff8787; color: #ff8787; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(17) + "</div>"`>> <<set $timeInMinutes = 1020>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> <!-- Evening Times --> <div style="margin-bottom: 15px;"> <h3 style="color: #ff6347; margin: 0 0 10px 0; font-size: 16px;">🌆 Evening</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: 8px;"> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(18) + "</div>"`>> <<set $timeInMinutes = 1080>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(19) + "</div>"`>> <<set $timeInMinutes = 1140>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(20) + "</div>"`>> <<set $timeInMinutes = 1200>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(21) + "</div>"`>> <<set $timeInMinutes = 1260>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(22) + "</div>"`>> <<set $timeInMinutes = 1320>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(23) + "</div>"`>> <<set $timeInMinutes = 1380>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> <!-- Night Times --> <div> <h3 style="color: #9775fa; margin: 0 0 10px 0; font-size: 16px;">🌙 Night</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); gap: 8px;"> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(0) + "</div>"`>> <<set $timeInMinutes = 0>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(1) + "</div>"`>> <<set $timeInMinutes = 60>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(2) + "</div>"`>> <<set $timeInMinutes = 120>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(3) + "</div>"`>> <<set $timeInMinutes = 180>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(4) + "</div>"`>> <<set $timeInMinutes = 240>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> <<link `"<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9775fa; color: #9775fa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>" + formatHourLabel(5) + "</div>"`>> <<set $timeInMinutes = 300>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> </div> <!-- Manual Time Input --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e91e6344; margin-bottom: 20px;"> <h2 style="color: #e91e63; margin: 0 0 15px 0; text-align: center;">⌨️ Manual Time Input</h2> <div style="background-color: #1a1a1a; padding: 20px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: 2fr 2fr 1fr; gap: 15px; align-items: end; max-width: 600px; margin: 0 auto;"> <div> <label style="color: #e91e63; font-weight: bold; display: block; margin-bottom: 5px;">Hour (1-12)</label> <<textbox "_manualHour" "8" style="width: 100%; padding: 10px; background: #2d2d2d; border: 2px solid #e91e63; border-radius: 6px; color: white; font-size: 16px;">> </div> <div> <label style="color: #e91e63; font-weight: bold; display: block; margin-bottom: 5px;">Minute (0-59)</label> <<textbox "_manualMinute" "00" style="width: 100%; padding: 10px; background: #2d2d2d; border: 2px solid #e91e63; border-radius: 6px; color: white; font-size: 16px;">> </div> <div> <label style="color: #e91e63; font-weight: bold; display: block; margin-bottom: 5px;">AM/PM</label> <select id="ampmSelect" style="width: 100%; padding: 10px; background: #2d2d2d; border: 2px solid #e91e63; border-radius: 6px; color: white; font-size: 16px; cursor: pointer;"> <option value="AM">AM</option> <option value="PM">PM</option> </select> </div> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; color: #e91e63; padding: 15px 40px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>✓ Set Time</div>">> <<set _hour = parseInt(_manualHour) || 12>> <<set _minute = parseInt(_manualMinute) || 0>> <<set _ampm = document.getElementById('ampmSelect').value>> <!-- Validate hour --> <<if _hour < 1 || _hour > 12>> <<set _hour = 12>> <</if>> <!-- Validate minute --> <<if _minute < 0 || _minute > 59>> <<set _minute = 0>> <</if>> <!-- Convert to 24-hour format --> <<if _ampm === "AM">> <<if _hour === 12>> <<set _hour24 = 0>> <<else>> <<set _hour24 = _hour>> <</if>> <<else>> <<if _hour === 12>> <<set _hour24 = 12>> <<else>> <<set _hour24 = _hour + 12>> <</if>> <</if>> <<set $timeInMinutes = (_hour24 * 60) + _minute>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <</link>> </div> </div> </div> <!-- Set Specific Day --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #da77f2; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #da77f244; margin-bottom: 20px;"> <h2 style="color: #da77f2; margin: 0 0 15px 0; text-align: center;">📅 Jump to Specific Day</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Monday</div>">> <<set _targetDay = "Monday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<if _targetDay === "Monday">><<set $weekNumber += 1>><</if>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tuesday</div>">> <<set _targetDay = "Tuesday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Wednesday</div>">> <<set _targetDay = "Wednesday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Thursday</div>">> <<set _targetDay = "Thursday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Friday</div>">> <<set _targetDay = "Friday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Saturday</div>">> <<set _targetDay = "Saturday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Sunday</div>">> <<set _targetDay = "Sunday">> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _targetDayIndex = setup.dayOrder.indexOf(_targetDay)>> <<if _targetDayIndex <= _currentDayIndex>> <<set _daysToAdd = 7 - _currentDayIndex + _targetDayIndex>> <<else>> <<set _daysToAdd = _targetDayIndex - _currentDayIndex>> <</if>> <<set $dayNumber += _daysToAdd>> <<set $dayOfWeek = _targetDay>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> </div> </div> <!-- Day Controls --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; margin-bottom: 20px;"> <h2 style="color: #667eea; margin: 0 0 15px 0; text-align: center;">⏩ Skip Time</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Day (8:00 AM)</div>">> <<set $dayNumber += 1>> <<set _currentDayIndex = setup.dayOrder.indexOf($dayOfWeek)>> <<set _nextDayIndex = (_currentDayIndex + 1) % 7>> <<set $dayOfWeek = setup.dayOrder[_nextDayIndex]>> <<if $dayOfWeek === "Monday">><<set $weekNumber += 1>><</if>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <<set $secretaryHoursWorkedToday = 0>> <!-- Mayor salary refresh on Monday --> <<if $dayOfWeek === "Monday" && $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>><<set $wifiDaysRemaining -= 1>><</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>><<set $busPassDaysRemaining -= 1>><</if>> <<if $gymMembershipDaysRemaining && $gymMembershipDaysRemaining > 0>><<set $gymMembershipDaysRemaining -= 1>><</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 1>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<if !$ownsHouse>><<set $homeless = true>><</if>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #da77f2; color: #da77f2; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Next Week (Monday 8:00 AM)</div>">> <<set $weekNumber += 1>> <<set $dayOfWeek = "Monday">> <<set $dayNumber += 7>> <<set $timeInMinutes = 480>> <<set $tradesRemainingToday = 5 + ($bonusDailyTrades || 0)>> <<set $failedTradesWithToday = []>> <<set $mayorHoursWorkedToday = 0>> <<set $secretaryHoursWorkedToday = 0>> <!-- Force Roisin evolution check --> <<run setup.forceRoisinEvolutionCheck()>> <!-- Mayor salary refresh (always Monday) --> <<if $jobs && $jobs.includes("City Mayor")>> <<if !$lastMayorSalaryRefresh>><<set $lastMayorSalaryRefresh = -1>><</if>> <<if !$mayorWeeklySalaryAvailable>><<set $mayorWeeklySalaryAvailable = 0>><</if>> <<if $lastMayorSalaryRefresh !== $dayNumber>> <<set $mayorWeeklySalaryAvailable = 1000>> <<set $lastMayorSalaryRefresh = $dayNumber>> <</if>> <</if>> <!-- Decrement daily counters for 7 days --> <<if $wifiDaysRemaining && $wifiDaysRemaining > 0>> <<set $wifiDaysRemaining -= 7>> <<if $wifiDaysRemaining < 0>><<set $wifiDaysRemaining = 0>><</if>> <</if>> <<if $busPassDaysRemaining && $busPassDaysRemaining > 0>> <<set $busPassDaysRemaining -= 7>> <<if $busPassDaysRemaining < 0>><<set $busPassDaysRemaining = 0>><</if>> <</if>> <<if $gymMembershipDaysRemaining && $gymMembershipDaysRemaining > 0>> <<set $gymMembershipDaysRemaining -= 7>> <<if $gymMembershipDaysRemaining < 0>><<set $gymMembershipDaysRemaining = 0>><</if>> <</if>> <<if $rentDaysRemaining && $rentDaysRemaining > 0>> <<set $rentDaysRemaining -= 7>> <<if $rentDaysRemaining <= 0 && $hasApartment>> <<set $hasApartment = false>> <<if !$ownsHouse>><<set $homeless = true>><</if>> <<set $wasEvicted = true>> <</if>> <</if>> <<replace "#currentTime">><<= getTimeString()>><</replace>> <<replace "#currentDayOfWeek">>$dayOfWeek<</replace>> <<replace "#currentDayNumber">>$dayNumber<</replace>> <<replace "#currentWeekNumber">>$weekNumber<</replace>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Stats Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">📊 Stats (Max: 999)</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <!-- Strength --> <div style="margin-bottom: 20px;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">■ Strength: <span id="statStrength"><<= setup.getTotalStat("strength")>></span></h3> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+1</div>">> <<set $stats.strength = Math.min(999, $stats.strength + 1)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+5</div>">> <<set $stats.strength = Math.min(999, $stats.strength + 5)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+10</div>">> <<set $stats.strength = Math.min(999, $stats.strength + 10)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+50</div>">> <<set $stats.strength = Math.min(999, $stats.strength + 50)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-1</div>">> <<set $stats.strength = Math.max(0, $stats.strength - 1)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-5</div>">> <<set $stats.strength = Math.max(0, $stats.strength - 5)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-10</div>">> <<set $stats.strength = Math.max(0, $stats.strength - 10)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-50</div>">> <<set $stats.strength = Math.max(0, $stats.strength - 50)>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: 1fr auto; gap: 8px;"> <<textbox "_strengthInput" $stats.strength>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 8px 16px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Set Value</div>">> <<set _val = parseInt(_strengthInput)>> <<if !isNaN(_val)>> <<set $stats.strength = Math.max(0, Math.min(999, _val))>> <<replace "#statStrength">><<= setup.getTotalStat("strength")>><</replace>> <</if>> <</link>> </div> </div> <!-- Dexterity --> <div style="margin-bottom: 20px;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">■ Dexterity: <span id="statDexterity"><<= setup.getTotalStat("dexterity")>></span></h3> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+1</div>">> <<set $stats.dexterity = Math.min(999, $stats.dexterity + 1)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+5</div>">> <<set $stats.dexterity = Math.min(999, $stats.dexterity + 5)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+10</div>">> <<set $stats.dexterity = Math.min(999, $stats.dexterity + 10)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+50</div>">> <<set $stats.dexterity = Math.min(999, $stats.dexterity + 50)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-1</div>">> <<set $stats.dexterity = Math.max(0, $stats.dexterity - 1)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-5</div>">> <<set $stats.dexterity = Math.max(0, $stats.dexterity - 5)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-10</div>">> <<set $stats.dexterity = Math.max(0, $stats.dexterity - 10)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-50</div>">> <<set $stats.dexterity = Math.max(0, $stats.dexterity - 50)>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: 1fr auto; gap: 8px;"> <<textbox "_dexterityInput" $stats.dexterity>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 8px 16px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Set Value</div>">> <<set _val = parseInt(_dexterityInput)>> <<if !isNaN(_val)>> <<set $stats.dexterity = Math.max(0, Math.min(999, _val))>> <<replace "#statDexterity">><<= setup.getTotalStat("dexterity")>><</replace>> <</if>> <</link>> </div> </div> <!-- Charisma --> <div style="margin-bottom: 20px;"> <h3 style="color: #ffd43b; margin: 0 0 10px 0;">■ Charisma: <span id="statCharisma"><<= setup.getTotalStat("charisma")>></span></h3> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+1</div>">> <<set $stats.charisma = Math.min(999, $stats.charisma + 1)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+5</div>">> <<set $stats.charisma = Math.min(999, $stats.charisma + 5)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+10</div>">> <<set $stats.charisma = Math.min(999, $stats.charisma + 10)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+50</div>">> <<set $stats.charisma = Math.min(999, $stats.charisma + 50)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-1</div>">> <<set $stats.charisma = Math.max(0, $stats.charisma - 1)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-5</div>">> <<set $stats.charisma = Math.max(0, $stats.charisma - 5)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-10</div>">> <<set $stats.charisma = Math.max(0, $stats.charisma - 10)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-50</div>">> <<set $stats.charisma = Math.max(0, $stats.charisma - 50)>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: 1fr auto; gap: 8px;"> <<textbox "_charismaInput" $stats.charisma>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 8px 16px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Set Value</div>">> <<set _val = parseInt(_charismaInput)>> <<if !isNaN(_val)>> <<set $stats.charisma = Math.max(0, Math.min(999, _val))>> <<replace "#statCharisma">><<= setup.getTotalStat("charisma")>><</replace>> <</if>> <</link>> </div> </div> <!-- Intelligence --> <div style="margin-bottom: 0;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">■ Intelligence: <span id="statIntelligence"><<= setup.getTotalStat("intelligence")>></span></h3> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+1</div>">> <<set $stats.intelligence = Math.min(999, $stats.intelligence + 1)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+5</div>">> <<set $stats.intelligence = Math.min(999, $stats.intelligence + 5)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+10</div>">> <<set $stats.intelligence = Math.min(999, $stats.intelligence + 10)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>+50</div>">> <<set $stats.intelligence = Math.min(999, $stats.intelligence + 50)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; margin-bottom: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-1</div>">> <<set $stats.intelligence = Math.max(0, $stats.intelligence - 1)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-5</div>">> <<set $stats.intelligence = Math.max(0, $stats.intelligence - 5)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-10</div>">> <<set $stats.intelligence = Math.max(0, $stats.intelligence - 10)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 6px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px;'>-50</div>">> <<set $stats.intelligence = Math.max(0, $stats.intelligence - 50)>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</link>> </div> <div style="display: grid; grid-template-columns: 1fr auto; gap: 8px;"> <<textbox "_intelligenceInput" $stats.intelligence>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 8px 16px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Set Value</div>">> <<set _val = parseInt(_intelligenceInput)>> <<if !isNaN(_val)>> <<set $stats.intelligence = Math.max(0, Math.min(999, _val))>> <<replace "#statIntelligence">><<= setup.getTotalStat("intelligence")>><</replace>> <</if>> <</link>> </div> </div> </div> </div> <!-- Body & Appearance Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">👤 Body & Appearance</h2> <!-- Gender --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Gender: <span id="currentGender" style="color: #e0e0e0;"><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Female</div>">> <<set $bodyParts.gender = "female">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Male</div>">> <<set $bodyParts.gender = "male">> <<replace "#currentGender">><<= $bodyParts.gender.charAt(0).toUpperCase() + $bodyParts.gender.slice(1)>><</replace>> <</link>> </div> </div> <!-- Genitals --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Genitals: <span id="currentGenitals" style="color: #e0e0e0;"><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small Penis</div>">> <<set $bodyParts.genitals = "small penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #5c7cfa; color: #5c7cfa; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Penis</div>">> <<set $bodyParts.genitals = "penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Big Penis</div>">> <<set $bodyParts.genitals = "big penis">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tight Vagina</div>">> <<set $bodyParts.genitals = "tight vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Vagina</div>">> <<set $bodyParts.genitals = "vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e64980; color: #e64980; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Loose Vagina</div>">> <<set $bodyParts.genitals = "loose vagina">> <<run setup.updateGenderMismatchTraits(State.variables)>> <<replace "#currentGenitals">><<= $bodyParts.genitals.charAt(0).toUpperCase() + $bodyParts.genitals.slice(1)>><</replace>> <</link>> </div> </div> <!-- Chest Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Chest Size: <span id="currentChest" style="color: #e0e0e0;"><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.chest = "flat masculine">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.chest = "flat">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #74c0fc; color: #74c0fc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.chest = "small">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.chest = "medium">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.chest = "large">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.chest = "huge">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.chest = "giant">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e03131; color: #e03131; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Gigantic</div>">> <<set $bodyParts.chest = "gigantic">> <<replace "#currentChest">><<= $bodyParts.chest.charAt(0).toUpperCase() + $bodyParts.chest.slice(1)>><</replace>> <</link>> </div> </div> <!-- Butt Size --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Butt Size: <span id="currentButt" style="color: #e0e0e0;"><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat Masculine</div>">> <<set $bodyParts.butt = "flat masculine">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Flat</div>">> <<set $bodyParts.butt = "flat">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #74c0fc; color: #74c0fc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Small</div>">> <<set $bodyParts.butt = "small">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #748ffc; color: #748ffc; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Medium</div>">> <<set $bodyParts.butt = "medium">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Large</div>">> <<set $bodyParts.butt = "large">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f06595; color: #f06595; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Huge</div>">> <<set $bodyParts.butt = "huge">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Giant</div>">> <<set $bodyParts.butt = "giant">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e03131; color: #e03131; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Gigantic</div>">> <<set $bodyParts.butt = "gigantic">> <<replace "#currentButt">><<= $bodyParts.butt.charAt(0).toUpperCase() + $bodyParts.butt.slice(1)>><</replace>> <</link>> </div> </div> <!-- Skin Tone --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Skin Tone: <span id="currentSkinTone" style="color: #e0e0e0;"><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd8a8; color: #ffd8a8; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Pale</div>">> <<set $appearance.skinTone = "pale">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #b7856a; color: #b7856a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Tan</div>">> <<set $appearance.skinTone = "tan">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #8d6e63; color: #8d6e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Dark</div>">> <<set $appearance.skinTone = "dark">> <<replace "#currentSkinTone">><<= $appearance.skinTone.charAt(0).toUpperCase() + $appearance.skinTone.slice(1)>><</replace>> <</link>> </div> </div> <!-- Hair Color --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Color: <span id="currentHairColor" style="color: #e0e0e0;"><<= $appearance.hairColor>></span></h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #495057; color: #868e96; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Black</div>">> <<set $appearance.hairColor = "Black">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #8d6e63; color: #8d6e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Brown</div>">> <<set $appearance.hairColor = "Brown">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Blonde</div>">> <<set $appearance.hairColor = "Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #fa5252; color: #fa5252; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Red</div>">> <<set $appearance.hairColor = "Red">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #dee2e6; color: #dee2e6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Platinum</div>">> <<set $appearance.hairColor = "Platinum Blonde">> <<replace "#currentHairColor">><<= $appearance.hairColor>><</replace>> <</link>> </div> </div> <!-- Hair Length - NOTE: Keeping OLD behavior that modifies "Long Hair"/"Short Hair" traits --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Length: <span id="currentHairLength" style="color: #e0e0e0;"><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #5c7cfa; color: #5c7cfa; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Short</div>">> <<set $appearance.hairLength = "short">> <<if $physicalTraits.includes("Long Hair")>> <<run $physicalTraits.delete("Long Hair")>> <</if>> <<if !$physicalTraits.includes("Short Hair")>> <<run $physicalTraits.push("Short Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #cc5de8; color: #cc5de8; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Long</div>">> <<set $appearance.hairLength = "long">> <<if $physicalTraits.includes("Short Hair")>> <<run $physicalTraits.delete("Short Hair")>> <</if>> <<if !$physicalTraits.includes("Long Hair")>> <<run $physicalTraits.push("Long Hair")>> <</if>> <<replace "#currentHairLength">><<= $appearance.hairLength.charAt(0).toUpperCase() + $appearance.hairLength.slice(1)>><</replace>> <</link>> </div> </div> <!-- Hair Style (Messy/Styled) --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <<if !$appearance.hairStyle>><<set $appearance.hairStyle = "messy">><</if>> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Hair Style: <span id="currentHairStyle" style="color: #e0e0e0;"><<if $appearance.hairStyle === "styled">>Styled<<else>>Messy<</if>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Styled</div>">> <<set $appearance.hairStyle = "styled">> <<replace "#currentHairStyle">>Styled<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Messy</div>">> <<set $appearance.hairStyle = "messy">> <<replace "#currentHairStyle">>Messy<</replace>> <</link>> </div> </div> <!-- Age --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Age: <span id="currentAge" style="color: #e0e0e0;"><<= $appearance.age>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Adult</div>">> <<set $appearance.age = "Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #868e96; color: #868e96; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Mature Adult</div>">> <<set $appearance.age = "Mature Adult">> <<replace "#currentAge">><<= $appearance.age>><</replace>> <</link>> </div> </div> <!-- Name --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Name: <span id="currentName" style="color: #e0e0e0;"><<= $firstName>> <<= $lastName>></span></h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">First Name:</label> <<textbox "_newFirstName" $firstName>> </div> <div> <label style="color: #aaa; font-size: 14px; display: block; margin-bottom: 5px;">Last Name:</label> <<textbox "_newLastName" $lastName>> </div> </div> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Update Name</div>">> <<if _newFirstName && _newFirstName.trim() !== "">> <<set $firstName = _newFirstName.trim()>> <</if>> <<if _newLastName && _newLastName.trim() !== "">> <<set $lastName = _newLastName.trim()>> <</if>> <<replace "#currentName">><<= $firstName>> <<= $lastName>><</replace>> <</link>> </div> </div> <!-- Transformation Testing Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff00ff; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff00ff; margin: 0 0 15px 0;">🔮 Test Transformations</h2> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0;">Click any transformation to instantly apply it and view the transformation scene.</p> <!-- Current Transformation Display --> <<if $activeTransformation>> <div style="background: #330033; border: 2px solid #8b00ff; border-radius: 8px; padding: 12px; margin-bottom: 15px; text-align: center;"> <p style="color: #cc88ff; margin: 0 0 10px 0; font-size: 14px;">Current Transformation: <strong style="color: #ff00ff;"><<print $activeTransformation>></strong></p> <<link "<div style='background: linear-gradient(135deg, #660000 0%, #440000 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px 16px; border-radius: 6px; display: inline-block; cursor: pointer; font-size: 13px;'>🔄 Revert Transformation</div>">> <<run setup.revertFullTransformation($activeTransformation)>> <<set $activeTransformation = null>> <<goto "DebugStatsAppearance">> <</link>> </div> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: flex; flex-wrap: wrap; gap: 8px; justify-content: center;"> <!-- Demonic --> <<link "<div style='background: linear-gradient(135deg, #4a0000 0%, #2d0000 100%); border: 2px solid #ff6b35; color: #ff6b35; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Succubus</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Succubus"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Succubus")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a0000 0%, #2d0000 100%); border: 2px solid #ff6b35; color: #ff6b35; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Imp</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Imp"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Imp")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a0000 0%, #2d0000 100%); border: 2px solid #ff6b35; color: #ff6b35; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Hellhound</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Hellhound"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Hellhound")>> <<goto "LabTransformationScene">> <</link>> <!-- Were-creatures --> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Werecat</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Werecat"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Werecat")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Werewolf</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Werewolf"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Werewolf")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Werebunny</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Werebunny"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Werebunny")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Werefox</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Werefox"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Werefox")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Weresheep</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Weresheep"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Weresheep")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d4a00 0%, #1a2d00 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Hucow</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Hucow"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Hucow")>> <<goto "LabTransformationScene">> <</link>> <!-- Aesthetic --> <<link "<div style='background: linear-gradient(135deg, #4a004a 0%, #2d002d 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Trophy Wife</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Trophy Wife"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Trophy Wife")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a004a 0%, #2d002d 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Gym Bunny</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Gym Bunny"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Gym Bunny")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a004a 0%, #2d002d 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>E-Girl</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "E-Girl"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("E-Girl")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a004a 0%, #2d002d 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Punk</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Punk"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Punk")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #4a004a 0%, #2d002d 100%); border: 2px solid #ff6b9d; color: #ff6b9d; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Gyaru</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Gyaru"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Gyaru")>> <<goto "LabTransformationScene">> <</link>> <!-- Supernatural --> <<link "<div style='background: linear-gradient(135deg, #00334a 0%, #001a2d 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Siren</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Siren"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Siren")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #00334a 0%, #001a2d 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Living Doll</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Living Doll"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Living Doll")>> <<goto "LabTransformationScene">> <</link>> <!-- Dominant/Corruption --> <<link "<div style='background: linear-gradient(135deg, #1a1a4a 0%, #0d0d2d 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Dominatrix</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Dominatrix"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Dominatrix")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #1a1a4a 0%, #0d0d2d 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Slut</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Slut"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Slut")>> <<goto "LabTransformationScene">> <</link>> <<link "<div style='background: linear-gradient(135deg, #1a1a4a 0%, #0d0d2d 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 13px;'>Himbo</div>">> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = {success: true, isFullTransformation: true, newTrait: "Himbo"}>> <<set $combinerSourceTraits = ["Debug Test"]>> <<run setup.applyFullTransformation("Himbo")>> <<goto "LabTransformationScene">> <</link>> </div> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Apartment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">🏢 Apartment</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #4dabf7;">Status:</strong> <span id="apartmentStatus"> <<if $hasApartment>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock Apartment</div>">> <<set $hasApartment = true>> <<set $rentDaysRemaining = 90>> <<set $homeless = false>> <<replace "#apartmentStatus">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <br><strong style="color: #4dabf7;">Rent Days Remaining:</strong> <span id="rentDaysDisplay" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $rentDaysRemaining || 0>></span> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Rent to 90 Days</div>">> <<set $rentDaysRemaining = 90>> <<replace "#rentDaysDisplay">><<print $rentDaysRemaining || 0>><</replace>> <</link>> </div> </div> </div> <!-- Residential Houses Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #51cf6644; margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">🏡 Residential Houses</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #51cf66;">Current Home:</strong> <span id="houseStatus"> <<if $ownsHouse>> <<if $houseLocation === "ResidentialMansions">> <span style="color: #ffd700; font-size: 16px; font-weight: bold;"> Modern Mansion</span> <<elseif $houseLocation === "ResidentialExpensiveHomes">> <span style="color: #e040fb; font-size: 16px; font-weight: bold;"> Expensive Home</span> <<elseif $houseLocation === "ResidentialNormalHomes">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> Suburban Home</span> <<else>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <</if>> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ No House</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🏠 Suburban</div>">> <<set $ownsHouse = true>> <<set $houseLocation = "ResidentialNormalHomes">> <<set $homeless = false>> <<replace "#houseStatus">><span style="color: #51cf66; font-size: 16px; font-weight: bold;"> Suburban Home</span><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e040fb; color: #e040fb; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🏘️ Expensive</div>">> <<set $ownsHouse = true>> <<set $houseLocation = "ResidentialExpensiveHomes">> <<set $homeless = false>> <<replace "#houseStatus">><span style="color: #e040fb; font-size: 16px; font-weight: bold;"> Expensive Home</span><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd700; color: #ffd700; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🏰 Mansion</div>">> <<set $ownsHouse = true>> <<set $houseLocation = "ResidentialMansions">> <<set $homeless = false>> <<replace "#houseStatus">><span style="color: #ffd700; font-size: 16px; font-weight: bold;"> Modern Mansion</span><</replace>> <</link>> </div> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove House Ownership</div>">> <<set $ownsHouse = false>> <<set $houseLocation = "">> <<replace "#houseStatus">><span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ No House</span><</replace>> <</link>> </div> </div> <!-- Tech Items Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #17a2b844; margin-bottom: 20px;"> <h2 style="color: #17a2b8; margin: 0 0 15px 0; text-align: center;">💻 Tech Items</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-bottom: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #17a2b8; color: #17a2b8; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>💻 Laptop</div>">> <<set $hasLaptop = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📺 TV</div>">> <<set $hasTV = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f39c12; color: #f39c12; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📡 Router</div>">> <<set $hasRouter = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📷 Webcam</div>">> <<set $hasWebcam = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #3b82f6; color: #3b82f6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📱 Phone</div>">> <<set $hasSmartphone = true>> <<goto "DebugHousingTech">> <</link>> </div> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Tech Items</div>">> <<set $hasLaptop = true>> <<set $hasTV = true>> <<set $hasRouter = true>> <<set $hasWebcam = true>> <<set $hasSmartphone = true>> <<goto "DebugHousingTech">> <</link>> <div id="techStatus" style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-top: 12px; border: 1px solid #444;"> <strong style="color: #17a2b8;">Owned:</strong> <<if $hasLaptop>><span style="color: #51cf66;"> 💻</span><</if>> <<if $hasTV>><span style="color: #51cf66;"> 📺</span><</if>> <<if $hasRouter>><span style="color: #51cf66;"> 📡</span><</if>> <<if $hasWebcam>><span style="color: #51cf66;"> 📷</span><</if>> <<if $hasSmartphone>><span style="color: #51cf66;"> 📱</span><</if>> <<if !$hasLaptop && !$hasTV && !$hasRouter && !$hasWebcam && !$hasSmartphone>><span style="color: #ff6b6b;"> None</span><</if>> </div> </div> <!-- WiFi Service --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0; text-align: center;">📶 WiFi Service</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #17a2b8;">WiFi Setup:</strong> <span id="wifiSetupStatus"> <<if $wifiSetupComplete>> <span style="color: #51cf66; font-weight: bold;"> ✓ Complete</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Not Setup</span> <</if>> </span> <br> <strong style="color: #17a2b8;">Service Days:</strong> <span id="wifiDaysDisplay" style="color: #ffd43b; font-weight: bold;"><<print $wifiDaysRemaining || 0>></span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Complete WiFi Setup</div>">> <<set $wifiSetupComplete = true>> <<replace "#wifiSetupStatus">><span style="color: #51cf66; font-weight: bold;"> ✓ Complete</span><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set WiFi to 90 Days</div>">> <<set $wifiDaysRemaining = 90>> <<replace "#wifiDaysDisplay">><<print $wifiDaysRemaining || 0>><</replace>> <</link>> </div> </div> </div> <!-- Music Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff634744; margin-bottom: 20px;"> <h2 style="color: #ff6347; margin: 0 0 15px 0; text-align: center;">🎵 Music Equipment</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; margin-bottom: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🎸 Guitar</div>">> <<set $ownsGuitar = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🎹 Piano</div>">> <<set $ownsElectricPiano = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🎤 Mic</div>">> <<set $ownsMicrophone = true>> <<goto "DebugHousingTech">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6347; color: #ff6347; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔊 Speakers</div>">> <<set $ownsSpeakers = true>> <<goto "DebugHousingTech">> <</link>> </div> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Music Equipment</div>">> <<set $ownsGuitar = true>> <<set $ownsElectricPiano = true>> <<set $ownsMicrophone = true>> <<set $ownsSpeakers = true>> <<goto "DebugHousingTech">> <</link>> <div id="musicStatus" style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-top: 12px; border: 1px solid #444;"> <strong style="color: #ff6347;">Owned:</strong> <<if $ownsGuitar>><span style="color: #51cf66;"> 🎸</span><</if>> <<if $ownsElectricPiano>><span style="color: #51cf66;"> 🎹</span><</if>> <<if $ownsMicrophone>><span style="color: #51cf66;"> 🎤</span><</if>> <<if $ownsSpeakers>><span style="color: #51cf66;"> 🔊</span><</if>> <<if !$ownsGuitar && !$ownsElectricPiano && !$ownsMicrophone && !$ownsSpeakers>><span style="color: #ff6b6b;"> None</span><</if>> </div> </div> </div> <!-- Cooking Ingredients Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #f59f00; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #f59f0044; margin-bottom: 20px;"> <h2 style="color: #f59f00; margin: 0 0 15px 0; text-align: center;">🍳 Cooking Ingredients</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+99 All Ingredients</div>">> <<if !$kitchenInventory>><<set $kitchenInventory = {ingredients: {}}>><</if>> <<if !$kitchenInventory.ingredients>><<set $kitchenInventory.ingredients = {}>><</if>> <<for _ingKey, _ingData range setup.ingredients>> <<set $kitchenInventory.ingredients[_ingKey] = ($kitchenInventory.ingredients[_ingKey] || 0) + 99>> <</for>> <<goto "DebugHousingTech">> <</link>> <div id="ingredientStatus" style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-top: 12px; border: 1px solid #444;"> <strong style="color: #f59f00;">Stock:</strong> <<if $kitchenInventory && $kitchenInventory.ingredients>> <<set _hasAny = false>> <<for _ingKey, _ingData range setup.ingredients>> <<if $kitchenInventory.ingredients[_ingKey] > 0>> <<set _hasAny = true>> <span style="color: #adb5bd; display: inline-block; margin: 2px 6px;"><<print _ingData.name>>: <span style="color: #51cf66; font-weight: bold;"><<print $kitchenInventory.ingredients[_ingKey]>></span></span> <</if>> <</for>> <<if !_hasAny>><span style="color: #ff6b6b;"> None</span><</if>> <<else>> <span style="color: #ff6b6b;"> None</span> <</if>> </div> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Streaming Content Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <span id="streamingSection"> <<include "CheatMenuStreaming">> </span> </div> <!-- PrawnHub Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6347; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div id="prawnhubSection"> <<include "CheatMenuPrawnHub">> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <<set _relColor = "#e91e63">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return to Cheat Menu Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _relColor>> 0%, <<= _relColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _relColor>>; box-shadow: 0 0 20px <<= _relColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">💕 Relationships Debug</h1> </div> <!-- Category Grid --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Quick Actions Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #e91e6344;"> <h2 style="color: #e91e63; margin: 0 0 15px 0; text-align: center;">⚡ Quick Actions</h2> <p style="color: rgba(255,255,255,0.8); margin: 0 0 15px 0; text-align: center; font-size: 14px;">Bulk relationship management</p> <div style="display: grid; grid-template-columns: 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e040fb; color: #e040fb; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔓 Meet All NPCs</div>">> <<if !$metNPCs>><<set $metNPCs = []>><</if>> <<if !$relationships>><<set $relationships = {}>><</if>> <<if $npcs && $npcs.length > 0>> <<for _m = 0; _m < $npcs.length; _m++>> <<set _npcName4 = $npcs[_m].name>> <<if !$metNPCs.includes(_npcName4)>> <<run $metNPCs.push(_npcName4)>> <</if>> <<if !$relationships[_npcName4] || typeof $relationships[_npcName4] !== 'object'>> <<set $relationships[_npcName4] = { level: 0, points: 0 }>> <</if>> <</for>> <</if>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <<replace "#metNPCsSection">><<include "DebugMetNPCsSection">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✨ Max All Relationships</div>">> <<set _allRelKeys = Object.keys($relationships)>> <<for _j = 0; _j < _allRelKeys.length; _j++>> <<set _npcName2 = _allRelKeys[_j]>> <<if $metNPCs.includes(_npcName2)>> <<run setup.addRelationshipPoints(_npcName2, 1000)>> <</if>> <</for>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔄 Reset All Relationships</div>">> <<set _resetKeys = Object.keys($relationships)>> <<for _k = 0; _k < _resetKeys.length; _k++>> <<set _npcName3 = _resetKeys[_k]>> <<set $relationships[_npcName3] = { level: 0, points: 0 }>> <</for>> <<set $metNPCs = []>> <<set $dailyConversations = {}>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <<replace "#metNPCsSection">><<include "DebugMetNPCsSection">><</replace>> <</link>> </div> </div> <!-- Manually Meet NPCs Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9c27b044;"> <h2 style="color: #9c27b0; margin: 0 0 15px 0; text-align: center;">👋 Manually Meet NPCs</h2> <p style="color: rgba(255,255,255,0.8); margin: 0 0 15px 0; text-align: center; font-size: 14px;">Select individual NPCs to meet</p> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333;"> <select id="meetNPCSelect" style="width: 100%; padding: 10px; background: #0a0a0a; color: #fff; border: 2px solid #9c27b0; border-radius: 6px; margin-bottom: 10px; font-size: 14px; cursor: pointer;"> <option value="">-- Select NPC to Meet --</option> <<if $npcs && $npcs.length > 0>> <<for _npc range $npcs>> <<if !$metNPCs || !$metNPCs.includes(_npc.name)>> <option value="<<print _npc.name>>"><<print _npc.name>></option> <</if>> <</for>> <</if>> </select> <<link "<div style='background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>👋 Meet Selected NPC</div>">> <<set _selectedNpc = jQuery("#meetNPCSelect").val()>> <<if _selectedNpc && _selectedNpc !== "">> <<if !$metNPCs>><<set $metNPCs = []>><</if>> <<if !$relationships>><<set $relationships = {}>><</if>> <<if !$metNPCs.includes(_selectedNpc)>> <<run $metNPCs.push(_selectedNpc)>> <</if>> <<if !$relationships[_selectedNpc] || typeof $relationships[_selectedNpc] !== 'object'>> <<set $relationships[_selectedNpc] = { level: 0, points: 0 }>> <</if>> <<replace "#relationshipsSection">><<include "CheatMenuRelationships">><</replace>> <<replace "#metNPCsSection">><<include "DebugMetNPCsSection">><</replace>> <<goto "DebugRelationships">> <</if>> <</link>> </div> <!-- Currently Met NPCs --> <span id="metNPCsSection"> <<include "DebugMetNPCsSection">> </span> </div> <!-- NPC-to-NPC Relationships Card --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #00bcd444;"> <h2 style="color: #00bcd4; margin: 0 0 15px 0; text-align: center;">🔗 NPC-to-NPC Relationships</h2> <p style="color: rgba(255,255,255,0.8); margin: 0 0 15px 0; text-align: center; font-size: 14px;">View relationships between NPCs</p> <!-- Relationship Type Legend --> <div style="display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; margin-bottom: 15px;"> <span style="background: #e91e63; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">❤️ romantic</span> <span style="background: #4caf50; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">👫 friends</span> <span style="background: #2196f3; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">💼 coworkers</span> <span style="background: #ff9800; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">👪 family</span> <span style="background: #f44336; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">😠 rivals</span> <span style="background: #9c27b0; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;">🏠 roommates</span> </div> <!-- NPC Lookup Dropdown --> <div style="background-color: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333;"> <select id="npcRelLookupMain" style="width: 100%; padding: 10px; background: #0a0a0a; color: #fff; border: 2px solid #00bcd4; border-radius: 6px; margin-bottom: 10px; font-size: 14px; cursor: pointer;"> <option value="">-- Select NPC to View --</option> <<if $npcs && $npcs.length > 0>> <<for _npc range $npcs>> <option value="<<print _npc.name>>"><<print _npc.name>></option> <</for>> <</if>> </select> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #00bcd4; color: #00bcd4; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔍 Look Up Relationships</div>">> <<set _selectedNpc = jQuery("#npcRelLookupMain").val()>> <<if _selectedNpc && _selectedNpc !== "">> <<set _npcRels = []>> <<if $npcToNpcRelationships>> <<for _rel range $npcToNpcRelationships>> <<if _rel.npc1 === _selectedNpc || _rel.npc2 === _selectedNpc>> <<run _npcRels.push(_rel)>> <</if>> <</for>> <</if>> <<replace "#npcLookupResultMain">> <h4 style="color: #00bcd4; margin: 10px 0;"><<print _selectedNpc>>'s Relationships:</h4> <<if _npcRels.length > 0>> <<set _relationshipColors = { "romantic": "#e91e63", "friends": "#4caf50", "coworkers": "#2196f3", "family": "#ff9800", "rivals": "#f44336", "roommates": "#9c27b0", "acquaintances": "#607d8b", "mentor": "#795548", "exes": "#009688" }>> <<set _relationshipIcons = { "romantic": "❤️", "friends": "👫", "coworkers": "💼", "family": "👪", "rivals": "😠", "roommates": "🏠", "acquaintances": "🤝", "mentor": "📚", "exes": "💕" }>> <<for _rel range _npcRels>> <<set _otherNpc = (_rel.npc1 === _selectedNpc) ? _rel.npc2 : _rel.npc1>> <<set _color = _relationshipColors[_rel.type] || "#667eea">> <<set _icon = _relationshipIcons[_rel.type] || "🔗">> <div style="background-color: #0a0a0a; padding: 8px; border-radius: 6px; margin-bottom: 5px; border-left: 3px solid <<print _color>>; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #fff; font-size: 13px;"><<print _otherNpc>></span> <span style="background: <<print _color>>; color: white; padding: 2px 6px; border-radius: 4px; font-size: 10px;"><<print _icon>> <<print _rel.type>></span> </div> <</for>> <div style="color: #888; margin-top: 8px; font-size: 11px; text-align: center;">Total: <<print _npcRels.length>> relationship(s)</div> <<else>> <div style="color: #ff6b6b; font-size: 13px;">No relationships found.</div> <</if>> <</replace>> <</if>> <</link>> <div id="npcLookupResultMain" style="margin-top: 10px; max-height: 200px; overflow-y: auto;"> <span style="color: #666; font-style: italic; font-size: 12px;">Select an NPC to see their relationships</span> </div> </div> </div> </div> <!-- All NPC-to-NPC Relationships List --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #00bcd4; margin: 0 0 15px 0;">📋 All NPC-to-NPC Relationships</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; max-height: 400px; overflow-y: auto;"> <<if $npcToNpcRelationships && $npcToNpcRelationships.length > 0>> <<set _relationshipColors = { "romantic": "#e91e63", "friends": "#4caf50", "coworkers": "#2196f3", "family": "#ff9800", "rivals": "#f44336", "roommates": "#9c27b0", "acquaintances": "#607d8b", "mentor": "#795548", "exes": "#009688" }>> <<set _relationshipIcons = { "romantic": "❤️", "friends": "👫", "coworkers": "💼", "family": "👪", "rivals": "😠", "roommates": "🏠", "acquaintances": "🤝", "mentor": "📚", "exes": "💕" }>> <<for _i, _rel range $npcToNpcRelationships>> <<set _color = _relationshipColors[_rel.type] || "#667eea">> <<set _icon = _relationshipIcons[_rel.type] || "🔗">> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; margin-bottom: 6px; border-left: 4px solid <<print _color>>; display: flex; justify-content: space-between; align-items: center;"> <div> <span style="color: #fff; font-weight: bold;"><<print _rel.npc1>></span> <span style="color: #888; margin: 0 10px;">↔</span> <span style="color: #fff; font-weight: bold;"><<print _rel.npc2>></span> </div> <span style="background: <<print _color>>; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;"><<print _icon>> <<print _rel.type>></span> </div> <</for>> <div style="color: #888; margin-top: 15px; text-align: center;">Total Relationships: <<print $npcToNpcRelationships.length>></div> <<else>> <div style="color: #ff6b6b; text-align: center; padding: 20px;">No NPC-to-NPC relationships found.</div> <</if>> </div> </div> <!-- Individual NPC Relationship Management --> <span id="relationshipsSection"> <<include "CheatMenuRelationships">> </span> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <span id="physicalTraitsSection"> <<include "CheatMenuPhysicalTraits">> </span> <span id="mentalTraitsSection"> <<include "CheatMenuMentalTraits">> </span> <span id="skillsSection"> <<include "CheatMenuSkills">> </span> <!-- Special Traits Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b9d; margin: 0 0 15px 0;">🧪 Special Traits & Skills</h2> <!-- Were-Creature --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Were-Creature</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Powerful transformation trait with 450 trade value and +60 Strength/Dexterity</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="wereStatus"> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.push("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $physicalTraits.includes("Were-Creature")>> <<run $physicalTraits.delete("Were-Creature")>> <</if>> <<replace "#wereStatus">> <<if $physicalTraits.includes("Were-Creature")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Sunfish --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Sunfish</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Legendary aquatic skill with 500 trade value and +50 to all stats</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="sunfishStatus"> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$skills.includes("Sunfish")>> <<run $skills.push("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $skills.includes("Sunfish")>> <<run $skills.delete("Sunfish")>> <</if>> <<replace "#sunfishStatus">> <<if $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> <!-- Definitely not a Vampire --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0;">Definitely not a Vampire</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Definitely not a Vampire trait with 450 trade value and +50 Strength/Charisma/Dexterity</p> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b9d;">Status:</strong> <span id="vampireStatus"> <<if $physicalTraits.includes("Definitely not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add</div>">> <<if !$physicalTraits.includes("Definitely not a Vampire")>> <<run $physicalTraits.push("Definitely not a Vampire")>> <</if>> <<replace "#vampireStatus">> <<if $physicalTraits.includes("Definitely not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove</div>">> <<if $physicalTraits.includes("Definitely not a Vampire")>> <<run $physicalTraits.delete("Definitely not a Vampire")>> <</if>> <<replace "#vampireStatus">> <<if $physicalTraits.includes("Definitely not a Vampire")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> <</replace>> <</link>> </div> </div> </div> <!-- Job Management Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">💼 Job Management</h2> <!-- Current Job Display --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Current Job:</h3> <span id="currentJob"> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> </span> </div> <!-- Job Selection --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">Change Job:</h3> <select id="replaceJob" style="width: 100%; padding: 12px; background: #0a0a0a; color: #fff; border: 2px solid #667eea; border-radius: 8px; margin-bottom: 15px; font-size: 15px; cursor: pointer;"> <option value="">-- Select Job --</option> <option value="Unemployed">Unemployed (Value: 0)</option> <option value="Adult Store Clerk">Adult Store Clerk (Value: 20)</option> <option value="Adult Streamer">Adult Streamer (Value: 40)</option> <option value="Baker">Baker (Value: 10)</option> <option value="Barista">Barista (Value: 20)</option> <option value="Beauty Salon Stylist">Beauty Salon Stylist (Value: 30)</option> <option value="Bouncer">Bouncer (Value: 40)</option> <option value="Brothel Owner">Brothel Owner (Value: 70)</option> <option value="Brothel Worker">Brothel Worker (Value: 35)</option> <option value="Bus Driver">Bus Driver (Value: 35)</option> <option value="City Mayor">City Mayor (Value: 140)</option> <option value="Cocktail Waitress">Cocktail Waitress (Value: 55)</option> <option value="Criminal">Criminal (Value: -150)</option> <option value="Dancing Instructor">Dancing Instructor (Value: 95)</option> <option value="Detective">Detective (Value: 80)</option> <option value="Dock Worker">Dock Worker (Value: 15)</option> <option value="Donuts Deliverer">Donuts Deliverer (Value: 15)</option> <option value="Ecentric Shop Worker">Ecentric Shop Worker (Value: 20)</option> <option value="Fitness Shop Clerk">Fitness Shop Clerk (Value: 25)</option> <option value="Fitness Trainer">Fitness Trainer (Value: 70)</option> <option value="Hooker">Hooker (Value: 30)</option> <option value="Mayor's Secretary">Mayor's Secretary (Value: 65)</option> <option value="Model">Model (Value: 35)</option> <option value="Patrol Officer">Patrol Officer (Value: 40)</option> <option value="Police Station Janitor">Police Station Janitor (Value: 10)</option> <option value="Police Station Receptionist">Police Station Receptionist (Value: 25)</option> <option value="Porn Star">Porn Star (Value: 50)</option> <option value="Prostitute">Prostitute (Value: 30)</option> <option value="Security Guard">Security Guard (Value: 15)</option> <option value="Sheriff">Sheriff (Value: 95)</option> <option value="Streamer">Streamer (Value: 20)</option> <option value="Stripper">Stripper (Value: 35)</option> <option value="Tech Store Clerk">Tech Store Clerk (Value: 20)</option> </select> <<link "<div style='background: linear-gradient(135deg, #ffd43b 0%, #fab005 100%); color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Apply Job Change</div>">> <<set _selectedJob = jQuery("#replaceJob").val()>> <<if _selectedJob && _selectedJob !== "">> <<if _selectedJob === "Unemployed">> <<set $jobs = []>> <<set $homeless = true>> <<else>> <<set $jobs = [_selectedJob]>> <<set $homeless = false>> /* Update stats to meet job requirements */ <<set _jobReqs = setup.jobRequirements[_selectedJob] || {}>> <<for _stat, _minValue range _jobReqs>> <<if $stats[_stat] < _minValue>> <<set $stats[_stat] = _minValue>> <</if>> <</for>> <</if>> <<replace "#currentJob">> <<if $jobs && $jobs.length > 0>> <span style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print $jobs[0]>></span> <<else>> <span style="color: #ff6b6b; font-size: 18px; font-weight: bold;">Unemployed</span> <</if>> <</replace>> <</if>> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Currently Met NPCs Display --> <<set _totalNPCs = ($npcs && $npcs.length) ? $npcs.length : 0>> <div style="margin-top: 15px; background-color: #0a0a0a; padding: 12px; border-radius: 8px; border: 1px solid #444; max-height: 200px; overflow-y: auto;"> <h4 style="color: #9c27b0; margin: 0 0 10px 0; font-size: 14px;">Currently Met NPCs (<<print $metNPCs ? $metNPCs.length : 0>>/<<print _totalNPCs>>):</h4> <<if $metNPCs && $metNPCs.length > 0>> <div style="display: flex; flex-wrap: wrap; gap: 6px;"> <<for _npc range $metNPCs>> <span style="background: #9c27b0; color: white; padding: 3px 8px; border-radius: 4px; font-size: 11px;"><<print _npc>></span> <</for>> </div> <<else>> <span style="color: #666; font-style: italic; font-size: 12px;">No NPCs met yet</span> <</if>> </div> <</nobr>>
/* ---------------------------------- */ /* --- BIMBO TRAIT OVERRIDE SYSTEM --- */ /* ---------------------------------- */ <<script>> // Define the Bimbo trait override set setup.bimboTraitOverrides = { gender: "female", hairColor: "platinum blonde", chest: "gigantic", butt: "gigantic", physicalTraits: ["Curvy", "Voluptuous", "High Energy", "Relaxed", "Fashionable"], mentalTraits: ["Bimbo", "Talkative", "Flirty", "Forgetful", "Extroverted"], voiceTraits: ["Bouncy Tone"], skills: ["High Heels Proficient", "Sexually Skilled", "Modeling", "Makeup", "Hair Styling", "Social Media"], additionalMentalTraits: ["High Stamina", "Relaxed"] }; // Check if character has Bimbo trait setup.hasBimboTrait = function(character) { if (!character) return false; if (character === State.variables) { return State.variables.mentalTraits && State.variables.mentalTraits.includes("Bimbo"); } return character.mentalTraits && character.mentalTraits.includes("Bimbo"); }; // Get effective traits (considers Bimbo override) setup.getEffectiveTraits = function(character, traitType) { if (!character) return []; var isBimbo = setup.hasBimboTrait(character); if (!isBimbo) { if (character === State.variables) { var v = State.variables; if (traitType === "physical") return v.physicalTraits || []; if (traitType === "mental") return v.mentalTraits || []; if (traitType === "skills") return v.skills || []; } else { if (traitType === "physical") return character.physicalTraits || []; if (traitType === "mental") return character.mentalTraits || []; if (traitType === "skills") return character.skills || []; } return []; } var overrides = setup.bimboTraitOverrides; if (traitType === "physical") { return overrides.physicalTraits.concat(overrides.voiceTraits); } if (traitType === "mental") { return overrides.mentalTraits.concat(overrides.additionalMentalTraits); } if (traitType === "skills") { return overrides.skills; } return []; }; // Get stored (original) traits when Bimbo is active setup.getStoredTraits = function(character, traitType) { if (!character) return []; if (character === State.variables) { var v = State.variables; if (!v.bimboStoredTraits) return []; if (traitType === "physical") return v.bimboStoredTraits.physical || []; if (traitType === "mental") return v.bimboStoredTraits.mental || []; if (traitType === "skills") return v.bimboStoredTraits.skills || []; } else { if (!character.bimboStoredTraits) return []; if (traitType === "physical") return character.bimboStoredTraits.physical || []; if (traitType === "mental") return character.bimboStoredTraits.mental || []; if (traitType === "skills") return character.bimboStoredTraits.skills || []; } return []; }; // Activate Bimbo trait (stores original traits) setup.activateBimboTrait = function(character) { if (!character) return; var isPlayer = (character === State.variables); var v = isPlayer ? State.variables : character; if (!v.bimboStoredTraits) { v.bimboStoredTraits = { physical: (isPlayer ? v.physicalTraits : character.physicalTraits).slice(), mental: (isPlayer ? v.mentalTraits : character.mentalTraits).slice(), skills: (isPlayer ? v.skills : character.skills).slice(), bodyParts: { gender: (isPlayer ? v.bodyParts.gender : character.bodyParts.gender), chest: (isPlayer ? v.bodyParts.chest : character.bodyParts.chest), butt: (isPlayer ? v.bodyParts.butt : character.bodyParts.butt) // NOTE: genitals are NOT stored - Bimbo doesn't affect them }, appearance: { hairColor: (isPlayer ? v.appearance.hairColor : character.appearance.hairColor) } }; } var overrides = setup.bimboTraitOverrides; if (isPlayer) { v.bodyParts.gender = overrides.gender; v.bodyParts.chest = overrides.chest; v.bodyParts.butt = overrides.butt; v.appearance.hairColor = overrides.hairColor; v.physicalTraits = overrides.physicalTraits.concat(overrides.voiceTraits); v.mentalTraits = overrides.mentalTraits.concat(overrides.additionalMentalTraits); v.skills = overrides.skills.slice(); } else { character.bodyParts.gender = overrides.gender; character.bodyParts.chest = overrides.chest; character.bodyParts.butt = overrides.butt; character.appearance.hairColor = overrides.hairColor; character.physicalTraits = overrides.physicalTraits.concat(overrides.voiceTraits); character.mentalTraits = overrides.mentalTraits.concat(overrides.additionalMentalTraits); character.skills = overrides.skills.slice(); } }; // Deactivate Bimbo trait (restores original traits) setup.deactivateBimboTrait = function(character) { if (!character) return; var isPlayer = (character === State.variables); var v = isPlayer ? State.variables : character; if (v.bimboStoredTraits) { if (isPlayer) { v.bodyParts.gender = v.bimboStoredTraits.bodyParts.gender; v.bodyParts.chest = v.bimboStoredTraits.bodyParts.chest; v.bodyParts.butt = v.bimboStoredTraits.bodyParts.butt; v.appearance.hairColor = v.bimboStoredTraits.appearance.hairColor; v.physicalTraits = v.bimboStoredTraits.physical.slice(); v.mentalTraits = v.bimboStoredTraits.mental.slice(); v.skills = v.bimboStoredTraits.skills.slice(); } else { character.bodyParts.gender = character.bimboStoredTraits.bodyParts.gender; character.bodyParts.chest = character.bimboStoredTraits.bodyParts.chest; character.bodyParts.butt = character.bimboStoredTraits.bodyParts.butt; character.appearance.hairColor = character.bimboStoredTraits.appearance.hairColor; character.physicalTraits = character.bimboStoredTraits.physical.slice(); character.mentalTraits = character.bimboStoredTraits.mental.slice(); character.skills = character.bimboStoredTraits.skills.slice(); } delete v.bimboStoredTraits; } }; // Bimbo transformation text setup.getBimboTransformationText = function(gaining, oldTraits) { if (gaining) { return "A wave of warmth washes over you, starting at your core and radiating outward. Your thoughts feel... lighter somehow, less complicated. Worries and complex ideas seem to drift away like clouds, replaced by simpler, more pleasant thoughts. Your body tingles as it shifts - curves swelling and rounding, your chest and butt expanding to gigantic proportions. Your hair lightens to platinum blonde, catching the light beautifully. You feel bubbly, energetic, and so, so happy! Everything just feels... easier now. More fun! You giggle at how good it feels to just be pretty and carefree. Who needs all those boring old thoughts anyway? Being a bimbo is like, totally amazing!"; } else { return "Clarity crashes over you like a cold wave. Suddenly, thoughts that seemed impossibly complex before make perfect sense again. Your mind sharpens, focuses - it's like waking up from a pleasant but hazy dream. Your body shifts too, curves adjusting, hair color changing back, proportions returning to what they were. The constant bubbly happiness fades to more nuanced emotions. You remember who you were, what you cared about. The mental fog lifts completely, leaving you feeling... different. More yourself, perhaps, but also strangely aware of what you just experienced."; } }; <</script>>
/* ========================================== * NPC LOCATION SCHEDULES * Job-based system with custom overrides * ==========================================*/ /* Job to location mapping - NPCs appear here based on their primary job */ <<set setup.jobLocations = { "Unemployed": "Alley", "Streamer": "MeetNeighbors", "Adult Streamer": "MeetNeighbors", "Dancing Instructor": "DanceStudio", "Barista": "Cafe", "City Mayor": "TownHall", "Mayor's Secretary": "TownHall", "Beauty Salon Stylist": "BeautySalon", "Baker": "Bakery", "Ecentric Shop Worker": "EcentricShop", "Tech Store Clerk": "TechStore", "Adult Store Clerk": "AdultStore", "Fitness Shop Clerk": "FitnessShop", "Brothel Worker": "Brothel", "Brothel Owner": "Brothel", "Stripper": "StripClub", "Bouncer": "StripClub", "Security Guard": "Casino", "Cocktail Waitress": "Casino", "Dock Worker": "Docks", "Bus Driver": "BusStop", "Fitness Trainer": "FenRisTraining", "Mysterious Book Shop owner": "LampreyTomes", "Amateur Musician": "MeetNeighbors", "Construction Worker": "Outskirts", "Package Courier": "BusinessDistrict", "Negotiator": "BusinessDistrict", "Enforcer": "Downtown", "Clinic Assistant": "Downtown", "Data Analyst": "BusinessDistrict", "Porn Star": "VIPLounge", "Hooker": "Alley", "Social Media Influencer": "Mall", "Police Officer": "Downtown", "Black Market Dealer": "Alley" }>> /* NPC-specific location schedules - These OVERRIDE job-based locations */ <<set setup.npcLocationSchedules = { "Purple Wood": { defaultLocation: "Apartments", customSchedule: { "Tuesday": [ {location: "Downtown", start: 10, end: 12}, {location: "SeabassPark", start: 12, end: 18}, {location: "Outskirts", start: 18, end: 20}, {location: "MeetNeighbors", start: 20, end: 24}, {location: "MeetNeighbors", start: 0, end: 10} ], "Friday": [ {location: "MeetNeighbors", start: 0, end: 19}, {location: "RedLightDistrict", start: 19, end: 20}, {location: "StripClub", start: 20, end: 24} ], "Saturday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Sunday": [ {location: "MeetNeighbors", start: 0, end: 24} ] }, traitOverrides: { "Bimbo": { "Saturday": [ {location: "Mall", start: 12, end: 20}, {location: "Apartments", start: 20, end: 24}, {location: "Apartments", start: 0, end: 12} ] } } }, "Luna Snow": { defaultLocation: "MeetNeighbors", customSchedule: { "Monday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Tuesday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Wednesday": [ {location: "MeetNeighbors", start: 0, end: 10}, {location: "TrainingCenter", start: 10, end: 13}, {location: "MeetNeighbors", start: 13, end: 24} ], "Thursday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Friday": [ {location: "MeetNeighbors", start: 0, end: 13}, {location: "ChromisTunes", start: 13, end: 15}, {location: "MeetNeighbors", start: 15, end: 24} ], "Saturday": [ {location: "MeetNeighbors", start: 0, end: 24} ], "Sunday": [ {location: "MeetNeighbors", start: 0, end: 24} ] } }, "Roisin Sullivan": { defaultLocation: "SecretLocation", customSchedule: { "Monday": [ {location: "SecretLocation", start: 0, end: 5}, {location: "GymNPCs", start: 5, end: 7}, {location: "SecretLocation", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Alleyway", start: 16, end: 22}, {location: "SecretLocation", start: 22, end: 24} ], "Tuesday": [ {location: "SecretLocation", start: 0, end: 5}, {location: "GymNPCs", start: 5, end: 7}, {location: "SecretLocation", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 21}, {location: "Outskirts", start: 21, end: 22}, {location: "SecretLocation", start: 22, end: 24} ], "Wednesday": [ {location: "SecretLocation", start: 0, end: 5}, {location: "GymNPCs", start: 5, end: 7}, {location: "SecretLocation", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 21}, {location: "Outskirts", start: 21, end: 22}, {location: "SecretLocation", start: 22, end: 24} ], "Thursday": [ {location: "SecretLocation", start: 0, end: 5}, {location: "GymNPCs", start: 5, end: 7}, {location: "SecretLocation", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 21}, {location: "Outskirts", start: 21, end: 22}, {location: "SecretLocation", start: 22, end: 24} ], "Friday": [ {location: "SecretLocation", start: 0, end: 6}, {location: "Beach", start: 6, end: 10}, {location: "CoralReef", start: 10, end: 13}, {location: "Docks", start: 13, end: 14}, {location: "SecretLocation", start: 14, end: 24} ], "Saturday": [ {location: "SecretLocation", start: 0, end: 5}, {location: "GymNPCs", start: 5, end: 7}, {location: "SecretLocation", start: 7, end: 10}, {location: "Casino", start: 10, end: 15}, {location: "Mall", start: 15, end: 17}, {location: "TownHall", start: 17, end: 18}, {location: "SecretLocation", start: 18, end: 24} ], "Sunday": [ {location: "Alter", start: 0, end: 24} ] } }, "Jake Steel": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 8}, {location: "Beach", start: 8, end: 12}, {location: "TheAngler", start: 12, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 16}, {location: "OutskirtsHousing", start: 16, end: 24} ] } }, "Marcus Carter": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "GymNPCs", start: 6, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 17}, {location: "CommercialDistrict", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "GymNPCs", start: 6, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 17}, {location: "CommercialDistrict", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "GymNPCs", start: 6, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 17}, {location: "CommercialDistrict", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "GymNPCs", start: 6, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 17}, {location: "CommercialDistrict", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "GymNPCs", start: 6, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 17}, {location: "TheAngler", start: 17, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "GymNPCs", start: 9, end: 11}, {location: "SeabassPark", start: 11, end: 15}, {location: "ResidentialDistrict", start: 15, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 24} ] } }, "Elena Romero": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Mall", start: 10, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ] } }, "Silva Silva": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "CommercialDistrict", start: 7, end: 12}, {location: "Downtown", start: 12, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "CommercialDistrict", start: 7, end: 12}, {location: "Downtown", start: 12, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "CommercialDistrict", start: 7, end: 12}, {location: "Downtown", start: 12, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "CommercialDistrict", start: 7, end: 12}, {location: "Downtown", start: 12, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "CommercialDistrict", start: 7, end: 12}, {location: "Downtown", start: 12, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "SeabassPark", start: 10, end: 14}, {location: "Mall", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Beach", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Grimm Patel": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 12}, {location: "Alley", start: 12, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 12}, {location: "Alley", start: 12, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 12}, {location: "Alley", start: 12, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 12}, {location: "Alley", start: 12, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 12}, {location: "Alley", start: 12, end: 18}, {location: "VIPLounge", start: 18, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Casino", start: 11, end: 18}, {location: "VIPLounge", start: 18, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 14}, {location: "SeabassPark", start: 14, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ] } }, "Scarlett Vex": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "VIPLounge", start: 18, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "VIPLounge", start: 19, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Jade Nightshade": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Tuesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Wednesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Thursday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Friday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Saturday": [ {location: "StripClub", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 16}, {location: "SeabassPark", start: 16, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ] } }, "Apollo Sterling": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "StripClub", start: 15, end: 24} ], "Tuesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "StripClub", start: 15, end: 24} ], "Wednesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "StripClub", start: 15, end: 24} ], "Thursday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "StripClub", start: 15, end: 24} ], "Friday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "StripClub", start: 15, end: 24} ], "Saturday": [ {location: "StripClub", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "StripClub", start: 17, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "SeabassPark", start: 17, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ] } }, "Vera Sinclair": { defaultLocation: "ResidentialExpensiveHomes", customSchedule: { "Monday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TownHall", start: 10, end: 16}, {location: "CommercialDistrict", start: 16, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TownHall", start: 10, end: 16}, {location: "CommercialDistrict", start: 16, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TownHall", start: 10, end: 16}, {location: "CommercialDistrict", start: 16, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TownHall", start: 10, end: 16}, {location: "CommercialDistrict", start: 16, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Friday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TownHall", start: 10, end: 16}, {location: "VIPLounge", start: 16, end: 21}, {location: "ResidentialExpensiveHomes", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 11}, {location: "Mall", start: 11, end: 15}, {location: "SeabassPark", start: 15, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 24} ] } }, "Rex Harmon": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Cass Morgan": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 11}, {location: "Mall", start: 11, end: 15}, {location: "SeabassPark", start: 15, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Ivy Brooks": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "GroceryStore", start: 8, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "GroceryStore", start: 8, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "GroceryStore", start: 8, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "GroceryStore", start: 8, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "GroceryStore", start: 8, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Mall", start: 10, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Zara Quinn": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Mall", start: 11, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Drake Lawson": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Alley", start: 16, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Alley", start: 16, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Alley", start: 16, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Alley", start: 16, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Casino", start: 16, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Casino", start: 12, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 14}, {location: "SeabassPark", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Nina Sato": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Mall", start: 11, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Daisy Flores": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Mall", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Mall", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Mall", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Mall", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Mall", start: 8, end: 16}, {location: "StripClub", start: 16, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Beach", start: 10, end: 15}, {location: "Mall", start: 15, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Milo Hart": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "CommercialDistrict", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Blair Hoffman": { defaultLocation: "ResidentialExpensiveHomes", customSchedule: { "Monday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "CommercialDistrict", start: 10, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialExpensiveHomes", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "CommercialDistrict", start: 10, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialExpensiveHomes", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "CommercialDistrict", start: 10, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialExpensiveHomes", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "CommercialDistrict", start: 10, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialExpensiveHomes", start: 19, end: 24} ], "Friday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "CommercialDistrict", start: 10, end: 17}, {location: "VIPLounge", start: 17, end: 22}, {location: "ResidentialExpensiveHomes", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 11}, {location: "Mall", start: 11, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "ResidentialExpensiveHomes", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialExpensiveHomes", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialExpensiveHomes", start: 17, end: 24} ] } }, "Wendy Parker": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Cafe", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Cafe", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Cafe", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Cafe", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Cafe", start: 6, end: 14}, {location: "TheAngler", start: 14, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "Mall", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Spencer Kim": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Tanya West": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Alley", start: 17, end: 24} ], "Tuesday": [ {location: "Alley", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Alley", start: 17, end: 24} ], "Wednesday": [ {location: "Alley", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Alley", start: 17, end: 24} ], "Thursday": [ {location: "Alley", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Alley", start: 17, end: 24} ], "Friday": [ {location: "Alley", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "RedLightDistrict", start: 17, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "RedLightDistrict", start: 18, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 16}, {location: "SeabassPark", start: 16, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ] } }, "Victor Reyes": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Docks", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Docks", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Docks", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Docks", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Docks", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Beach", start: 10, end: 15}, {location: "TheAngler", start: 15, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Beach", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Clara Chen": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "GroceryStore", start: 17, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Hospital", start: 8, end: 17}, {location: "VIPLounge", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Mall", start: 10, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ] } }, "Tommy Blake": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 16}, {location: "TheAngler", start: 16, end: 22}, {location: "OutskirtsHousing", start: 22, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "TheAngler", start: 14, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "OutskirtsHousing", start: 17, end: 24} ] } }, "Lena Cross": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Mall", start: 11, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Oscar Grant": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "CommercialDistrict", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Penny Shaw": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "SeabassPark", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Mall", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Mall", start: 10, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } }, "Felix Dunn": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Casino", start: 16, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 11}, {location: "Casino", start: 11, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Amber Cole": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "ModelingStudio", start: 12, end: 18}, {location: "VIPLounge", start: 18, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "VIPLounge", start: 19, end: 23}, {location: "BusinessDistrictHousing", start: 23, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Mason Reed": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 15}, {location: "Alley", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 15}, {location: "Alley", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 15}, {location: "Alley", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 15}, {location: "Alley", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Outskirts", start: 7, end: 15}, {location: "Casino", start: 15, end: 22}, {location: "OutskirtsHousing", start: 22, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 11}, {location: "Casino", start: 11, end: 18}, {location: "StripClub", start: 18, end: 23}, {location: "OutskirtsHousing", start: 23, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 14}, {location: "SeabassPark", start: 14, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ] } }, "Ruby Lane": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Tuesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Wednesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Thursday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Friday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Saturday": [ {location: "StripClub", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 16}, {location: "SeabassPark", start: 16, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ] } }, /* ========== DOCK WORKERS (5) - Staggered Shifts ========== */ "Mike Murphy": { defaultLocation: "DocksHousing", customSchedule: { "Monday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "TheAngler", start: 15, end: 19}, {location: "DocksHousing", start: 19, end: 24} ], "Tuesday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "Beach", start: 13, end: 16}, {location: "DocksHousing", start: 16, end: 24} ], "Wednesday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "TheAngler", start: 15, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Thursday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "DocksHousing", start: 17, end: 24} ], "Friday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "TheAngler", start: 15, end: 22}, {location: "DocksHousing", start: 22, end: 24} ], "Saturday": [ {location: "DocksHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "TheAngler", start: 14, end: 19}, {location: "DocksHousing", start: 19, end: 24} ], "Sunday": [ {location: "DocksHousing", start: 0, end: 11}, {location: "GymNPCs", start: 11, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "DocksHousing", start: 17, end: 24} ] } }, "Carlos Mendez": { defaultLocation: "DocksHousing", customSchedule: { "Monday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "Mall", start: 19, end: 21}, {location: "DocksHousing", start: 21, end: 24} ], "Tuesday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "DocksHousing", start: 18, end: 24} ], "Wednesday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Beach", start: 16, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Thursday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Friday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "VIPLounge", start: 18, end: 22}, {location: "DocksHousing", start: 22, end: 24} ], "Saturday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Beach", start: 16, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Sunday": [ {location: "DocksHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "DocksHousing", start: 18, end: 24} ] } }, "Jamal Rivers": { defaultLocation: "DocksHousing", customSchedule: { "Monday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "GymNPCs", start: 18, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Tuesday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "Beach", start: 18, end: 21}, {location: "DocksHousing", start: 21, end: 24} ], "Wednesday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "GymNPCs", start: 18, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Thursday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "TheAngler", start: 18, end: 21}, {location: "DocksHousing", start: 21, end: 24} ], "Friday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "GymNPCs", start: 18, end: 20}, {location: "VIPLounge", start: 20, end: 23}, {location: "DocksHousing", start: 23, end: 24} ], "Saturday": [ {location: "DocksHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Docks", start: 10, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "DocksHousing", start: 22, end: 24} ], "Sunday": [ {location: "DocksHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "DocksHousing", start: 16, end: 24} ] } }, "Rosa Otterino": { defaultLocation: "DocksHousing", customSchedule: { "Monday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "GroceryStore", start: 16, end: 17}, {location: "DocksHousing", start: 17, end: 24} ], "Tuesday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "DocksHousing", start: 19, end: 24} ], "Wednesday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "DocksHousing", start: 18, end: 24} ], "Thursday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "DocksHousing", start: 19, end: 24} ], "Friday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Saturday": [ {location: "DocksHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "DocksHousing", start: 17, end: 24} ], "Sunday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "DocksHousing", start: 19, end: 24} ] } }, "Keisha Jackson": { defaultLocation: "DocksHousing", customSchedule: { "Monday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "DocksHousing", start: 18, end: 24} ], "Tuesday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "Beach", start: 13, end: 16}, {location: "DocksHousing", start: 16, end: 24} ], "Wednesday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "DocksHousing", start: 19, end: 24} ], "Thursday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "DocksHousing", start: 15, end: 24} ], "Friday": [ {location: "DocksHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Docks", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "DocksHousing", start: 20, end: 24} ], "Saturday": [ {location: "DocksHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Docks", start: 5, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "DocksHousing", start: 17, end: 24} ], "Sunday": [ {location: "DocksHousing", start: 0, end: 11}, {location: "SeabassPark", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "DocksHousing", start: 18, end: 24} ] } }, /* ========== CONSTRUCTION WORKERS (3 New) - Day Shifts ========== */ "Marco Rodriguez": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "TheAngler", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "OutskirtsHousing", start: 17, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "Beach", start: 13, end: 16}, {location: "OutskirtsHousing", start: 16, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "GymNPCs", start: 13, end: 15}, {location: "VIPLounge", start: 15, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 4}, {location: "Cafe", start: 4, end: 5}, {location: "Outskirts", start: 5, end: 13}, {location: "Beach", start: 13, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 11}, {location: "GymNPCs", start: 11, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "OutskirtsHousing", start: 17, end: 24} ] } }, "Sheryl Williams": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "TheAngler", start: 19, end: 22}, {location: "OutskirtsHousing", start: 22, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "Beach", start: 17, end: 21}, {location: "OutskirtsHousing", start: 21, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "OutskirtsHousing", start: 16, end: 24} ] } }, "David O'Brien": { defaultLocation: "OutskirtsHousing", customSchedule: { "Monday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "SeabassPark", start: 15, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ], "Tuesday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "TheAngler", start: 15, end: 19}, {location: "OutskirtsHousing", start: 19, end: 24} ], "Wednesday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "SeabassPark", start: 17, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Thursday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "GroceryStore", start: 15, end: 16}, {location: "OutskirtsHousing", start: 16, end: 24} ], "Friday": [ {location: "OutskirtsHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Outskirts", start: 8, end: 17}, {location: "TheAngler", start: 17, end: 21}, {location: "OutskirtsHousing", start: 21, end: 24} ], "Saturday": [ {location: "OutskirtsHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Outskirts", start: 6, end: 15}, {location: "TheAngler", start: 15, end: 20}, {location: "OutskirtsHousing", start: 20, end: 24} ], "Sunday": [ {location: "OutskirtsHousing", start: 0, end: 10}, {location: "SeabassPark", start: 10, end: 14}, {location: "TheAngler", start: 14, end: 18}, {location: "OutskirtsHousing", start: 18, end: 24} ] } }, /* ========== PATROL OFFICERS (3) - 24/7 Coverage Rotation ========== */ "Boris Shorthead": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Downtown", start: 6, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Downtown", start: 6, end: 14}, {location: "TheAngler", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Downtown", start: 6, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Downtown", start: 6, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Downtown", start: 6, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "TheAngler", start: 16, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, "Mareregererrer Mayonnaise": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Sunday": [ {location: "Downtown", start: 0, end: 6}, {location: "Cafe", start: 6, end: 7}, {location: "Downtown", start: 7, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ] } }, "Poggies Name420": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Tuesday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Wednesday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Thursday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Friday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 21}, {location: "Cafe", start: 21, end: 22}, {location: "Downtown", start: 22, end: 24} ], "Saturday": [ {location: "Downtown", start: 0, end: 6}, {location: "ResidentialDistrict", start: 6, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "Downtown", start: 14, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ] } }, /* ========== BEAUTY SALON STYLISTS (3) ========== */ "Crystal Meffin": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "Mall", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "Mall", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "BeautySalon", start: 9, end: 17}, {location: "Mall", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ] } }, "Sophi Boris": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "GymNPCs", start: 18, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "VIPLounge", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "Casino", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "BeautySalon", start: 12, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 12}, {location: "Mall", start: 12, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ] } }, "Naomi Light": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "DanceStudio", start: 14, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "SeabassPark", start: 14, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "DanceStudio", start: 14, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "BeautySalon", start: 8, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "SeabassPark", start: 10, end: 14}, {location: "DanceStudio", start: 14, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ] } }, /* ========== BAKERS (2) - Early Morning Shifts ========== */ "Hannah Chuckins": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "SeabassPark", start: 11, end: 14}, {location: "ResidentialDistrict", start: 14, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "GroceryStore", start: 14, end: 15}, {location: "ResidentialDistrict", start: 15, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "Mall", start: 11, end: 14}, {location: "ResidentialDistrict", start: 14, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "Mall", start: 11, end: 14}, {location: "ResidentialDistrict", start: 14, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 11}, {location: "SeabassPark", start: 11, end: 15}, {location: "GroceryStore", start: 15, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, "Janis Besser": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "SeabassPark", start: 11, end: 14}, {location: "ResidentialDistrict", start: 14, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "GroceryStore", start: 14, end: 15}, {location: "ResidentialDistrict", start: 15, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "Mall", start: 11, end: 14}, {location: "ResidentialDistrict", start: 14, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "Bakery", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 2}, {location: "Cafe", start: 2, end: 3}, {location: "Bakery", start: 3, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "ResidentialDistrict", start: 15, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "Mall", start: 10, end: 13}, {location: "SeabassPark", start: 13, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, /* ========== ADULT STORE CLERKS (2) ========== */ "Destiny Pumpkin": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "Alley", start: 20, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "StripClub", start: 20, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "Mall", start: 20, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "Alley", start: 20, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "StripClub", start: 20, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 11}, {location: "Cafe", start: 11, end: 12}, {location: "AdultStore", start: 12, end: 20}, {location: "VIPLounge", start: 20, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 12}, {location: "Mall", start: 12, end: 16}, {location: "Alley", start: 16, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, "Alex Passionfruit": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "StripClub", start: 22, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "Alley", start: 22, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "Mall", start: 22, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "StripClub", start: 22, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 13}, {location: "Cafe", start: 13, end: 14}, {location: "AdultStore", start: 14, end: 22}, {location: "VIPLounge", start: 22, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Mall", start: 17, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ] } }, /* ========== DANCING INSTRUCTORS (2) ========== */ "Dennis Fungi": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "VIPLounge", start: 16, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Casino", start: 16, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "DanceStudio", start: 9, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "VIPLounge", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ] } }, "Yvela Mushroom": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Cafe", start: 12, end: 13}, {location: "DanceStudio", start: 16, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 13}, {location: "Cafe", start: 15, end: 16}, {location: "DanceStudio", start: 16, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Mall", start: 12, end: 15}, {location: "Cafe", start: 15, end: 16}, {location: "DanceStudio", start: 16, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "Cafe", start: 15, end: 16}, {location: "DanceStudio", start: 16, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Cafe", start: 15, end: 16}, {location: "DanceStudio", start: 16, end: 21}, {location: "VIPLounge", start: 21, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "Cafe", start: 15, end: 16}, {location: "DanceStudio", start: 16, end: 21}, {location: "Casino", start: 21, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "GymNPCs", start: 11, end: 13}, {location: "Beach", start: 13, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, /* ========== BROTHEL WORKERS (7) - Varied Evening Schedules ========== */ "Candace Luxe": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Mall", start: 15, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Tuesday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "BeautySalon", start: 16, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Wednesday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Thursday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Friday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Saturday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "BeautySalon", start: 15, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 24} ], "Sunday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, "Ruby Becker": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 20, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 15}, {location: "Beach", start: 15, end: 18}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "VIPLounge", start: 17, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 15}, {location: "BeautySalon", start: 15, end: 17}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ] } }, "Sapphire Wallace": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Tuesday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "BeautySalon", start: 17, end: 19}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Wednesday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Thursday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Friday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "VIPLounge", start: 16, end: 20}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Saturday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "BeautySalon", start: 15, end: 17}, {location: "Mall", start: 17, end: 20}, {location: "Cafe", start: 20, end: 21}, {location: "Brothel", start: 21, end: 24} ], "Sunday": [ {location: "Brothel", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Beach", start: 15, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, "Jasmine Abrams": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 23}, {location: "RedLightDistrictHousing", start: 23, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ] } }, "Ebony Vasquez": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Tuesday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Wednesday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Thursday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Friday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Saturday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 14}, {location: "VIPLounge", start: 14, end: 18}, {location: "Cafe", start: 18, end: 19}, {location: "Brothel", start: 19, end: 24} ], "Sunday": [ {location: "Brothel", start: 0, end: 1}, {location: "RedLightDistrictHousing", start: 1, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ] } }, "Amber Skye": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Brothel", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ] } }, "Selkira Onyxia": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Tuesday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 15}, {location: "BeautySalon", start: 15, end: 17}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Wednesday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 14}, {location: "DanceStudio", start: 14, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Thursday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Friday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 15}, {location: "VIPLounge", start: 15, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Saturday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Brothel", start: 20, end: 24} ], "Sunday": [ {location: "Brothel", start: 0, end: 3}, {location: "RedLightDistrictHousing", start: 3, end: 15}, {location: "Beach", start: 15, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, /* ========== SINGLE-EMPLOYEE JOBS ========== */ "Tank Morrison": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Tuesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Wednesday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "TheAngler", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Thursday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Friday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Saturday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "StripClub", start: 18, end: 24} ], "Sunday": [ {location: "StripClub", start: 0, end: 2}, {location: "RedLightDistrictHousing", start: 2, end: 12}, {location: "GymNPCs", start: 12, end: 15}, {location: "Beach", start: 15, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, "Diamond Murphy": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Tuesday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "GymNPCs", start: 15, end: 17}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Wednesday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "BeautySalon", start: 16, end: 18}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Thursday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Friday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Saturday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Mall", start: 15, end: 19}, {location: "Cafe", start: 19, end: 20}, {location: "Alley", start: 20, end: 24} ], "Sunday": [ {location: "Alley", start: 0, end: 4}, {location: "RedLightDistrictHousing", start: 4, end: 15}, {location: "Beach", start: 15, end: 19}, {location: "RedLightDistrictHousing", start: 19, end: 24} ] } }, "Kate Velvet": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 12}, {location: "Mall", start: 12, end: 15}, {location: "Cafe", start: 15, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Tuesday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 12}, {location: "BeautySalon", start: 12, end: 14}, {location: "Cafe", start: 15, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Wednesday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 12}, {location: "GymNPCs", start: 12, end: 14}, {location: "Mall", start: 14, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Thursday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 12}, {location: "VIPLounge", start: 12, end: 15}, {location: "Cafe", start: 15, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Friday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 12}, {location: "Mall", start: 12, end: 15}, {location: "Cafe", start: 15, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Saturday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 12}, {location: "BeautySalon", start: 12, end: 14}, {location: "Cafe", start: 15, end: 16}, {location: "Brothel", start: 16, end: 24} ], "Sunday": [ {location: "Brothel", start: 0, end: 1}, {location: "BusinessDistrictHousing", start: 1, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ] } }, "Bella Carver": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "BeautySalon", start: 16, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "VIPLounge", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "BeautySalon", start: 16, end: 18}, {location: "VIPLounge", start: 18, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "Mall", start: 10, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ] } }, "Kevin Oats": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "SeabassPark", start: 18, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "TechStore", start: 10, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Cafe", start: 12, end: 13}, {location: "Mall", start: 13, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, "Raven Bido": { defaultLocation: "RedLightDistrictHousing", customSchedule: { "Monday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "Alley", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ], "Tuesday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "Alley", start: 18, end: 21}, {location: "RedLightDistrictHousing", start: 21, end: 24} ], "Thursday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "SeabassPark", start: 18, end: 20}, {location: "RedLightDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "StripClub", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "RedLightDistrictHousing", start: 0, end: 9}, {location: "Cafe", start: 9, end: 10}, {location: "EccentricShop", start: 10, end: 18}, {location: "Alley", start: 18, end: 22}, {location: "RedLightDistrictHousing", start: 22, end: 24} ], "Sunday": [ {location: "RedLightDistrictHousing", start: 0, end: 12}, {location: "Mall", start: 12, end: 15}, {location: "Alley", start: 15, end: 18}, {location: "RedLightDistrictHousing", start: 18, end: 24} ] } }, "Banana Banana": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "VIPLounge", start: 16, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 6, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "BusinessDistrictHousing", start: 18, end: 24} ] } }, "Trixie Rye": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Tuesday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "GymNPCs", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Wednesday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "BeautySalon", start: 14, end: 16}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Thursday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Friday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "Beach", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Saturday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "Mall", start: 14, end: 17}, {location: "Cafe", start: 17, end: 18}, {location: "Casino", start: 18, end: 24} ], "Sunday": [ {location: "Casino", start: 0, end: 2}, {location: "BusinessDistrictHousing", start: 2, end: 14}, {location: "Beach", start: 14, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ] } }, "Xenis Aku": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "TheAngler", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "SeabassPark", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "GroceryStore", start: 14, end: 15}, {location: "ResidentialDistrict", start: 15, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "TheAngler", start: 14, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "BusStop", start: 6, end: 14}, {location: "Docks", start: 14, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "SeabassPark", start: 10, end: 14}, {location: "TheAngler", start: 14, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Pheiffer Coms": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "TheAngler", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "SeabassPark", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "TheAngler", start: 18, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, "Fen Ris": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 5}, {location: "Cafe", start: 5, end: 6}, {location: "FenRisTraining", start: 6, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 10}, {location: "Beach", start: 10, end: 14}, {location: "GymNPCs", start: 14, end: 17}, {location: "BusinessDistrictHousing", start: 17, end: 24} ] } }, "Brad Icus": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "Mall", start: 17, end: 19}, {location: "BusinessDistrictHousing", start: 19, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "VIPLounge", start: 19, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "FitnessShop", start: 8, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 9}, {location: "GymNPCs", start: 9, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "BusinessDistrictHousing", start: 16, end: 24} ] } }, "Sunny Flipflop": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "Mall", start: 17, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "GymNPCs", start: 17, end: 19}, {location: "TheAngler", start: 19, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "Downtown", start: 9, end: 17}, {location: "Beach", start: 17, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 10}, {location: "GymNPCs", start: 10, end: 12}, {location: "Beach", start: 12, end: 16}, {location: "ResidentialDistrict", start: 16, end: 24} ] } }, "Bongo Bongo": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Mall", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "GymNPCs", start: 16, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "VIPLounge", start: 19, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "Downtown", start: 8, end: 16}, {location: "Beach", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 11}, {location: "Beach", start: 11, end: 15}, {location: "Mall", start: 15, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ] } }, "Butt Johnson": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "TechStore", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Mall", start: 12, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 22}, {location: "ResidentialDistrict", start: 22, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 24} ], "Saturday": [ {location: "MeetNeighbors", start: 0, end: 3}, {location: "ResidentialDistrict", start: 3, end: 14}, {location: "Cafe", start: 14, end: 15}, {location: "MeetNeighbors", start: 15, end: 24} ], "Sunday": [ {location: "MeetNeighbors", start: 0, end: 3}, {location: "ResidentialDistrict", start: 3, end: 16}, {location: "Mall", start: 16, end: 19}, {location: "ResidentialDistrict", start: 19, end: 24} ] } }, "Dick Richardson": { defaultLocation: "BusinessDistrictHousing", customSchedule: { "Monday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Tuesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "Casino", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Wednesday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Thursday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "TheAngler", start: 17, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ], "Friday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "Casino", start: 17, end: 22}, {location: "BusinessDistrictHousing", start: 22, end: 24} ], "Saturday": [ {location: "BusinessDistrictHousing", start: 0, end: 8}, {location: "Cafe", start: 8, end: 9}, {location: "TownHall", start: 9, end: 17}, {location: "VIPLounge", start: 17, end: 21}, {location: "BusinessDistrictHousing", start: 21, end: 24} ], "Sunday": [ {location: "BusinessDistrictHousing", start: 0, end: 12}, {location: "TheAngler", start: 12, end: 16}, {location: "VIPLounge", start: 16, end: 20}, {location: "BusinessDistrictHousing", start: 20, end: 24} ] } }, "Creo Applesauce": { defaultLocation: "ResidentialDistrict", customSchedule: { "Monday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Tuesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "Mall", start: 18, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Wednesday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Thursday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "SeabassPark", start: 18, end: 20}, {location: "ResidentialDistrict", start: 20, end: 24} ], "Friday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "Mall", start: 18, end: 21}, {location: "ResidentialDistrict", start: 21, end: 24} ], "Saturday": [ {location: "ResidentialDistrict", start: 0, end: 7}, {location: "Cafe", start: 7, end: 8}, {location: "TownHall", start: 8, end: 18}, {location: "ResidentialDistrict", start: 18, end: 24} ], "Sunday": [ {location: "ResidentialDistrict", start: 0, end: 12}, {location: "Cafe", start: 12, end: 13}, {location: "SeabassPark", start: 13, end: 17}, {location: "ResidentialDistrict", start: 17, end: 24} ] } } }>> /* Job-based schedule templates - used when NPC changes jobs */ <<set setup.jobScheduleTemplates = { "Stripper": { workLocation: "StripClub", workStart: 18, workEnd: 2, defaultHome: "RedLightDistrictHousing" }, "Porn Star": { workLocation: "ModelingStudio", workStart: 12, workEnd: 18, defaultHome: "BusinessDistrictHousing" }, "Hooker": { workLocation: "Alley", workStart: 17, workEnd: 2, defaultHome: "RedLightDistrictHousing" }, "Security Guard": { workLocation: "Downtown", workStart: 8, workEnd: 17, defaultHome: "ResidentialDistrict" }, "Clinic Assistant": { workLocation: "Hospital", workStart: 8, workEnd: 17, defaultHome: "BusinessDistrictHousing" }, "Package Courier": { workLocation: "CommercialDistrict", workStart: 7, workEnd: 17, defaultHome: "ResidentialDistrict" }, "Negotiator": { workLocation: "Alley", workStart: 12, workEnd: 18, defaultHome: "BusinessDistrictHousing" }, "Retail Worker": { workLocation: "Mall", workStart: 9, workEnd: 17, defaultHome: "ResidentialDistrict" }, "Barista": { workLocation: "Cafe", workStart: 6, workEnd: 14, defaultHome: "ResidentialDistrict" }, "Fisherman": { workLocation: "Docks", workStart: 5, workEnd: 15, defaultHome: "OutskirtsHousing" }, "Dock Worker": { workLocation: "Docks", workStart: 8, workEnd: 17, defaultHome: "ResidentialDistrict" }, "Government Worker": { workLocation: "TownHall", workStart: 9, workEnd: 17, defaultHome: "BusinessDistrictHousing" }, "Black Market Dealer": { workLocation: "Alley", workStart: 18, workEnd: 2, defaultHome: "OutskirtsHousing" }, "Casino Worker": { workLocation: "Casino", workStart: 14, workEnd: 22, defaultHome: "ResidentialDistrict" }, "Social Media Influencer": { workLocation: "Mall", workStart: 10, workEnd: 18, defaultHome: "BusinessDistrictHousing" }, "Police Officer": { workLocation: "Downtown", workStart: 8, workEnd: 18, defaultHome: "ResidentialDistrict" }, "Farm Hand": { workLocation: "Outskirts", workStart: 6, workEnd: 16, defaultHome: "OutskirtsHousing" }, "Grocery Clerk": { workLocation: "GroceryStore", workStart: 8, workEnd: 17, defaultHome: "ResidentialDistrict" } }>> /* Generate a dynamic schedule based on NPC's current job */ <<set setup.generateJobBasedSchedule = function(npc) { var job = npc.job; var template = setup.jobScheduleTemplates[job]; if (!template) { // No template for this job, return null to use default behavior return null; } var homeLocation = npc.residence || template.defaultHome; var workLocation = template.workLocation; var workStart = template.workStart; var workEnd = template.workEnd; var schedule = {}; var days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; // Weekday schedule (Mon-Fri) for (var i = 0; i < 5; i++) { var day = days[i]; if (workEnd < workStart) { // Night shift job (crosses midnight) schedule[day] = [ {location: homeLocation, start: 0, end: workEnd}, {location: homeLocation, start: workEnd, end: workStart - 1}, {location: "Cafe", start: workStart - 1, end: workStart}, {location: workLocation, start: workStart, end: 24} ]; } else { // Day shift job schedule[day] = [ {location: homeLocation, start: 0, end: workStart - 1}, {location: "Cafe", start: workStart - 1, end: workStart}, {location: workLocation, start: workStart, end: workEnd}, {location: homeLocation, start: workEnd, end: 24} ]; } } // Weekend schedule (lighter) schedule["Saturday"] = [ {location: homeLocation, start: 0, end: 10}, {location: "Beach", start: 10, end: 15}, {location: "Mall", start: 15, end: 18}, {location: homeLocation, start: 18, end: 24} ]; schedule["Sunday"] = [ {location: homeLocation, start: 0, end: 12}, {location: "SeabassPark", start: 12, end: 17}, {location: homeLocation, start: 17, end: 24} ]; return schedule; }>> /* Swap schedules between two NPCs (for identity swap) */ <<set setup.swapNPCSchedules = function(npc1Name, npc2Name) { var schedule1 = setup.npcLocationSchedules[npc1Name]; var schedule2 = setup.npcLocationSchedules[npc2Name]; // Swap the schedules if (schedule1 && schedule2) { setup.npcLocationSchedules[npc1Name] = schedule2; setup.npcLocationSchedules[npc2Name] = schedule1; } }>> /* Update NPC schedule when job changes */ <<set setup.updateNPCScheduleForJob = function(npcName, newJob) { var npc = setup.findNPCByName(npcName); if (!npc) return; // Store original schedule if not already stored if (!npc.originalSchedule && setup.npcLocationSchedules[npcName]) { npc.originalSchedule = JSON.parse(JSON.stringify(setup.npcLocationSchedules[npcName])); } // Generate new schedule based on job npc.job = newJob; var newSchedule = setup.generateJobBasedSchedule(npc); if (newSchedule) { if (!setup.npcLocationSchedules[npcName]) { setup.npcLocationSchedules[npcName] = {}; } setup.npcLocationSchedules[npcName].customSchedule = newSchedule; } }>> /* Get NPC's current location based on job, custom schedule, day, time, and traits */ <<set setup.getNPCLocation = function(npcNameOrObject, dayOfWeek, hour) { var npc = typeof npcNameOrObject === 'string' ? setup.findNPCByName(npcNameOrObject) : npcNameOrObject; if (!npc) return null; // LIFE SWAP OVERRIDE - Check for forced location first (highest priority) if (npc.forcedLocation) { return npc.forcedLocation; } // Check if NPC has a redirected schedule from life swap var scheduleKey = npc.scheduleSource || npc.originalName || npc.permanentId || npc.name; var schedule = setup.npcLocationSchedules[scheduleKey]; // If NPC has custom schedule in new system, use that if (schedule) { // Check individual trait-based overrides FIRST (they take priority over global Bimbo) if (schedule.traitOverrides) { for (var trait in schedule.traitOverrides) { var hasTrait = false; if (npc.mentalTraits && npc.mentalTraits.includes(trait)) hasTrait = true; if (npc.physicalTraits && npc.physicalTraits.includes(trait)) hasTrait = true; if (hasTrait) { var traitSchedule = schedule.traitOverrides[trait]; if (traitSchedule[dayOfWeek]) { var daySchedule = traitSchedule[dayOfWeek]; for (var i = 0; i < daySchedule.length; i++) { var slot = daySchedule[i]; if (hour >= slot.start && hour < slot.end) { return slot.location; } } } } } } // Global Bimbo trait override (only applies if no individual override was found) var hasBimbo = false; if (npc.mentalTraits && npc.mentalTraits.includes("Bimbo")) hasBimbo = true; if (hasBimbo) { // After 8pm (20:00), go to MeetNeighbors if (hour >= 20 || hour < 6) { return "MeetNeighbors"; } // During the day, alternate between Mall and Park based on day var dayIndex = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"].indexOf(dayOfWeek); if (dayIndex % 2 === 0) { return "Mall"; } else { return "SeabassPark"; } } // Check custom schedule if (schedule.customSchedule && schedule.customSchedule[dayOfWeek]) { var daySchedule = schedule.customSchedule[dayOfWeek]; for (var i = 0; i < daySchedule.length; i++) { var slot = daySchedule[i]; if (hour >= slot.start && hour < slot.end) { var location = slot.location; // Translate ResidentialDistrict to NPC's actual housing if (location === "ResidentialDistrict" && npc.residence) { var housingLocation = setup.housingToScheduleLocation[npc.residence]; if (housingLocation) { return housingLocation; } } return location; } } } // Default location for this NPC if (schedule.defaultLocation) { var defaultLoc = schedule.defaultLocation; // Translate ResidentialDistrict to NPC's actual housing if (defaultLoc === "ResidentialDistrict" && npc.residence) { var housingLocation = setup.housingToScheduleLocation[npc.residence]; if (housingLocation) { return housingLocation; } } return defaultLoc; } } // Fall back to job-based location var primaryJob = Array.isArray(npc.jobs) ? npc.jobs[0] : npc.jobs; var jobLocation = setup.jobLocations[primaryJob] || null; // Translate ResidentialDistrict to NPC's actual housing for job-based fallback too if (jobLocation === "ResidentialDistrict" && npc.residence) { var housingLocation = setup.housingToScheduleLocation[npc.residence]; if (housingLocation) { return housingLocation; } } return jobLocation; }>> /* Get all NPCs at a specific location */ <<set setup.getNPCsAtLocation = function(location) { var v = State.variables; var dayOfWeek = v.dayOfWeek || "Monday"; var hour = Math.floor(v.timeInMinutes / 60) % 24; var npcsHere = []; for (var i = 0; i < v.npcs.length; i++) { var npcLocation = setup.getNPCLocation(v.npcs[i], dayOfWeek, hour); if (npcLocation === location) { npcsHere.push(v.npcs[i]); } } return npcsHere; }>> /* Check if NPC uses new location system */ <<set setup.usesLocationSystem = function(npcName) { return setup.npcLocationSchedules[npcName] !== undefined; }>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💪 Opah Fitness - Closing Time</h1> <div style="background: #2a2a2a; border: 3px solid #ffc107; padding: 30px; border-radius: 12px; text-align: center; margin: 50px auto; max-width: 700px; box-shadow: 0 6px 12px rgba(0,0,0,0.5);"> <p style="color: #ffc107; font-size: 26px; font-weight: bold; margin: 0 0 20px 0;">⏰ Time's Up!</p> <p style="color: #ccc; font-size: 16px; margin: 0 0 20px 0; line-height: 1.8;"> As you finish your workout, the gym staff politely inform you that it's closing time. The lights start dimming and other members are heading to the locker rooms to shower and change. </p> <p style="color: #aaa; font-size: 14px; margin: 0 0 25px 0; font-style: italic;"> "Great workout today! We're closing up for the night. Come back tomorrow between 5 AM and 9 PM!" </p> <div style="background: #1a1a1a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 25px;"> <p style="color: #ff6b6b; font-size: 14px; margin: 0; font-weight: bold;"> You gather your things and head out. </p> </div> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Leave the Gym</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PoliceDepartment">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PoliceDepartment")>> <<run $visitedLocations.push("PoliceDepartment")>> <</if>> /* Check if player is a Criminal and arrest them */ <<if $jobs && $jobs.includes("Criminal")>> <<set $arrestedAtStation = true>> <<goto "CaughtByPolice">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4169e1; text-align: center;">🚔 Sunfish City Police Department</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/PoliceDepartment.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #4169e1; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Police Department"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #4169e1 0%, #1e3a8a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4169e1;"> <p style="color: white; font-size: 18px; margin: 0;"> The main headquarters of the Sunfish City Police Department. The lobby is clean and professional, with officers and staff moving purposefully through the corridors. Behind the reception desk, you can see doors leading to various departments, holding cells, and administrative offices. </p> </div> <!-- Check for Receptionist --> <<set _receptionistNPC = null>> <<set _receptionistJobs = setup.getNPCsByJob("Police Station Receptionist")>> <<if _receptionistJobs && _receptionistJobs.length > 0>> <<set _receptionistNPC = _receptionistJobs[0]>> <</if>> <!-- Receptionist Interaction (if present) --> <<if _receptionistNPC>> <h2 style="color: #e83e8c;">Reception Desk</h2> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin-top: 0;">💼 Talk to <<print _receptionistNPC.name>></h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">The receptionist is at the front desk. You could ask about job opportunities.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to Receptionist</div>">> <<set $talkingToReceptionist = _receptionistNPC>> <<goto "PoliceReceptionistTalk">> <</link>> </div> </div> <</if>> <h2 style="color: #4169e1;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin-top: 20px;"> <!-- Jail --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #666; margin-top: 0;">🔒 Holding Cells</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">The jail where arrested individuals are held.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Jail</div>">> <<goto "Jail">> <</link>> </div> <!-- Break Room (Police Staff Only) --> <<set _hasPoliceJob = false>> <<set _policeJobTypes = ["Sheriff", "Patrol Officer", "Detective", "Police Station Receptionist", "Police Station Janitor"]>> <<if $jobs && Array.isArray($jobs)>> <<for _policeJob range _policeJobTypes>> <<if $jobs.includes(_policeJob)>> <<set _hasPoliceJob = true>> <</if>> <</for>> <</if>> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin-top: 0;">☕ Officer Break Room</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">A private break room for police officers.</p> <<if _hasPoliceJob>> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'> Staff Only </div> <</if>> </div> <!-- Return to Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to downtown.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Police Department</div>">> <<goto "Downtown">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = []>> <<set _policeJobs = ["Sheriff", "Patrol Officer", "Detective", "Police Station Receptionist", "Police Station Janitor", "Donuts Deliverer"]>> <<for _job range _policeJobs>> <<set _jobNPCs = setup.getNPCsByJob(_job)>> <<if _jobNPCs && _jobNPCs.length > 0>> <<set _npcsHere = _npcsHere.concat(_jobNPCs)>> <</if>> <</for>> <h2 style="color: #4169e1;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4169e1; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #4169e1; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4169e1; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The station seems quiet at the moment. No officers or staff are visible in the lobby. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PoliceBreakRoom">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("PoliceBreakRoom")>> <<run $visitedLocations.push("PoliceBreakRoom")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">☕ Police Department Break Room</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/PoliceBreakRoom.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Break Room"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #17a2b8 0%, #00d4ff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> A comfortable break room for police department staff. The room has several couches, a coffee maker that's constantly brewing, a small kitchenette with a fridge, and a TV mounted on the wall. A table in the corner is scattered with boxes of donuts. The atmosphere is relaxed and casual compared to the rest of the station. </p> </div> <!-- Work Section --> <<set _hasWorkableJob = false>> <<if $jobs && Array.isArray($jobs)>> <<if $jobs.includes("Sheriff") || $jobs.includes("Patrol Officer") || $jobs.includes("Police Station Receptionist") || $jobs.includes("Police Station Janitor")>> <<set _hasWorkableJob = true>> <</if>> <</if>> <<if _hasWorkableJob>> <h2 style="color: #ffd43b;">Work</h2> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 20px; margin-bottom: 30px;"> <!-- Patrol Officer Work --> <<if $jobs && $jobs.includes("Patrol Officer")>> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin-top: 0;">🚓 Patrol Duty</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Head out on patrol.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work</div>">> <<goto "PatrolOfficerWork">> <</link>> </div> <</if>> <!-- Receptionist Work - Universal System --> <<if $jobs && $jobs.includes("Police Station Receptionist")>> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin-top: 0;">💼 Reception Desk</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Work at the front desk. (Max 8 hours/day)</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> <!-- Janitor Work - Universal System --> <<if $jobs && $jobs.includes("Police Station Janitor")>> <div style="border: 3px solid #95a5a6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #95a5a6; margin-top: 0;">🧹 Janitorial Duties</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Clean the station. (Max 8 hours/day)</p> <<link "<div style='background: #95a5a6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Work</div>">> <<goto "UniversalWork">> <</link>> </div> <</if>> </div> <</if>> <h2 style="color: #17a2b8;">Activities</h2> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin-top: 20px;"> <!-- Get Coffee --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.5;"> <h3 style="color: #666; margin-top: 0;">☕ Get Coffee</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Pour yourself a cup of coffee. It's been sitting here a while, but it's free.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Eat Donuts --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.5;"> <h3 style="color: #666; margin-top: 0;">🍩 Eat Donuts</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Help yourself to the communal donuts. There's always a fresh box around here.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Watch TV --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.5;"> <h3 style="color: #666; margin-top: 0;">📺 Watch TV</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Relax and watch some TV for a while. There's usually a game or news on.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Take a Nap --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; opacity: 0.5;"> <h3 style="color: #666; margin-top: 0;">😴 Take a Nap</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Catch some Z's on the couch. No one will judge you here.</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Coming Soon</div> </div> <!-- Return to Police Department --> <div style="border: 3px solid #4169e1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4169e1; margin-top: 0;">🚔 Back to Station</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the main police department lobby.</p> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Break Room</div>">> <<goto "PoliceDepartment">> <</link>> </div> </div> <div id="breakRoomMessage"></div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("PoliceBreakRoom")>> <h2 style="color: #17a2b8;">Officers on Break</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The break room is empty at the moment. Everyone must be out on duty. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "SheriffWork">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">⭐ Sheriff's Office</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ffd700 0%, #f39c12 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> Sheriff work content will go here. </p> </div> <<link "<div style='background: #2ecc71; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolOfficerWork">> <!-- Check if player has Driving skill --> <<set _hasDriving = $skills && $skills.includes("Driving")>> <!-- Check if enough time has passed since last patrol (16 hours = 960 minutes) --> <<if !$lastPatrolEndTime>> <<set $lastPatrolEndTime = 0>> <</if>> <<set _timeSinceLastPatrol = $timeInMinutes - $lastPatrolEndTime>> <<set _canPatrol = (_timeSinceLastPatrol >= 960 || $lastPatrolEndTime === 0) && _hasDriving>> <<set _timeRemaining = 960 - _timeSinceLastPatrol>> <<set _hoursRemaining = Math.floor(_timeRemaining / 60)>> <<set _minutesRemaining = _timeRemaining % 60>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">🚓 Patrol Duty</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> Time to hit the streets and keep Sunfish City safe. You can patrol for up to 8 hours per day. Your patrol car is waiting outside, ready to take you anywhere in the city. </p> </div> <<if !_hasDriving>> <div style="background: #000; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">⚠️ NO DRIVING SKILL ⚠️</h3> <p style="color: #e0e0e0; text-align: center; margin: 0;"> You need the <strong style="color: #ffd43b;">Driving</strong> skill to operate a patrol vehicle. You cannot go on patrol without it. </p> </div> <<elseif !_canPatrol>> <div style="background: #000; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0; text-align: center;">⚠️ TOO EXHAUSTED TO PATROL ⚠️</h3> <p style="color: #e0e0e0; text-align: center; margin: 0;"> You're too exhausted from your last shift. You need to rest for <strong style="color: #ffd43b;"><<print _hoursRemaining>> hours and <<print _minutesRemaining>> minutes</strong> before you can patrol again. </p> </div> <</if>> <h2 style="color: #3498db;">Start Your Shift</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Begin Patrol --> <div style="border: 3px solid <<if _canPatrol>>#28a745<<else>>#666<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column; <<if !_canPatrol>>opacity: 0.5;<</if>>"> <h3 style="color: <<if _canPatrol>>#28a745<<else>>#666<</if>>; margin-top: 0;">🚨 Begin Patrol</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Start your 8-hour patrol shift. You'll be paid $35/hour.</p> <p style="font-size: 14px; color: <<if _canPatrol>>#28a745<<else>>#666<</if>>; margin: 10px 0; font-weight: bold;">Pay: $280 for full shift</p> <<if _canPatrol>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Patrol</div>">> <<set $patrolStartTime = $timeInMinutes>> <<set $patrolHoursWorked = 0>> <<set $onPatrol = true>> <<set $traitStolenThisShift = false>> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Patrol Officer")>> <<run $jobsWorked.push("Patrol Officer")>> <</if>> <<goto "PatrolDowntown">> <</link>> <<else>> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'><<if !_hasDriving>>Need Driving Skill<<else>>Too Exhausted<</if>></div> <</if>> </div> <!-- Return to Break Room --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin-top: 0;">☕ Break Room</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the break room.</p> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ReceptionistWork">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">💼 Reception Desk</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e83e8c 0%, #d63384 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0;"> The reception desk is the first point of contact for everyone entering the police station. You'll be handling phone calls, greeting visitors, managing paperwork, and keeping everything organized. Professional appearance and demeanor are essential. </p> </div> <!-- ===== SKILL TREE: Get hourly pay bonus ===== --> <<set _hourlyPayBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _hourlyPayBonus = setup.skillTree.getEffect("hourlyPayBonus") || 0>> <</if>> <!-- Calculate potential pay with bonuses/penalties --> <<set _basePay = 60>> <<set _payMultiplier = 1.0>> <<set _bonuses = []>> <<set _penalties = []>> <!-- Task 1: Answer Phone Calls --> <<set _phoneBonus = 0>> <<if $mentalTraits.includes("Polite")>> <<set _phoneBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Friendly")>> <<set _phoneBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Patient")>> <<set _phoneBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Calm")>> <<set _phoneBonus += 0.02>> <</if>> <<if $skills.includes("Customer Service")>> <<set _phoneBonus += 0.05>> <</if>> <!-- Voice trait bonuses --> <<if $physicalTraits.includes("Clear Enunciation") || $physicalTraits.includes("Articulate Speech")>> <<set _phoneBonus += 0.04>> <</if>> <<if $physicalTraits.includes("Smooth Voice") || $physicalTraits.includes("Friendly Tone") || $physicalTraits.includes("Warm Tone")>> <<set _phoneBonus += 0.03>> <</if>> <!-- Phone penalties --> <<if $mentalTraits.includes("Rude")>> <<set _phoneBonus -= 0.05>> <</if>> <<if $mentalTraits.includes("Impatient")>> <<set _phoneBonus -= 0.04>> <</if>> <<if $mentalTraits.includes("Short Tempered")>> <<set _phoneBonus -= 0.04>> <</if>> <<if $physicalTraits.includes("Mumbly Voice") || $physicalTraits.includes("Stuttering Speech")>> <<set _phoneBonus -= 0.05>> <</if>> <<if $physicalTraits.includes("Monotone") || $physicalTraits.includes("Flat Voice")>> <<set _phoneBonus -= 0.03>> <</if>> <!-- Task 2: Process Walk-ins --> <<set _walkInBonus = 0>> <<if $mentalTraits.includes("Polite")>> <<set _walkInBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Friendly")>> <<set _walkInBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Patient")>> <<set _walkInBonus += 0.04>> <</if>> <<if $mentalTraits.includes("Empathetic")>> <<set _walkInBonus += 0.04>> <</if>> <<if $mentalTraits.includes("Diplomatic")>> <<set _walkInBonus += 0.03>> <</if>> <<if $skills.includes("Customer Service")>> <<set _walkInBonus += 0.05>> <</if>> <!-- Walk-in penalties --> <<if $mentalTraits.includes("Rude")>> <<set _walkInBonus -= 0.06>> <</if>> <<if $mentalTraits.includes("Bitchy")>> <<set _walkInBonus -= 0.05>> <</if>> <<if $mentalTraits.includes("Cold")>> <<set _walkInBonus -= 0.04>> <</if>> <<if $mentalTraits.includes("Insensitive")>> <<set _walkInBonus -= 0.04>> <</if>> <<if $mentalTraits.includes("Short Tempered")>> <<set _walkInBonus -= 0.04>> <</if>> <!-- Task 3: File Paperwork --> <<set _filingBonus = 0>> <<if $mentalTraits.includes("Organized")>> <<set _filingBonus += 0.06>> <<else>> <<set _filingBonus -= 0.05>> <<run _penalties.push("Missing Organized: -5%")>> <</if>> <<if $physicalTraits.includes("Detail-Oriented")>> <<set _filingBonus += 0.04>> <</if>> <<if $mentalTraits.includes("Efficient")>> <<set _filingBonus += 0.03>> <</if>> <<if $mentalTraits.includes("Focused")>> <<set _filingBonus += 0.03>> <</if>> <<if $physicalTraits.includes("Punctual")>> <<set _filingBonus += 0.02>> <</if>> <!-- Filing penalties --> <<if $mentalTraits.includes("Disorganized")>> <<set _filingBonus -= 0.06>> <</if>> <<if $mentalTraits.includes("Forgetful")>> <<set _filingBonus -= 0.04>> <</if>> <<if $mentalTraits.includes("Lazy")>> <<set _filingBonus -= 0.04>> <</if>> <<if $physicalTraits.includes("Slow")>> <<set _filingBonus -= 0.03>> <</if>> <<if $physicalTraits.includes("Clumsy")>> <<set _filingBonus -= 0.03>> <</if>> <!-- Task 4: Issue Visitor Badges --> <<set _badgeBonus = 0>> <<if $mentalTraits.includes("Organized")>> <<set _badgeBonus += 0.04>> <</if>> <<if $physicalTraits.includes("Detail-Oriented")>> <<set _badgeBonus += 0.05>> <</if>> <<if $physicalTraits.includes("Perceptive")>> <<set _badgeBonus += 0.04>> <</if>> <<if $mentalTraits.includes("Focused")>> <<set _badgeBonus += 0.03>> <</if>> <!-- Badge penalties --> <<if $mentalTraits.includes("Disorganized")>> <<set _badgeBonus -= 0.05>> <</if>> <<if $mentalTraits.includes("Forgetful")>> <<set _badgeBonus -= 0.05>> <</if>> <<if $mentalTraits.includes("Reckless")>> <<set _badgeBonus -= 0.04>> <</if>> <<if $mentalTraits.includes("Careless")>> <<set _badgeBonus -= 0.04>> <</if>> <!-- Missing Customer Service penalty (critical for reception) --> <<if !$skills.includes("Customer Service")>> <<run _penalties.push("Missing Customer Service: -5%")>> <<set _payMultiplier -= 0.05>> <</if>> <!-- Calculate total task performance --> <<set _taskAverage = (_phoneBonus + _walkInBonus + _filingBonus + _badgeBonus) / 4>> <<set _payMultiplier += _taskAverage>> <<set _performancePay = Math.floor(_basePay * _payMultiplier)>> <!-- ===== SKILL TREE: Calculate hourly pay bonus ===== --> <<set _skillTreeBonus = 0>> <<if _hourlyPayBonus > 0>> <<set _skillTreeBonus = Math.floor(_performancePay * (_hourlyPayBonus / 100))>> <</if>> <<set _finalPay = _performancePay + _skillTreeBonus>> <!-- Build bonus/penalty display --> <<if _phoneBonus > 0>> <<run _bonuses.push("Phone Skills: +" + Math.round(_phoneBonus * 100) + "%")>> <<elseif _phoneBonus < 0>> <<run _penalties.push("Phone Skills: " + Math.round(_phoneBonus * 100) + "%")>> <</if>> <<if _walkInBonus > 0>> <<run _bonuses.push("Customer Interaction: +" + Math.round(_walkInBonus * 100) + "%")>> <<elseif _walkInBonus < 0>> <<run _penalties.push("Customer Interaction: " + Math.round(_walkInBonus * 100) + "%")>> <</if>> <<if _filingBonus > 0>> <<run _bonuses.push("Filing Efficiency: +" + Math.round(_filingBonus * 100) + "%")>> <<elseif _filingBonus < 0>> <<run _penalties.push("Filing Efficiency: " + Math.round(_filingBonus * 100) + "%")>> <</if>> <<if _badgeBonus > 0>> <<run _bonuses.push("Badge Processing: +" + Math.round(_badgeBonus * 100) + "%")>> <<elseif _badgeBonus < 0>> <<run _penalties.push("Badge Processing: " + Math.round(_badgeBonus * 100) + "%")>> <</if>> <!-- Work Status --> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #34495e;"> <h3 style="color: #e83e8c; margin-top: 0;">💰 Job Details</h3> <p style="color: #ecf0f1; margin: 10px 0;"> <strong>Base Rate:</strong> $15/hour<br> <strong>Shift Length:</strong> 4 hours<br> <strong>Base Pay:</strong> $<<print _basePay>> </p> <<if _bonuses.length > 0>> <div style="background: #27ae60; padding: 10px; border-radius: 6px; margin: 10px 0;"> <p style="color: white; font-weight: bold; margin: 5px 0;">✓ Performance Bonuses:</p> <<for _bonus range _bonuses>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _bonus</p> <</for>> </div> <</if>> <<if _penalties.length > 0>> <div style="background: #c0392b; padding: 10px; border-radius: 6px; margin: 10px 0;"> <p style="color: white; font-weight: bold; margin: 5px 0;">⚠️ Performance Penalties:</p> <<for _penalty range _penalties>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _penalty</p> <</for>> </div> <</if>> <!-- ===== SKILL TREE: Display bonus ===== --> <<if _skillTreeBonus > 0>> <div style="background: #9C27B0; padding: 10px; border-radius: 6px; margin: 10px 0;"> <p style="color: white; font-weight: bold; margin: 5px 0;">⭐ Skill Tree Bonus:</p> <p style="color: #CE93D8; margin: 3px 0; font-size: 14px;">• Hourly Pay Bonus (+<<print _hourlyPayBonus>>%): +$<<print _skillTreeBonus>></p> </div> <</if>> <p style="color: #2ecc71; font-weight: bold; margin: 10px 0;"> <strong>Final Pay:</strong> $<<print _finalPay>> </p> <<if $workedReceptionistToday>> <p style="color: #e74c3c; font-weight: bold; margin: 10px 0;"> You've already worked your shift today. Come back tomorrow. </p> <<else>> <p style="color: #2ecc71; font-weight: bold; margin: 10px 0;"> You can work a shift today. </p> <</if>> </div> <!-- Task Breakdown --> <<if !$workedReceptionistToday>> <div style="padding: 20px; background: #34495e; border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <h3 style="color: #e83e8c; margin-top: 0;">📋 Today's Tasks</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; margin: 15px 0;"> <div style="background: #2c3e50; padding: 12px; border-radius: 8px; border: 2px solid <<if _phoneBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>;"> <p style="color: #95a5a6; margin: 0; font-size: 14px; font-weight: bold;">📞 Answer Phones</p> <p style="color: <<if _phoneBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>; margin: 5px 0; font-size: 16px; font-weight: bold;"> <<if _phoneBonus >= 0>>+<<print Math.round(_phoneBonus * 100)>>%<<else>><<print Math.round(_phoneBonus * 100)>>%<</if>> </p> </div> <div style="background: #2c3e50; padding: 12px; border-radius: 8px; border: 2px solid <<if _walkInBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>;"> <p style="color: #95a5a6; margin: 0; font-size: 14px; font-weight: bold;">👥 Process Walk-ins</p> <p style="color: <<if _walkInBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>; margin: 5px 0; font-size: 16px; font-weight: bold;"> <<if _walkInBonus >= 0>>+<<print Math.round(_walkInBonus * 100)>>%<<else>><<print Math.round(_walkInBonus * 100)>>%<</if>> </p> </div> <div style="background: #2c3e50; padding: 12px; border-radius: 8px; border: 2px solid <<if _filingBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>;"> <p style="color: #95a5a6; margin: 0; font-size: 14px; font-weight: bold;">📁 File Paperwork</p> <p style="color: <<if _filingBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>; margin: 5px 0; font-size: 16px; font-weight: bold;"> <<if _filingBonus >= 0>>+<<print Math.round(_filingBonus * 100)>>%<<else>><<print Math.round(_filingBonus * 100)>>%<</if>> </p> </div> <div style="background: #2c3e50; padding: 12px; border-radius: 8px; border: 2px solid <<if _badgeBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>;"> <p style="color: #95a5a6; margin: 0; font-size: 14px; font-weight: bold;">🎫 Issue Badges</p> <p style="color: <<if _badgeBonus >= 0>>#2ecc71<<else>>#e74c3c<</if>>; margin: 5px 0; font-size: 16px; font-weight: bold;"> <<if _badgeBonus >= 0>>+<<print Math.round(_badgeBonus * 100)>>%<<else>><<print Math.round(_badgeBonus * 100)>>%<</if>> </p> </div> </div> <<link "<div style='background: #e83e8c; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; transition: all 0.3s;' onmouseover='this.style.background=\"#d63384\"' onmouseout='this.style.background=\"#e83e8c\"'>💼 Work 4-Hour Shift ($<<print _finalPay>>)</div>">> <<set $receptionistPayEarned = _performancePay>> <<set $receptionistBonuses = _bonuses>> <<set $receptionistPenalties = _penalties>> <<set $receptionistSkillTreeBonus = _skillTreeBonus>> <<set $money += _finalPay>> <<set $workedReceptionistToday = true>> <<set $time += 4>> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Receptionist")>> <<run $jobsWorked.push("Receptionist")>> <</if>> <<goto "ReceptionistWorkComplete">> <</link>> </div> <</if>> <!-- Return Link --> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; transition: all 0.3s;' onmouseover='this.style.background=\"#2980b9\"' onmouseout='this.style.background=\"#3498db\"'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "JanitorWork">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #95a5a6; text-align: center;">🧹 Janitorial Duties</h1> <div style="padding: 20px; background: linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #95a5a6;"> <p style="color: white; font-size: 18px; margin: 0;"> The janitorial closet smells of disinfectant and floor polish. Various cleaning supplies line the shelves, and a mop bucket sits in the corner. This is honest work that keeps the police station running smoothly. </p> </div> <!-- Calculate potential pay with penalties --> <<set _basePay = 96>> <<set _payMultiplier = 1.0>> <<set _penalties = []>> <!-- Check for missing beneficial traits --> <<if !$mentalTraits.includes("Punctual")>> <<set _payMultiplier -= 0.05>> <<run _penalties.push("Missing Punctual: -5%")>> <</if>> <<if !$skills.includes("Cleaning")>> <<set _payMultiplier -= 0.05>> <<run _penalties.push("Missing Cleaning Skill: -5%")>> <</if>> <!-- Check for negative traits --> <<if $mentalTraits.includes("Slow Learner")>> <<set _payMultiplier -= 0.05>> <<run _penalties.push("Slow Learner: -5%")>> <</if>> <<if $mentalTraits.includes("Forgetful")>> <<set _payMultiplier -= 0.05>> <<run _penalties.push("Forgetful: -5%")>> <</if>> <<set _finalPay = Math.floor(_basePay * _payMultiplier)>> <!-- Work Status --> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #34495e;"> <h3 style="color: #95a5a6; margin-top: 0;">💰 Job Details</h3> <p style="color: #ecf0f1; margin: 10px 0;"> <strong>Base Rate:</strong> $12/hour<br> <strong>Shift Length:</strong> 8 hours<br> <strong>Base Pay:</strong> $<<print _basePay>> </p> <<if _penalties.length > 0>> <div style="background: #c0392b; padding: 10px; border-radius: 6px; margin: 10px 0;"> <p style="color: white; font-weight: bold; margin: 5px 0;">⚠️ Pay Penalties:</p> <<for _penalty range _penalties>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _penalty</p> <</for>> </div> <p style="color: #e74c3c; font-weight: bold; margin: 10px 0;"> <strong>Final Pay After Penalties:</strong> $<<print _finalPay>> </p> <<else>> <p style="color: #2ecc71; font-weight: bold; margin: 10px 0;"> ✓ No penalties - Full pay: $<<print _finalPay>> </p> <</if>> <<if $workedJanitorToday>> <p style="color: #e74c3c; font-weight: bold; margin: 10px 0;"> You've already worked your shift today. Come back tomorrow. </p> <<else>> <p style="color: #2ecc71; font-weight: bold; margin: 10px 0;"> You can work a shift today. </p> <</if>> </div> <!-- Work Action --> <<if !$workedJanitorToday>> <div style="padding: 20px; background: #34495e; border-radius: 15px; margin-bottom: 25px; border: 2px solid #95a5a6;"> <h3 style="color: #95a5a6; margin-top: 0;">Available Tasks</h3> <<link "<div style='background: #2ecc71; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; transition: all 0.3s;' onmouseover='this.style.background=\"#27ae60\"' onmouseout='this.style.background=\"#2ecc71\"'>🧹 Work 8-Hour Shift ($<<print _finalPay>>)</div>">> <<set $janitorPayEarned = _finalPay>> <<set $janitorPenalties = _penalties>> <<set $money += _finalPay>> <<set $workedJanitorToday = true>> <<set $time += 8>> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Police Station Janitor")>> <<run $jobsWorked.push("Police Station Janitor")>> <</if>> <<goto "JanitorWorkComplete">> <</link>> </div> <</if>> <!-- Return Link --> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; transition: all 0.3s;' onmouseover='this.style.background=\"#2980b9\"' onmouseout='this.style.background=\"#3498db\"'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolAlleyway">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #666; text-align: center;">🌆 Dark Alleyway - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #434343 0%, #000000 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #666;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the dark alleyways. These narrow passages are hotspots for crime - pickpockets, drug deals, and worse. You stay alert. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #666;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to downtown.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to red light district.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin-top: 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the docks.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> </div> <!-- Shady Shop (Can't Enter) --> <div style="border: 3px solid #ff4444; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff4444; margin-top: 0;">🕶️ Shady Shop</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Suspicious storefront.</p> <<link "<div style='background: #ff4444; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">This place is definitely suspicious, but you're on patrol. You make a mental note to investigate when you're off duty.</p> </div> <</replace>> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolDocks">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">⚓ Docks - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e3a5f 0%, #2c5f8d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the industrial waterfront. Dock workers eye you warily as you make your rounds. This area sees its share of smuggling and other criminal activity. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #3498db;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to downtown.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to red light district.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Check the alleyway.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolRedLightDistrict">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🔴 Red Light District - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #c31432 0%, #ff1493 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the neon-lit streets of the red light district. Your presence keeps the peace, though some activities here operate in legal gray areas. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #ff1493;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to downtown.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin-top: 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the docks.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Check the alleyway.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> </div> <!-- Outskirts --> <div style="border: 3px solid #888; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #888; margin-top: 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Head to the outskirts.</p> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> </div> <!-- Brothel (Can't Enter) --> <div style="border: 3px solid #007FFF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #007FFF; margin-top: 0;">💋 Azure Angelfish Lounge</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Brothel establishment.</p> <<link "<div style='background: #007FFF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on official patrol. Can't visit establishments like this while in uniform - it would compromise your authority.</p> </div> <</replace>> <</link>> </div> <!-- Strip Club (Can't Enter) --> <div style="border: 3px solid #9D00FF; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9D00FF; margin-top: 0;">🪼 Electric Jelly Revue</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Strip club.</p> <<link "<div style='background: #9D00FF; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on duty. Entering adult entertainment venues while in uniform is strictly prohibited.</p> </div> <</replace>> <</link>> </div> <!-- Casino (Can't Enter) --> <div style="border: 3px solid #C0C0C0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #C0C0C0; margin-top: 0;">🎰 The Silver Marlin</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Casino.</p> <<link "<div style='background: #C0C0C0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on patrol duty. Gambling while in uniform would be a serious breach of protocol.</p> </div> <</replace>> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolSeabassPark">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4a7c2c; text-align: center;">🌳 Seabass Park - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2d5016 0%, #3d6b1f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4a7c2c;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the peaceful park. Joggers and families enjoy the green space while you keep watch for any trouble. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #4a7c2c;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> </div> <!-- Outskirts --> <div style="border: 3px solid #888; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #888; margin-top: 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the outskirts.</p> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolDowntown">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #667eea; text-align: center;">🏙️ Downtown - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #667eea 0%, #4a9eff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the bustling downtown area. The streets are packed with people, and you keep a watchful eye on the crowds. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #667eea;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the red light district.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Check the alleyway.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> </div> <!-- Apartments (Can't Enter) --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin-top: 0;">🏢 Sunfish Apartments</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Residential building.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on duty right now. No time for personal visits to the apartments.</p> </div> <</replace>> <</link>> </div> <!-- Town Hall (Can't Enter) --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin-top: 0;">🏛️ Town Hall</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">City government building.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on patrol. Official police business only - no time for city hall visits.</p> </div> <</replace>> <</link>> </div> <!-- Aquarium (Can't Enter) --> <div style="border: 3px solid #1e90ff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #1e90ff; margin-top: 0;">🐠 Aquarium</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">City aquarium.</p> <<link "<div style='background: #1e90ff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on duty. The fish can wait - you need to stay focused on patrol.</p> </div> <</replace>> <</link>> </div> <!-- Police Department --> <div style="border: 3px solid #4169e1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4169e1; margin-top: 0;">🚔 Police Department</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the station.</p> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolBusinessDistrict">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">💼 Business District - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the corporate towers and professional areas. Business people give you respectful nods as you make your rounds. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #17a2b8;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #888; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Outskirts</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolOutskirts">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to downtown.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin-top: 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the docks.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to red light district.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> </div> <!-- Seabass Park --> <div style="border: 3px solid #4a7c2c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4a7c2c; margin-top: 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the park.</p> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> </div> <!-- Businesses that can't be entered --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin-top: 0;">💪 Opah Fitness</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Gym.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on patrol. No time for a workout right now.</p> </div> <</replace>> <</link>> </div> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e91e63; margin-top: 0;">💃 Dance Studio</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Dance studio.</p> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on duty. No time for dancing lessons.</p> </div> <</replace>> <</link>> </div> <div style="border: 3px solid #8b4513; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #d2691e; margin-top: 0;">☕ Manta Ray Cafe</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Coffee shop.</p> <<link "<div style='background: #8b4513; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on patrol. Maybe grab coffee on your break later.</p> </div> <</replace>> <</link>> </div> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9b59b6; margin-top: 0;">🛍️ Mall</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Shopping center.</p> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Investigate</div>">> <<replace "#patrolMessage">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107; margin: 15px 0;"> <p style="color: #ffc107; margin: 0; text-align: center;">You're on duty. Shopping will have to wait until you're off the clock.</p> </div> <</replace>> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PatrolOutskirts">> <!-- Crime Detection (25% chance) --> <<if !$crimeDetected && $onPatrol>> <<set _crimeChance = Math.random() * 100>> <<if _crimeChance < 25>> <<set _tierRoll = Math.random() * 100>> <<if _tierRoll < 90>> <<set _tier1Crimes = ["PettyTheft", "Speeding", "ParkingViolation"]>> <<set $currentCrime = _tier1Crimes[Math.floor(Math.random() * _tier1Crimes.length)]>> <<elseif _tierRoll < 96>> <<set _tier2Crimes = ["MinorTraitTheft", "Assault"]>> <<set $currentCrime = _tier2Crimes[Math.floor(Math.random() * _tier2Crimes.length)]>> <<elseif _tierRoll < 99>> <<set _tier3Crimes = ["AssaultWithWeapon", "MajorTraitTheft"]>> <<set $currentCrime = _tier3Crimes[Math.floor(Math.random() * _tier3Crimes.length)]>> <<else>> <<set _tier4Crimes = ["MajorHeist", "GangViolence"]>> <<set $currentCrime = _tier4Crimes[Math.floor(Math.random() * _tier4Crimes.length)]>> <</if>> <<set $crimeDetected = true>> <</if>> <</if>> <<if $crimeDetected && $currentCrime>> <<goto "CrimeScene">> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #888; text-align: center;">🌾 Outskirts - On Patrol</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a4a4a 0%, #5a5a5a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #888;"> <p style="color: white; font-size: 18px; margin: 0;"> You're patrolling the edge of the city where urban sprawl meets countryside. It's quieter here, but isolated areas can hide their own dangers. </p> </div> <<if $onPatrol>> <<if $patrolStartTime === undefined || $patrolStartTime === null>> <<set $patrolStartTime = $timeInMinutes>> <</if>> <<set $patrolHoursWorked = (($timeInMinutes >= $patrolStartTime) ? ($timeInMinutes - $patrolStartTime) : (1440 - $patrolStartTime + $timeInMinutes)) / 60>> <<if $patrolHoursWorked >= 8>> <<set $patrolHoursWorked = 8>> <<set _earnings = Math.floor($patrolHoursWorked * 35)>> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<if _pearlActive>><<set _earnings = Math.round(_earnings * 1.5)>><</if>> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<set _creditBonus = 0>> <<if _hasBankAccount>> <<set _creditBonus = Math.floor(_earnings * 0.05)>> <<set $bankAccount.balance += _earnings + _creditBonus>> <<else>> <<set $money += _earnings>> <</if>> <<set $lastPatrolEarnings = _earnings>> <<set $lastPatrolHours = $patrolHoursWorked>> <<set $lastPatrolPearlActive = _pearlActive>> <<set $lastPatrolCreditBonus = _creditBonus>> <<set $lastPatrolHadBank = _hasBankAccount>> <<set $onPatrol = false>> <<set $lastShiftEndTime = $timeInMinutes>> <<set $crimeDetected = false>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; font-weight: bold;">⏰ Patrol Time: <<print $patrolHoursWorked.toFixed(2)>> hours / 8 hours</p> <<if $patrolHoursWorked >= 7.5>> <p style="color: #ffd43b; margin: 5px 0 0 0; font-weight: bold;">⚠️ Shift ending soon!</p> <</if>> </div> <</if>> <<if $onPatrol>> <h2 style="color: #888;">Patrol Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Get in Patrol Car --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin-top: 0;">🚗 Get in Patrol Car</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Drive to any location.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Vehicle</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px;"> <h2 style="color: #3498db; margin-top: 0;">🚗 Drive to Location</h2> <div style="display: grid; gap: 10px;"> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Police Station</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PoliceBreakRoom">> <</link>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Downtown</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDowntown">> <</link>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Business District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolBusinessDistrict">> <</link>> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Red Light District</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Docks</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolDocks">> <</link>> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Alleyway</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolAlleyway">> <</link>> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Seabass Park</div>">> <<run Dialog.close()>> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer;'>Cancel</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> </div> <!-- Seabass Park --> <div style="border: 3px solid #4a7c2c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4a7c2c; margin-top: 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to the park.</p> <<link "<div style='background: #4a7c2c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolSeabassPark">> <</link>> </div> <!-- Red Light District --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ff1493; margin-top: 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Walk to red light district.</p> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Walk There</div>">> <<set $crimeDetected = false>> <<goto "PatrolRedLightDistrict">> <</link>> </div> </div> <div id="patrolMessage"></div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = passage()>> <!-- Initialize Crime Scene --> <<if !$crimeInProgress>> <<set $crimeInProgress = true>> <!-- Set crime-specific data based on $currentCrime --> <<if $currentCrime === "PettyTheft">> <<set $crimeType = "Petty Theft">> <<set $crimeTier = 1>> <<set $suspectCount = 1>> <<set $requiresBackup = false>> <<set $crimeDesc = { items: ["candy bars", "electronics", "alcohol", "food"], location: "corner store", action: "shoplifting" }>> <<elseif $currentCrime === "Speeding">> <<set $crimeType = "Speeding">> <<set $crimeTier = 1>> <<set $suspectCount = 1>> <<set $requiresBackup = false>> <<set $crimeDesc = { speed: ["20 mph over", "30 mph over", "dangerously fast"], location: "main street", action: "speeding" }>> <<elseif $currentCrime === "ParkingViolation">> <<set $crimeType = "Parking Violation">> <<set $crimeTier = 1>> <<set $suspectCount = 0>> <<set $requiresBackup = false>> <<set $crimeDesc = { violation: ["fire lane", "handicap spot", "no parking zone", "blocking intersection"], location: "downtown", action: "illegally parked" }>> <<elseif $currentCrime === "MinorTraitTheft">> <<set $crimeType = "Minor Trait Theft">> <<set $crimeTier = 2>> <<set $suspectCount = 1>> <<set $requiresBackup = false>> <<set $crimeDesc = { traits: ["confidence", "charm", "energy", "creativity"], location: "alleyway", action: "draining traits" }>> <<elseif $currentCrime === "Assault">> <<set $crimeType = "Assault">> <<set $crimeTier = 2>> <<set $suspectCount = 1>> <<set $requiresBackup = false>> <<set $crimeDesc = { severity: ["punching", "kicking while down", "beating"], location: "street", action: "assaulting someone" }>> <<elseif $currentCrime === "AssaultWithWeapon">> <<set $crimeType = "Assault with a Weapon">> <<set $crimeTier = 3>> <<set $suspectCount = 1>> <<set $requiresBackup = true>> <<set $crimeDesc = { weapon: ["knife", "bat", "crowbar", "broken bottle"], location: "alley", action: "threatening with a weapon" }>> <<elseif $currentCrime === "MajorTraitTheft">> <<set $crimeType = "Major Trait Theft">> <<set $crimeTier = 3>> <<set $suspectCount = 1>> <<set $requiresBackup = true>> <<set $crimeDesc = { victims: ["multiple victims", "several people", "a group"], location: "abandoned building", action: "systematically draining major traits" }>> <<elseif $currentCrime === "MajorHeist">> <<set $crimeType = "Major Heist">> <<set $crimeTier = 4>> <<set $suspectCount = Math.floor(Math.random() * 3) + 3>> <<set $requiresBackup = true>> <<set $crimeDesc = { target: ["bank", "jewelry store", "armored truck"], weapons: ["automatic weapons", "assault rifles", "heavy firearms"], action: "armed robbery" }>> <<elseif $currentCrime === "GangViolence">> <<set $crimeType = "Gang Violence">> <<set $crimeTier = 4>> <<set $suspectCount = Math.floor(Math.random() * 5) + 5>> <<set $requiresBackup = true>> <<set $crimeDesc = { gangs: ["rival gangs", "two crews", "opposing factions"], location: "street intersection", action: "shootout" }>> <</if>> <!-- Generate Suspect Profile --> <<set _ages = ["Young teen", "College age", "Middle-aged", "Elderly"]>> <<set _builds = ["Scrawny", "Average", "Athletic", "Large"]>> <<set _demeanors = ["Nervous and sweaty", "Cool and calm", "Aggressive", "Scared", "Confident", "Desperate"]>> <<set $suspect = { age: _ages[Math.floor(Math.random() * _ages.length)], build: _builds[Math.floor(Math.random() * _builds.length)], demeanor: _demeanors[Math.floor(Math.random() * _demeanors.length)], threatLevel: $crimeTier, currentState: "active", compliance: 50, apprehended: false, scanned: false, traitTheftAttempted: false, hasWeapon: $crimeTier >= 3 }>> <!-- Generate traits for suspect --> <<set $suspect.traits = setup.generateCriminalTraits($crimeTier, $suspect.age, $suspect.build)>> <<set $suspect.stats = setup.calculateSuspectStats($suspect)>> <!-- Context Factors - Time and Location Based --> <<set _isNight = ($timeInMinutes >= 1320 || $timeInMinutes < 360)>> <<set _witnessCount = 0>> <!-- Determine witnesses based on time and location --> <<if $lastLocation === "PatrolDowntown" || $lastLocation === "PatrolBusinessDistrict">> <<set _witnessCount = _isNight ? 1 : 2>> <<elseif $lastLocation === "PatrolRedLightDistrict">> <<set _witnessCount = 2>> <<elseif $lastLocation === "PatrolDocks" || $lastLocation === "PatrolAlleyway">> <<set _witnessCount = _isNight ? 0 : 1>> <<elseif $lastLocation === "PatrolSeabassPark">> <<set _witnessCount = _isNight ? 0 : 2>> <<elseif $lastLocation === "PatrolOutskirts">> <<set _witnessCount = _isNight ? 0 : 1>> <<else>> <<set _witnessCount = 1>> <</if>> <<set _witnessLevels = ["Few", "Moderate", "Many"]>> <<set $context = { nearbyOfficers: Math.floor(Math.random() * 4), backupTime: Math.floor(Math.random() * 5) + 1, activeCalls: ["None", "Minor", "Major"][Math.floor(Math.random() * 3)], witnesses: _witnessLevels[_witnessCount], backupCalled: false, backupArrived: false }>> <!-- Performance Tracking --> <<set $performance = { actions: [], forceUsed: [], appropriateness: 100, procedureScore: 100, outcomeScore: 0, warnings: [], traitTheftDetected: false, wentInAlone: false }>> <<set $crimeStage = 0>> <!-- Initialize weapon variable if crime has weapons --> <<if $crimeDesc && $crimeDesc.weapon && $crimeDesc.weapon.length > 0>> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <<else>> <<set _weapon = "weapon">> <</if>> <</if>> <div class="crime-scene"> <h1 class="crime-header">🚨 Crime in Progress: <<print $crimeType>></h1> <!-- Situation Description --> <div class="situation-box"> <<if $crimeStage === 0>> <!-- Initial Crime Description --> <<if $currentCrime === "PettyTheft">> <<set _item = $crimeDesc.items[Math.floor(Math.random() * $crimeDesc.items.length)]>> <p class="situation-text"> You spot a <<print $suspect.age.toLowerCase()>> person with a <<print $suspect.build.toLowerCase()>> build shoplifting from a <<print $crimeDesc.location>>. They're stuffing <<print _item>> into their jacket. They appear <<print $suspect.demeanor.toLowerCase()>>. </p> <<elseif $currentCrime === "Speeding">> <<set _speed = $crimeDesc.speed[Math.floor(Math.random() * $crimeDesc.speed.length)]>> <p class="situation-text"> A car just blew past you going <<print _speed>> the speed limit on <<print $crimeDesc.location>>. The driver appears <<print $suspect.demeanor.toLowerCase()>> and is weaving through traffic recklessly. </p> <<elseif $currentCrime === "ParkingViolation">> <<set _violation = $crimeDesc.violation[Math.floor(Math.random() * $crimeDesc.violation.length)]>> <p class="situation-text"> A vehicle is illegally parked in a <<print _violation>> in <<print $crimeDesc.location>>. The driver is nowhere to be seen, blocking emergency access. </p> <<elseif $currentCrime === "MinorTraitTheft">> <<set _trait = $crimeDesc.traits[Math.floor(Math.random() * $crimeDesc.traits.length)]>> <p class="situation-text"> You witness a <<print $suspect.age.toLowerCase()>> person with a <<print $suspect.build.toLowerCase()>> build performing an illegal trait extraction on an unwilling victim in an <<print $crimeDesc.location>>. The victim looks dazed and confused. The perpetrator appears <<print $suspect.demeanor.toLowerCase()>>. </p> <<elseif $currentCrime === "Assault">> <<set _severity = $crimeDesc.severity[Math.floor(Math.random() * $crimeDesc.severity.length)]>> <p class="situation-text"> A <<print $suspect.build.toLowerCase()>> attacker is <<print _severity>> someone on the <<print $crimeDesc.location>>. The victim is already on the ground bleeding. The attacker appears <<print $suspect.demeanor.toLowerCase()>>. </p> <<elseif $currentCrime === "AssaultWithWeapon">> <<if !_weapon && $crimeDesc.weapon && $crimeDesc.weapon.length > 0>> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <</if>> <p class="situation-text"> Someone is threatening another person with a <<print _weapon>> in an <<print $crimeDesc.location>>. The situation is tense and could turn deadly at any moment. The attacker is a <<print $suspect.age.toLowerCase()>> person with a <<print $suspect.build.toLowerCase()>> build, appearing <<print $suspect.demeanor.toLowerCase()>>. The victim is backed against a wall, terrified for their life. </p> <<elseif $currentCrime === "MajorTraitTheft">> <<set _victims = $crimeDesc.victims[Math.floor(Math.random() * $crimeDesc.victims.length)]>> <p class="situation-text"> A powerful trait thief has cornered <<print _victims>> in an <<print $crimeDesc.location>>. They're systematically extracting major traits from each person, leaving them as hollow shells. This is organized and professional. The thief appears <<print $suspect.demeanor.toLowerCase()>> and <<print $suspect.build.toLowerCase()>>. Their victims are barely conscious. </p> <<elseif $currentCrime === "MajorHeist">> <<set _target = $crimeDesc.target[Math.floor(Math.random() * $crimeDesc.target.length)]>> <<set _weapons = $crimeDesc.weapons[Math.floor(Math.random() * $crimeDesc.weapons.length)]>> <p class="situation-text"> <<print $suspectCount>> armed criminals are robbing a <<print _target>>! Multiple masked perpetrators with <<print _weapons>> are inside, taking hostages. This is a full-scale heist operation with professional criminals. You can see at least <<print $suspectCount>> suspects moving around inside. </p> <p style="color: #ffd43b; font-weight: bold; margin-top: 10px;"> ⚠️ THIS IS A MAJOR INCIDENT - BACKUP STRONGLY RECOMMENDED </p> <<elseif $currentCrime === "GangViolence">> <<set _gangs = $crimeDesc.gangs[Math.floor(Math.random() * $crimeDesc.gangs.length)]>> <p class="situation-text"> <<print _gangs>> are engaged in a full-scale shootout at a <<print $crimeDesc.location>>! You can count at least <<print $suspectCount>> armed gang members firing weapons. Bullets are flying, bystanders are caught in the crossfire, and the situation is spiraling out of control. This is urban warfare. </p> <p style="color: #ff0000; font-weight: bold; margin-top: 10px; font-size: 18px;"> 🚨 EXTREMELY DANGEROUS - MULTIPLE ARMED SUSPECTS - DO NOT ENGAGE ALONE </p> <</if>> <<elseif $suspect.currentState === "complying">> <<if $suspectCount > 1>> <p class="situation-text">Some suspects are cooperating, but the situation is still volatile.</p> <<else>> <p class="situation-text">The suspect is cooperating with your commands.</p> <</if>> <<elseif $suspect.currentState === "fleeing">> <<if $suspectCount > 1>> <p class="situation-text">The suspects are scattering and trying to escape!</p> <<else>> <p class="situation-text">The suspect is trying to run away!</p> <</if>> <<elseif $suspect.currentState === "resisting">> <<if $suspectCount > 1>> <p class="situation-text">The suspects are resisting aggressively! You're outnumbered!</p> <<else>> <p class="situation-text">The suspect is resisting and becoming aggressive!</p> <</if>> <<elseif $suspect.currentState === "attacking">> <<if $suspectCount > 1>> <p class="situation-text" style="color: #ff0000;">Multiple suspects are attacking you! You're in serious danger!</p> <<else>> <p class="situation-text">The suspect has become violent and is attacking you!</p> <</if>> <<elseif $suspect.currentState === "subdued">> <<if $suspectCount > 1>> <p class="situation-text">The suspects have been subdued and are no longer a threat.</p> <<else>> <p class="situation-text">The suspect has been subdued and is no longer a threat.</p> <</if>> <<elseif $suspect.currentState === "escaped">> <<if $suspectCount > 1>> <p class="situation-text">The suspects have escaped!</p> <<else>> <p class="situation-text">The suspect has escaped!</p> <</if>> <<elseif $suspect.currentState === "officer_down">> <p class="situation-text" style="color: #ff0000; font-size: 20px; font-weight: bold;"> 🚨 OFFICER DOWN 🚨<br> You've been overpowered! Backup is rushing to your location! </p> <</if>> </div> <!-- Visible Traits --> <<if $suspect.traits.visible.length > 0>> <div class="traits-visible"> <h3 class="traits-header">👁️ Visible Characteristics</h3> <div class="trait-list"> <<for _trait range $suspect.traits.visible>> <span class="trait-tag trait-visible"><<print _trait>></span> <</for>> </div> </div> <</if>> <!-- Context Information --> <div class="context-box"> <h3 class="context-header">📊 Situation Context</h3> <div class="context-grid"> <<if $suspectCount > 1>> <div><strong class="stat-label" style="color: #ff0000;">Suspects:</strong> <<print $suspectCount>></div> <</if>> <div><strong class="stat-label stat-officers">Officers Nearby:</strong> <<print $context.nearbyOfficers>></div> <div><strong class="stat-label stat-backup">Backup ETA:</strong> <<if $context.backupCalled>><<print $context.backupTime>> min<<else>>Not Called<</if>></div> <div><strong class="stat-label stat-calls">Active Priority Calls:</strong> <<print $context.activeCalls>></div> <div><strong class="stat-label stat-witnesses">Witnesses:</strong> <<print $context.witnesses>></div> </div> </div> <<if $suspect.currentState === "subdued" && !$suspect.apprehended>> <!-- Post-Apprehension Options --> <div class="apprehension-box"> <h2 class="section-header">🔒 Suspect<<if $suspectCount > 1>>s<</if>> Apprehended</h2> <p class="info-text">The suspect<<if $suspectCount > 1>>s are<<else>> is<</if>> in custody. What do you want to do?</p> <div class="action-grid"> <<if !$suspect.scanned && $suspectCount === 1>> <!-- Scan for Traits (only for single suspects) --> <div class="action-card action-scan"> <h3 class="action-title">🔍 Scan Suspect</h3> <p class="action-desc">Use your trait scanner to identify all traits.</p> <<link "<div class='action-button button-scan'>Scan Traits</div>">> <<set $suspect.scanned = true>> <<goto "CrimeScene">> <</link>> </div> <</if>> <!-- Process Arrest --> <div class="action-card action-process"> <h3 class="action-title">📋 Process Arrest</h3> <p class="action-desc">Complete the arrest by the book.</p> <<link "<div class='action-button button-process'>Process Arrest</div>">> <<set $suspect.apprehended = true>> <<set $performance.outcomeScore = 100>> <<run $performance.actions.push("Processed arrest properly")>> <<goto "CrimeResolution">> <</link>> </div> </div> </div> <<if $suspect.scanned && $suspectCount === 1>> <!-- Display All Traits After Scan --> <div class="traits-scanned"> <h3 class="traits-header">🔍 Trait Scan Results</h3> <<if $suspect.traits.physical.length > 0>> <div class="trait-category"> <h4>Physical Traits:</h4> <div class="trait-list"> <<for _trait range $suspect.traits.physical>> <<set _value = setup.getTraitValue('physical', _trait)>> <span class="trait-tag trait-physical" title="Value: <<print _value>>"> <<print _trait>> <span class="trait-value">(<<print _value>>)</span> </span> <</for>> </div> </div> <</if>> <<if $suspect.traits.mental.length > 0>> <div class="trait-category"> <h4>Mental Traits:</h4> <div class="trait-list"> <<for _trait range $suspect.traits.mental>> <<set _value = setup.getTraitValue('mental', _trait)>> <span class="trait-tag trait-mental" title="Value: <<print _value>>"> <<print _trait>> <span class="trait-value">(<<print _value>>)</span> </span> <</for>> </div> </div> <</if>> <<if $suspect.traits.skills.length > 0>> <div class="trait-category"> <h4>Skills:</h4> <div class="trait-list"> <<for _trait range $suspect.traits.skills>> <<set _value = setup.getTraitValue('skill', _trait)>> <span class="trait-tag trait-skill" title="Value: <<print _value>>"> <<print _trait>> <span class="trait-value">(<<print _value>>)</span> </span> <</for>> </div> </div> <</if>> <<if !$suspect.traitTheftAttempted>> <<if !$traitStolenThisShift>> <div class="theft-warning"> <h4 class="warning-title">⚠️ Trait Theft Warning</h4> <p class="warning-text"> You can attempt to steal ONE trait from this suspect. However, this is illegal and you risk: </p> <ul class="warning-list"> <li>Being caught by witnesses (<<print $context.witnesses>> witnesses present)</li> <li>Being reported by nearby officers (<<print $context.nearbyOfficers>> nearby)</li> <li>Immediate termination if caught</li> <li>Criminal charges if you have multiple stolen traits</li> </ul> <<link "<div class='action-button button-theft' style='background: #8b0000; border-color: #ff0000;'>Attempt Trait Theft</div>">> <<goto "OfficerCrimeAttempt">> <</link>> </div> <<else>> <div style="background: #000; padding: 15px; border-radius: 8px; margin-top: 20px; border: 3px solid #666;"> <h4 style="color: #888; margin: 0 0 10px 0;">🚫 Trait Theft Unavailable</h4> <p style="color: #aaa; margin: 0; text-align: center;"> You've already stolen a trait this shift. Attempting another theft would be far too risky. </p> </div> <</if>> <</if>> </div> <</if>> <<elseif $suspect.currentState === "officer_down">> <!-- Officer Down - Auto-resolve --> <div class="failure-box"> <h2 class="failure-header" style="color: #ff0000;">🚨 CRITICAL FAILURE 🚨</h2> <p class="failure-text"> You were completely overpowered. <<if $suspectCount > 1>>The <<print $suspectCount>> suspects<<else>>The suspect<</if>> escaped while you were incapacitated. Backup arrived moments later and rushed you to the hospital. </p> <p class="warning-text" style="color: #ff6b6b; font-size: 16px; margin-top: 15px;"> This incident will be heavily reviewed. Going into a Tier <<print $crimeTier>> situation alone was extremely reckless. </p> </div> <<set $performance.outcomeScore = 0>> <<set $performance.appropriateness = 0>> <<set $performance.procedureScore = 0>> <<run $performance.warnings.push("Officer incapacitated - extreme negligence")>> <<run $performance.warnings.push("Engaged Tier " + $crimeTier + " threat without backup")>> <<run $performance.warnings.push("All suspects escaped")>> <<link "<div class='action-button button-return'>Continue to Hospital</div>">> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <<goto "CrimeResolution">> <</link>> <<elseif $suspect.currentState !== "subdued" && $suspect.currentState !== "escaped">> <!-- ========== CRIME-SPECIFIC ACTIONS ========== --> <!-- SPEEDING - Chase or Citation --> <<if $currentCrime === "Speeding">> <h2 class="section-header">How do you pursue?</h2> <div class="action-grid"> <div class="action-card action-verbal"> <h3 class="action-title">🚨 Initiate Pursuit</h3> <p class="action-desc">Turn on lights and sirens, chase the vehicle.</p> <p class="force-level">May pull over or flee</p> <<link "<div class='action-button button-verbal'>Start Pursuit</div>">> <<set $chosenAction = "Initiate Pursuit">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-calm"> <h3 class="action-title">📋 Issue Citation by Plate</h3> <p class="action-desc">Let them go, mail ticket based on license plate.</p> <p class="force-level">No pursuit risk</p> <<link "<div class='action-button button-calm'>Issue Citation</div>">> <<set $suspect.currentState = "subdued">> <<set $suspect.apprehended = true>> <<set $performance.outcomeScore = 80>> <<run $performance.actions.push("Issued speeding citation without pursuit")>> <<goto "CrimeResolution">> <</link>> </div> <div class="action-card action-aggressive"> <h3 class="action-title">🚗 Aggressive Pursuit</h3> <p class="action-desc">High-speed chase with PIT maneuver if needed.</p> <p class="force-level" style="color: #ff6b6b;">Extreme force - property damage risk</p> <<link "<div class='action-button button-aggressive'>Aggressive Chase</div>">> <<set $chosenAction = "Aggressive Pursuit">> <<set $forceLevel = 4>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- PARKING VIOLATION - Ticket or Tow --> <<elseif $currentCrime === "ParkingViolation">> <h2 class="section-header">How do you handle this?</h2> <div class="action-grid"> <div class="action-card action-verbal"> <h3 class="action-title">🎫 Issue Parking Ticket</h3> <p class="action-desc">Write a ticket and place it on the windshield.</p> <p class="force-level">Standard procedure</p> <<link "<div class='action-button button-verbal'>Issue Ticket</div>">> <<set $chosenAction = "Issue Ticket">> <<set $forceLevel = 0>> <<set $suspect.currentState = "subdued">> <<set $suspect.apprehended = true>> <<set $performance.outcomeScore = 100>> <<run $performance.actions.push("Issued parking ticket properly")>> <<goto "CrimeResolution">> <</link>> </div> <div class="action-card action-backup"> <h3 class="action-title">🚗 Call Tow Truck</h3> <p class="action-desc">Have the vehicle towed away.</p> <p class="force-level">Enforcement action</p> <<link "<div class='action-button button-backup'>Call Tow</div>">> <<set $chosenAction = "Call Tow Truck">> <<set $forceLevel = 0>> <<set $suspect.currentState = "subdued">> <<set $suspect.apprehended = true>> <<set $performance.outcomeScore = 100>> <<run $performance.actions.push("Had vehicle towed")>> <<goto "CrimeResolution">> <</link>> </div> <div class="action-card action-physical"> <h3 class="action-title">🔨 Break Window & Inspect</h3> <p class="action-desc">Break window to check for emergency/medical situation.</p> <p class="force-level">Property damage - extreme measure</p> <<link "<div class='action-button button-physical'>Break Window</div>">> <<set $chosenAction = "Break Window">> <<set $forceLevel = 3>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- PETTY THEFT - Confront or Detain --> <<elseif $currentCrime === "PettyTheft">> <h2 class="section-header">How do you respond?</h2> <div class="action-grid"> <div class="action-card action-verbal"> <h3 class="action-title">📢 Verbal Command</h3> <p class="action-desc">Shout "Stop! Police!" and order them to freeze.</p> <p class="force-level">May comply or flee</p> <<link "<div class='action-button button-verbal'>Use Command</div>">> <<set $chosenAction = "Verbal Warning">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-calm"> <h3 class="action-title">🤝 Calm Approach</h3> <p class="action-desc">Walk up calmly and speak with the suspect.</p> <p class="force-level">De-escalation</p> <<link "<div class='action-button button-calm'>Approach Calmly</div>">> <<set $chosenAction = "Calm Approach">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-physical"> <h3 class="action-title">✋ Detain Immediately</h3> <p class="action-desc">Physically restrain the shoplifter.</p> <p class="force-level">Direct action</p> <<link "<div class='action-button button-physical'>Detain Now</div>">> <<set $chosenAction = "Physical Intervention">> <<set $forceLevel = 2>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-aggressive"> <h3 class="action-title">💢 Tackle Suspect</h3> <p class="action-desc">Aggressively tackle them to the ground.</p> <p class="force-level">Heavy force - may cause injury</p> <<link "<div class='action-button button-aggressive'>Tackle</div>">> <<set $chosenAction = "Aggressive Takedown">> <<set $forceLevel = 4>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- ASSAULT - Intervene or Separate --> <<elseif $currentCrime === "Assault">> <h2 class="section-header">How do you intervene?</h2> <div class="action-grid"> <div class="action-card action-verbal"> <h3 class="action-title">📢 Shout Commands</h3> <p class="action-desc">Yell "Police! Stop!" to interrupt the attack.</p> <p class="force-level">May stop or escalate</p> <<link "<div class='action-button button-verbal'>Shout Commands</div>">> <<set $chosenAction = "Verbal Warning">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-physical"> <h3 class="action-title">✋ Physically Separate</h3> <p class="action-desc">Pull the attacker off the victim.</p> <p class="force-level">Appropriate force</p> <<link "<div class='action-button button-physical'>Separate Them</div>">> <<set $chosenAction = "Physical Intervention">> <<set $forceLevel = 2>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-aggressive"> <h3 class="action-title">💢 Tackle Attacker</h3> <p class="action-desc">Aggressively take down the assailant.</p> <p class="force-level">Heavy force</p> <<link "<div class='action-button button-aggressive'>Tackle</div>">> <<set $chosenAction = "Aggressive Takedown">> <<set $forceLevel = 4>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-weapon"> <h3 class="action-title">⚡ Use Taser</h3> <p class="action-desc">Deploy taser to immediately stop the assault.</p> <p class="force-level" style="color: #ff6b6b;">Extreme - less lethal weapon</p> <<link "<div class='action-button button-weapon'>Deploy Taser</div>">> <<set $chosenAction = "Use Taser">> <<set $forceLevel = 3>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-backup"> <h3 class="action-title">📻 Call for Backup First</h3> <p class="action-desc">Request assistance before engaging.</p> <p class="force-level">Cautious approach</p> <<link "<div class='action-button button-backup'>Call Backup</div>">> <<set $chosenAction = "Call for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- MINOR TRAIT THEFT - Interrupt Extraction --> <<elseif $currentCrime === "MinorTraitTheft">> <h2 class="section-header">How do you stop the trait theft?</h2> <div class="action-grid"> <div class="action-card action-verbal"> <h3 class="action-title">📢 Interrupt Verbally</h3> <p class="action-desc">Shout to break their concentration.</p> <p class="force-level">May stop or flee</p> <<link "<div class='action-button button-verbal'>Shout</div>">> <<set $chosenAction = "Verbal Warning">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-physical"> <h3 class="action-title">✋ Physical Disruption</h3> <p class="action-desc">Physically interrupt the trait extraction.</p> <p class="force-level">Stop the process</p> <<link "<div class='action-button button-physical'>Disrupt Extraction</div>">> <<set $chosenAction = "Physical Intervention">> <<set $forceLevel = 2>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-calm"> <h3 class="action-title">🤝 Negotiate</h3> <p class="action-desc">Try to talk them down from the theft.</p> <p class="force-level">De-escalation</p> <<link "<div class='action-button button-calm'>Negotiate</div>">> <<set $chosenAction = "Calm Approach">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-aggressive"> <h3 class="action-title">💢 Aggressive Tackle</h3> <p class="action-desc">Immediately tackle them to stop the extraction.</p> <p class="force-level">Heavy force - may injure victim too</p> <<link "<div class='action-button button-aggressive'>Tackle Hard</div>">> <<set $chosenAction = "Aggressive Takedown">> <<set $forceLevel = 4>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- ASSAULT WITH WEAPON - Dangerous Situation --> <<elseif $currentCrime === "AssaultWithWeapon">> <h2 class="section-header">How do you handle the armed suspect?</h2> <<if $context.backupCalled && !$context.backupArrived>> <div style="background: rgba(52, 152, 219, 0.3); padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center; font-weight: bold;"> 📻 Backup en route - ETA <<print $context.backupTime>> minutes </p> </div> <</if>> <div class="action-grid"> <div class="action-card action-weapon"> <h3 class="action-title">🔫 Draw Weapon</h3> <p class="action-desc">Draw your firearm and order them to drop the weapon.</p> <p class="force-level">Appropriate for armed threat</p> <<link "<div class='action-button button-weapon'>Draw Weapon</div>">> <<set $chosenAction = "Draw Weapon">> <<set $forceLevel = 5>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-backup"> <h3 class="action-title">📻 Call for Backup</h3> <p class="action-desc">Request immediate assistance.</p> <p class="force-level" style="background: #000; border: 2px solid #ffd43b; color: #ffd43b; padding: 5px 10px; border-radius: 4px; font-weight: bold; display: inline-block;">⚠️ STRONGLY ADVISED</p> <<link "<div class='action-button button-backup'>Call Backup</div>">> <<set $chosenAction = "Call for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <<if $context.backupCalled && !$context.backupArrived>> <div class="action-card" style="border-color: #3498db; border-width: 3px;"> <h3 class="action-title">⏳ Wait for Backup</h3> <p class="action-desc">Hold position until backup arrives.</p> <p class="force-level"><<print $context.backupTime>> min remaining</p> <<link "<div class='action-button' style='background: #3498db;'>Wait</div>">> <<set $chosenAction = "Wait for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <</if>> <div class="action-card action-verbal"> <h3 class="action-title">📢 Verbal De-escalation</h3> <p class="action-desc">Try to talk them down without drawing weapon.</p> <p class="force-level">Risky but non-violent</p> <<link "<div class='action-button button-verbal'>Talk Down</div>">> <<set $chosenAction = "Calm Approach">> <<set $forceLevel = 1>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card" style="border-color: #ff0000; border-width: 3px;"> <h3 class="action-title">🔫 Shoot to Neutralize</h3> <p class="action-desc">Fire immediately if they don't drop weapon.</p> <p class="force-level" style="color: #ff0000;">LETHAL FORCE - extreme measure</p> <<link "<div class='action-button' style='background: #8b0000;'>Shoot if Threatened</div>">> <<set $chosenAction = "Shoot to Neutralize">> <<set $forceLevel = 6>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- MAJOR TRAIT THEFT - Serious Crime --> <<elseif $currentCrime === "MajorTraitTheft">> <h2 class="section-header">How do you stop the major trait theft?</h2> <<if $context.backupCalled && !$context.backupArrived>> <div style="background: rgba(52, 152, 219, 0.3); padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center; font-weight: bold;"> 📻 Backup en route - ETA <<print $context.backupTime>> minutes </p> </div> <</if>> <div class="action-grid"> <div class="action-card action-weapon"> <h3 class="action-title">🔫 Draw Weapon</h3> <p class="action-desc">This is a dangerous criminal - use lethal force option.</p> <p class="force-level">Appropriate force</p> <<link "<div class='action-button button-weapon'>Draw Weapon</div>">> <<set $chosenAction = "Draw Weapon">> <<set $forceLevel = 5>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card action-backup"> <h3 class="action-title">📻 Call for Backup</h3> <p class="action-desc">This requires multiple officers.</p> <p class="force-level" style="background: #000; border: 2px solid #ffd43b; color: #ffd43b; padding: 5px 10px; border-radius: 4px; font-weight: bold; display: inline-block;">⚠️ STRONGLY ADVISED</p> <<link "<div class='action-button button-backup'>Call Backup</div>">> <<set $chosenAction = "Call for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <<if $context.backupCalled && !$context.backupArrived>> <div class="action-card" style="border-color: #3498db; border-width: 3px;"> <h3 class="action-title">⏳ Wait for Backup</h3> <p class="action-desc">Hold position, monitor the situation.</p> <p class="force-level"><<print $context.backupTime>> min remaining</p> <<link "<div class='action-button' style='background: #3498db;'>Wait</div>">> <<set $chosenAction = "Wait for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <</if>> <div class="action-card action-physical"> <h3 class="action-title">✋ Interrupt Physically</h3> <p class="action-desc">Rush in and disrupt the trait extraction.</p> <p class="force-level" style="color: #ff6b6b;">Risky without backup!</p> <<link "<div class='action-button button-physical'>Interrupt</div>">> <<set $chosenAction = "Physical Intervention">> <<set $forceLevel = 2>> <<goto "CrimeResponse">> <</link>> </div> <div class="action-card" style="border-color: #ff0000; border-width: 3px;"> <h3 class="action-title">🔫 Lethal Force Authorized</h3> <p class="action-desc">Shoot on sight to save victims - extreme measure.</p> <p class="force-level" style="color: #ff0000;">LETHAL - victims at risk</p> <<link "<div class='action-button' style='background: #8b0000;'>Engage Lethal</div>">> <<set $chosenAction = "Lethal Force">> <<set $forceLevel = 6>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- MAJOR HEIST - Multiple Armed Suspects --> <<elseif $currentCrime === "MajorHeist">> <h2 class="section-header">How do you respond to the heist?</h2> <<if $context.backupCalled && !$context.backupArrived>> <div style="background: rgba(52, 152, 219, 0.3); padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center; font-weight: bold;"> 📻 Backup en route - ETA <<print $context.backupTime>> minutes </p> </div> <</if>> <div class="action-grid"> <div class="action-card action-backup" style="border-color: #ffd43b; border-width: 3px;"> <h3 class="action-title">📻 Call for Backup</h3> <p class="action-desc">This is a MAJOR INCIDENT - you need backup NOW.</p> <p class="force-level" style="color: #ff0000; font-weight: bold;">🚨 CRITICAL - DO NOT ENGAGE ALONE</p> <<link "<div class='action-button button-backup'>Call Backup</div>">> <<set $chosenAction = "Call for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <<if $context.backupCalled && !$context.backupArrived>> <div class="action-card" style="border-color: #3498db; border-width: 3px;"> <h3 class="action-title">⏳ Wait for Backup</h3> <p class="action-desc">Monitor situation, establish perimeter.</p> <p class="force-level"><<print $context.backupTime>> min remaining</p> <<link "<div class='action-button' style='background: #3498db;'>Wait</div>">> <<set $chosenAction = "Wait for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <</if>> <div class="action-card action-weapon" style="opacity: 0.7;"> <h3 class="action-title">🔫 Engage Alone</h3> <p class="action-desc">Draw weapon and confront multiple armed suspects.</p> <p class="force-level" style="color: #ff0000;">⚠️ EXTREMELY DANGEROUS</p> <<link "<div class='action-button button-weapon'>Engage</div>">> <<set $chosenAction = "Draw Weapon">> <<set $forceLevel = 5>> <<goto "CrimeResponse">> <</link>> </div> </div> <!-- GANG VIOLENCE - Active Shootout --> <<elseif $currentCrime === "GangViolence">> <h2 class="section-header">How do you respond to the shootout?</h2> <<if $context.backupCalled && !$context.backupArrived>> <div style="background: rgba(52, 152, 219, 0.3); padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center; font-weight: bold;"> 📻 Backup en route - ETA <<print $context.backupTime>> minutes </p> </div> <</if>> <div class="action-grid"> <div class="action-card action-backup" style="border-color: #ff0000; border-width: 4px;"> <h3 class="action-title">📻 Call for Backup</h3> <p class="action-desc">Request ALL available units - this is urban warfare.</p> <p class="force-level" style="color: #ff0000; font-weight: bold;">🚨 MANDATORY - OFFICER SAFETY</p> <<link "<div class='action-button button-backup'>Call All Units</div>">> <<set $chosenAction = "Call for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <<if $context.backupCalled && !$context.backupArrived>> <div class="action-card" style="border-color: #3498db; border-width: 3px;"> <h3 class="action-title">⏳ Take Cover & Wait</h3> <p class="action-desc">Find cover, protect civilians, wait for tactical response.</p> <p class="force-level"><<print $context.backupTime>> min remaining</p> <<link "<div class='action-button' style='background: #3498db;'>Take Cover</div>">> <<set $chosenAction = "Wait for Backup">> <<set $forceLevel = 0>> <<goto "CrimeResponse">> <</link>> </div> <</if>> <div class="action-card action-weapon" style="opacity: 0.5;"> <h3 class="action-title">🔫 Engage Armed Suspects</h3> <p class="action-desc">Draw weapon and engage <<print $suspectCount>> armed gang members alone.</p> <p class="force-level" style="color: #ff0000;">⚠️ EXTREMELY DANGEROUS - HIGH RISK OF DEATH</p> <<link "<div class='action-button button-weapon' style='background: #4d0000;'>Engage Alone</div>">> <<set $chosenAction = "Draw Weapon">> <<set $forceLevel = 5>> <<goto "CrimeResponse">> <</link>> </div> </div> <</if>> <<else>> <!-- Crime is over - Go to resolution --> <<goto "CrimeResolution">> <</if>> </div> <!-- Closes crime-scene --> <</nobr>>
<<nobr>> <<set $crimeStage += 1>> <!-- Record Action --> <<run $performance.actions.push($chosenAction)>> <<run $performance.forceUsed.push($forceLevel)>> <!-- Get player trait modifier --> <<set _modifier = setup.getPlayerActionModifier($chosenAction, $suspect)>> <!-- Determine Suspect Response based on action and their characteristics --> <<set _reaction = "">> <<set _escalation = 0>> <<if $chosenAction === "Verbal Warning">> <!-- Only works for low-tier crimes --> <<if $crimeTier >= 3>> <<set $suspect.currentState = "attacking">> <<set _reaction = "Your shouted warning is met with immediate violence! ">> <<if $suspect.hasWeapon>> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <<set _reaction += "The suspect turns on you with their " + _weapon + "! This situation just became life-threatening!">> <<else>> <<set _reaction += "The suspect charges at you aggressively!">> <</if>> <<set $performance.appropriateness -= 40>> <<run $performance.warnings.push("Verbal warning ineffective for Tier 3+ threat - endangered officer safety")>> <<else>> <<set _baseChance = 50 + _modifier>> <<if $suspect.demeanor === "Nervous and sweaty" || $suspect.demeanor === "Scared">> <<set _baseChance += 20>> <<elseif $suspect.demeanor === "Cool and calm">> <<set _baseChance -= 10>> <<elseif $suspect.demeanor === "Aggressive">> <<set _baseChance -= 30>> <</if>> <<set _compliance = Math.random() * 100>> <<if _compliance < _baseChance>> <<set $suspect.currentState = "complying">> <<set _reaction = "The suspect freezes at your command and raises their hands in surrender.">> <<elseif _compliance < _baseChance + 25>> <<set $suspect.currentState = "fleeing">> <<set $suspect.threatLevel = Math.min($suspect.threatLevel + 1, 5)>> <<set _reaction = "Startled by your shout, the suspect bolts and tries to run!">> <<else>> <<set $suspect.currentState = "resisting">> <<set $suspect.threatLevel = Math.min($suspect.threatLevel + 2, 5)>> <<set _reaction = "The suspect turns aggressive and refuses to comply!">> <</if>> <</if>> <<elseif $chosenAction === "Calm Approach">> <!-- Completely inappropriate for violent crimes --> <<if $crimeTier >= 3>> <<if $currentCrime === "AssaultWithWeapon">> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <<set _reaction = "You try to calmly approach someone wielding a " + _weapon + "?! They immediately turn the weapon on you! Your calm demeanor means nothing when someone has a deadly weapon!">> <<set $suspect.currentState = "attacking">> <<set $performance.appropriateness -= 50>> <<run $performance.warnings.push("CRITICAL ERROR: Used calm approach on armed suspect - extreme danger")>> <<elseif $currentCrime === "MajorTraitTheft">> <<set _reaction = "You try to approach calmly, but this is a professional criminal caught red-handed. They see you as an obstacle and immediately attack with trait-draining magic!">> <<set $suspect.currentState = "attacking">> <<set $performance.appropriateness -= 45>> <<run $performance.warnings.push("Inappropriate de-escalation attempt on dangerous magic user")>> <</if>> <<elseif $currentCrime === "Assault">> <<set _reaction = "You try to calmly intervene, but this person is already in a violent rage. They turn their aggression toward you!">> <<set $suspect.currentState = "attacking">> <<set $performance.appropriateness -= 30>> <<run $performance.warnings.push("Poor judgment - calm approach during active assault")>> <<else>> <<set _baseChance = 60 + _modifier>> <<if $suspect.demeanor === "Cool and calm" || $suspect.demeanor === "Nervous and sweaty">> <<set _baseChance += 15>> <<elseif $suspect.demeanor === "Aggressive">> <<set _baseChance -= 25>> <</if>> <<set _compliance = Math.random() * 100>> <<if _compliance < _baseChance>> <<set $suspect.currentState = "complying">> <<set _reaction = "The suspect seems relieved by your calm demeanor and cooperates.">> <<else>> <<set $suspect.currentState = "fleeing">> <<set $suspect.threatLevel = Math.min($suspect.threatLevel + 1, 5)>> <<set _reaction = "The suspect takes advantage of your calm approach and suddenly runs!">> <</if>> <</if>> <<elseif $chosenAction === "Physical Intervention">> <<if $suspectCount > 1>> <!-- Multiple suspects - very dangerous --> <<set _reaction = "You try to physically restrain one suspect, but there are " + $suspectCount + " of them! ">> <<if $context.backupArrived>> <<set _reaction += "Fortunately, backup helps you control the situation.">> <<set $suspect.currentState = "subdued">> <<else>> <<set _reaction += "You're immediately swarmed and overwhelmed! This was a terrible decision!">> <<set $suspect.currentState = "officer_down">> <<set $performance.appropriateness = 0>> <<run $performance.warnings.push("CRITICAL FAILURE: Attempted to physically engage multiple suspects alone")>> <</if>> <<elseif $crimeTier === 3 && $suspect.hasWeapon>> <!-- Tier 3 with weapon - extremely dangerous --> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <<set _success = Math.random() * 100>> <<if _success < 30 + _modifier>> <<set _reaction = "You manage to disarm the suspect and wrestle them to the ground before they can use the " + _weapon + "! That was incredibly risky but it worked.">> <<set $suspect.currentState = "subdued">> <<run $performance.warnings.push("Extremely risky disarm - could have been fatal")>> <<else>> <<set _reaction = "You move in to restrain them, but they swing the " + _weapon + " at you! You're forced to back off - this suspect is too dangerous to engage without a weapon drawn!">> <<set $suspect.currentState = "attacking">> <<set $performance.appropriateness -= 35>> <<run $performance.warnings.push("Failed to neutralize armed suspect - poor tactical decision")>> <</if>> <<else>> <<set _baseChance = 70 + _modifier>> <<if $suspect.build === "Scrawny">> <<set _baseChance += 20>> <<elseif $suspect.build === "Large" || $suspect.build === "Athletic">> <<set _baseChance -= 15>> <</if>> <<if $suspect.traits.physical.includes("Muscular") || $suspect.traits.physical.includes("Strong")>> <<set _baseChance -= 20>> <</if>> <<if $suspect.traits.skills.includes("Combat") || $suspect.traits.skills.includes("Martial Arts")>> <<set _baseChance -= 25>> <</if>> <<set _success = Math.random() * 100>> <<if _success < _baseChance>> <<set $suspect.currentState = "subdued">> <<set _reaction = "You successfully restrain the suspect. They struggle briefly but you maintain control.">> <<else>> <<set $suspect.currentState = "resisting">> <<set $suspect.threatLevel = Math.min($suspect.threatLevel + 2, 5)>> <<set _reaction = "The suspect fights back! They're stronger than you expected!">> <<if $crimeTier >= 3>> <<set _reaction += " This could get dangerous!">> <</if>> <</if>> <</if>> <<elseif $chosenAction === "Aggressive Takedown">> <<if $suspectCount > 1>> <<set _reaction = "You aggressively tackle one of the " + $suspectCount + " suspects, but the others immediately attack you! ">> <<if $context.backupArrived>> <<set _reaction += "Backup rushes in to help control the situation.">> <<set $suspect.currentState = "subdued">> <<else>> <<set _reaction += "You're overwhelmed by the group!">> <<set $suspect.currentState = "officer_down">> <<set $performance.appropriateness = 0>> <<run $performance.warnings.push("Reckless aggression against multiple suspects without backup")>> <</if>> <<else>> <<set $suspect.currentState = "subdued">> <<if $suspect.threatLevel <= 2>> <<set $performance.appropriateness -= 30>> <<run $performance.warnings.push("Excessive force for threat level")>> <<set _reaction = "You slam the suspect to the ground hard. They're subdued but witnesses look concerned at your aggression.">> <<else>> <<set _reaction = "You tackle the suspect hard. Given the threat level, the force was justified.">> <</if>> <</if>> <<elseif $chosenAction === "Use Taser">> <<if $suspectCount > 1>> <<set _reaction = "You deploy your taser on one suspect, but there are " + $suspectCount + " of them! The others attack while you're focused on the one!">> <<if $context.backupArrived>> <<set _reaction += " Backup secures the others.">> <<set $suspect.currentState = "subdued">> <<else>> <<set _reaction += " You're overwhelmed!">> <<set $suspect.currentState = "officer_down">> <<set $performance.appropriateness = 0>> <</if>> <<elseif $crimeTier <= 2>> <<set _success = Math.random() * 100>> <<if _success < 85>> <<set $suspect.currentState = "subdued">> <<set _reaction = "The taser strikes true! The suspect collapses, incapacitated. They're quickly restrained.">> <<set $performance.appropriateness -= 15>> <<run $performance.warnings.push("Taser use on low-threat suspect - may be excessive")>> <<else>> <<set $suspect.currentState = "fleeing">> <<set _reaction = "One of the taser probes misses! The suspect runs while you're reloading!">> <</if>> <<else>> <<set _success = Math.random() * 100>> <<if _success < 80>> <<set $suspect.currentState = "subdued">> <<set _reaction = "The taser deployment is successful! The suspect goes down. Appropriate less-lethal force for the threat level.">> <<else>> <<set $suspect.currentState = "attacking">> <<set _reaction = "The taser fails to connect properly! The suspect charges at you!">> <</if>> <</if>> <<elseif $chosenAction === "Draw Weapon">> <<if $currentCrime === "MajorHeist" || $currentCrime === "GangViolence">> <!-- Tier 4 - multiple armed suspects --> <<if !$context.backupCalled && !$context.backupArrived>> <<set _reaction = "You draw your weapon on " + $suspectCount + " armed criminals! They immediately open fire! You're completely outgunned and outnumbered!">> <<set $suspect.currentState = "officer_down">> <<set $performance.appropriateness = 0>> <<set $performance.procedureScore = 0>> <<run $performance.warnings.push("FATAL ERROR: Engaged multiple armed suspects alone")>> <<run $performance.warnings.push("Did not call for backup on Tier 4 incident")>> <<elseif $context.backupArrived>> <<set _reaction = "You and your backup draw weapons. Faced with multiple officers, the suspects surrender. This was handled correctly.">> <<set $suspect.currentState = "subdued">> <<run $performance.actions.push("Coordinated armed response with backup")>> <<else>> <<set _reaction = "You draw your weapon and order them to surrender. They're hesitating... you desperately need backup to arrive!">> <<set $suspect.currentState = "complying">> <<run $performance.warnings.push("Drew weapon on multiple suspects before backup arrived - extreme risk")>> <</if>> <<elseif $crimeTier >= 3>> <!-- Tier 3 - appropriate force --> <<set $suspect.currentState = "subdued">> <<if $suspect.hasWeapon>> <<set _weapon = $crimeDesc.weapon[Math.floor(Math.random() * $crimeDesc.weapon.length)]>> <<set _reaction = "You draw your weapon on the suspect who's armed with a " + _weapon + ". They immediately drop their weapon and surrender. This was the appropriate level of force.">> <<run $performance.actions.push("Appropriate force - armed suspect disarmed")>> <<else>> <<set _reaction = "You draw your weapon. The suspect immediately surrenders. Given the high threat level, this may be defensible.">> <<set $performance.appropriateness -= 15>> <<run $performance.warnings.push("Weapon drawn on unarmed Tier 3 suspect - review required")>> <</if>> <<else>> <!-- Tier 1-2 - excessive force --> <<set $suspect.currentState = "subdued">> <<set $performance.appropriateness -= 50>> <<run $performance.warnings.push("Drew weapon for non-life-threatening situation")>> <<run $performance.warnings.push("Excessive force - potential brutality complaint")>> <<set _reaction = "You draw your weapon on the suspect. They immediately surrender, terrified. Witnesses are filming this on their phones - this will not look good.">> <</if>> <<elseif $chosenAction === "Shoot to Neutralize" || $chosenAction === "Lethal Force">> <<if $crimeTier >= 3 && $suspect.hasWeapon>> <<set $suspect.currentState = "subdued">> <<set _reaction = "You fire and neutralize the armed threat. Given the imminent danger, this use of lethal force will likely be ruled justified.">> <<run $performance.actions.push("Lethal force used on armed suspect")>> <<set $performance.appropriateness -= 10>> <<elseif $currentCrime === "MajorHeist" || $currentCrime === "GangViolence">> <<if !$context.backupArrived>> <<set _reaction = "You open fire on multiple armed suspects alone! This becomes a firefight - you're outgunned!">> <<set $suspect.currentState = "officer_down">> <<set $performance.appropriateness = 0>> <<run $performance.warnings.push("Engaged in firefight with multiple suspects alone - fatal error")>> <<else>> <<set $suspect.currentState = "subdued">> <<set _reaction = "With backup support, lethal force is used to neutralize the armed threats. Multiple officers fire. The suspects are neutralized.">> <<run $performance.actions.push("Coordinated lethal force response")>> <</if>> <<else>> <<set $suspect.currentState = "subdued">> <<set $performance.appropriateness -= 70>> <<run $performance.warnings.push("CRITICAL: Lethal force used without imminent deadly threat")>> <<run $performance.warnings.push("Unjustified shooting - criminal charges likely")>> <<set _reaction = "You fire on the suspect! They go down. This was NOT a justified use of lethal force - you will face serious consequences!">> <</if>> <<elseif $chosenAction === "Call for Backup">> <<set $context.backupCalled = true>> <<if $context.activeCalls === "Major">> <<set $performance.procedureScore -= 20>> <<run $performance.warnings.push("Called for backup during major active incident elsewhere")>> <<set $context.backupTime += 3>> <<set _reaction = "You radio for backup, but dispatch informs you there's a major incident elsewhere. Your backup will be delayed - ETA now " + $context.backupTime + " minutes.">> <<else>> <<set _reaction = "You call for backup. Dispatch confirms - officers en route, ETA " + $context.backupTime + " minutes.">> <<run $performance.actions.push("Called for backup appropriately")>> <</if>> <<if $requiresBackup>> <<set _reaction += " This was the correct call for a Tier " + $crimeTier + " situation.">> <<set $performance.procedureScore += 20>> <</if>> <!-- Check if suspect escapes while waiting --> <<if $crimeTier <= 2>> <<set _escape = Math.random() * 100>> <<set _escapeChance = 40 - ($context.nearbyOfficers * 10)>> <<if _escape < _escapeChance>> <<set $suspect.currentState = "escaped">> <<set $performance.outcomeScore = 0>> <<run $performance.warnings.push("Suspect escaped while waiting for backup")>> <<set _reaction += " However, while you wait, the suspect notices you on the radio and bolts before you can react!">> <<else>> <<set _reaction += " The suspect doesn't notice or doesn't run.">> <</if>> <</if>> <<elseif $chosenAction === "Wait for Backup">> <<set $context.backupTime -= 1>> <<if $context.backupTime <= 0>> <<set $context.backupArrived = true>> <<set _reaction = "Backup arrives! ">> <<if $currentCrime === "MajorHeist" || $currentCrime === "GangViolence">> <<set _reaction += "With " + Math.floor(Math.random() * 4 + 4) + " additional officers, you coordinate a tactical response. The suspects are surrounded and surrender after a tense standoff. Excellent patience and procedure.">> <<set $suspect.currentState = "subdued">> <<set $performance.procedureScore += 30>> <<set $performance.outcomeScore = 100>> <<run $performance.actions.push("Waited for backup on Tier 4 - textbook response")>> <<elseif $crimeTier === 3>> <<set _reaction += "With additional officers, the arrest is made safely. Good call waiting for support.">> <<set $suspect.currentState = "subdued">> <<set $performance.procedureScore += 15>> <<set $performance.outcomeScore = 80>> <</if>> <<else>> <<set _reaction = "You maintain your position and wait. The suspect is still active. Backup arrives in " + $context.backupTime + " minute">> <<if $context.backupTime > 1>><<set _reaction += "s">><</if>> <<set _reaction += ".">> <!-- Check if situation escalates while waiting --> <<if Math.random() < 0.3 && $crimeTier >= 3>> <<if $currentCrime === "AssaultWithWeapon">> <<set _reaction += " The armed suspect is getting more agitated!">> <<set $suspect.threatLevel = Math.min($suspect.threatLevel + 1, 5)>> <<elseif $currentCrime === "MajorTraitTheft">> <<set _reaction += " The trait thief is draining more victims while you wait!">> <<set $performance.outcomeScore -= 10>> <</if>> <</if>> <</if>> <<elseif $chosenAction === "Initiate Pursuit" || $chosenAction === "Aggressive Pursuit">> <<if $chosenAction === "Aggressive Pursuit">> <<set _chaseSuccess = Math.random() * 100>> <<if _chaseSuccess < 60>> <<set $suspect.currentState = "subdued">> <<set _reaction = "You engage in a high-speed pursuit and execute a PIT maneuver. The vehicle spins out and crashes. The driver is apprehended but there's significant property damage.">> <<set $performance.appropriateness -= 25>> <<run $performance.warnings.push("Excessive force - high-speed pursuit with PIT maneuver for speeding violation")>> <<else>> <<set $suspect.currentState = "escaped">> <<set _reaction = "You pursue aggressively but the driver is reckless. After a dangerous chase, they escape down a side street you can't follow. The pursuit caused multiple traffic incidents.">> <<set $performance.appropriateness -= 40>> <<set $performance.outcomeScore = 0>> <<run $performance.warnings.push("Reckless pursuit resulted in escape and public danger")>> <</if>> <<else>> <<set _pullOver = Math.random() * 100>> <<if _pullOver < 70>> <<set $suspect.currentState = "subdued">> <<set _reaction = "You initiate pursuit with lights and sirens. The driver pulls over after a brief chase. Good, controlled pursuit.">> <<set $performance.outcomeScore = 90>> <<else>> <<set $suspect.currentState = "fleeing">> <<set _reaction = "You turn on your lights and sirens, but the driver accelerates! This is turning into a pursuit!">> <</if>> <</if>> <<elseif $chosenAction === "Break Window">> <<set $suspect.currentState = "subdued">> <<set _reaction = "You break the vehicle's window to check for emergencies. There's no one inside and no emergency. This was completely unnecessary property damage.">> <<set $performance.appropriateness -= 60>> <<run $performance.warnings.push("Destroyed property without justification")>> <<run $performance.warnings.push("Excessive response to parking violation")>> <<set $performance.outcomeScore = 20>> <</if>> <!-- Track if officer went in alone on dangerous situation --> <<if ($crimeTier >= 3 || $suspectCount > 1) && !$context.backupCalled && $chosenAction !== "Call for Backup" && $chosenAction !== "Wait for Backup">> <<set $performance.wentInAlone = true>> <<set $performance.procedureScore -= 30>> <<run $performance.warnings.push("Engaged Tier " + $crimeTier + " threat without calling for backup first")>> <</if>> <!-- Evaluate Force Appropriateness --> <<if $forceLevel > 0>> <<set _forceDifference = $forceLevel - $suspect.threatLevel>> <<if _forceDifference > 2>> <<set $performance.appropriateness -= 25>> <<run $performance.warnings.push("Force used significantly exceeded threat level")>> <<elseif _forceDifference > 0>> <<set $performance.appropriateness -= 10>> <</if>> <</if>> <!-- Display Response --> <div class="crime-scene"> <h1 class="crime-header">⚡ Action Result</h1> <div class="response-box"> <h3 class="response-action">You used: <<print $chosenAction>></h3> <p class="response-text"><<print _reaction>></p> </div> <<if $suspect.currentState !== "subdued" && $suspect.currentState !== "escaped" && $suspect.currentState !== "officer_down">> <div class="alert-box"> <p class="alert-text">⚠️ The situation is still active! Choose your next action.</p> </div> <</if>> <<link "<div class='action-button button-continue'>Continue</div>">> <<goto "CrimeScene">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "JanitorWorkComplete">> <!-- Achievement for working hourly job --> <<run setup.achievements.unlock("hourly_job")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Janitor")>> <<run $jobsWorked.push("Janitor")>> <</if>> <!-- ===== SKILL TREE: Get hourly pay bonus ===== --> <<set _hourlyPayBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _hourlyPayBonus = setup.skillTree.getEffect("hourlyPayBonus") || 0>> <</if>> <!-- Calculate skill tree bonus on janitor pay --> <<set _basePay = $janitorPayEarned || 96>> <<set _skillTreeBonus = 0>> <<if _hourlyPayBonus > 0>> <<set _skillTreeBonus = Math.floor(_basePay * (_hourlyPayBonus / 100))>> <</if>> <!-- Add skill tree bonus to total (if not already added during work start) --> <<if _skillTreeBonus > 0 && !$janitorSkillTreeBonusApplied>> <<set $money += _skillTreeBonus>> <<set $janitorSkillTreeBonusApplied = true>> <</if>> <<set _totalPay = _basePay + _skillTreeBonus>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #2ecc71; text-align: center;">✅ Shift Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71;"> <p style="color: white; font-size: 18px; text-align: center; margin: 0;"> You've completed your 8-hour janitorial shift! </p> </div> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #34495e;"> <h3 style="color: #2ecc71; margin-top: 0;">💰 Payment Received</h3> <p style="color: #ecf0f1; font-size: 16px;"> You spent 8 hours mopping floors, cleaning bathrooms, emptying trash, and keeping the station spotless. The work was tiring but honest, and you've earned your pay. </p> <div style="background: #34495e; padding: 15px; border-radius: 8px; margin: 15px 0;"> <p style="color: #95a5a6; margin: 5px 0;"><strong>Base Pay:</strong> $96 (8 hours × $12/hour)</p> <<if $janitorPenalties && $janitorPenalties.length > 0>> <div style="border-top: 1px solid #7f8c8d; margin: 10px 0; padding-top: 10px;"> <p style="color: #e74c3c; font-weight: bold; margin: 5px 0;">Penalties Applied:</p> <<for _penalty range $janitorPenalties>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _penalty</p> <</for>> </div> <</if>> <<if $janitorBonuses && $janitorBonuses.length > 0>> <div style="border-top: 1px solid #7f8c8d; margin: 10px 0; padding-top: 10px;"> <p style="color: #2ecc71; font-weight: bold; margin: 5px 0;">Bonuses Applied:</p> <<for _bonus range $janitorBonuses>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _bonus</p> <</for>> </div> <</if>> <!-- ===== SKILL TREE: Display bonus ===== --> <<if _skillTreeBonus > 0>> <div style="border-top: 1px solid #9C27B0; margin: 10px 0; padding-top: 10px;"> <p style="color: #CE93D8; font-weight: bold; margin: 5px 0;">⭐ Skill Tree Bonus:</p> <p style="color: #CE93D8; margin: 3px 0; font-size: 14px;">• Hourly Pay Bonus (+<<print _hourlyPayBonus>>%): +$<<print _skillTreeBonus>></p> </div> <</if>> </div> <p style="color: #2ecc71; font-size: 20px; font-weight: bold; text-align: center; margin: 20px 0;"> +$<<print _totalPay>> </p> <p style="color: #95a5a6; text-align: center;"> Current Balance: $<<print $money>> </p> </div> <!-- Reset the bonus applied flag for next shift --> <<set $janitorSkillTreeBonusApplied = false>> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; transition: all 0.3s;' onmouseover='this.style.background=\"#2980b9\"' onmouseout='this.style.background=\"#3498db\"'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PoliceReceptionistTalk">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">💼 Talking to <<print $talkingToReceptionist.name>></h1> <div style="padding: 20px; background: linear-gradient(135deg, #e83e8c 0%, #d63384 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0;"> <<print $talkingToReceptionist.name>> looks up from the reception desk with a professional smile. </p> </div> <!-- Check if janitor job is available --> <<set _janitorAvailable = true>> <<if $jobs && $jobs.includes("Police Station Janitor")>> <<set _janitorAvailable = false>> <</if>> <<if _janitorAvailable>> <<set _janitorNPCs = setup.getNPCsByJob("Police Station Janitor")>> <<if _janitorNPCs && _janitorNPCs.length > 0>> <<set _janitorAvailable = false>> <</if>> <</if>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Ask About Jobs --> <div style="border: 3px solid #ffd43b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd43b; margin-top: 0;">💼 Ask About Jobs</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Inquire about job openings at the station.</p> <<link "<div style='background: #ffd43b; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"Are you hiring?\"</div>">> <<goto "PoliceReceptionistJobs">> <</link>> </div> <!-- Leave --> <div style="border: 3px solid #4169e1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4169e1; margin-top: 0;">🚪 Leave</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Return to the police department lobby.</p> <<link "<div style='background: #4169e1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Say Goodbye</div>">> <<goto "PoliceDepartment">> <</link>> </div> </div> <div id="receptionistMessage"></div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PoliceReceptionistJobs">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">💼 Job Opportunities</h1> <!-- Check if janitor job is available --> <<set _janitorAvailable = true>> <<if $jobs && $jobs.includes("Police Station Janitor")>> <<set _janitorAvailable = false>> <<set _alreadyHasJob = true>> <<else>> <<set _alreadyHasJob = false>> <</if>> <<if _janitorAvailable>> <<set _janitorNPCs = setup.getNPCsByJob("Police Station Janitor")>> <<if _janitorNPCs && _janitorNPCs.length > 0>> <<set _janitorAvailable = false>> <<set _janitorTaken = _janitorNPCs[0]>> <</if>> <</if>> <<if _alreadyHasJob>> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #95a5a6;"> <p style="color: #ecf0f1; font-size: 16px; margin: 0;"> <<print $talkingToReceptionist.name>>: "You already work here as a janitor! You don't need to apply again." </p> </div> <<elseif !_janitorAvailable && _janitorTaken>> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: #ecf0f1; font-size: 16px; margin: 0;"> <<print $talkingToReceptionist.name>>: "Sorry, we're not hiring at the moment. <<print _janitorTaken.name>> is currently handling all our janitorial needs." </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71;"> <p style="color: white; font-size: 16px; margin: 0;"> <<print $talkingToReceptionist.name>>: "Actually, yes! We're looking for a janitor. The pay is $12 per hour, and you can work one 4-hour shift per day. It's honest work keeping the station clean. Interested?" </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Accept Job --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin-top: 0;">✅ Accept Job</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Take the janitorial position.</p> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I'll take it!\"</div>">> <<set $jobs = ["Police Station Janitor"]>> <<goto "PoliceReceptionistJobAccepted">> <</link>> </div> <!-- Decline Job --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin-top: 0;">❌ Decline</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Politely decline the offer.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"Not right now\"</div>">> <<goto "PoliceReceptionistTalk">> <</link>> </div> </div> <</if>> <<if _alreadyHasJob || (!_janitorAvailable && _janitorTaken)>> <<link "<div style='background: #4169e1; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 20px; transition: all 0.3s;' onmouseover='this.style.background=\"#2c5aa0\"' onmouseout='this.style.background=\"#4169e1\"'>Return</div>">> <<goto "PoliceReceptionistTalk">> <</link>> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "PoliceReceptionistJobAccepted">> <!-- Achievement for getting hired --> <<run setup.achievements.unlock("get_hired")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #2ecc71; text-align: center;">🎉 Job Accepted!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71;"> <p style="color: white; font-size: 18px; text-align: center; margin: 0;"> Congratulations! You're now a Police Station Janitor! </p> </div> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #34495e;"> <p style="color: #ecf0f1; font-size: 16px; margin: 0;"> <<print $talkingToReceptionist.name>>: "Great! Welcome aboard. You can access the break room now and start working whenever you're ready. Just head there and you'll find the janitorial closet. Good luck!" </p> </div> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; transition: all 0.3s;' onmouseover='this.style.background=\"#2980b9\"' onmouseout='this.style.background=\"#3498db\"'>Return to Lobby</div>">> <<goto "PoliceDepartment">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Jail">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Jail")>> <<run $visitedLocations.push("Jail")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #888; text-align: center; margin: 15px 0;">⚖️ County Jail</h1> <<if !$jailSystem>> <<set $jailSystem = { inJail: false, daysToServe: 0, daysServed: 0, canPayFine: false, fineAmount: 0, previousJob: "", fromPoliceCorruption: false }>> <</if>> <<if !$crimeSystem.crimesCommitted>> <<set $crimeSystem.crimesCommitted = 0>> <</if>> <<if !$crimeSystem.consecutiveEscapes>> <<set $crimeSystem.consecutiveEscapes = 0>> <</if>> <!-- Check if coming from police corruption --> <<if $performance && $performance.traitTheftDetected>> <<set $jailSystem.fromPoliceCorruption = true>> <<set $jailSystem.daysToServe = Math.max($stolenTraitsOnDuty.length, 1) * 2>> <<set $jailSystem.fineAmount = 0>> <<set $jailSystem.canPayFine = false>> <<set $jailSystem.previousJob = "Unemployed">> <<else>> <<set $jailSystem.fromPoliceCorruption = false>> <</if>> <!-- Calculate jail time based on crimes committed (crime system) --> <<if !$jailSystem.fromPoliceCorruption && $jailSystem.daysToServe === 0 && $crimeSystem.crimesCommitted > 0>> <<set $jailSystem.daysToServe = $crimeSystem.crimesCommitted>> <<set $jailSystem.fineAmount = $crimeSystem.crimesCommitted * 250>> <<set $jailSystem.canPayFine = true>> <</if>> <!-- If not serving time, show intro --> <<if !$jailSystem.inJail>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #666;"> <p style="color: #ccc; margin: 0; font-size: 15px;"> A cold, gray building with thick concrete walls and barred windows. The bars are solid and there's no way out except to serve your time or pay the fine. </p> </div> <!-- POLICE CORRUPTION PATH --> <<if $jailSystem.fromPoliceCorruption>> <div style="background: linear-gradient(135deg, #8b0000 0%, #dc3545 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ff0000;"> <h3 style="color: #fff; margin: 0 0 15px 0; text-align: center;">🚔 CORRUPT OFFICER - SERVING TIME</h3> <div style="background: rgba(0,0,0,0.3); padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"><b>Traits Stolen While On Duty:</b> $stolenTraitsOnDuty.length</p> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"><b>Required Jail Time:</b> $jailSystem.daysToServe days</p> <p style="color: #ff6b6b; margin: 0; font-size: 14px; font-style: italic;">No fine option available for corrupt officers</p> </div> <p style="color: #fff; margin: 0; font-size: 14px; text-align: center; font-style: italic;"> You must serve your full sentence for abusing your position of authority. </p> </div> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: #666; color: #fff; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>⏳ Begin Serving Time</div>">> <<set $jailSystem.inJail = true>> <<set $jailSystem.daysServed = 0>> <<set $crimeSystem.consecutiveEscapes = 0>> <<goto "Jail">> <</link>> </div> <!-- CRIMINAL PATH --> <<elseif $jobs && $jobs.includes("Criminal")>> <div style="background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ff0000;"> <h3 style="color: #fff; margin: 0 0 15px 0; text-align: center;">🔴 CRIMINAL STATUS</h3> <div style="background: rgba(0,0,0,0.3); padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"><b>Crimes Committed:</b> $crimeSystem.crimesCommitted</p> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"><b>Required Jail Time:</b> $jailSystem.daysToServe days</p> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"><b>Alternative Fine:</b> $<<print $jailSystem.fineAmount>></p> <<if $jailSystem.previousJob && $jailSystem.previousJob !== "Unemployed">> <p style="color: #ffd43b; margin: 0; font-size: 15px;"><b>Previous Job:</b> $jailSystem.previousJob (will be restored)</p> <</if>> </div> <p style="color: #fff; margin: 0; font-size: 14px; text-align: center; font-style: italic;"> You cannot trade away the Criminal job until you serve your time or pay the fine. </p> </div> <!-- Serve Time or Pay Fine Options --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <<link "<div style='background: #666; color: #fff; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>⏳ Serve Jail Time</div>">> <<set $jailSystem.inJail = true>> <<set $jailSystem.daysServed = 0>> <<set $crimeSystem.consecutiveEscapes = 0>> <<goto "Jail">> <</link>> <<if $money >= $jailSystem.fineAmount>> <<link "<div style='background: #f39c12; color: #fff; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>💰 Pay Fine</div>">> <<set $money -= $jailSystem.fineAmount>> <<if $jailSystem.previousJob && $jailSystem.previousJob !== "">> <<set $jobs = [$jailSystem.previousJob]>> <<else>> <<set $jobs = ["Unemployed"]>> <</if>> <<set $jailSystem.daysToServe = 0>> <<set $crimeSystem.crimesCommitted = 0>> <<set $crimeSystem.consecutiveEscapes = 0>> <<goto "PayFineResult">> <</link>> <<else>> <div style='background: #3a3a3a; color: #666; padding: 15px; border-radius: 8px; text-align: center; opacity: 0.5; font-weight: bold;'>💰 Pay Fine ($<<print $jailSystem.fineAmount>>)<br><span style="font-size: 13px;">Not enough money</span></div> <</if>> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #666;"> <p style="color: #ccc; text-align: center; margin: 0; font-size: 15px; font-style: italic;"> You're not currently incarcerated. This facility is only accessible to those serving time. </p> </div> <</if>> <</if>> <!-- If currently serving time --> <<if $jailSystem.inJail>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">⏳ SERVING TIME</h3> <div style="background: rgba(0,0,0,0.3); padding: 15px; border-radius: 8px;"> <p style="color: #ccc; margin: 0 0 10px 0; font-size: 15px;"><b>Days Served:</b> $jailSystem.daysServed / $jailSystem.daysToServe</p> <p style="color: #ccc; margin: 0; font-size: 15px;"><b>Days Remaining:</b> <<print $jailSystem.daysToServe - $jailSystem.daysServed>></p> <<if $jailSystem.fromPoliceCorruption>> <p style="color: #ff6b6b; margin: 10px 0 0 0; font-size: 14px; font-style: italic;">Serving time for corruption charges</p> <</if>> </div> </div> <div style="background: #1a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #888;"> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px; text-align: center; font-style: italic;"> You spend your days in a small cell. The monotonous routine and harsh conditions begin to change you... </p> <<if $jailSystem.daysServed < $jailSystem.daysToServe>> <<link "<div style='background: #667eea; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>⏭️ Serve Another Day</div>">> <<set $jailSystem.daysServed += 1>> <<set $day += 1>> <<set setup.processJailTraitChange()>> <<goto "Jail">> <</link>> <<else>> <div style="background: linear-gradient(135deg, #51cf66 0%, #2ecc71 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #51cf66;"> <h3 style="color: #fff; margin: 0 0 10px 0; text-align: center;">✅ TIME SERVED</h3> <p style="color: #fff; margin: 0; text-align: center; font-size: 15px;"> You've completed your sentence and are eligible for release! </p> </div> <<link "<div style='background: #51cf66; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🚪 Leave Jail</div>">> <<set $jailSystem.inJail = false>> <<set $jailSystem.daysToServe = 0>> <<set $jailSystem.daysServed = 0>> <!-- Police corruption path - already unemployed --> <<if $jailSystem.fromPoliceCorruption>> <<set $jobs = ["Unemployed"]>> <<set $stolenTraitsOnDuty = []>> <<set $jailSystem.fromPoliceCorruption = false>> <<unset $performance>> <!-- Criminal path - restore previous job --> <<else>> <<if $jailSystem.previousJob && $jailSystem.previousJob !== "">> <<set $jobs = [$jailSystem.previousJob]>> <<else>> <<set $jobs = ["Unemployed"]>> <</if>> <<set $crimeSystem.crimesCommitted = 0>> <</if>> <<goto "JailReleaseResult">> <</link>> <</if>> </div> <</if>> <<if !$jailSystem.inJail && (!$jobs || !$jobs.includes("Criminal")) && !$jailSystem.fromPoliceCorruption>> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold;'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ReceptionistWorkComplete">> <!-- ===== SKILL TREE: Get hourly pay bonus ===== --> <<set _hourlyPayBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _hourlyPayBonus = setup.skillTree.getEffect("hourlyPayBonus") || 0>> <</if>> <!-- Calculate skill tree bonus --> <<set _basePay = $receptionistPayEarned || 60>> <<set _skillTreeBonus = $receptionistSkillTreeBonus || 0>> <<set _totalPay = _basePay + _skillTreeBonus>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">✅ Shift Complete</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e83e8c 0%, #d63384 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; text-align: center; margin: 0;"> You've completed your 4-hour reception shift! </p> </div> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #34495e;"> <h3 style="color: #e83e8c; margin-top: 0;">💰 Payment Received</h3> <p style="color: #ecf0f1; font-size: 16px;"> You spent 4 hours answering phones, greeting visitors, filing paperwork, and keeping the front desk running smoothly. Your professional demeanor made a good impression. </p> <div style="background: #34495e; padding: 15px; border-radius: 8px; margin: 15px 0;"> <p style="color: #95a5a6; margin: 5px 0;"><strong>Base Pay:</strong> $60 (4 hours × $15/hour)</p> <<if $receptionistBonuses && $receptionistBonuses.length > 0>> <div style="border-top: 1px solid #2ecc71; margin: 10px 0; padding-top: 10px;"> <p style="color: #2ecc71; font-weight: bold; margin: 5px 0;">Performance Bonuses:</p> <<for _bonus range $receptionistBonuses>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _bonus</p> <</for>> </div> <</if>> <<if $receptionistPenalties && $receptionistPenalties.length > 0>> <div style="border-top: 1px solid #e74c3c; margin: 10px 0; padding-top: 10px;"> <p style="color: #e74c3c; font-weight: bold; margin: 5px 0;">Performance Penalties:</p> <<for _penalty range $receptionistPenalties>> <p style="color: #ecf0f1; margin: 3px 0; font-size: 14px;">• _penalty</p> <</for>> </div> <</if>> <!-- ===== SKILL TREE: Display bonus ===== --> <<if _skillTreeBonus > 0>> <div style="border-top: 1px solid #9C27B0; margin: 10px 0; padding-top: 10px;"> <p style="color: #CE93D8; font-weight: bold; margin: 5px 0;">⭐ Skill Tree Bonus:</p> <p style="color: #CE93D8; margin: 3px 0; font-size: 14px;">• Hourly Pay Bonus (+<<print _hourlyPayBonus>>%): +$<<print _skillTreeBonus>></p> </div> <</if>> </div> <p style="color: #e83e8c; font-size: 20px; font-weight: bold; text-align: center; margin: 20px 0;"> +$<<print _totalPay>> </p> <p style="color: #95a5a6; text-align: center;"> Current Balance: $<<print $money>> </p> </div> <!-- Co-worker relationship bonus (receptionists) --> <<set _coworkerBonuses = []>> <<set _coworkers = setup.getNPCsByJob("Receptionist")>> <<if _coworkers && _coworkers.length > 0>> <<for _i = 0; _i < _coworkers.length; _i++>> <<set _coworker = _coworkers[_i]>> <<set _coworkerName = _coworker.name>> <<if random(1, 100) <= 50>> <<set _relPoints = random(1, 5)>> <<run setup.meetNPC(_coworker)>> <<run setup.addRelationshipPoints(_coworkerName, _relPoints)>> <<run _coworkerBonuses.push({name: _coworkerName, points: _relPoints})>> <</if>> <</for>> <</if>> <<if _coworkerBonuses.length > 0>> <div style="padding: 20px; background: #2c3e50; border-radius: 15px; margin-bottom: 25px; border: 2px solid #667eea;"> <h3 style="color: #667eea; margin-top: 0;">👥 Co-Worker Bonding</h3> <p style="color: #aaa; font-size: 14px; margin-bottom: 15px;">Working alongside your colleagues has strengthened your relationships!</p> <<for _cwb range _coworkerBonuses>> <div style="background: #34495e; padding: 10px 15px; border-radius: 8px; margin-top: 8px; border: 2px solid #51cf66; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #fff;">💚 <<print _cwb.name>></span> <span style="color: #51cf66; font-weight: bold;">+<<print _cwb.points>> points</span> </div> <</for>> </div> <</if>> <<link "<div style='background: #3498db; color: white; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; transition: all 0.3s;' onmouseover='this.style.background=\"#2980b9\"' onmouseout='this.style.background=\"#3498db\"'>Return to Break Room</div>">> <<goto "PoliceBreakRoom">> <</link>> </div> <</nobr>>
<<nobr>> <<silently>> /* Crime System Initialization */ <<set setup.visiblePhysicalTraits = [ "Athletic Build", "Muscular", "Scarred", "Tattooed", "Tall", "Short", "Petite", "Broad-shouldered", "Lean", "Fit", "Strong", "Weak", "Overweight", "Underweight", "Curvy", "Voluptuous", "Attractive", "Ugly", "Plain", "Youthful", "Mature", "Freckled", "Pierced", "Dark Skin", "Pale Skin", "Tan Skin", "Long Hair", "Short Hair", "Fashionable", "Smooth Skin", "Blemished" ]>> <<set setup.detectableMentalTraits = [ "Nervous", "Aggressive", "Calm", "Arrogant", "Confident", "Shy", "Awkward", "Friendly", "Cold", "Rude", "Polite", "Talkative", "Quiet", "Energetic", "Lazy", "Brave", "Cowardly", "Humble", "Extroverted", "Introverted" ]>> <<set setup.detectableVoiceTraits = [ "Smooth Voice", "Raspy Voice", "Deep Voice", "High-Pitched Tone", "Stuttering Speech", "Mumbly Voice", "Monotone", "Fast Talker", "Slow Calm Voice", "Sharp Voice", "Friendly Tone", "Warm Tone", "Articulate Speech" ]>> <<set setup.dangerousTraits = [ "Muscular", "Scarred", "Tattooed", "Athletic Build", "Strong", "Aggressive", "Combat", "Martial Arts", "Brave", "Reckless", "Dominant", "Cold", "Cruel" ]>> <<set setup.criminalSkills = [ "Combat", "Stealth", "Lock Picking", "Athletics", "Persuasion", "Fast Talker" ]>> <<set setup.generateCriminalTraits = function(tier, age, build) { var traits = { physical: [], mental: [], voice: [], skills: [], visible: [], hidden: [] }; var numPhysical = Math.floor(Math.random() * 2) + tier; var numMental = Math.floor(Math.random() * 2) + tier; var numSkills = Math.floor(Math.random() * tier) + 1; var physicalPool = Object.keys(setup.traitBonuses).filter(function(trait) { return setup.visiblePhysicalTraits.includes(trait); }); if (tier >= 2) { for (var i = 0; i < tier - 1; i++) { if (Math.random() < 0.6) { var dangerousTrait = setup.dangerousTraits[Math.floor(Math.random() * setup.dangerousTraits.length)]; if (!traits.physical.includes(dangerousTrait)) { traits.physical.push(dangerousTrait); } } } } if (build === "Athletic" || build === "Large") { if (Math.random() < 0.7 && !traits.physical.includes("Muscular")) { traits.physical.push("Muscular"); } if (Math.random() < 0.5 && !traits.physical.includes("Strong")) { traits.physical.push("Strong"); } } while (traits.physical.length < numPhysical && physicalPool.length > 0) { var randomTrait = physicalPool[Math.floor(Math.random() * physicalPool.length)]; if (!traits.physical.includes(randomTrait)) { var conflict = setup.getConflictingTrait(randomTrait, traits.physical); if (!conflict) { traits.physical.push(randomTrait); } } physicalPool.splice(physicalPool.indexOf(randomTrait), 1); } var mentalPool = []; if (tier >= 3) { mentalPool = ["Aggressive", "Cold", "Cruel", "Reckless", "Arrogant"]; } else if (tier === 2) { mentalPool = ["Aggressive", "Confident", "Brave", "Sly"]; } else { mentalPool = ["Nervous", "Scared", "Impulsive", "Foolish"]; } for (var j = 0; j < numMental && j < mentalPool.length; j++) { var randomMental = mentalPool[Math.floor(Math.random() * mentalPool.length)]; if (!traits.mental.includes(randomMental)) { traits.mental.push(randomMental); } } if (Math.random() < 0.6) { var voicePool = setup.detectableVoiceTraits; traits.voice.push(voicePool[Math.floor(Math.random() * voicePool.length)]); } var skillPool = Object.keys(setup.skillBonuses); if (tier >= 2) { skillPool = setup.criminalSkills; } for (var k = 0; k < numSkills && k < skillPool.length; k++) { var randomSkill = skillPool[Math.floor(Math.random() * skillPool.length)]; if (!traits.skills.includes(randomSkill)) { traits.skills.push(randomSkill); } } traits.visible = traits.physical.concat(traits.voice.filter(function(t) { return setup.detectableVoiceTraits.includes(t); })).concat(traits.mental.filter(function(t) { return setup.detectableMentalTraits.includes(t); })); traits.hidden = traits.mental.filter(function(t) { return !traits.visible.includes(t); }).concat(traits.skills); return traits; }>> <<set setup.calculateSuspectStats = function(suspect) { var stats = { strength: 10, dexterity: 10, intelligence: 10, charisma: 10 }; var allTraits = (suspect.traits.physical || []) .concat(suspect.traits.mental || []) .concat(suspect.traits.voice || []) .concat(suspect.traits.skills || []); allTraits.forEach(function(trait) { var bonus = setup.traitBonuses[trait] || setup.skillBonuses[trait]; if (bonus) { for (var stat in bonus) { stats[stat] += bonus[stat]; } } }); return stats; }>> <<set setup.getPlayerActionModifier = function(action, suspect) { var v = State.variables; var modifier = 0; var playerTraits = (v.physicalTraits || []) .concat(v.mentalTraits || []) .concat(v.skills || []); var suspectStats = setup.calculateSuspectStats(suspect); var playerStats = { strength: Math.min(setup.getTotalStat('strength'), 100), dexterity: Math.min(setup.getTotalStat('dexterity'), 100), intelligence: Math.min(setup.getTotalStat('intelligence'), 100), charisma: Math.min(setup.getTotalStat('charisma'), 100) }; if (action === "Verbal Warning") { modifier += (playerStats.charisma - suspectStats.intelligence) * 2; if (playerTraits.includes("Confident")) { modifier += 20; } if (playerTraits.includes("Brave")) { modifier += 15; } if (playerTraits.includes("Diplomatic")) { modifier += 20; } if (playerTraits.includes("Public Speaking")) { modifier += 15; } if (playerTraits.includes("Articulate Speech")) { modifier += 10; } if (playerTraits.includes("Charismatic Voice")) { modifier += 15; } if (playerTraits.includes("Smooth Talker")) { modifier += 15; } if (playerTraits.includes("Shy")) { modifier -= 20; } if (playerTraits.includes("Awkward")) { modifier -= 15; } if (playerTraits.includes("Stuttering Speech")) { modifier -= 15; } if (playerTraits.includes("Mumbly Voice")) { modifier -= 10; } if (playerTraits.includes("Cowardly")) { modifier -= 25; } if (playerTraits.includes("Insecure")) { modifier -= 15; } } else if (action === "Calm Approach") { modifier += (playerStats.charisma - suspectStats.charisma) * 2; modifier += (playerStats.intelligence - suspectStats.intelligence); if (playerTraits.includes("Calm")) { modifier += 25; } if (playerTraits.includes("Empathetic")) { modifier += 20; } if (playerTraits.includes("Diplomatic")) { modifier += 25; } if (playerTraits.includes("Patient")) { modifier += 15; } if (playerTraits.includes("Friendly")) { modifier += 15; } if (playerTraits.includes("Kind")) { modifier += 15; } if (playerTraits.includes("Warm")) { modifier += 10; } if (playerTraits.includes("Reassuring")) { modifier += 15; } if (playerTraits.includes("Soothing Tone")) { modifier += 10; } if (playerTraits.includes("Gentle Voice")) { modifier += 10; } if (playerTraits.includes("Aggressive")) { modifier -= 25; } if (playerTraits.includes("Short Tempered")) { modifier -= 20; } if (playerTraits.includes("Impatient")) { modifier -= 15; } if (playerTraits.includes("Cold")) { modifier -= 20; } if (playerTraits.includes("Rude")) { modifier -= 20; } if (playerTraits.includes("Blunt")) { modifier -= 10; } } else if (action === "Physical Intervention" || action === "Aggressive Takedown") { modifier += (playerStats.strength + playerStats.dexterity - suspectStats.strength - suspectStats.dexterity); if (playerTraits.includes("Combat")) { modifier += 30; } if (playerTraits.includes("Martial Arts")) { modifier += 35; } if (playerTraits.includes("Athletic Build")) { modifier += 20; } if (playerTraits.includes("Muscular")) { modifier += 20; } if (playerTraits.includes("Strong")) { modifier += 20; } if (playerTraits.includes("Quick Reflexes")) { modifier += 20; } if (playerTraits.includes("Fit")) { modifier += 15; } if (playerTraits.includes("Brave")) { modifier += 15; } if (playerTraits.includes("Aggressive")) { modifier += 15; } if (playerTraits.includes("Dominant")) { modifier += 10; } if (playerTraits.includes("Athletics")) { modifier += 20; } if (playerTraits.includes("Fast")) { modifier += 15; } if (playerTraits.includes("Quick")) { modifier += 15; } if (playerTraits.includes("Weak")) { modifier -= 30; } if (playerTraits.includes("Clumsy")) { modifier -= 25; } if (playerTraits.includes("Slow")) { modifier -= 20; } if (playerTraits.includes("Cowardly")) { modifier -= 30; } if (playerTraits.includes("Overweight")) { modifier -= 20; } if (playerTraits.includes("Underweight")) { modifier -= 15; } if (playerTraits.includes("Stiff")) { modifier -= 20; } if (playerTraits.includes("Lazy")) { modifier -= 15; } if (playerTraits.includes("Submissive")) { modifier -= 15; } if (playerTraits.includes("Passive")) { modifier -= 10; } } else if (action === "Draw Weapon") { modifier += (playerStats.dexterity + playerStats.charisma - suspectStats.intelligence); if (playerTraits.includes("Quick Reflexes")) { modifier += 20; } if (playerTraits.includes("Brave")) { modifier += 20; } if (playerTraits.includes("Confident")) { modifier += 15; } if (playerTraits.includes("Calm")) { modifier += 15; } if (playerTraits.includes("Steadfast")) { modifier += 10; } if (playerTraits.includes("Disciplined")) { modifier += 15; } if (playerTraits.includes("Clumsy")) { modifier -= 25; } if (playerTraits.includes("Cowardly")) { modifier -= 30; } if (playerTraits.includes("Nervous")) { modifier -= 20; } if (playerTraits.includes("Shaky Voice")) { modifier -= 15; } if (playerTraits.includes("Insecure")) { modifier -= 15; } } else if (action === "Call for Backup") { modifier += (playerStats.intelligence - suspectStats.intelligence); if (playerTraits.includes("Wise")) { modifier += 20; } if (playerTraits.includes("Logical")) { modifier += 15; } if (playerTraits.includes("Analytical")) { modifier += 15; } if (playerTraits.includes("Cautious")) { modifier += 15; } if (playerTraits.includes("Humble")) { modifier += 10; } if (playerTraits.includes("Patient")) { modifier += 10; } if (playerTraits.includes("Arrogant")) { modifier -= 20; } if (playerTraits.includes("Reckless")) { modifier -= 25; } if (playerTraits.includes("Overconfident")) { modifier -= 15; } if (playerTraits.includes("Stubborn")) { modifier -= 15; } if (playerTraits.includes("Competitive")) { modifier -= 10; } } return modifier; }>> <<set setup.attemptTraitTheft = function(traitName, suspect, isPhysical, previewOnly) { var v = State.variables; var traitValue = setup.getTraitValue('mental', traitName) || setup.getTraitValue('skill', traitName) || setup.getTraitValue('physical', traitName); var detectionChance = isPhysical ? 50 : 30; if (traitValue > 100) { detectionChance += 30; } else if (traitValue > 50) { detectionChance += 20; } else if (traitValue > 25) { detectionChance += 10; } if (isPhysical) { detectionChance += 25; } if (v.context && v.context.witnesses === "Many") { detectionChance += 20; } else if (v.context && v.context.witnesses === "Moderate") { detectionChance += 15; } else if (v.context && v.context.witnesses === "Few") { detectionChance += 10; } if (v.context && v.context.nearbyOfficers > 0) { detectionChance += v.context.nearbyOfficers * 20; } var sheriffNearby = false; if (v.context && v.context.nearbyOfficers > 0) { sheriffNearby = Math.random() * 100 < (v.context.nearbyOfficers * 20); } if (sheriffNearby) { detectionChance = 100; } var playerTraits = (v.physicalTraits || []).concat(v.mentalTraits || []).concat(v.skills || []); if (playerTraits.includes("Stealth")) { detectionChance -= 20; } if (playerTraits.includes("Sly")) { detectionChance -= 15; } if (playerTraits.includes("Sneaky")) { detectionChance -= 15; } if (playerTraits.includes("Deceitful")) { detectionChance -= 10; } if (playerTraits.includes("Quick")) { detectionChance -= 10; } if (playerTraits.includes("Quick Reflexes")) { detectionChance -= 15; } if (playerTraits.includes("Clumsy")) { detectionChance += 20; } if (playerTraits.includes("Awkward")) { detectionChance += 15; } if (playerTraits.includes("Nervous")) { detectionChance += 15; } if (playerTraits.includes("Honest")) { detectionChance += 25; } if (playerTraits.includes("Shy")) { detectionChance += 10; } var playerDex = Math.min(setup.getTotalStat('dexterity'), 100); var dexBonus = playerDex * 0.25; detectionChance -= dexBonus; if (setup.skillTree && setup.skillTree.getEffect) { var skillTreeOnDutyBonus = setup.skillTree.getEffect("onDutyStealBonus"); if (skillTreeOnDutyBonus > 0) { detectionChance -= skillTreeOnDutyBonus; } } if (v.currentArtifact === "The Slippery Scales") { detectionChance -= 40; } if (detectionChance > 90) { detectionChance = 90; } if (detectionChance < 10) { detectionChance = 10; } if (!v.stolenTraits) { v.stolenTraits = []; } if (previewOnly) { return { success: false, detectionChance: detectionChance, traitValue: traitValue, sheriffNearby: false }; } var caught = Math.random() * 100 < detectionChance; return { success: !caught, detectionChance: detectionChance, traitValue: traitValue, sheriffNearby: sheriffNearby }; }>> <</silently>> <</nobr>>
<<nobr>> <!-- Safety check - redirect if no crime data --> <<if !$suspect || !$performance || !$crimeInProgress>> <<if $lastLocation && $lastLocation.indexOf("Patrol") === 0>> <<goto $lastLocation>> <<else>> <<goto "PatrolDowntown">> <</if>> <</if>> <div class="crime-scene"> <!-- Crime Resolved - Show Results --> <<if !$performance.outcomeScore || $performance.outcomeScore === 0>> <<set $performance.outcomeScore = $suspect.currentState === "subdued" && $suspect.apprehended ? 100 : 0>> <</if>> <!-- Special handling for officer down --> <<if $suspect.currentState === "officer_down">> <<set $performance.outcomeScore = 0>> <<set $performance.appropriateness = 0>> <<set $performance.procedureScore = 0>> <</if>> <!-- Calculate Final Score --> <<set $finalScore = Math.round( ($performance.appropriateness * 0.4) + ($performance.procedureScore * 0.3) + ($performance.outcomeScore * 0.3) )>> <<if $performance.traitTheftDetected>> <<set $finalScore = 0>> <</if>> <h1 class="crime-header">📊 Performance Review: <<print $crimeType>></h1> <div class="performance-box"> <h3 class="score-header">Final Score: <span style="color: <<if $finalScore >= 70>>#51cf66<<elseif $finalScore >= 50>>#ffd43b<<else>>#ff6b6b<</if>>;"><<print $finalScore>>/100</span></h3> <div class="score-breakdown"> <div class="score-item"> <strong>Force Appropriateness:</strong> <span style="color: <<if $performance.appropriateness >= 70>>#51cf66<<elseif $performance.appropriateness >= 50>>#ffd43b<<else>>#ff6b6b<</if>>;"><<print Math.round($performance.appropriateness)>>/100</span> </div> <div class="score-item"> <strong>Procedure:</strong> <span style="color: <<if $performance.procedureScore >= 70>>#51cf66<<elseif $performance.procedureScore >= 50>>#ffd43b<<else>>#ff6b6b<</if>>;"><<print Math.round($performance.procedureScore)>>/100</span> </div> <div class="score-item"> <strong>Outcome:</strong> <span style="color: <<if $performance.outcomeScore >= 70>>#51cf66<<elseif $performance.outcomeScore >= 50>>#ffd43b<<else>>#ff6b6b<</if>>;"><<print Math.round($performance.outcomeScore)>>/100</span> </div> </div> <<if $suspectCount > 1>> <div style="background: rgba(52, 152, 219, 0.2); padding: 10px; border-radius: 6px; margin: 15px 0; border: 2px solid #3498db;"> <p style="color: #3498db; margin: 0; text-align: center;"> <strong>Suspects Involved:</strong> <<print $suspectCount>> </p> </div> <</if>> <h4 class="actions-header">Actions Taken:</h4> <div class="actions-list"> <<if $performance.actions.length > 0>> <<for _action range $performance.actions>> <div class="action-taken">• <<print _action>></div> <</for>> <<else>> <div class="action-taken">• No actions recorded</div> <</if>> </div> <<if $performance.warnings.length > 0>> <h4 class="warnings-header">⚠️ Issues & Concerns:</h4> <div class="warnings-list"> <<for _warning range $performance.warnings>> <div class="warning-item">• <<print _warning>></div> <</for>> </div> <</if>> <<set _rating = $finalScore >= 90 ? "Exemplary" : $finalScore >= 70 ? "Good" : $finalScore >= 50 ? "Acceptable" : $finalScore >= 30 ? "Poor" : "Terrible">> <<set _ratingClass = $finalScore >= 90 ? "rating-excellent" : $finalScore >= 70 ? "rating-good" : $finalScore >= 50 ? "rating-acceptable" : "rating-poor">> <div style="margin-top: 20px; padding: 15px; background: rgba(255,255,255,0.05); border-radius: 8px;"> <h4 class="<<print _ratingClass>>" style="margin: 0; text-align: center; font-size: 24px;">Rating: <<print _rating>></h4> <<if $finalScore < 30>> <p style="color: #ff6b6b; text-align: center; margin-top: 10px;"> This performance will be flagged for review by Internal Affairs. </p> <<elseif $finalScore >= 90>> <p style="color: #51cf66; text-align: center; margin-top: 10px;"> Outstanding work, Officer. This will be noted in your record. </p> <!-- 5% chance to gain a positive trait --> <<if Math.random() * 100 < 5>> <<set _goodTraits = ["Brave", "Confident", "Disciplined", "Patient", "Calm", "Analytical", "Perceptive", "Diplomatic", "Assertive", "Humble", "Wise", "Cautious"]>> <<set _availableTraits = _goodTraits.filter(function(t) { return !State.variables.mentalTraits.includes(t); })>> <<if _availableTraits.length > 0>> <<set _gainedTrait = _availableTraits[Math.floor(Math.random() * _availableTraits.length)]>> <<run $mentalTraits.push(_gainedTrait)>> <div style="background: #000; padding: 15px; border-radius: 8px; margin-top: 15px; border: 3px solid #51cf66;"> <h4 style="color: #51cf66; margin: 0 0 10px 0; text-align: center;">✨ TRAIT GAINED ✨</h4> <p style="color: #51cf66; text-align: center; margin: 0;"> Your exemplary performance has earned you the trait: <strong style="color: #ffd700;"><<print _gainedTrait>></strong> </p> </div> <</if>> <</if>> <</if>> <<if $performance.wentInAlone && ($crimeTier >= 3 || $suspectCount > 1)>> <p style="color: #ff0000; text-align: center; margin-top: 10px; font-weight: bold;"> WARNING: Engaging high-threat situations alone is against protocol and endangers officer safety. </p> <</if>> </div> </div> <!-- Outcome-Specific Messages --> <<if $suspect.currentState === "officer_down">> <div class="failure-box"> <h3 class="failure-header">🚨 OFFICER DOWN - CRITICAL FAILURE 🚨</h3> <p class="failure-text"> You were completely overpowered in this incident. This represents a catastrophic failure in judgment and procedure. You will be required to undergo remedial training before returning to active duty. </p> </div> <<elseif $suspect.currentState === "escaped">> <div class="failure-box"> <h3 class="failure-header">❌ Suspect Escaped</h3> <p class="failure-text"> The suspect<<if $suspectCount > 1>>s<</if>> got away. This incident will remain unsolved, and the perpetrator<<if $suspectCount > 1>>s remain<</if>> at large. </p> </div> <<elseif $suspect.currentState === "subdued" && $suspect.apprehended>> <div class="success-box"> <h3 class="success-header">✅ Arrest Successful</h3> <p class="success-text"> The suspect<<if $suspectCount > 1>>s have<<else>> has<</if>> been apprehended and will face charges for <<print $crimeType>>. </p> </div> <</if>> <!-- Display Lost Traits from Punishment --> <<if $lostTraitsFromPunishment && $lostTraitsFromPunishment.length > 0>> <div style="background: #000; padding: 20px; border-radius: 10px; margin: 20px 0; border: 3px solid #8b0000;"> <h3 style="color: #ff0000; margin: 0 0 15px 0; text-align: center;">💔 TRAITS LOST AS PUNISHMENT</h3> <p style="color: #ff6b6b; margin-bottom: 15px;"> The shame and trauma of being caught has cost you dearly. You have lost: </p> <ul style="color: #ff6b6b; background: rgba(139, 0, 0, 0.2); padding: 15px; border-radius: 6px; border: 2px solid #8b0000;"> <<for _lostTrait range $lostTraitsFromPunishment>> <li style="margin: 5px 0;"><strong><<print _lostTrait>></strong></li> <</for>> </ul> <p style="color: #ff6b6b; font-style: italic; margin-top: 15px; text-align: center;"> These traits represent the personal cost of your corruption being exposed. </p> </div> <<set $lostTraitsFromPunishment = []>> <</if>> <<link "<div class='action-button button-return'>Return to Patrol</div>">> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <<unset $suspectCount>> <<unset $requiresBackup>> <<if $lastLocation && $lastLocation.indexOf("Patrol") === 0>> <<goto $lastLocation>> <<else>> <<goto "PatrolDowntown">> <</if>> <</link>> </div> <</nobr>>
<<nobr>> <!-- Automatically gain Corrupt trait for attempting officer crime --> <<if !$mentalTraits.includes("Corrupt")>> <<run $mentalTraits.push("Corrupt")>> <<set $gainedCorruptTrait = true>> <<else>> <<set $gainedCorruptTrait = false>> <</if>> <!-- ===== SKILL TREE: Get On-Duty Steal Bonus for display ===== --> <<set _onDutyStealBonus = setup.skillTree.getEffect("onDutyStealBonus")>> <div class="crime-scene"> <h1 class="crime-header" style="color: #dc3545;">🚨 ILLEGAL ACTION - TRAIT THEFT</h1> <<if $gainedCorruptTrait>> <div class="corruption-gained-box"> <h3 style="color: #ff0000; margin: 0 0 10px 0; text-align: center;">⚠️ YOU HAVE BECOME CORRUPT ⚠️</h3> <p style="color: #fff; text-align: center; margin: 0;"> By choosing to abuse your power as a police officer, you have gained the <strong style="color: #ffd700;">"Corrupt"</strong> trait. </p> <p style="color: #ff6b6b; text-align: center; font-size: 14px; margin: 10px 0 0 0;"> This permanent mark will affect how others perceive you and how you view the law. </p> </div> <</if>> <div class="officer-crime-box"> <h2 style="color: #ff0000; margin: 0 0 15px 0;">Select ONE Trait to Steal</h2> <p style="color: #fff; margin-bottom: 20px;"> You are about to commit a serious crime. Choose carefully - you only get one attempt. </p> <!-- ===== SKILL TREE: On-Duty Steal Bonus Display ===== --> <<if _onDutyStealBonus > 0>> <div style="background: rgba(156, 39, 176, 0.2); padding: 10px; border-radius: 6px; margin-bottom: 15px; border: 2px solid #9C27B0;"> <p style="color: #9C27B0; margin: 0; font-size: 14px; text-align: center;"> ⭐ <strong>Skill Tree Active:</strong> -<<print _onDutyStealBonus>>% detection chance on all thefts </p> </div> <</if>> <!-- Physical Traits --> <<if $suspect.traits.physical.length > 0>> <div class="theft-trait-section"> <h3 style="color: #51cf66; margin: 15px 0 10px 0;">Physical Traits</h3> <p style="color: #ff6b6b; font-size: 14px; margin-bottom: 10px;"> ⚠️ Physical trait theft is extremely difficult and obvious - MUCH higher detection chance! </p> <div class="theft-trait-grid"> <<for _trait range $suspect.traits.physical>> <<capture _trait>> <<set _value = setup.getTraitValue('physical', _trait)>> <<set _detectionResult = setup.attemptTraitTheft(_trait, $suspect, true, true)>> <<set _detectionChance = Math.round(_detectionResult.detectionChance)>> <div class="theft-trait-option"> <<link `"<div class='theft-trait-button theft-physical'>" + _trait + " (" + _value + ")<br><span style='font-size: 12px; color: #ff6b6b;'>Detection: " + _detectionChance + "%</span></div>"`>> <<set $attemptedTrait = _trait>> <<set $attemptedTraitType = "physical">> <<set $theftResult = setup.attemptTraitTheft(_trait, $suspect, true, false)>> <<goto "OfficerCrimeResult">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Mental Traits --> <<if $suspect.traits.mental.length > 0>> <div class="theft-trait-section"> <h3 style="color: #ff6b6b; margin: 15px 0 10px 0;">Mental Traits</h3> <div class="theft-trait-grid"> <<for _trait range $suspect.traits.mental>> <<capture _trait>> <<set _value = setup.getTraitValue('mental', _trait)>> <<set _detectionResult = setup.attemptTraitTheft(_trait, $suspect, false, true)>> <<set _detectionChance = Math.round(_detectionResult.detectionChance)>> <div class="theft-trait-option"> <<link `"<div class='theft-trait-button theft-mental'>" + _trait + " (" + _value + ")<br><span style='font-size: 12px; color: #ffd43b;'>Detection: " + _detectionChance + "%</span></div>"`>> <<set $attemptedTrait = _trait>> <<set $attemptedTraitType = "mental">> <<set $theftResult = setup.attemptTraitTheft(_trait, $suspect, false, false)>> <<goto "OfficerCrimeResult">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <!-- Skills --> <<if $suspect.traits.skills.length > 0>> <div class="theft-trait-section"> <h3 style="color: #ffd43b; margin: 15px 0 10px 0;">Skills</h3> <div class="theft-trait-grid"> <<for _trait range $suspect.traits.skills>> <<capture _trait>> <<set _value = setup.getTraitValue('skill', _trait)>> <<set _detectionResult = setup.attemptTraitTheft(_trait, $suspect, false, true)>> <<set _detectionChance = Math.round(_detectionResult.detectionChance)>> <div class="theft-trait-option"> <<link `"<div class='theft-trait-button theft-skill'>" + _trait + " (" + _value + ")<br><span style='font-size: 12px; color: #4dabf7;'>Detection: " + _detectionChance + "%</span></div>"`>> <<set $attemptedTrait = _trait>> <<set $attemptedTraitType = "skill">> <<set $theftResult = setup.attemptTraitTheft(_trait, $suspect, false, false)>> <<goto "OfficerCrimeResult">> <</link>> </div> <</capture>> <</for>> </div> </div> <</if>> <div style="margin-top: 30px; padding-top: 20px; border-top: 2px solid #666;"> <p style="color: #ffd43b; text-align: center; margin-bottom: 15px;"> You can still abandon this theft and return to processing the arrest. </p> <<link "<div class='action-button button-return'>Abandon This Theft</div>">> <<set $suspect.traitTheftAttempted = false>> <<goto "CrimeScene">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div class="crime-scene"> <<if $theftResult.success>> <!-- Successful Theft --> <div style="background: rgba(40, 167, 69, 0.2); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #28a745;"> <h2 style="color: #28a745; margin: 0 0 15px 0; text-align: center;">✅ Theft Successful (For Now)</h2> <p style="color: #e0e0e0; font-size: 16px; margin-bottom: 10px;"> You successfully stole the trait "<span style="color: #ffd700; font-weight: bold;"><<print $attemptedTrait>></span>" from the suspect without being immediately detected. </p> <p style="color: #ffeb3b; font-size: 14px; margin-bottom: 10px;"> Detection risk was <<print Math.round($theftResult.detectionChance)>>%. You managed to avoid detection this time. </p> <p style="color: #fff; font-size: 14px; margin-bottom: 15px;"> Trait value: <strong><<print $theftResult.traitValue>></strong> </p> <!-- ===== SKILL TREE: On-Duty Steal Bonus Display ===== --> <<set _onDutyStealBonus = setup.skillTree.getEffect("onDutyStealBonus")>> <<if _onDutyStealBonus > 0>> <p style="color: #9C27B0; font-size: 14px; margin-bottom: 10px;"> ⭐ <strong>Skill Tree Bonus:</strong> -<<print _onDutyStealBonus>>% detection chance </p> <</if>> <!-- Check which traits helped/hurt --> <<set _playerTraits = ($physicalTraits || []).concat($mentalTraits || []).concat($skills || [])>> <<if _playerTraits.includes("Stealth") || _playerTraits.includes("Sly") || _playerTraits.includes("Quick Reflexes")>> <p style="color: #90ee90; font-style: italic; margin-top: 10px; font-size: 14px;"> Your <<if _playerTraits.includes("Stealth")>>stealthy nature<<elseif _playerTraits.includes("Sly")>>sly cunning<<else>>quick reflexes<</if>> helped you pull this off without being noticed. </p> <</if>> <<if !$stolenTraits>><<set $stolenTraits = []>><</if>> <<if !$stolenTraitsOnDuty>><<set $stolenTraitsOnDuty = []>><</if>> <!-- Log to both arrays --> <<set _stolenTraitRecord = { trait: $attemptedTrait, value: $theftResult.traitValue, type: $attemptedTraitType, source: $crimeType + " Suspect", date: $dayNumber, location: $lastLocation }>> <<run $stolenTraits.push(_stolenTraitRecord)>> <<run $stolenTraitsOnDuty.push(_stolenTraitRecord)>> <!-- Add trait to appropriate array with conflict checking --> <<set _allPlayerTraits = $physicalTraits.concat($mentalTraits)>> <<set _conflictTrait = setup.getConflictingTrait($attemptedTrait, _allPlayerTraits)>> <<if _conflictTrait>> <!-- Remove conflicting trait first --> <<if $physicalTraits.includes(_conflictTrait)>> <<run $physicalTraits.delete(_conflictTrait)>> <<elseif $mentalTraits.includes(_conflictTrait)>> <<run $mentalTraits.delete(_conflictTrait)>> <</if>> <<set _stolenTraitRecord.replaced = _conflictTrait>> <</if>> <!-- Safety check: don't add trait if blocked by transformation --> <<set _blockedByTransform = setup.isTraitBlockedByTransformation && (setup.isTraitBlockedByTransformation($attemptedTrait, "physical") || setup.isTraitBlockedByTransformation($attemptedTrait, "mental"))>> <<if !_blockedByTransform>> <<if $attemptedTraitType === "physical">> <<if !$physicalTraits.includes($attemptedTrait)>> <<run $physicalTraits.push($attemptedTrait)>> <</if>> <<elseif $attemptedTraitType === "mental">> <<if !$mentalTraits.includes($attemptedTrait)>> <<run $mentalTraits.push($attemptedTrait)>> <</if>> <<elseif $attemptedTraitType === "skill">> <<if !$skills.includes($attemptedTrait)>> <<run $skills.push($attemptedTrait)>> <</if>> <</if>> <</if>><!-- End transformation block check --> <div style="background: rgba(220, 53, 69, 0.3); padding: 20px; border-radius: 10px; margin-top: 20px; border: 2px solid #dc3545;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">⚠️ CONSEQUENCES IF CAUGHT</h3> <p style="color: #fff; font-size: 15px; margin-bottom: 10px;"> You now have <strong style="color: #ffd700;"><<print $stolenTraitsOnDuty.length>></strong> stolen trait<<if $stolenTraitsOnDuty.length !== 1>>s<</if>> from suspects while on duty. </p> <p style="color: #e0e0e0; font-size: 14px; margin-top: 15px; margin-bottom: 10px;"> If caught, you will: </p> <ul style="color: #ffcccb; margin: 10px 0; padding-left: 25px; line-height: 1.6;"> <li>Be immediately <strong>FIRED</strong> from the police force</li> <li>Lose <strong>ALL</strong> traits stolen while on duty</li> <li>Face a <strong style="color: #ffd700;">$<<print $stolenTraitsOnDuty.length * 500>></strong> fine (or lose 5 random positive traits)</li> </ul> <<if $stolenTraitsOnDuty.length >= 3>> <p style="color: #ff0000; font-weight: bold; margin-top: 15px; font-size: 16px; text-align: center; background: rgba(0,0,0,0.3); padding: 10px; border-radius: 6px;"> 🚨 WARNING: Multiple stolen traits means a $<<print $stolenTraitsOnDuty.length * 500>> fine if caught! </p> <</if>> </div> </div> <<link "<div class='action-button button-continue'>Continue</div>">> <<goto "CrimeScene">> <</link>> <<else>> <!-- Caught! Redirect to confrontation --> <<goto "OfficerCrimeCaught">> <</if>> </div> <</nobr>>
<<nobr>> <div class="crime-scene"> <h1 class="crime-header" style="color: #ff0000;">🚨 YOU'VE BEEN CAUGHT!</h1> <<if $theftResult.sheriffNearby>> <div class="sheriff-caught-box" style="background: rgba(139, 0, 0, 0.8); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ff0000;"> <h3 style="color: #fff; margin: 0 0 15px 0; text-align: center;">👮 THE SHERIFF IS HERE</h3> <p style="color: #fff; margin: 0; font-size: 16px; line-height: 1.6;"> The Sheriff witnessed you attempting to steal "<<print $attemptedTrait>>" from the suspect. They're calling for backup right now. You have seconds to decide what to do. </p> </div> <<else>> <div style="background: rgba(220, 53, 69, 0.3); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #dc3545;"> <h3 style="color: #dc3545; margin: 0 0 15px 0; text-align: center;">⚠️ OFFICER APPROACHING</h3> <p style="color: #fff; margin: 0 0 10px 0; font-size: 16px;"> You were caught attempting to steal the trait "<<print $attemptedTrait>>" from the apprehended suspect! </p> <p style="color: #fff; margin: 0; font-size: 14px;"> Detection chance was <<print Math.round($theftResult.detectionChance)>>%. An officer saw what you were doing and is approaching rapidly. </p> <!-- Explain what went wrong --> <<set _playerTraits = ($physicalTraits || []).concat($mentalTraits || []).concat($skills || [])>> <<if _playerTraits.includes("Clumsy")>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> Your clumsiness gave you away - you fumbled the extraction. </p> <<elseif _playerTraits.includes("Honest")>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> Your honest demeanor made the deception obvious. </p> <<elseif _playerTraits.includes("Nervous")>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> Your nervous behavior drew suspicion. </p> <<elseif _playerTraits.includes("Awkward")>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> Your awkwardness made the theft obvious. </p> <<elseif $context.nearbyOfficers > 0>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> With <<print $context.nearbyOfficers>> officer<<if $context.nearbyOfficers > 1>>s<</if>> nearby, someone noticed. </p> <<else>> <p style="color: #ff6b6b; font-style: italic; margin-top: 10px;"> A witness reported you immediately. </p> <</if>> </div> <</if>> <div style="background: rgba(255, 193, 7, 0.2); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107;"> <h3 style="color: #ffc107; margin: 0 0 15px 0; text-align: center;">⚡ CHOOSE QUICKLY</h3> <p style="color: #fff; text-align: center; margin: 0;"> You have split seconds to decide. Do you flee the scene or stay and face the consequences? </p> </div> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px;"> <!-- Option 1: Flee --> <div style="background: rgba(139, 0, 0, 0.3); padding: 20px; border-radius: 12px; border: 3px solid #8b0000;"> <h3 style="color: #ff0000; margin: 0 0 15px 0; text-align: center;">🏃 FLEE THE SCENE</h3> <p style="color: #fff; font-size: 14px; margin-bottom: 15px;"> Run away from the scene. This will make things MUCH worse: </p> <ul style="color: #ff6b6b; margin-bottom: 15px; padding-left: 20px;"> <li>Automatic termination from police force</li> <li>Become a <strong style="color: #ff0000;">Criminal</strong></li> <li>Significantly higher fines and penalties</li> <li>Warrant for your arrest</li> <li>Much harder to trade (Criminal: -20% trade chance)</li> </ul> <<link "<div style='background: #8b0000; color: #fff; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🏃 FLEE NOW</div>">> <<goto "OfficerCrimeFlee">> <</link>> </div> <!-- Option 2: Face Consequences --> <div style="background: rgba(52, 152, 219, 0.3); padding: 20px; border-radius: 12px; border: 3px solid #3498db;"> <h3 style="color: #3498db; margin: 0 0 15px 0; text-align: center;">⚖️ FACE THE CONSEQUENCES</h3> <p style="color: #fff; font-size: 14px; margin-bottom: 15px;"> Stay and accept responsibility. You'll still be fired, but the penalties will be lighter: </p> <ul style="color: #4dabf7; margin-bottom: 15px; padding-left: 20px;"> <li>Immediate termination from police force</li> <li>All stolen traits confiscated</li> <li>Choose: Pay fine, accept debt, or lose 5 traits</li> <li>No criminal record (if you cooperate)</li> </ul> <<link "<div style='background: #3498db; color: #fff; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>⚖️ ACCEPT PUNISHMENT</div>">> <<goto "OfficerCrimePunishment">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div class="crime-scene"> <h1 class="crime-header" style="color: #ff0000;">🏃 YOU FLED THE SCENE</h1> <div class="failure-box"> <h2 class="failure-header">🚨 FUGITIVE STATUS</h2> <p class="failure-text"> You ran from the scene, abandoning your badge and your career. The entire police department is now looking for you. </p> </div> <!-- IMMEDIATE TERMINATION --> <div class="fired-box"> <h3 class="fired-header">❌ TERMINATED & WANTED</h3> <p style="color: #fff; font-weight: bold; font-size: 18px;"> You are FIRED from the Sunfish City Police Department and now have an active warrant for your arrest. </p> </div> <!-- CRIMINAL JOB ASSIGNED --> <div style="background: rgba(139, 0, 0, 0.4); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #ff0000;"> <h3 style="color: #ff0000; margin: 0 0 15px 0;">🔴 YOU ARE NOW A CRIMINAL</h3> <p style="color: #fff; margin-bottom: 10px;"> Your job has been changed to "Criminal". This will make your life significantly harder: </p> <ul style="color: #ff6b6b;"> <li><strong>-150 value</strong> on all trades (people don't trust criminals)</li> <li><strong>-20% trade success chance</strong> (decreased from normal)</li> <li>Active warrant - you can be arrested at any time</li> <li>Higher fines and penalties for everything</li> </ul> </div> <!-- CONFISCATE STOLEN TRAITS --> <<if $stolenTraitsOnDuty && $stolenTraitsOnDuty.length > 0>> <div style="background: rgba(255, 107, 107, 0.3); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">⚖️ STOLEN TRAITS CONFISCATED</h3> <p style="color: #fff; margin-bottom: 15px;"> All traits stolen while on duty have been magically confiscated: </p> <ul class="stolen-list"> <<for _stolen range $stolenTraitsOnDuty>> <li> <strong><<print _stolen.trait>></strong> (<<print _stolen.type>>, Value: <<print _stolen.value>>) </li> <</for>> </ul> <!-- Remove stolen traits --> <<for _stolen range $stolenTraitsOnDuty>> <<if _stolen.type === "physical">> <<run $physicalTraits.delete(_stolen.trait)>> <<elseif _stolen.type === "mental">> <<run $mentalTraits.delete(_stolen.trait)>> <<elseif _stolen.type === "skill">> <<run $skills.delete(_stolen.trait)>> <</if>> <</for>> <<set $stolenTraitsOnDuty = []>> </div> <</if>> <!-- Set Criminal Job and Clean Up --> <<set $jobs = ["Criminal"]>> <<set $onPatrol = false>> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<if $performance>><<set $performance.traitTheftDetected = true>><</if>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <!-- Determine where to send the player --> <<set _returnLocation = "Downtown">> <<if $lastLocation>> <<if $lastLocation === "PoliceBreakRoom">> <<set _returnLocation = "PoliceDepartment">> <<elseif $lastLocation === "PatrolDowntown" || $lastLocation === "CrimeScene">> <<set _returnLocation = "Downtown">> <<elseif $lastLocation === "PatrolBusinessDistrict">> <<set _returnLocation = "BusinessDistrict">> <<elseif $lastLocation === "PatrolRedLightDistrict">> <<set _returnLocation = "RedLightDistrict">> <<elseif $lastLocation === "PatrolDocks">> <<set _returnLocation = "Docks">> <<elseif $lastLocation === "PatrolAlleyway">> <<set _returnLocation = "Alleyway">> <<elseif $lastLocation === "PatrolSeabassPark">> <<set _returnLocation = "SeabassPark">> <<elseif $lastLocation === "PatrolOutskirts">> <<set _returnLocation = "Outskirts">> <</if>> <</if>> <div style="background: rgba(52, 152, 219, 0.3); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #3498db;"> <h3 style="color: #3498db; margin: 0 0 15px 0; text-align: center;">🏃 ESCAPE</h3> <p style="color: #fff; text-align: center; margin-bottom: 15px;"> You manage to slip away in the chaos. You're no longer a police officer - just another person in Sunfish City. But now you have a criminal record and an active warrant. </p> <<link "<div style='background: #3498db; color: #fff; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Continue</div>">> <<goto _returnLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <div class="crime-scene"> <h1 class="crime-header" style="color: #dc3545;">⚖️ FACING JUSTICE</h1> <div class="failure-box"> <h2 class="failure-header">🚨 CAUGHT IN THE ACT</h2> <p class="failure-text"> You chose to stay and face the consequences of your actions. The department appreciates your cooperation, but you're still being terminated. </p> </div> <!-- IMMEDIATE TERMINATION --> <div class="fired-box"> <h3 class="fired-header">❌ IMMEDIATE TERMINATION</h3> <p style="color: #fff; font-weight: bold; font-size: 18px;"> You have been FIRED from the Sunfish City Police Department. </p> <p style="color: #ff6b6b; margin-top: 10px;"> All police credentials revoked. You are no longer authorized to patrol or carry a badge. </p> </div> <!-- STOLEN TRAITS CONFISCATED --> <<if !$stolenTraitsOnDuty>> <<set $stolenTraitsOnDuty = []>> <</if>> <<if $stolenTraitsOnDuty.length > 0>> <div style="background: rgba(255, 107, 107, 0.3); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">⚖️ CONFISCATED TRAITS</h3> <p style="color: #fff; margin-bottom: 15px;"> All traits stolen while on duty have been confiscated and returned: </p> <ul class="stolen-list"> <<for _stolen range $stolenTraitsOnDuty>> <li> <strong><<print _stolen.trait>></strong> (<<print _stolen.type>>, Value: <<print _stolen.value>>) - From <<print _stolen.source>> on Day <<print _stolen.date>> </li> <</for>> </ul> <!-- Remove all stolen traits from player --> <<for _stolen range $stolenTraitsOnDuty>> <<if _stolen.type === "physical">> <<run $physicalTraits.delete(_stolen.trait)>> <<elseif _stolen.type === "mental">> <<run $mentalTraits.delete(_stolen.trait)>> <<elseif _stolen.type === "skill">> <<run $skills.delete(_stolen.trait)>> <</if>> <</for>> <p style="color: #ff6b6b; font-weight: bold; margin-top: 15px;"> You have lost <<print $stolenTraitsOnDuty.length>> stolen trait<<if $stolenTraitsOnDuty.length !== 1>>s<</if>>. </p> </div> <</if>> <!-- PUNISHMENT OPTIONS --> <<set _fine = Math.max($stolenTraitsOnDuty.length, 1) * 5000>> <<set _debtFine = Math.max($stolenTraitsOnDuty.length, 1) * 10000>> <<set _canPayFine = $money >= _fine>> <div style="background: rgba(139, 0, 0, 0.3); padding: 20px; border-radius: 12px; margin: 20px 0; border: 3px solid #8b0000;"> <h3 style="color: #ff0000; margin: 0 0 15px 0; text-align: center;">⚠️ CHOOSE YOUR PUNISHMENT ⚠️</h3> <p style="color: #fff; text-align: center; margin-bottom: 20px;"> Because you cooperated, you avoid a criminal record. Choose one: </p> <div style="display: grid; grid-template-columns: 1fr; gap: 15px;"> <!-- Option 1: Pay Fine --> <div style="background: rgba(255, 193, 7, 0.2); padding: 15px; border-radius: 8px; border: 2px solid #ffc107;"> <h4 style="color: #ffc107; margin: 0 0 10px 0;">💰 Pay Fine: $<<print _fine>></h4> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;"> Pay $5,000 per stolen trait to avoid jail time </p> <<if _canPayFine>> <p style="color: #51cf66; font-size: 12px; margin-bottom: 10px;"> ✓ You have enough (Current: $<<print $money>>) </p> <<capture _fine>> <<set _payLabel = "<div style='background: #ffc107; color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Pay $" + _fine + " Fine</div>">> <<link _payLabel>> <<set $money -= _fine>> <<set $currentJob = "Unemployed">> <<set $jobs = []>> <<set $onPatrol = false>> <<set $stolenTraitsOnDuty = []>> <<set $performance.traitTheftDetected = true>> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <<unset $suspectCount>> <<unset $requiresBackup>> <<goto "YourApartment">> <</link>> <</capture>> <<else>> <p style="color: #ff6b6b; font-size: 12px; margin-bottom: 10px;"> ✗ Insufficient funds (Need: $<<print _fine>>, You have: $<<print $money>>) </p> <div style='background: #444; color: #777; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; cursor: not-allowed; opacity: 0.5;'> Cannot Afford Fine </div> <</if>> </div> <!-- Option 2: Take on Debt --> <div style="background: rgba(220, 53, 69, 0.2); padding: 15px; border-radius: 8px; border: 2px solid #dc3545;"> <h4 style="color: #dc3545; margin: 0 0 10px 0;">📋 Accept Debt: $<<print _debtFine>></h4> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;"> Take on debt instead of paying immediately ($10,000 per stolen trait). All future income will go towards paying this debt until it's cleared. </p> <p style="color: #ff6b6b; font-size: 13px; margin-bottom: 10px; font-weight: bold;"> ⚠️ WARNING: You will not be able to keep any money earned until this debt is fully paid off! </p> <<capture _debtFine>> <<set _debtLabel = "<div style='background: #dc3545; color: #fff; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept $" + _debtFine + " Debt</div>">> <<link _debtLabel>> <<if !$debt>><<set $debt = 0>><</if>> <<set $debt += _debtFine>> <<set $currentJob = "Unemployed">> <<set $jobs = []>> <<set $onPatrol = false>> <<set $stolenTraitsOnDuty = []>> <<set $performance.traitTheftDetected = true>> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <<unset $suspectCount>> <<unset $requiresBackup>> <<goto "YourApartment">> <</link>> <</capture>> </div> <!-- Option 3: Go to Jail --> <div style="background: rgba(102, 102, 102, 0.2); padding: 15px; border-radius: 8px; border: 2px solid #666;"> <h4 style="color: #aaa; margin: 0 0 10px 0;">🔒 Go to Jail</h4> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;"> Serve time instead of paying fines. Time served varies based on severity. </p> <<link "<div style='background: #666; color: #fff; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Accept Jail Time</div>">> <<set $currentJob = "Unemployed">> <<set $jobs = []>> <<set $onPatrol = false>> <<set $stolenTraitsOnDuty = []>> <<set $performance.traitTheftDetected = true>> <<set $crimeDetected = false>> <<set $currentCrime = null>> <<set $crimeInProgress = false>> <<unset $suspect>> <<unset $context>> <<unset $performance>> <<unset $crimeStage>> <<unset $crimeDesc>> <<unset $suspectCount>> <<unset $requiresBackup>> <<goto "Jail">> <</link>> </div> </div> </div> </div> <</nobr>>
<<nobr>> <<set _canSteal = setup.canPlayerSteal()>> <<set _locationData = setup.crimeLocations[$currentCrimeLocation]>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🦹 Criminal Activities</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">_locationData.name</h2> <<if $crimeSystem.activeWarrant>> <div style="background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); color: white; padding: 12px; border-radius: 5px; margin-bottom: 15px; font-weight: bold; text-align: center; font-size: 15px;"> ⚠️ <b>ACTIVE WARRANT</b> - Police heat: $crimeSystem.heatLevel% </div> <</if>> <<if $job && $job !== "Unemployed" && $job !== "Criminal">> <div style="background: linear-gradient(135deg, #f39c12 0%, #f1c40f 100%); color: #000; padding: 12px; border-radius: 5px; margin-bottom: 15px; text-align: center; font-size: 15px;"> ⚠️ <b>WARNING:</b> If caught stealing, you'll lose your job and become a Criminal! </div> <</if>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 18px;">Criminal Record</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Successful:</b> $crimeSystem.successfulThefts | <b>Failed:</b> $crimeSystem.failedThefts | <b>Heat:</b> $crimeSystem.heatLevel/100</p> <p style="margin: 5px 0; font-size: 15px;"><b>Arrested:</b> $crimeSystem.arrestCount times | <b>Resisted:</b> $crimeSystem.resistedArrestCount times</p> </div> <<if !_canSteal.canSteal>> <div style="background: #3a3a3a; padding: 15px; border-radius: 8px; border-left: 4px solid #95a5a6; margin-bottom: 15px;"> <p style="color: #bdc3c7; margin: 0; font-style: italic; font-size: 15px;">_canSteal.reason</p> </div> <<else>> <<set _breakdown = setup.getTheftStatBreakdown($currentCrimeLocation)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 18px;">Location Info</h3> <p style="color: #ccc; margin: 0 0 10px 0; font-size: 15px;">_locationData.description</p> <div style="background: #2a2a2a; padding: 10px; border-radius: 5px; margin-bottom: 10px;"> <p style="color: #aaa; font-size: 15px; margin: 5px 0;"><b>Target Frequency:</b> <span style="color: #51cf66;">_locationData.targetFrequency%</span></p> <p style="color: #aaa; font-size: 15px; margin: 5px 0;"><b>Patrol Risk:</b> <span style="color: #ff6b6b;">_locationData.patrolFrequency%</span></p> <p style="color: #aaa; font-size: 15px; margin: 5px 0;"><b>Your Success Rate:</b> <span style="color: <<if _breakdown.total >= 70>>#2ecc71<<elseif _breakdown.total >= 40>>#f39c12<<else>>#e74c3c<</if>>;">_breakdown.total%</span></p> <<if _breakdown.wellRestedBonus > 0>> <p style="color: #51cf66; font-size: 13px; margin: 3px 0 3px 15px;">😴 Well Rested: +<<print _breakdown.wellRestedBonus>>%</p> <</if>> <<if _breakdown.exhaustionPenalty < 0>> <p style="color: #ff6b6b; font-size: 13px; margin: 3px 0 3px 15px;">Exhaustion: <<print _breakdown.exhaustionPenalty>>%</p> <</if>> <<if _breakdown.werefoxBonus > 0>> <p style="color: #ff9800; font-size: 13px; margin: 3px 0 3px 15px;">✓ Werefox: +<<print _breakdown.werefoxBonus>>%</p> <</if>> </div> <<if $crimeSystem.heatLevel >= 50>> <p style="color: #ff6b6b; font-size: 14px; margin: 8px 0; font-weight: bold;">⚠️ High heat! Police are actively patrolling.</p> <</if>> <<if $traitScanner>> <p style="color: #3498db; font-size: 14px; margin: 8px 0;">✓ Trait Scanner active</p> <<elseif $physicalTraits.includes("Sunfish") || $mentalTraits.includes("Sunfish")>> <p style="color: #3498db; font-size: 14px; margin: 8px 0;">✓ Sunfish perception active</p> <<else>> <p style="color: #888; font-size: 14px; margin: 8px 0;">⚠️ No scanner - physical traits only</p> <</if>> </div> <div style="text-align: center; margin-bottom: 15px;"> <<if $job && $job !== "Unemployed" && $job !== "Criminal">> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>🎯 Scout for Targets</div>">> <<popover 'noclick'>> <div style="padding: 20px; background: #1a1a1a; border-radius: 10px; max-width: 450px;"> <h2 style="color: #ff6b6b; margin-top: 0; text-align: center; font-size: 20px;">⚠️ WARNING</h2> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border-left: 4px solid #ff6b6b; margin-bottom: 15px;"> <p style="color: #fff; margin: 0 0 8px 0; font-size: 15px;"><b>Current Job:</b> <span style="color: #51cf66;">$job</span></p> <p style="color: #ff6b6b; margin: 0 0 5px 0; font-size: 15px;">If caught stealing:</p> <ul style="color: #ccc; margin: 5px 0; font-size: 14px; padding-left: 20px;"> <li>Lose your job immediately</li> <li>Become a "Criminal"</li> <li>Face fines and jail time</li> <li>Gain criminal record</li> </ul> </div> <p style="color: #aaa; text-align: center; margin-bottom: 15px; font-size: 14px; font-style: italic;">Risk your employment?</p> <div style="display: flex; gap: 10px; justify-content: center;"> <<link "<div style='background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; text-align: center; font-size: 15px;'>Yes, Risk It</div>">> <<run Dialog.close()>> <<goto "ScoutForTarget">> <</link>> <<link "<div style='background: #95a5a6; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; text-align: center; font-size: 15px;'>No, Go Back</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> <<else>> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>🎯 Scout for Targets</div>">> <<goto "ScoutForTarget">> <</link>> <</if>> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>← Return to _locationData.name</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
/* ---------------------------------- */ /* --- TRAIT THEFT CRIME SYSTEM --- */ /* --- EASIER THEFT VERSION (2X) --- */ /* ---------------------------------- */ <<set $traitScanner = false>> <<set $crimeSystem = { warnings: 0, witnessedCrimes: 0, totalThefts: 0, successfulThefts: 0, failedThefts: 0, arrestCount: 0, resistedArrestCount: 0, surrenderCount: 0, lastCrimeLocation: "", lastCrimeTime: "", heatLevel: 0, activeWarrant: false, lastHeatDecayDay: 0, crimesCommitted: 0, consecutiveEscapes: 0 // NEW: Track escape streak }>> /* Location data for trait theft with stat requirements */ <<set setup.crimeLocations = { "Alleyway": { name: "Dark Alleyway", targetFrequency: 35, patrolFrequency: 15, traitQuality: "low-medium", nightBonus: 15, description: "A shadowy alleyway where desperate souls lurk.", primaryStats: ["dexterity", "strength"], secondaryStats: ["intelligence"] }, "Downtown": { name: "Downtown", targetFrequency: 75, patrolFrequency: 40, traitQuality: "medium", nightBonus: 5, description: "Busy streets filled with all kinds of people.", primaryStats: ["charisma", "dexterity"], secondaryStats: ["intelligence"] }, "BusinessDistrict": { name: "Business District", targetFrequency: 65, patrolFrequency: 50, traitQuality: "medium-high", nightBonus: -10, description: "Well-dressed professionals hurrying about their business.", primaryStats: ["charisma", "intelligence"], secondaryStats: ["dexterity"] }, "RedLightDistrict": { name: "Red Light District", targetFrequency: 80, patrolFrequency: 25, traitQuality: "medium", nightBonus: 20, description: "A seedy area where morals are... flexible.", primaryStats: ["charisma", "strength"], secondaryStats: ["dexterity"] }, "SeabassPark": { name: "Seabass Park", targetFrequency: 50, patrolFrequency: 20, traitQuality: "low-medium", nightBonus: -15, description: "A peaceful park, though less populated at night.", primaryStats: ["dexterity", "intelligence"], secondaryStats: ["charisma"] }, "Mall": { name: "Shopping Mall", targetFrequency: 85, patrolFrequency: 45, traitQuality: "medium-high", nightBonus: -30, description: "Crowded shopping center full of consumers.", primaryStats: ["charisma", "dexterity"], secondaryStats: ["intelligence"] }, "Outskirts": { name: "City Outskirts", targetFrequency: 25, patrolFrequency: 10, traitQuality: "low", nightBonus: 5, description: "Sparse population on the edge of the city.", primaryStats: ["strength", "dexterity"], secondaryStats: ["intelligence"] }, "Docks": { name: "Harbor Docks", targetFrequency: 40, patrolFrequency: 30, traitQuality: "low-medium", nightBonus: 10, description: "Working-class folks loading and unloading cargo.", primaryStats: ["strength", "dexterity"], secondaryStats: ["charisma"] } }>> <<set setup.unstealableTraits = [ "Criminal Deluxe", "Were-Creature", "Totally not a Vampire", "Occult Expert", "Lucky", "Sunfish", "Soul", "Oral Expert", "Anal Expert", "Rough Sex Enthusiast", "Sensual Lover", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Roleplay Expert", "Dirty Talker", "Tantric Master", "Exhibitionist", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master", "Fishing", "Advanced Angler", "Master Angler", "Fishimon Master", "Quill", /* LABORATORY TRANSFORMATION TRAITS - Base Traits */ "Catperson", "Wolfperson", "Horns", "Fangs", "Pointed Ears", "Glowing Eyes", "Claws", "Wings", "Tail", "Lactating", "Mischievous", "Docile", "Feral", "Predatory", "Maternal", "Paternal", "Breeding Obsessed", "Heat Cycles", "Pack Minded", "Nocturnal", "Territorial", "Shameless", "Insatiable", "Praise Seeking", "Obedient", "Collar Loving", "Rebellious", "Corrupted", /* LABORATORY TRANSFORMATION TRAITS - Intermediate Combination */ "Temptress", "Sadist", "Masochist", "Milky", "Neko", "Inu", "Imp-Touched", "Mommy Energy", "Devoted", "Savage", "Genius", /* LABORATORY TRANSFORMATION TRAITS - Full Transformations */ "Succubus", // "Incubus", - temporarily disabled "Imp", "Hellhound", "Werecat", "Werewolf", "Werebunny", "Werefox", "Weresheep", "Hucow", "Trophy Wife", "Gym Bunny", "E-Girl", "Punk", "Siren", "Living Doll", "Dominatrix", "Slut", "Himbo" ]>> <<set setup.moralTraitsBlockingTheft = [ "Kind", "Honest", "Considerate", "Loyal", "Polite", "Warm", "Empathetic", "Supportive", "Thoughtful", "Trusting" ]>> <<set setup.moralTraitsPenalty = [ "Friendly", "Diplomatic", "Calm", "Patient", "Humble", "Mature", "Wise", "Reassuring" ]>> <<set setup.theftBonusTraits = { "Sly": 2, "Deceitful": 1, "Crafty": 3, "Shrewd": 1, "Cunning": 4, "Stealthy": 5, "Quick Reflexes": 2, "Nimble Fingers": 3, "Fast": 2, "Quick": 2, "Reckless": 1, "Impulsive": 1, "Corrupt": 1, "Selfish": 1, "Cruel": 1, "Cold": 1, "Sunfish": 15 }>> <<set setup.theftBonusSkills = { "Stealth": 7, "Lock Picking": 8, "Acting": 3, "Persuasion": 7, "Criminal Deluxe": 100 }>> <<set setup.canPlayerSteal = function() { var v = State.variables; // Check if player is in their original body // lifeSwapPortraitSource being undefined or "player" means they're in their original body if (v.lifeSwapPortraitSource && v.lifeSwapPortraitSource !== "player") { return { canSteal: false, reason: "You can only steal while in your <b>original body</b>. Life swapping into another body prevents you from committing theft." }; } for (var i = 0; i < setup.moralTraitsBlockingTheft.length; i++) { var trait = setup.moralTraitsBlockingTheft[i]; if (v.physicalTraits.includes(trait) || v.mentalTraits.includes(trait)) { return { canSteal: false, reason: "Your <b>" + trait + "</b> nature prevents you from stealing from innocent people." }; } } return {canSteal: true}; }>> <<set setup.calculateStatModifier = function(stat, value) { var effectiveValue = Math.min(50, value); if (effectiveValue < 15) { return -Math.floor((15 - effectiveValue) / 2); } // DOUBLED: Was divide by 5, now divide by 2.5 return Math.floor((effectiveValue - 15) / 2.5); }>> <<set setup.calculateTheftChance = function(location) { var v = State.variables; var baseChance = 50; // DOUBLED from 25 var totalStr = setup.getTotalStat("strength"); var totalDex = setup.getTotalStat("dexterity"); var totalInt = setup.getTotalStat("intelligence"); var totalCha = setup.getTotalStat("charisma"); var locationData = setup.crimeLocations[location]; if (locationData) { for (var i = 0; i < locationData.primaryStats.length; i++) { var stat = locationData.primaryStats[i]; if (stat === "strength") { baseChance += setup.calculateStatModifier(stat, totalStr); } else if (stat === "dexterity") { baseChance += setup.calculateStatModifier(stat, totalDex); } else if (stat === "intelligence") { baseChance += setup.calculateStatModifier(stat, totalInt); } else if (stat === "charisma") { baseChance += setup.calculateStatModifier(stat, totalCha); } } for (var i = 0; i < locationData.secondaryStats.length; i++) { var stat = locationData.secondaryStats[i]; var modifier = 0; if (stat === "strength") { modifier = setup.calculateStatModifier(stat, totalStr); } else if (stat === "dexterity") { modifier = setup.calculateStatModifier(stat, totalDex); } else if (stat === "intelligence") { modifier = setup.calculateStatModifier(stat, totalInt); } else if (stat === "charisma") { modifier = setup.calculateStatModifier(stat, totalCha); } baseChance += Math.floor(modifier / 2); } baseChance -= Math.floor(locationData.patrolFrequency / 5); } if (v.timeOfDay === "Night" || v.timeOfDay === "Late Night") { baseChance += 20; // DOUBLED from 10 } // Individual trait bonuses - DOUBLED for (var trait in setup.theftBonusTraits) { if (v.physicalTraits.includes(trait) || v.mentalTraits.includes(trait)) { baseChance += (setup.theftBonusTraits[trait] * 2); } } // Individual skill bonuses - DOUBLED for (var skill in setup.theftBonusSkills) { if (v.skills.includes(skill)) { baseChance += (setup.theftBonusSkills[skill] * 2); } } // Moral trait penalties - HALVED for (var i = 0; i < setup.moralTraitsPenalty.length; i++) { var trait = setup.moralTraitsPenalty[i]; if (v.physicalTraits.includes(trait) || v.mentalTraits.includes(trait)) { baseChance -= 6; // HALVED from 12 } } if (v.physicalTraits.includes("Clumsy")) { baseChance -= 7.5; // HALVED from 15 } // Lucky/Unlucky trait modifiers - DOUBLED if (v.physicalTraits.includes("Lucky") || v.mentalTraits.includes("Lucky")) { baseChance += 20; // DOUBLED from 10 } if (v.physicalTraits.includes("Unlucky") || v.mentalTraits.includes("Unlucky")) { baseChance -= 20; // DOUBLED from 10 } // Werefox +20% stealing bonus if (v.physicalTraits.includes("Werefox")) { baseChance += 20; } // ===== SKILL TREE: Steal Bonus ===== var skillTreeStealBonus = setup.skillTree.getEffect("stealBonus"); if (skillTreeStealBonus > 0) { baseChance += skillTreeStealBonus; } baseChance -= Math.floor(v.crimeSystem.heatLevel / 10); // Determine minimum chance var minChance = 0; // Default minimum is 0% // ===== SKILL TREE: Steal Min Chance ===== var skillTreeMinChance = setup.skillTree.getEffect("stealMinChance"); if (skillTreeMinChance > 0) { minChance = Math.max(minChance, skillTreeMinChance); } // Slippery Scales artifact bonus if (v.currentArtifact === "The Slippery Scales") { baseChance += 40; // +40% instead of doubling minChance = Math.max(minChance, 10); // Slippery Scales sets minimum to 10% } // ===== BUFF/DEBUFF MODIFIERS ===== if (typeof setup.getDebuffEffect === 'function') { var debuffSteal = setup.getDebuffEffect("stealChance"); if (debuffSteal !== 0) baseChance += debuffSteal; } if (typeof setup.getBuffEffect === 'function') { var buffSteal = setup.getBuffEffect("stealChance"); if (buffSteal > 0) baseChance += buffSteal; } return Math.max(minChance, Math.min(95, baseChance)); }>> <<set setup.getTheftStatBreakdown = function(location) { var v = State.variables; var breakdown = { base: 50, // DOUBLED timeBonus: 0, statBonuses: {}, traitBonuses: 0, skillBonuses: 0, skillTreeBonus: 0, penalties: 0, heatPenalty: 0, luckModifier: 0, artifactBonus: 0, exhaustionPenalty: 0, wellRestedBonus: 0, werefoxBonus: 0, minChance: 0, total: 0 }; var stats = { strength: setup.getTotalStat("strength"), dexterity: setup.getTotalStat("dexterity"), intelligence: setup.getTotalStat("intelligence"), charisma: setup.getTotalStat("charisma") }; var locationData = setup.crimeLocations[location]; if (locationData) { for (var i = 0; i < locationData.primaryStats.length; i++) { var stat = locationData.primaryStats[i]; var modifier = setup.calculateStatModifier(stat, stats[stat]); breakdown.statBonuses[stat + " (primary)"] = modifier; } for (var i = 0; i < locationData.secondaryStats.length; i++) { var stat = locationData.secondaryStats[i]; var modifier = Math.floor(setup.calculateStatModifier(stat, stats[stat]) / 2); breakdown.statBonuses[stat + " (secondary)"] = modifier; } breakdown.penalties -= Math.floor(locationData.patrolFrequency / 5); } if (v.timeOfDay === "Night" || v.timeOfDay === "Late Night") { breakdown.timeBonus = 20; // DOUBLED } // Individual trait bonuses - DOUBLED for (var trait in setup.theftBonusTraits) { if (v.physicalTraits.includes(trait) || v.mentalTraits.includes(trait)) { breakdown.traitBonuses += (setup.theftBonusTraits[trait] * 2); } } // Individual skill bonuses - DOUBLED for (var skill in setup.theftBonusSkills) { if (v.skills.includes(skill)) { breakdown.skillBonuses += (setup.theftBonusSkills[skill] * 2); } } // ===== SKILL TREE: Steal Bonus ===== breakdown.skillTreeBonus = setup.skillTree.getEffect("stealBonus"); // Moral trait penalties - HALVED for (var i = 0; i < setup.moralTraitsPenalty.length; i++) { if (v.physicalTraits.includes(setup.moralTraitsPenalty[i]) || v.mentalTraits.includes(setup.moralTraitsPenalty[i])) { breakdown.penalties -= 6; // HALVED from 12 } } if (v.physicalTraits.includes("Clumsy")) { breakdown.penalties -= 7.5; // HALVED from 15 } // Lucky/Unlucky modifiers - DOUBLED if (v.physicalTraits.includes("Lucky") || v.mentalTraits.includes("Lucky")) { breakdown.luckModifier = 20; // DOUBLED from 10 } if (v.physicalTraits.includes("Unlucky") || v.mentalTraits.includes("Unlucky")) { breakdown.luckModifier = -20; // DOUBLED from 10 } breakdown.heatPenalty = -Math.floor(v.crimeSystem.heatLevel / 10); // Slippery Scales artifact bonus if (v.currentArtifact === "The Slippery Scales") { breakdown.artifactBonus = 40; // +40% instead of doubling } // ===== BUFF/DEBUFF MODIFIERS ===== if (typeof setup.getDebuffEffect === 'function') { var debuffStealBreak = setup.getDebuffEffect("stealChance"); if (debuffStealBreak !== 0) breakdown.exhaustionPenalty = debuffStealBreak; } if (typeof setup.getBuffEffect === 'function') { var buffStealBreak = setup.getBuffEffect("stealChance"); if (buffStealBreak > 0) breakdown.wellRestedBonus = buffStealBreak; } // Werefox +20% stealing bonus if (v.physicalTraits.includes("Werefox")) { breakdown.werefoxBonus = 20; } // ===== SKILL TREE: Steal Min Chance ===== var skillTreeMinChance = setup.skillTree.getEffect("stealMinChance"); breakdown.minChance = skillTreeMinChance; if (v.currentArtifact === "The Slippery Scales") { breakdown.minChance = Math.max(breakdown.minChance, 10); } breakdown.total = breakdown.base + breakdown.timeBonus; for (var stat in breakdown.statBonuses) { breakdown.total += breakdown.statBonuses[stat]; } breakdown.total += breakdown.traitBonuses + breakdown.skillBonuses + breakdown.skillTreeBonus + breakdown.penalties + breakdown.heatPenalty + breakdown.luckModifier + breakdown.artifactBonus + breakdown.exhaustionPenalty + breakdown.wellRestedBonus + breakdown.werefoxBonus; breakdown.total = Math.max(breakdown.minChance, Math.min(95, breakdown.total)); return breakdown; }>> <<set setup.generateTheftTarget = function(location) { var locationData = setup.crimeLocations[location]; var quality = locationData.traitQuality; var target = { name: "", physicalTraits: [], mentalTraits: [], skills: [], bodyParts: { chest: "", butt: "", gender: "", genitals: "" }, appearance: { hairColor: "", hairLength: "", skinTone: "", age: "" } }; // Determine gender first (LOWERCASE to match game convention) var genders = ["male", "female"]; target.bodyParts.gender = genders[random(0, genders.length - 1)]; // Gender-appropriate names var maleNames = ["James", "Michael", "David", "John", "Robert", "William", "Richard", "Joseph", "Thomas", "Christopher", "Daniel", "Matthew", "Anthony", "Mark", "Donald", "Steven", "Paul", "Andrew", "Joshua", "Kenneth"]; var femaleNames = ["Mary", "Jennifer", "Linda", "Patricia", "Elizabeth", "Barbara", "Susan", "Jessica", "Sarah", "Karen", "Nancy", "Lisa", "Margaret", "Betty", "Sandra", "Ashley", "Dorothy", "Kimberly", "Emily", "Donna"]; var lastNames = ["Smith", "Johnson", "Williams", "Brown", "Jones", "Garcia", "Miller", "Davis", "Rodriguez", "Martinez", "Hernandez", "Lopez", "Gonzalez", "Wilson", "Anderson", "Thomas", "Taylor", "Moore", "Jackson", "Martin"]; if (target.bodyParts.gender === "male") { target.name = maleNames[random(0, maleNames.length - 1)] + " " + lastNames[random(0, lastNames.length - 1)]; } else { target.name = femaleNames[random(0, femaleNames.length - 1)] + " " + lastNames[random(0, lastNames.length - 1)]; } // Age - stored in appearance.age var ageRoll = random(1, 100); if (ageRoll <= 70) { target.appearance.age = "Adult"; } else { target.appearance.age = "Mature Adult"; } // Hair - stored in appearance (FIXED - lowercase hairLength) var hairColors = ["Black", "Brown", "Blonde", "Red", "Platinum Blonde"]; target.appearance.hairColor = hairColors[random(0, hairColors.length - 1)]; var hairLengths = ["short", "long"]; target.appearance.hairLength = hairLengths[random(0, hairLengths.length - 1)]; // Skin tone var skinTones = ["Pale", "Tan", "Dark"]; target.appearance.skinTone = skinTones[random(0, skinTones.length - 1)]; // Body parts - gender appropriate (LOWERCASE genitals to match game convention) if (target.bodyParts.gender === "male") { // Males: only flat masculine chest, masculine/flat butt, penis target.bodyParts.chest = "flat masculine"; var maleButtSizes = ["flat masculine", "flat", "small"]; target.bodyParts.butt = maleButtSizes[random(0, maleButtSizes.length - 1)]; target.bodyParts.genitals = "penis"; } else { // Females: no flat masculine chest, varied butt, vagina var femaleChestSizes = ["flat", "small", "medium", "large", "huge", "giant"]; var femaleButtSizes = ["flat", "small", "medium", "large", "huge", "giant"]; target.bodyParts.chest = femaleChestSizes[random(0, femaleChestSizes.length - 1)]; target.bodyParts.butt = femaleButtSizes[random(0, femaleButtSizes.length - 1)]; target.bodyParts.genitals = "vagina"; } // Gender-appropriate physical traits (REMOVED hair length traits - handled by body parts) var masculineTraits = ["Tall", "Muscular", "Fit", "Athletic Build", "Lean", "Stocky", "Broad-shouldered", "Strong", "Scarred", "Sharp Features"]; var feminineTraits = ["Attractive", "Curvy", "Voluptuous", "Petite", "Slim", "Graceful", "Youthful", "Fashionable", "Smooth Skin"]; var neutralTraits = ["Short", "Tattooed", "Pierced", "Freckled", "Plain", "Ugly", "Mature"]; var visiblePhysicalPool = []; if (target.bodyParts.gender === "male") { visiblePhysicalPool = masculineTraits.concat(neutralTraits); } else { visiblePhysicalPool = feminineTraits.concat(neutralTraits); } var numTraits = 0; if (quality === "low") { numTraits = random(1, 3); } else if (quality === "low-medium") { numTraits = random(2, 4); } else if (quality === "medium") { numTraits = random(3, 5); } else if (quality === "medium-high") { numTraits = random(4, 7); } else { numTraits = random(5, 8); } for (var i = 0; i < numTraits; i++) { if (visiblePhysicalPool.length > 0) { var idx = random(0, visiblePhysicalPool.length - 1); var trait = visiblePhysicalPool[idx]; var conflict = setup.getConflictingTrait(trait, target.physicalTraits); if (!conflict && !target.physicalTraits.includes(trait)) { if (!setup.unstealableTraits.includes(trait)) { target.physicalTraits.push(trait); } } visiblePhysicalPool.splice(idx, 1); } } var mentalPool = [ "Confident", "Shy", "Friendly", "Kind", "Bitchy", "Charming", "Awkward", "Intelligent", "Foolish", "Brave", "Cowardly", "Calm", "Short Tempered", "Dominant", "Submissive", "Extroverted", "Introverted", "Optimistic", "Pessimistic", "Hardworking", "Lazy", "Patient", "Impatient", "Honest", "Deceitful", "Sly", "Creative", "Analytical", "Energetic", "Loyal", "Ambitious", "Humble", "Arrogant" ]; var numMental = random(2, 5); for (var i = 0; i < numMental; i++) { if (mentalPool.length > 0) { var idx = random(0, mentalPool.length - 1); var trait = mentalPool[idx]; var conflict = setup.getConflictingTrait(trait, target.mentalTraits); if (!conflict && !target.mentalTraits.includes(trait)) { if (!setup.unstealableTraits.includes(trait)) { target.mentalTraits.push(trait); } } mentalPool.splice(idx, 1); } } var skillPool = Object.keys(setup.skillBonuses).filter(function(skill) { return !setup.unstealableTraits.includes(skill); }); var numSkills = random(1, 4); for (var i = 0; i < numSkills; i++) { if (skillPool.length > 0) { var idx = random(0, skillPool.length - 1); target.skills.push(skillPool[idx]); skillPool.splice(idx, 1); } } return target; }>> <<set setup.checkOfficerPatrol = function(location) { var v = State.variables; var locationData = setup.crimeLocations[location]; var patrolChance = locationData.patrolFrequency; patrolChance += Math.floor(v.crimeSystem.heatLevel / 5); if (v.timeOfDay === "Night" || v.timeOfDay === "Late Night") { patrolChance += 10; } var roll = random(1, 100); return roll <= patrolChance; }>> <<set setup.checkWitnesses = function(location) { var locationData = setup.crimeLocations[location]; var witnessChance = Math.floor(locationData.targetFrequency / 2); var roll = random(1, 100); return roll <= witnessChance; }>> <<set setup.calculateEscapeChance = function() { var v = State.variables; var baseChance = 25; var totalDex = setup.getTotalStat("dexterity"); var dexMod = setup.calculateStatModifier("dexterity", totalDex); baseChance += dexMod * 2; var totalStr = setup.getTotalStat("strength"); var strMod = setup.calculateStatModifier("strength", totalStr); baseChance += strMod; if (v.physicalTraits.includes("Fast") || v.physicalTraits.includes("Quick")) { baseChance += 15; } if (v.physicalTraits.includes("Athletic Build") || v.physicalTraits.includes("Fit")) { baseChance += 10; } if (v.skills.includes("Athletics")) { baseChance += 10; } if (v.physicalTraits.includes("Slow") || v.physicalTraits.includes("Clumsy")) { baseChance -= 20; } if (v.physicalTraits.includes("Overweight")) { baseChance -= 15; } // Lucky/Unlucky modifiers for escape if (v.physicalTraits.includes("Lucky") || v.mentalTraits.includes("Lucky")) { baseChance += 10; } if (v.physicalTraits.includes("Unlucky") || v.mentalTraits.includes("Unlucky")) { baseChance -= 10; } // Slippery Scales artifact bonus if (v.currentArtifact === "The Slippery Scales") { baseChance += 50; } return Math.max(5, Math.min(85, baseChance)); }>> <<set setup.decayCrimeHeat = function() { var v = State.variables; if (v.crimeSystem.heatLevel > 0) { v.crimeSystem.heatLevel = Math.max(0, v.crimeSystem.heatLevel - 2); } if (v.crimeSystem.heatLevel < 20) { v.crimeSystem.activeWarrant = false; } }>> <<set setup.checkAndDecayHeat = function() { var v = State.variables; // Initialize lastHeatDecayDay if it doesn't exist if (v.crimeSystem.lastHeatDecayDay === undefined) { v.crimeSystem.lastHeatDecayDay = v.dayNumber; } // Check if a full day has passed since last decay if (v.dayNumber > v.crimeSystem.lastHeatDecayDay) { var daysPassed = v.dayNumber - v.crimeSystem.lastHeatDecayDay; // Decay heat for each day that passed for (var i = 0; i < daysPassed; i++) { if (v.crimeSystem.heatLevel > 0) { // Base decay: 5 points per day var decayAmount = 5; // ===== SKILL TREE: Heat Decay Bonus ===== var skillTreeHeatDecay = setup.skillTree.getEffect("heatDecay"); if (skillTreeHeatDecay > 0) { decayAmount += skillTreeHeatDecay; } v.crimeSystem.heatLevel = Math.max(0, v.crimeSystem.heatLevel - decayAmount); } } // Update last decay day v.crimeSystem.lastHeatDecayDay = v.dayNumber; // Clear warrant if heat is low enough if (v.crimeSystem.heatLevel < 20) { v.crimeSystem.activeWarrant = false; } } }>> <<set setup.attemptScannerTheft = function() { var v = State.variables; var baseChance = 2; var totalDex = setup.getTotalStat("dexterity"); if (totalDex >= 30) baseChance += 10; if (totalDex >= 50) baseChance += 10; if (v.skills.includes("Lock Picking")) baseChance += 10; if (v.skills.includes("Stealth")) baseChance += 10; if (v.physicalTraits.includes("Sly") || v.mentalTraits.includes("Sly")) baseChance += 5; if (v.physicalTraits.includes("Quick Reflexes")) baseChance += 8; // Lucky/Unlucky modifiers if (v.physicalTraits.includes("Lucky") || v.mentalTraits.includes("Lucky") || v.physicalTraits.includes("Hellhound")) baseChance += 10; if (v.physicalTraits.includes("Unlucky") || v.mentalTraits.includes("Unlucky")) baseChance -= 10; return Math.max(2, Math.min(85, baseChance)); }>> <<set setup.getTraitValueModifier = function(traitName, bodyPartValue) { var traitValue; // If bodyPartValue is provided, use it directly (for body parts) if (bodyPartValue !== undefined && bodyPartValue !== null) { traitValue = bodyPartValue; } else { // Use the existing getTraitValue function - try different types traitValue = setup.getTraitValue('physical', traitName); // If it returned a default value, try mental if (traitValue === 15) { traitValue = setup.getTraitValue('mental', traitName); } // If still default, try skill if (traitValue === 15) { traitValue = setup.getTraitValue('skill', traitName); } } var modifier = 0; if (traitValue < 0) { // Negative traits are EASIER to steal (bonus) - ORIGINAL FORMULA modifier = Math.abs(traitValue); } else if (traitValue >= 0 && traitValue <= 10) { // Low value traits - no modifier modifier = 0; } else if (traitValue >= 11 && traitValue <= 25) { // Medium value traits - small penalty - ORIGINAL FORMULA modifier = -Math.floor((traitValue - 10) / 3); } else if (traitValue >= 26 && traitValue <= 50) { // High value traits - moderate penalty - ORIGINAL FORMULA modifier = -10 - Math.floor((traitValue - 25) / 2.5); } else { // Very high value traits (50+) - larger penalty - ORIGINAL FORMULA modifier = -20 - Math.floor((traitValue - 50) / 3.5); } return modifier; }>> <<set setup.calculateIndividualTraitStealChance = function(traitName, bodyPartValue, baseChance) { var v = State.variables; // Start with base chance from location calculation if not provided if (baseChance === undefined) { baseChance = setup.calculateTheftChance(v.currentCrimeLocation); } // Get the trait value modifier (penalties for high-value traits - ORIGINAL penalties) var modifier = setup.getTraitValueModifier(traitName, bodyPartValue); // Calculate final chance var finalChance = baseChance + modifier; // Determine minimum chance var minChance = 0; // Default minimum is 0% // ===== SKILL TREE: Steal Min Chance ===== var skillTreeMinChance = setup.skillTree.getEffect("stealMinChance"); if (skillTreeMinChance > 0) { minChance = Math.max(minChance, skillTreeMinChance); } // Slippery Scales artifact sets minimum to 10% if (v.currentArtifact === "The Slippery Scales") { minChance = Math.max(minChance, 10); } return Math.max(minChance, Math.min(95, finalChance)); }>> <<set setup.canSeeAllTraits = function() { var v = State.variables; // Can see all traits if: have Sunfish trait, have trait scanner, OR have Slippery Scales artifact return v.skills.includes("Sunfish") || v.traitScanner === true || v.currentArtifact === "The Slippery Scales"; }>> <<set setup.jailTraitGain = [ "Punctual", "Underweight", "Weak", "Disciplined", "Honest", "Calm", "Patient", "Paranoid", "Overthinker", "Stubborn", "Submissive", "Cowardly", "Dull", "Obsessive", "Unskilled", "Unlucky", "Unreliable" ]>> <<set setup.jailTraitLoss = [ "Sly", "Deceitful", "Crafty", "Cunning", "Stealthy", "Fast", "Quick", "Cruel", "Cold" ]>> <<set setup.processJailTraitChange = function() { var v = State.variables; var temp = State.temporary; if (!temp.jailTraitsGained) temp.jailTraitsGained = []; if (!temp.jailTraitsLost) temp.jailTraitsLost = []; if (!temp.jailTraitsReplaced) temp.jailTraitsReplaced = []; if (!temp.daysServedTotal) temp.daysServedTotal = 0; temp.daysServedTotal = v.jailSystem.daysServed; // Calculate chance based on days served (increases each day) var baseChance = Math.min(15 + (v.jailSystem.daysServed * 5), 60); // Chance to LOSE negative traits if (random(1, 100) <= baseChance) { var lossableTraits = setup.jailTraitLoss.filter(function(trait) { return v.physicalTraits.includes(trait) || v.mentalTraits.includes(trait); }); if (lossableTraits.length > 0) { var traitToLose = lossableTraits[random(0, lossableTraits.length - 1)]; // Remove from appropriate array if (v.physicalTraits.includes(traitToLose)) { v.physicalTraits.delete(traitToLose); } else if (v.mentalTraits.includes(traitToLose)) { v.mentalTraits.delete(traitToLose); } temp.jailTraitsLost.push(traitToLose); } } // Chance to GAIN or REPLACE traits if (random(1, 100) <= baseChance) { var gainableMentalTraits = setup.jailTraitGain.filter(function(trait) { return !v.mentalTraits.includes(trait) && !v.physicalTraits.includes(trait); }); var gainablePhysicalTraits = setup.jailTraitGain.filter(function(trait) { return !v.physicalTraits.includes(trait) && !v.mentalTraits.includes(trait) && (trait === "Underweight" || trait === "Weak"); }); // Combine all gainable traits var allGainable = gainableMentalTraits.concat(gainablePhysicalTraits); if (allGainable.length > 0) { var newTrait = allGainable[random(0, allGainable.length - 1)]; // Check if it conflicts with existing trait (for mutually exclusive pairs) var conflictingTrait = setup.getConflictingTrait(newTrait, v.mentalTraits.concat(v.physicalTraits)); if (conflictingTrait) { // REPLACE the conflicting trait if (v.physicalTraits.includes(conflictingTrait)) { v.physicalTraits.delete(conflictingTrait); } else if (v.mentalTraits.includes(conflictingTrait)) { v.mentalTraits.delete(conflictingTrait); } // Add the new trait to appropriate array if (["Underweight", "Weak"].includes(newTrait)) { v.physicalTraits.push(newTrait); } else { v.mentalTraits.push(newTrait); } temp.jailTraitsReplaced.push({old: conflictingTrait, new: newTrait}); } else { // GAIN the trait (no conflict) if (["Underweight", "Weak"].includes(newTrait)) { v.physicalTraits.push(newTrait); } else { v.mentalTraits.push(newTrait); } temp.jailTraitsGained.push(newTrait); } } } }>> <<set setup.canTradeCriminalJob = function() { var v = State.variables; // Cannot trade Criminal job if you have crimes committed if (!v.jobs || v.jobs.length === 0) return true; return !v.jobs.includes("Criminal") || v.crimeSystem.crimesCommitted === 0; }>>
<<widget "crimeOption">> <<set _currentLoc = $args[0]>> <<set _canSteal = setup.canPlayerSteal()>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin: 25px 0; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">🦹 Criminal Activity</h2> <<if !_canSteal.canSteal>> <div style="background: #3a3a3a; padding: 15px; border-radius: 8px; border-left: 4px solid #95a5a6;"> <p style="color: #bdc3c7; margin: 0; font-style: italic;">_canSteal.reason</p> </div> <<else>> <<set _locationData = setup.crimeLocations[_currentLoc]>> <<set _breakdown = setup.getTheftStatBreakdown(_currentLoc)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ccc; margin: 0 0 10px 0;">Scout this area for potential targets to steal traits from.</p> <div style="background: #2a2a2a; padding: 10px; border-radius: 5px; margin-bottom: 10px;"> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><b>Target Frequency:</b> <span style="color: #51cf66;">_locationData.targetFrequency%</span></p> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><b>Patrol Risk:</b> <span style="color: #ff6b6b;">_locationData.patrolFrequency%</span></p> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><b>Your Success Rate:</b> <span style="color: <<if _breakdown.total >= 70>>#2ecc71<<elseif _breakdown.total >= 40>>#f39c12<<else>>#e74c3c<</if>>;">_breakdown.total%</span></p> <<if _breakdown.wellRestedBonus > 0>> <p style="color: #51cf66; font-size: 12px; margin: 3px 0 3px 15px;">😴 Well Rested: +<<print _breakdown.wellRestedBonus>>%</p> <</if>> <<if _breakdown.exhaustionPenalty < 0>> <p style="color: #ff6b6b; font-size: 12px; margin: 3px 0 3px 15px;">Exhaustion: <<print _breakdown.exhaustionPenalty>>%</p> <</if>> <<if _breakdown.werefoxBonus > 0>> <p style="color: #ff9800; font-size: 12px; margin: 3px 0 3px 15px;">✓ Werefox: +<<print _breakdown.werefoxBonus>>%</p> <</if>> </div> <<if $crimeSystem.heatLevel >= 50>> <p style="color: #ff6b6b; font-size: 13px; margin: 10px 0; font-weight: bold;">⚠️ High heat level! Police are actively searching this area.</p> <</if>> <<if $traitScanner>> <p style="color: #3498db; font-size: 13px; margin: 5px 0;">✓ Trait Scanner active - you can see all traits</p> <<elseif $physicalTraits.includes("Sunfish") || $mentalTraits.includes("Sunfish")>> <p style="color: #3498db; font-size: 13px; margin: 5px 0;">✓ Sunfish perception - you can see all traits</p> <<else>> <p style="color: #888; font-size: 13px; margin: 5px 0;">⚠️ Without a scanner, you can only see physical appearance</p> <</if>> </div> <<if $job && $job !== "Unemployed" && $job !== "Criminal">> <<link "<div style='background: #e74c3c; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🎯 Scout for Targets</div>">> <<popover 'noclick'>> <div style="padding: 25px; background: #1a1a1a; border-radius: 10px; max-width: 500px;"> <h2 style="color: #ff6b6b; margin-top: 0; text-align: center;">⚠️ WARNING</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border-left: 4px solid #ff6b6b; margin-bottom: 20px;"> <p style="color: #fff; margin: 0 0 10px 0; font-weight: bold;">You are currently employed as: <span style="color: #51cf66;">$job</span></p> <p style="color: #ff6b6b; margin: 0; font-size: 15px;">If you are <b>caught stealing</b> by police, you will:</p> <ul style="color: #ccc; margin: 10px 0;"> <li>Lose your current job immediately</li> <li>Be forced into the "Criminal" career path</li> <li>Face fines and possible jail time</li> <li>Gain a criminal record</li> </ul> </div> <p style="color: #aaa; text-align: center; margin-bottom: 20px; font-style: italic;">Are you sure you want to risk your employment?</p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='background: #e74c3c; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; text-align: center;'>Yes, Take the Risk</div>">> <<set $currentCrimeLocation = _currentLoc>> <<run Dialog.close()>> <<goto "ScoutForTarget">> <</link>> <<link "<div style='background: #95a5a6; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; text-align: center;'>No, Stay Safe</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> <<else>> <<link "<div style='background: #e74c3c; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🎯 Scout for Targets</div>">> <<set $currentCrimeLocation = _currentLoc>> <<goto "ScoutForTarget">> <</link>> <</if>> <</if>> </div> <</widget>>
<<nobr>> /* Advance time for searching */ <<run advanceTime(random(10, 30))>> <<set _location = setup.crimeLocations[$currentCrimeLocation]>> <<set _targetChance = _location.targetFrequency>> /* Apply night bonus/penalty */ <<if $timeOfDay === "Night" || $timeOfDay === "Late Night">> <<set _targetChance += _location.nightBonus>> <</if>> /* 3% chance to encounter an officer */ <<set _officerEncounter = random(1, 100) <= 3>> <<if _officerEncounter>> /* Encountered an officer! */ <<goto "OfficerEncounterScout">> <<else>> <<set _foundTarget = random(1, 100) <= _targetChance>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🔍 Scouting for Targets</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">_location.name</h2> <<if _foundTarget>> <<set $currentTarget = setup.generateTheftTarget($currentCrimeLocation)>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #2ecc71;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0; font-size: 18px;">🎯 Target Found</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Name:</b> $currentTarget.name</p> <p style="margin: 5px 0; font-size: 15px;"><b>Age:</b> $currentTarget.appearance.age</p> <div style="background: #1a1a1a; padding: 10px; border-radius: 5px; margin-top: 10px;"> <h4 style="color: #3498db; margin: 0 0 8px 0; font-size: 15px;">Physical Attributes:</h4> <p style="margin: 3px 0; font-size: 14px;"><b>Chest:</b> $currentTarget.bodyParts.chest</p> <p style="margin: 3px 0; font-size: 14px;"><b>Butt:</b> $currentTarget.bodyParts.butt</p> <p style="margin: 3px 0; font-size: 14px;"><b>Hair Color:</b> $currentTarget.appearance.hairColor</p> <p style="margin: 3px 0; font-size: 14px;"><b>Hair Length:</b> $currentTarget.appearance.hairLength</p> <p style="margin: 3px 0; font-size: 14px;"><b>Skin Tone:</b> $currentTarget.appearance.skinTone</p> <p style="margin: 3px 0; font-size: 14px;"><b>Gender:</b> $currentTarget.bodyParts.gender</p> <p style="margin: 3px 0; font-size: 14px;"><b>Genitals:</b> $currentTarget.bodyParts.genitals</p> </div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h4 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Visible Physical Traits:</h4> <<if $currentTarget.physicalTraits.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 5px;"> <<for _trait range $currentTarget.physicalTraits>> <div style="background: #2a2a2a; padding: 8px 10px; border-radius: 3px; border-left: 2px solid #e74c3c; font-size: 14px;"> _trait </div> <</for>> </div> <<else>> <p style="color: #888; font-style: italic; margin: 0; font-size: 14px;">No notable physical traits</p> <</if>> <<if setup.canSeeAllTraits()>> <div style="background: #1e3a5f; padding: 12px; border-radius: 5px; margin-top: 10px; border: 2px solid #3498db;"> <h4 style="color: #3498db; margin: 0 0 10px 0; font-size: 16px;">🔍 Scanner Data - Mental Traits:</h4> <<if $currentTarget.mentalTraits.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 5px;"> <<for _trait range $currentTarget.mentalTraits>> <div style="background: #2c4a6f; padding: 8px 10px; border-radius: 3px; border-left: 2px solid #3498db; font-size: 14px;"> _trait </div> <</for>> </div> <<else>> <p style="color: #888; font-style: italic; margin: 0; font-size: 14px;">No notable mental traits</p> <</if>> <h4 style="color: #3498db; margin: 10px 0 10px 0; font-size: 16px;">🔍 Scanner Data - Skills:</h4> <<if $currentTarget.skills.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 5px;"> <<for _skill range $currentTarget.skills>> <div style="background: #2c4a6f; padding: 8px 10px; border-radius: 3px; border-left: 2px solid #3498db; font-size: 14px;"> _skill </div> <</for>> </div> <<else>> <p style="color: #888; font-style: italic; margin: 0; font-size: 14px;">No notable skills</p> <</if>> </div> <<else>> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0; font-style: italic; text-align: center;">⚠️ Mental traits and skills hidden - Trait Scanner required</p> <</if>> </div> <div style="text-align: center; margin: 15px 0;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>🎯 Attempt Theft</div>">> <<goto "SelectTraitToSteal">> <</link>> </div> <div style="text-align: center; margin-top: 10px;"> <<link "<div style='display: inline-block; background: #95a5a6; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 15px;'>Look for Another Target</div>">> <<goto "ScoutForTarget">> <</link>> </div> <<else>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 15px;"> <p style="color: #ccc; margin: 0 0 10px 0; font-size: 15px;">You spend time searching the area, but find no suitable targets...</p> <p style="color: #888; font-size: 14px; margin: 0; font-style: italic;">Target chance was _targetChance%</p> </div> <div style="text-align: center; margin: 15px 0;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Keep Searching</div>">> <<goto "ScoutForTarget">> <</link>> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 15px;'>← Give Up and Leave</div>">> <<goto "CrimeHub">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _baseChance = setup.calculateTheftChance($currentCrimeLocation)>> /* ===== Determine minimum chance ===== */ <<set _minChance = 0>> <<set _skillTreeMinChance = setup.skillTree.getEffect("stealMinChance")>> <<if _skillTreeMinChance > 0>> <<set _minChance = Math.max(_minChance, _skillTreeMinChance)>> <</if>> <<if $currentArtifact === "The Slippery Scales">> <<set _minChance = Math.max(_minChance, 10)>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🎯 Select Trait to Steal</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Target: $currentTarget.name</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #667eea;"> <p style="color: #ccc; margin: 0 0 5px 0; font-size: 15px;"><b>Base Success Rate:</b> <span style="color: <<if _baseChance >= 50>>#2ecc71<<elseif _baseChance >= 25>>#f39c12<<else>>#ff6b6b<</if>>;">_baseChance%</span></p> <p style="color: #888; margin: 0; font-size: 13px; font-style: italic;">Trait/size value affects final odds</p> <<if _minChance > 0>> <p style="color: #9C27B0; margin: 5px 0 0 0; font-size: 13px;">⭐ Minimum chance: _minChance%</p> <</if>> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ccc; margin: 0; font-size: 15px; text-align: center;"> Choose ONE thing to steal. You can swap body parts or conflicting traits. </p> </div> <!-- BODY PARTS SECTION --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #3498db; margin: 0 0 12px 0; font-size: 18px;">Physical Attributes (Swappable):</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px;"> <!-- Chest --> <<set _targetChestValue = setup.getTraitValue('bodyPart', 'chest', $currentTarget.bodyParts.chest)>> <<set _chestModifier = setup.getTraitValueModifier('chest', _targetChestValue)>> <<set _chestFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _chestModifier))>> <<set _sameChest = ($bodyParts.chest === $currentTarget.bodyParts.chest)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameChest>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Chest Size</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.bodyParts.chest</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $bodyParts.chest</p> <<if !_sameChest>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _targetChestValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _chestFinalChance >= 70>>#2ecc71<<elseif _chestFinalChance >= 50>>#51cf66<<elseif _chestFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_chestFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameChest>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Size</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Chest</div>">> <<set $selectedTrait = "chest">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Butt --> <<set _targetButtValue = setup.getTraitValue('bodyPart', 'butt', $currentTarget.bodyParts.butt)>> <<set _buttModifier = setup.getTraitValueModifier('butt', _targetButtValue)>> <<set _buttFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _buttModifier))>> <<set _sameButt = ($bodyParts.butt === $currentTarget.bodyParts.butt)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameButt>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Butt Size</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.bodyParts.butt</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $bodyParts.butt</p> <<if !_sameButt>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _targetButtValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _buttFinalChance >= 70>>#2ecc71<<elseif _buttFinalChance >= 50>>#51cf66<<elseif _buttFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_buttFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameButt>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Size</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Butt</div>">> <<set $selectedTrait = "butt">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Hair Color --> <<set _hairColorValue = setup.getTraitValue('bodyPart', 'hairColor')>> <<set _hairColorModifier = setup.getTraitValueModifier('hairColor', _hairColorValue)>> <<set _hairFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _hairColorModifier))>> <<set _sameHairColor = ($appearance.hairColor === $currentTarget.appearance.hairColor)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameHairColor>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Hair Color</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.appearance.hairColor</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $appearance.hairColor</p> <<if !_sameHairColor>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _hairColorValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _hairFinalChance >= 70>>#2ecc71<<elseif _hairFinalChance >= 50>>#51cf66<<elseif _hairFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_hairFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameHairColor>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Color</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Hair Color</div>">> <<set $selectedTrait = "hairColor">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Hair Length --> <<set _hairLengthValue = setup.getTraitValue('bodyPart', 'hairLength')>> <<set _hairLengthModifier = setup.getTraitValueModifier('hairLength', _hairLengthValue)>> <<set _hairLengthFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _hairLengthModifier))>> <<set _sameHairLength = ($appearance.hairLength === $currentTarget.appearance.hairLength)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameHairLength>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Hair Length</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.appearance.hairLength</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $appearance.hairLength</p> <<if !_sameHairLength>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _hairLengthValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _hairLengthFinalChance >= 70>>#2ecc71<<elseif _hairLengthFinalChance >= 50>>#51cf66<<elseif _hairLengthFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_hairLengthFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameHairLength>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Length</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Hair Length</div>">> <<set $selectedTrait = "hairLength">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Skin Tone --> <<set _skinToneValue = setup.getTraitValue('bodyPart', 'skinTone')>> <<set _skinToneModifier = setup.getTraitValueModifier('skinTone', _skinToneValue)>> <<set _skinToneFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _skinToneModifier))>> <<set _sameSkinTone = ($appearance.skinTone === $currentTarget.appearance.skinTone)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameSkinTone>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Skin Tone</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.appearance.skinTone</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $appearance.skinTone</p> <<if !_sameSkinTone>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _skinToneValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _skinToneFinalChance >= 70>>#2ecc71<<elseif _skinToneFinalChance >= 50>>#51cf66<<elseif _skinToneFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_skinToneFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameSkinTone>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Tone</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Skin Tone</div>">> <<set $selectedTrait = "skinTone">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Gender --> <<set _genderValue = setup.getTraitValue('bodyPart', 'gender')>> <<set _genderModifier = setup.getTraitValueModifier('gender', _genderValue)>> <<set _genderFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _genderModifier))>> <<set _sameGender = ($bodyParts.gender === $currentTarget.bodyParts.gender)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameGender>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Gender</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.bodyParts.gender</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $bodyParts.gender</p> <<if !_sameGender>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _genderValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _genderFinalChance >= 70>>#2ecc71<<elseif _genderFinalChance >= 50>>#51cf66<<elseif _genderFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_genderFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameGender>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Gender</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Gender</div>">> <<set $selectedTrait = "gender">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Genitals --> <<set _genitalsValue = setup.getTraitValue('bodyPart', 'genitals', $currentTarget.bodyParts.genitals)>> <<set _genitalsModifier = setup.getTraitValueModifier('genitals', _genitalsValue)>> <<set _genitalsFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _genitalsModifier))>> <<set _sameGenitals = ($bodyParts.genitals === $currentTarget.bodyParts.genitals)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameGenitals>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Genitals</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.bodyParts.genitals</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> $bodyParts.genitals</p> <<if !_sameGenitals>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _genitalsValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _genitalsFinalChance >= 70>>#2ecc71<<elseif _genitalsFinalChance >= 50>>#51cf66<<elseif _genitalsFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_genitalsFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameGenitals>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Genitals</div>">> <<set $selectedTrait = "genitals">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <!-- Age --> <<set _ageValue = setup.getTraitValue('bodyPart', 'age')>> <<set _ageModifier = setup.getTraitValueModifier('age', _ageValue)>> <<set _ageFinalChance = Math.max(_minChance, Math.min(95, _baseChance + _ageModifier))>> <<set _sameAge = ($appearance.age === $currentTarget.appearance.age)>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _sameAge>>#95a5a6<<else>>#3498db<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;">Age</p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Target's:</b> $currentTarget.appearance.age</p> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Your's:</b> <<print $appearance.age || "Adult">></p> <<if !_sameAge>> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> _ageValue</p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _ageFinalChance >= 70>>#2ecc71<<elseif _ageFinalChance >= 50>>#51cf66<<elseif _ageFinalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;">_ageFinalChance%</span></p> <<else>> <p style="margin: 0; font-size: 13px; color: #888; font-style: italic;">Already the same</p> <</if>> </div> <<if _sameAge>> <div style='background: #95a5a6; color: #666; padding: 8px 12px; border-radius: 4px; text-align: center; font-size: 14px; font-weight: bold;'>Already Same Age</div> <<else>> <<link "<div style='background: #3498db; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Swap Age</div>">> <<set $selectedTrait = "age">> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> </div> </div> <!-- TRAITS SECTION --> <<set _allTraits = []>> <<set _allTraits = _allTraits.concat($currentTarget.physicalTraits)>> <<if $traitScanner || $physicalTraits.includes("Sunfish") || $mentalTraits.includes("Sunfish") || $currentArtifact === "The Slippery Scales">> <<set _allTraits = _allTraits.concat($currentTarget.mentalTraits)>> <<set _allTraits = _allTraits.concat($currentTarget.skills)>> <</if>> <<if _allTraits.length > 0>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 12px 0; font-size: 18px;">Available Traits & Skills:</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px;"> <<for _i = 0; _i < _allTraits.length; _i++>> <<set _trait = _allTraits[_i]>> /* Skip hair length traits since hair length is a body part option */ <<set _isHairLengthTrait = (_trait === "Long Hair" || _trait === "Short Hair")>> /* Check if player already has this exact trait */ <<set _playerHasExact = $physicalTraits.includes(_trait) || $mentalTraits.includes(_trait) || $skills.includes(_trait)>> /* Check if trait is blocked by current transformation */ <<set _blockedByTransform = setup.isTraitBlockedByTransformation && (setup.isTraitBlockedByTransformation(_trait, "physical") || setup.isTraitBlockedByTransformation(_trait, "mental"))>> /* Only show if player doesn't already have it, it's not a hair length trait, it's not blacklisted, and not blocked by transformation */ <<if !_playerHasExact && !_isHairLengthTrait && !setup.unstealableTraits.includes(_trait) && !_blockedByTransform>> /* Check for conflicts with player's traits */ <<set _playerAllTraits = $physicalTraits.concat($mentalTraits)>> <<set _conflict = setup.getConflictingTrait(_trait, _playerAllTraits)>> /* Get trait value and success chance */ <<set _traitModifier = setup.getTraitValueModifier(_trait)>> <<set _finalChance = Math.max(_minChance, Math.min(95, _baseChance + _traitModifier))>> <<set _traitValue = setup.getTraitValue('physical', _trait)>> <<if _traitValue === 15>> <<set _traitValue = setup.getTraitValue('mental', _trait)>> <</if>> <<if _traitValue === 15>> <<set _traitValue = setup.getTraitValue('skill', _trait)>> <</if>> /* Check for theft bonuses */ <<set _bonusPercent = 0>> <<if setup.theftBonusTraits && setup.theftBonusTraits[_trait]>> <<set _bonusPercent = setup.theftBonusTraits[_trait]>> <<elseif setup.theftBonusSkills && setup.theftBonusSkills[_trait]>> <<set _bonusPercent = setup.theftBonusSkills[_trait]>> <</if>> /* CRITICAL: Capture ALL variables used in this iteration */ <<capture _trait, _conflict, _traitValue, _finalChance, _bonusPercent>> <div style="background: #2a2a2a; padding: 12px; border-radius: 5px; border-left: 3px solid <<if _conflict>>#f39c12<<else>>#e74c3c<</if>>;"> <p style="margin: 0 0 8px 0; font-weight: bold; font-size: 15px; color: #fff;"> <<print _trait>> <<if _bonusPercent > 0>> <span style="color: #2ecc71; font-size: 12px;">(+<<print _bonusPercent>>% crime)</span> <</if>> </p> <div style="background: #1a1a1a; padding: 6px; border-radius: 3px; margin-bottom: 8px;"> <p style="margin: 0 0 3px 0; font-size: 13px; color: #aaa;"><b>Value:</b> <span style="color: <<if _traitValue < 0>>#ff6b6b<<elseif _traitValue <= 10>>#95a5a6<<elseif _traitValue <= 25>>#f39c12<<else>>#2ecc71<</if>>;"><<print _traitValue>></span></p> <p style="margin: 0; font-size: 14px; font-weight: bold;"><b>Success:</b> <span style="color: <<if _finalChance >= 70>>#2ecc71<<elseif _finalChance >= 50>>#51cf66<<elseif _finalChance >= 30>>#f39c12<<else>>#ff6b6b<</if>>;"><<print _finalChance>>%</span></p> </div> <<if _conflict>> <p style="margin: 0 0 8px 0; font-size: 13px; color: #f39c12;"> ⚠️ Will replace your: <b><<print _conflict>></b> </p> <<set _swapButtonText = "Swap for " + _conflict>> <<link "<div style='background: #f39c12; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>_swapButtonText</div>">> <<set $selectedTrait = _trait>> <<set $swappingTrait = _conflict>> <<goto "AttemptTraitTheft">> <</link>> <<else>> <<link "<div style='background: #e74c3c; color: white; padding: 8px 12px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 14px; font-weight: bold;'>Steal This</div>">> <<set $selectedTrait = _trait>> <<set $swappingTrait = null>> <<goto "AttemptTraitTheft">> <</link>> <</if>> </div> <</capture>> <</if>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 15px;"> <p style="color: #888; margin: 0; font-style: italic; font-size: 15px;">No additional traits available to steal from this target.</p> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #95a5a6; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 15px;'>← Back to Target</div>">> <<goto "ScoutForTarget">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _successChance = setup.calculateTheftChance($currentCrimeLocation)>> /* Check if stealing body part or trait */ <<set _isBodyPart = ["chest", "butt", "hairColor", "gender", "genitals", "ageCategory"].includes($selectedTrait)>> <<if _isBodyPart>> /* Get body part value based on type */ <<if $selectedTrait === "chest">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'chest', $currentTarget.bodyParts.chest)>> <<elseif $selectedTrait === "butt">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'butt', $currentTarget.bodyParts.butt)>> <<elseif $selectedTrait === "hairColor">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'hairColor')>> <<elseif $selectedTrait === "hairLength">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'hairLength')>> <<elseif $selectedTrait === "skinTone">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'skinTone')>> <<elseif $selectedTrait === "gender">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'gender')>> <<elseif $selectedTrait === "genitals">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'genitals', $currentTarget.bodyParts.genitals)>> <<elseif $selectedTrait === "age" || $selectedTrait === "ageCategory">> <<set _bodyPartValue = setup.getTraitValue('bodyPart', 'age')>> <<else>> <<set _bodyPartValue = 15>> <</if>> <<set _traitValueModifier = setup.getTraitValueModifier($selectedTrait, _bodyPartValue)>> <<else>> /* Regular trait - get modifier */ <<set _traitValueModifier = setup.getTraitValueModifier($selectedTrait)>> <</if>> <<set _successChance += _traitValueModifier>> /* ===== Determine minimum chance ===== */ <<set _minChance = 0>> /* ===== SKILL TREE: Steal Min Chance ===== */ <<set _skillTreeMinChance = setup.skillTree.getEffect("stealMinChance")>> <<if _skillTreeMinChance > 0>> <<set _minChance = Math.max(_minChance, _skillTreeMinChance)>> <</if>> /* Slippery Scales artifact sets minimum to 10% */ <<if $currentArtifact === "The Slippery Scales">> <<set _minChance = Math.max(_minChance, 10)>> <</if>> <<set _successChance = Math.max(_minChance, Math.min(95, _successChance))>> <<set _roll = random(1, 100)>> <<set _success = _roll <= _successChance>> <<run advanceTime(random(15, 45))>> <<if _success>> <<set _witnessed = setup.checkWitnesses($currentCrimeLocation)>> <<set _policeShown = false>> <<if _witnessed>> <<set $crimeSystem.witnessedCrimes += 1>> <<set _policeShown = setup.checkOfficerPatrol($currentCrimeLocation)>> <</if>> <<if _policeShown>> <<goto "CaughtByPolice">> <<else>> <<goto "TraitTheftSuccess">> <</if>> <<else>> <<set $crimeSystem.failedThefts += 1>> <<set $crimeSystem.totalThefts += 1>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 10)>> <<set _policeShown = setup.checkOfficerPatrol($currentCrimeLocation)>> <<if _policeShown>> <<goto "CaughtByPolice">> <</if>> <</if>> <<if !_isBodyPart>> <<set _traitValue = setup.getTraitValue('physical', $selectedTrait)>> <<if _traitValue === 15>> <<set _traitValue = setup.getTraitValue('mental', $selectedTrait)>> <</if>> <<if _traitValue === 15>> <<set _traitValue = setup.getTraitValue('skill', $selectedTrait)>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🎯 Theft Failed</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Target: $currentTarget.name</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 18px;">Attempt Details</h3> <<if _isBodyPart>> <p style="margin: 5px 0; font-size: 15px;"><b>Attempted to Steal:</b> <<if $selectedTrait === "chest">>Chest Size <<elseif $selectedTrait === "butt">>Butt Size <<elseif $selectedTrait === "hairColor">>Hair Color <<elseif $selectedTrait === "gender">>Gender <<elseif $selectedTrait === "genitals">>Genitals <<elseif $selectedTrait === "ageCategory">>Age Category <</if>> </p> <<else>> <p style="margin: 5px 0; font-size: 15px;"><b>Attempted to Steal:</b> $selectedTrait</p> <</if>> <<if $swappingTrait>> <p style="margin: 5px 0; font-size: 15px; color: #f39c12;"><b>Swapping for:</b> $swappingTrait</p> <</if>> <<if !_isBodyPart && _traitValue !== undefined>> <p style="margin: 5px 0; font-size: 15px;"><b>Trait Value:</b> <span style="color: <<if _traitValue < 0>>#ff6b6b<<elseif _traitValue <= 10>>#95a5a6<<elseif _traitValue <= 25>>#f39c12<<else>>#2ecc71<</if>>;">_traitValue</span></p> <p style="margin: 5px 0; font-size: 15px;"><b>Difficulty Modifier:</b> <span style="color: <<if _traitValueModifier > 0>>#2ecc71<<elseif _traitValueModifier < 0>>#ff6b6b<<else>>#95a5a6<</if>>;"><<if _traitValueModifier > 0>>+<</if>>_traitValueModifier% <<if _traitValue < 0>>(Easier)<<elseif _traitValue <= 10>>(Normal)<<elseif _traitValue <= 25>>(Hard)<<elseif _traitValue <= 50>>(Very Hard)<<else>>(Extremely Hard)<</if>></span></p> <</if>> <p style="margin: 5px 0; font-size: 15px;"><b>Success Chance:</b> <span style="color: <<if _successChance >= 50>>#2ecc71<<elseif _successChance >= 25>>#f39c12<<else>>#ff6b6b<</if>>;">_successChance%</span> <<if _minChance > 0>> <span style="color: #9C27B0; font-size: 13px;">(min: _minChance%)</span> <</if>> </p> <p style="margin: 5px 0; font-size: 15px;"><b>Your Roll:</b> _roll</p> </div> <div style="background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); color: white; padding: 12px; border-radius: 5px; margin-bottom: 15px; font-weight: bold; text-align: center; font-size: 15px;"> ✗ ATTEMPT FAILED! </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ccc; margin: 0 0 10px 0; font-size: 15px;">Your attempt failed! The target noticed something was off and moved away before you could complete the theft.</p> <<if !_isBodyPart && _traitValue !== undefined && _traitValue > 25>> <p style="color: #f39c12; margin: 0; font-size: 14px; font-style: italic;">The trait was too valuable and well-protected to steal easily...</p> <</if>> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #ff6b6b;"> <p style="color: #ff6b6b; margin: 0; font-size: 15px;"><b>Heat Level:</b> +10% (Now: $crimeSystem.heatLevel%)</p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>← Leave the Area</div>">> <<goto "CrimeHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Apply the theft */ <<set $crimeSystem.successfulThefts += 1>> <<set $crimeSystem.totalThefts += 1>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 5)>> /* Achievement for stealing a trait successfully */ <<run setup.achievements.unlock("steal_trait_success")>> /* ===== SKILL TREE: Steal Money Bonus ===== */ <<set _stealMoneyBonus = setup.skillTree.getEffect("stealMoneyBonus")>> <<if _stealMoneyBonus > 0>> <<set $money += _stealMoneyBonus>> <</if>> <<set _isBodyPart = ["chest", "butt", "hairColor", "hairLength", "skinTone", "age", "gender", "genitals"].includes($selectedTrait)>> <<if _isBodyPart>> /* Swapping body parts */ <<if $selectedTrait === "chest">> <<set _temp = $bodyParts.chest>> <<set $bodyParts.chest = $currentTarget.bodyParts.chest>> <<set $currentTarget.bodyParts.chest = _temp>> <<set _swappedFrom = _temp>> <<set _swappedTo = $bodyParts.chest>> <<set _displayName = "Chest Size">> <<elseif $selectedTrait === "butt">> <<set _temp = $bodyParts.butt>> <<set $bodyParts.butt = $currentTarget.bodyParts.butt>> <<set $currentTarget.bodyParts.butt = _temp>> <<set _swappedFrom = _temp>> <<set _swappedTo = $bodyParts.butt>> <<set _displayName = "Butt Size">> <<elseif $selectedTrait === "hairColor">> <<set _temp = $appearance.hairColor>> <<set $appearance.hairColor = $currentTarget.appearance.hairColor>> <<set $currentTarget.appearance.hairColor = _temp>> <<set _swappedFrom = _temp>> <<set _swappedTo = $appearance.hairColor>> <<set _displayName = "Hair Color">> <<elseif $selectedTrait === "hairLength">> /* Swap hair length value only (no traits involved) */ <<set _temp = $appearance.hairLength>> <<set $appearance.hairLength = $currentTarget.appearance.hairLength>> <<set $currentTarget.appearance.hairLength = _temp>> <<set _swappedFrom = _temp>> <<set _swappedTo = $appearance.hairLength>> <<set _displayName = "Hair Length">> <<elseif $selectedTrait === "skinTone">> <<set _temp = $appearance.skinTone>> <<set $appearance.skinTone = $currentTarget.appearance.skinTone>> <<set $currentTarget.appearance.skinTone = _temp>> <<set _swappedFrom = _temp>> <<set _swappedTo = $appearance.skinTone>> <<set _displayName = "Skin Tone">> <<elseif $selectedTrait === "age">> /* Swap age value */ <<set _temp = $appearance.age || "Adult">> <<set _targetAge = $currentTarget.appearance.age || "Adult">> <<set $appearance.age = _targetAge>> <<set $currentTarget.appearance.age = _temp>> /* Swap age traits (Mature / Youthful) */ <<set _playerHadMature = $physicalTraits.includes("Mature")>> <<set _playerHadYouthful = $physicalTraits.includes("Youthful")>> <<set _targetHadMature = $currentTarget.physicalTraits.includes("Mature")>> <<set _targetHadYouthful = $currentTarget.physicalTraits.includes("Youthful")>> /* Remove old traits from both */ <<run $physicalTraits.delete("Mature")>> <<run $physicalTraits.delete("Youthful")>> <<run $currentTarget.physicalTraits.delete("Mature")>> <<run $currentTarget.physicalTraits.delete("Youthful")>> /* Add swapped traits */ <<if _targetHadMature>> <<run $physicalTraits.push("Mature")>> <</if>> <<if _targetHadYouthful>> <<run $physicalTraits.push("Youthful")>> <</if>> <<if _playerHadMature>> <<run $currentTarget.physicalTraits.push("Mature")>> <</if>> <<if _playerHadYouthful>> <<run $currentTarget.physicalTraits.push("Youthful")>> <</if>> <<set _swappedFrom = _temp>> <<set _swappedTo = $appearance.age>> <<set _displayName = "Age">> <<elseif $selectedTrait === "gender">> <<set _temp = $bodyParts.gender>> <<set $bodyParts.gender = $currentTarget.bodyParts.gender>> <<set $currentTarget.bodyParts.gender = _temp>> /* CRITICAL: Also update $gender variable for job compatibility */ <<set $gender = $bodyParts.gender>> /* Update gender-mismatch traits for both player and target */ <<run setup.updateGenderMismatchTraits()>> <<run setup.updateGenderMismatchTraits($currentTarget)>> <<set _swappedFrom = _temp>> <<set _swappedTo = $bodyParts.gender>> <<set _displayName = "Gender">> <<elseif $selectedTrait === "genitals">> <<set _temp = $bodyParts.genitals>> <<set $bodyParts.genitals = $currentTarget.bodyParts.genitals>> <<set $currentTarget.bodyParts.genitals = _temp>> /* Update gender-mismatch traits for both player and target */ <<run setup.updateGenderMismatchTraits()>> <<run setup.updateGenderMismatchTraits($currentTarget)>> <<set _swappedFrom = _temp>> <<set _swappedTo = $bodyParts.genitals>> <<set _displayName = "Genitals">> <</if>> <<else>> /* Regular trait theft */ <<if $swappingTrait>> /* Swapping traits */ <<if $physicalTraits.includes($swappingTrait)>> <<set _idx = $physicalTraits.indexOf($swappingTrait)>> <<run $physicalTraits.splice(_idx, 1)>> <<elseif $mentalTraits.includes($swappingTrait)>> <<set _idx = $mentalTraits.indexOf($swappingTrait)>> <<run $mentalTraits.splice(_idx, 1)>> <</if>> <</if>> /* Add the stolen trait with conflict checking */ <<set _allPlayerTraits = $physicalTraits.concat($mentalTraits)>> <<set _conflictTrait = setup.getConflictingTrait($selectedTrait, _allPlayerTraits)>> <<if _conflictTrait>> <!-- Remove conflicting trait first --> <<if $physicalTraits.includes(_conflictTrait)>> <<run $physicalTraits.delete(_conflictTrait)>> <<elseif $mentalTraits.includes(_conflictTrait)>> <<run $mentalTraits.delete(_conflictTrait)>> <</if>> <<set _replacedConflict = _conflictTrait>> <</if>> <<if $currentTarget.physicalTraits.includes($selectedTrait)>> <<run $physicalTraits.push($selectedTrait)>> <<elseif $currentTarget.mentalTraits.includes($selectedTrait)>> <<run $mentalTraits.push($selectedTrait)>> <<elseif $currentTarget.skills.includes($selectedTrait)>> <<run $skills.push($selectedTrait)>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #2ecc71; text-align: center; margin: 10px 0; font-size: 28px;">✓ SUCCESS!</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Theft Completed</h2> <div style="background: #1a4d1a; border: 2px solid #2ecc71; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0; font-size: 18px;">Successful Theft!</h3> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;">You successfully stole from $currentTarget.name!</p> <div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 5px; margin: 10px 0;"> <<if _isBodyPart>> <p style="color: #2ecc71; margin: 0; font-size: 16px; font-weight: bold;">✓ Swapped <<print _displayName>></p> <p style="color: #888; margin: 8px 0 0 0; font-size: 14px;"><<print _swappedFrom>> → <<print _swappedTo>></p> <<else>> <p style="color: #2ecc71; margin: 0; font-size: 16px; font-weight: bold;">✓ Gained: $selectedTrait</p> <<if $swappingTrait>> <p style="color: #f39c12; margin: 8px 0 0 0; font-size: 16px; font-weight: bold;">↔ Lost: $swappingTrait</p> <</if>> <</if>> </div> <p style="color: #ff6b6b; margin: 10px 0 0 0; font-size: 14px;"><b>Heat Level:</b> +5% (Now: $crimeSystem.heatLevel%)</p> <!-- ===== SKILL TREE: Steal Money Bonus Display ===== --> <<if _stealMoneyBonus > 0>> <p style="color: #9C27B0; margin: 10px 0 0 0; font-size: 14px;"><b>⭐ Skill Tree Bonus:</b> +$<<print _stealMoneyBonus>> cash</p> <</if>> </div> <!-- TRANSFORMATION DESCRIPTIONS SECTION --> <div style="background: #2a2a2a; padding: 20px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 18px;">🔄 Transformation</h3> <<if _isBodyPart>> <!-- Body Part Transformations --> <<if $selectedTrait === "chest">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getChestTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "butt">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getButtTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "gender">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getGenderTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "genitals">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getGenitalTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <!-- Check for special trait acquisition --> <<if $physicalTraits.includes("Cuntboy")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 12px; margin-top: 10px; border-radius: 6px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 14px;"> ✨ You've gained the "Cuntboy" trait - a male with a vagina! </p> </div> <<elseif $physicalTraits.includes("Futanari")>> <div style="background: #3a2030; border: 2px solid #9b59b6; padding: 12px; margin-top: 10px; border-radius: 6px;"> <p style="color: #9b59b6; margin: 0; font-weight: bold; font-size: 14px;"> ✨ You've gained the "Futanari" trait - a female with a penis! </p> </div> <</if>> <<elseif $selectedTrait === "age">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getAgeTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "hairColor">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getHairColorTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "hairLength">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getHairLengthTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <<elseif $selectedTrait === "skinTone">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getSkinToneTransformationText(_swappedFrom, _swappedTo)>> </p> </div> <</if>> <<else>> <!-- Regular Trait Theft --> <<if $currentTarget.physicalTraits.includes($selectedTrait)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<if $swappingTrait && setup.getConflictingTrait($selectedTrait, [$swappingTrait]) === $swappingTrait>> <<print setup.getMutuallyExclusiveSwapText($swappingTrait, $selectedTrait)>> <<else>> <<print setup.getPhysicalTraitChangeText($selectedTrait, true)>> <</if>> </p> </div> <!-- Special transformations --> <<if $selectedTrait === "Were-Creature">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getWereCreatureTransformationText(true, "wolf")>> </p> </div> <<elseif $selectedTrait === "Definitely not a Vampire">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getVampireTransformationText(true)>> </p> </div> <<elseif $selectedTrait === "Sunfish">> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getSunfishTransformationText(true)>> </p> </div> <</if>> <!-- Lost trait description if swapping --> <<if $swappingTrait>> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 10px; border: 2px solid #f39c12;"> <p style="color: #f39c12; font-size: 14px; font-weight: bold; margin: 0 0 8px 0;">Lost Trait:</p> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getPhysicalTraitChangeText($swappingTrait, false)>> </p> </div> <</if>> <<elseif $currentTarget.mentalTraits.includes($selectedTrait)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<if $swappingTrait && setup.getConflictingTrait($selectedTrait, [$swappingTrait]) === $swappingTrait>> <<print setup.getMutuallyExclusiveSwapText($swappingTrait, $selectedTrait)>> <<else>> <<print setup.getMentalTraitChangeText($selectedTrait, true)>> <</if>> </p> </div> <!-- Lost trait description if swapping --> <<if $swappingTrait>> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-top: 10px; border: 2px solid #f39c12;"> <p style="color: #f39c12; font-size: 14px; font-weight: bold; margin: 0 0 8px 0;">Lost Trait:</p> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getMentalTraitChangeText($swappingTrait, false)>> </p> </div> <</if>> <<elseif $currentTarget.skills.includes($selectedTrait)>> <div style="background: #1a1a1a; padding: 15px; border-radius: 6px; margin-bottom: 10px;"> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"> <<print setup.getSkillGainText($selectedTrait)>> </p> </div> <</if>> <</if>> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Crime Statistics</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Total Thefts:</b> $crimeSystem.totalThefts</p> <p style="margin: 5px 0; font-size: 15px;"><b>Success Rate:</b> <<print Math.round(($crimeSystem.successfulThefts / $crimeSystem.totalThefts) * 100)>>%</p> </div> <<if $crimeSystem.heatLevel >= 80>> <div style="background: #4d1a1a; padding: 12px; border-radius: 5px; border-left: 4px solid #ff6b6b; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px; font-weight: bold;">⚠️ WARNING: Heat level critically high! Police are actively searching for you.</p> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Leave the Area</div>">> <<goto "CrimeHub">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$jailSystem>> <<set $jailSystem = { inJail: false, daysToServe: 0, daysServed: 0, canPayFine: false, fineAmount: 0, previousJob: "" }>> <</if>> /* Check arrest type */ <<set _atStation = $arrestedAtStation || false>> <<set _arrestType = $arrestType || "crime">> <<set $arrestedAtStation = false>> <<set $arrestType = "">> /* Store previous job and become Criminal IMMEDIATELY when caught */ <<if $jobs && $jobs.length > 0 && !$jobs.includes("Criminal")>> <<set $jailSystem.previousJob = $jobs[0]>> <<elseif !$jailSystem.previousJob>> <<set $jailSystem.previousJob = "Unemployed">> <</if>> <<if !$jobs.includes("Criminal")>> <<set $jobs = ["Criminal"]>> <</if>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 25)>> <<set $crimeSystem.activeWarrant = true>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #ff6b6b; text-align: center; margin: 10px 0; font-size: 28px;">🚔 CAUGHT!</h1> <<if _arrestType === "streaming">> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Tracked Through Your Stream</h2> <<elseif _arrestType === "adultStreaming">> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Identified on Adult Platform</h2> <<elseif _arrestType === "jobApplication">> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Background Check Failed</h2> <<elseif _atStation>> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Arrested at Police Station</h2> <<else>> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Police Officer on Scene</h2> <</if>> <div style="background: #4d1a1a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <<if _arrestType === "streaming">> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> "POLICE! OPEN UP! We have you surrounded!" </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> You're just about to start your stream when you hear pounding on your apartment door. Before you can react, police burst in with a battering ram. "We traced your IP address from your streaming activity. You're wanted for multiple crimes!" Officers swarm your apartment, cutting off any escape routes. Your hands are cuffed behind your back as they read you your rights. </p> <<elseif _arrestType === "adultStreaming">> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> "THIS IS THE POLICE! We have a warrant for your arrest!" </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> As you set up your webcam for an adult stream, your apartment door explodes inward. A SWAT team floods in, weapons drawn. "Freeze! We've been monitoring your online activity and traced your location through the streaming platform!" There's nowhere to run as officers surround you from all sides. You're tackled to the ground and restrained before you can even think about escaping. </p> <<elseif _arrestType === "jobApplication">> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> "Don't move! You're under arrest!" </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> Hours after submitting your job application, you hear a knock at your door. Thinking it might be about the job, you open it - only to find yourself face-to-face with armed police officers. "The cafe ran your background check and immediately flagged you as a wanted criminal. We've had this place surrounded since you got home." Officers rush in from the stairwell and fire escape, blocking every exit. You're handcuffed without a chance to resist. </p> <<elseif _atStation>> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> "Hold it right there! You have an outstanding warrant!" </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> You walked right into the police station with a criminal record. Officers immediately recognize you and move to arrest you. There's no escape from here. </p> <<else>> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> "Freeze! You're under arrest for attempted theft!" </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> A police officer appears and has caught you in the act. You have two choices: surrender peacefully or try to escape. </p> <</if>> </div> <<if $jailSystem.previousJob && $jailSystem.previousJob !== "Unemployed" && $jailSystem.previousJob !== "Criminal">> <div style="background: #3a2020; border: 2px solid #ff6b6b; padding: 12px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px; font-weight: bold;"> ✗ You've lost your job as $jailSystem.previousJob and are now a Criminal! </p> </div> <</if>> <<set _canResist = !_atStation && _arrestType === "crime">> <<set _escapeChance = setup.calculateEscapeChance()>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Your Options:</h3> <div style="background: #1a1a1a; padding: 12px; border-radius: 5px; margin-bottom: 10px; border-left: 3px solid #95a5a6;"> <h4 style="color: #95a5a6; margin: 0 0 8px 0; font-size: 15px;">1. Surrender Peacefully</h4> <p style="color: #ccc; margin: 0 0 8px 0; font-size: 14px;">Accept arrest and face reduced penalties.</p> <ul style="color: #aaa; font-size: 13px; margin: 5px 0; padding-left: 20px;"> <li>Pay fine: $2,500</li> <li>Must serve time or pay fine at jail</li> <li>Heat +25%</li> </ul> </div> <<if _canResist>> <div style="background: #1a1a1a; padding: 12px; border-radius: 5px; border-left: 3px solid #e74c3c;"> <h4 style="color: #e74c3c; margin: 0 0 8px 0; font-size: 15px;">2. Resist Arrest (Escape Chance: _escapeChance%)</h4> <p style="color: #ccc; margin: 0 0 8px 0; font-size: 14px;">Try to fight or run away from the officer.</p> <p style="color: #2ecc71; font-size: 13px; margin: 5px 0;"><b>If successful:</b> Escape with +15% heat (must still visit jail later)</p> <p style="color: #ff6b6b; font-size: 13px; margin: 5px 0;"><b>If caught:</b></p> <ul style="color: #aaa; font-size: 13px; margin: 5px 0; padding-left: 20px;"> <li>Pay fine: $5,000</li> <li>Sent directly to jail</li> <li>Heat +40%</li> </ul> </div> <<else>> <div style="background: #1a1a1a; padding: 12px; border-radius: 5px; border-left: 3px solid #666; opacity: 0.5;"> <h4 style="color: #666; margin: 0 0 8px 0; font-size: 15px;">2. Resist Arrest (UNAVAILABLE)</h4> <<if _arrestType === "streaming" || _arrestType === "adultStreaming" || _arrestType === "jobApplication">> <p style="color: #888; margin: 0 0 8px 0; font-size: 14px;">They've surrounded your apartment - there's no way out.</p> <p style="color: #666; font-size: 12px; margin: 0; font-style: italic;">Police have blocked all exits - resistance is futile</p> <<else>> <p style="color: #888; margin: 0 0 8px 0; font-size: 14px;">You can't escape from inside the police station.</p> <p style="color: #666; font-size: 12px; margin: 0; font-style: italic;">Surrounded by officers - escape is impossible</p> <</if>> </div> <</if>> </div> <div style="text-align: center; margin: 15px 0;"> <<link "<div style='display: inline-block; background: #95a5a6; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>Surrender Peacefully</div>">> <<goto "SurrenderArrest">> <</link>> </div> <<if _canResist>> <div style="text-align: center; margin-top: 10px;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>Resist Arrest</div>">> <<goto "ResistArrest">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$jailSystem>> <<set $jailSystem = { inJail: false, daysToServe: 0, daysServed: 0, canPayFine: false, fineAmount: 0, previousJob: "" }>> <</if>> /* Reset consecutive escapes counter */ <<if !$crimeSystem.consecutiveEscapes>> <<set $crimeSystem.consecutiveEscapes = 0>> <</if>> <<set $crimeSystem.consecutiveEscapes = 0>> <<set $crimeSystem.surrenderCount += 1>> <<set $crimeSystem.arrestCount += 1>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 25)>> /* Store previous job before becoming Criminal */ <<if $jobs && $jobs.length > 0 && !$jobs.includes("Criminal")>> <<set $jailSystem.previousJob = $jobs[0]>> <<if $jobs[0] !== "Unemployed">> <<set _lostJob = true>> <<set _previousJobName = $jobs[0]>> <<else>> <<set _lostJob = false>> <</if>> <<elseif !$jailSystem.previousJob>> <<set $jailSystem.previousJob = "Unemployed">> <<set _lostJob = false>> <</if>> <<set $jobs = ["Criminal"]>> <<set $crimeSystem.crimesCommitted = ($crimeSystem.crimesCommitted || 0) + 1>> /* Pay fine - take from cash first, remainder from bank (can go negative) */ <<set _fineOwed = 2500>> <<if $money >= _fineOwed>> <<set $money -= _fineOwed>> <<else>> <<set _fineOwed -= $money>> <<set $money = 0>> <<if $bankAccount && $bankAccount.hasAccount>> <<set $bankAccount.balance -= _fineOwed>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #95a5a6; text-align: center; margin: 10px 0; font-size: 28px;">⚖️ Arrested</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Surrendered Peacefully</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #95a5a6;"> <p style="color: #ccc; margin: 0 0 12px 0; font-size: 15px;"> You put your hands up and allow the officer to arrest you. The process is professional and without incident. </p> <div style="background: #1a1a1a; padding: 12px; border-radius: 5px; margin: 10px 0;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 16px;">Consequences:</h4> <<if _lostJob>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Lost job: _previousJobName</p> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Forced into Criminal career</p> <<else>> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Forced into Criminal career</p> <</if>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Fine paid: $2,500</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Crimes committed: +1</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Must serve jail time or pay fine</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Heat: +25% (Now: $crimeSystem.heatLevel%)</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Escape streak reset!</p> </div> <p style="color: #888; margin: 12px 0 0 0; font-size: 14px; font-style: italic;"> You're being taken into custody. Time to face the consequences. </p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Criminal Record Updated</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Times Arrested:</b> $crimeSystem.arrestCount</p> <p style="margin: 5px 0; font-size: 15px;"><b>Times Surrendered:</b> $crimeSystem.surrenderCount</p> <p style="margin: 5px 0; font-size: 15px;"><b>Heat Level:</b> $crimeSystem.heatLevel/100</p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Go to Jail</div>">> <<goto "Jail">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _escapeChance = setup.calculateEscapeChance()>> <<set _roll = random(1, 100)>> <<set _escaped = _roll <= _escapeChance>> <<set $crimeSystem.resistedArrestCount += 1>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🏃 Resisting Arrest!</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Attempting Escape</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="margin: 5px 0; font-size: 15px;"><b>Escape Chance:</b> _escapeChance%</p> <p style="margin: 5px 0; font-size: 15px;"><b>Your Roll:</b> _roll</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #e74c3c;"> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> You make a break for it, adrenaline pumping through your veins as you try to outrun the officer... </p> </div> <<if _escaped>> <<goto "EscapeSuccess">> <<else>> <<goto "EscapeFailed">> <</if>> </div> <</nobr>>
<<nobr>> <<if !$jailSystem>> <<set $jailSystem = { inJail: false, daysToServe: 0, daysServed: 0, canPayFine: false, fineAmount: 0, previousJob: "" }>> <</if>> <<if !$crimeSystem>> <<set $crimeSystem = { warnings: 0, witnessedCrimes: 0, totalThefts: 0, successfulThefts: 0, failedThefts: 0, arrestCount: 0, resistedArrestCount: 0, surrenderCount: 0, lastCrimeLocation: "", lastCrimeTime: "", heatLevel: 0, activeWarrant: false, lastHeatDecayDay: 0, crimesCommitted: 0, consecutiveEscapes: 0 }>> <</if>> /* Reset consecutive escapes counter */ <<set $crimeSystem.consecutiveEscapes = 0>> /* Update crime statistics */ <<set $crimeSystem.arrestCount += 1>> <<set $crimeSystem.resistedArrestCount += 1>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 40)>> <<set $crimeSystem.crimesCommitted = ($crimeSystem.crimesCommitted || 0) + 2>> /* Store previous job before becoming Criminal */ <<set _lostJob = false>> <<set _previousJobName = "">> <<if $jobs && Array.isArray($jobs) && $jobs.length > 0>> <<if !$jobs.includes("Criminal")>> <<set $jailSystem.previousJob = $jobs[0]>> <<if $jobs[0] !== "Unemployed">> <<set _lostJob = true>> <<set _previousJobName = $jobs[0]>> <</if>> <<set $jobs = ["Criminal"]>> <</if>> <<else>> <<set $jobs = ["Criminal"]>> <<set $jailSystem.previousJob = "Unemployed">> <</if>> /* Pay harsher fine - take from cash first, remainder from bank (can go negative) */ <<set _fineOwed = 5000>> <<if $money >= _fineOwed>> <<set $money -= _fineOwed>> <<else>> <<set _fineOwed -= $money>> <<set $money = 0>> <<if $bankAccount && $bankAccount.hasAccount>> <<set $bankAccount.balance -= _fineOwed>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #ff6b6b; text-align: center; margin: 10px 0; font-size: 28px;">✗ CAUGHT!</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Escape Failed</h2> <div style="background: #4d1a1a; border: 2px solid #e74c3c; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 18px;">Subdued and Arrested</h3> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> The officer catches up to you and tackles you to the ground. You're arrested and charged with resisting arrest in addition to attempted theft. </p> <div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 5px; margin: 10px 0;"> <h4 style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 16px;">HARSH Consequences:</h4> <<if _lostJob>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Lost job: _previousJobName</p> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Forced into Criminal career</p> <<else>> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Forced into Criminal career</p> <</if>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Fine paid: $5,000</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Crimes committed: +2</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Must serve jail time or pay fine</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Heat: +40% (Now: $crimeSystem.heatLevel%)</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Escape streak reset!</p> </div> <p style="color: #888; margin: 12px 0 0 0; font-size: 14px; font-style: italic;"> You must now go to the jail to serve your sentence or pay the fine. </p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Criminal Record</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Times Arrested:</b> $crimeSystem.arrestCount</p> <p style="margin: 5px 0; font-size: 15px;"><b>Resisted Arrest:</b> $crimeSystem.resistedArrestCount times</p> <p style="margin: 5px 0; font-size: 15px;"><b>Total Crimes:</b> $crimeSystem.crimesCommitted</p> <p style="margin: 5px 0; font-size: 15px;"><b>Heat Level:</b> $crimeSystem.heatLevel/100</p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Continue</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$jailSystem>> <<set $jailSystem = { inJail: false, daysToServe: 0, daysServed: 0, canPayFine: false, fineAmount: 0, previousJob: "" }>> <</if>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 15)>> /* Increment consecutive escapes counter */ <<if !$crimeSystem.consecutiveEscapes>> <<set $crimeSystem.consecutiveEscapes = 0>> <</if>> <<set $crimeSystem.consecutiveEscapes += 1>> /* Check for 5 escapes achievement */ <<if $crimeSystem.consecutiveEscapes >= 5>> <<run setup.achievements.unlock("evade_cops_5")>> <</if>> /* Store previous job and become Criminal */ <<if $jobs && $jobs.length > 0 && !$jobs.includes("Criminal")>> <<set $jailSystem.previousJob = $jobs[0]>> <<if $jobs[0] !== "Unemployed">> <<set _lostJob = true>> <<set _previousJobName = $jobs[0]>> <<else>> <<set _lostJob = false>> <</if>> <<elseif !$jailSystem.previousJob>> <<set $jailSystem.previousJob = "Unemployed">> <<set _lostJob = false>> <</if>> <<set $jobs = ["Criminal"]>> <<set $crimeSystem.crimesCommitted = ($crimeSystem.crimesCommitted || 0) + 1>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #2ecc71; text-align: center; margin: 10px 0; font-size: 28px;">✓ ESCAPED!</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Got Away Clean</h2> <div style="background: #1a4d1a; border: 2px solid #2ecc71; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0; font-size: 18px;">Successfully Escaped!</h3> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> You manage to lose the officer in the chaos! Your heart is pounding, but you're free. </p> <div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 5px; margin: 10px 0;"> <<if _lostJob>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;">✗ Lost job: _previousJobName</p> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Now a Criminal (wanted)</p> <<else>> <p style="color: #f39c12; margin: 5px 0; font-size: 15px;">→ Now a Criminal (wanted)</p> <</if>> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;"><b>Crimes Committed:</b> +1</p> <p style="color: #ff6b6b; margin: 5px 0; font-size: 15px;"><b>Heat Level:</b> +15% (Now: $crimeSystem.heatLevel%)</p> <p style="color: #2ecc71; margin: 5px 0; font-size: 15px;"><b>Consecutive Escapes:</b> $crimeSystem.consecutiveEscapes</p> </div> <p style="color: #f39c12; margin: 12px 0 0 0; font-size: 14px; font-style: italic;"> ⚠️ You must visit the Jail to serve time or pay your fine before you can change jobs! </p> </div> <<if $crimeSystem.heatLevel >= 80>> <div style="background: #4d1a1a; padding: 12px; border-radius: 5px; border-left: 4px solid #ff6b6b; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px; font-weight: bold;">⚠️ CRITICAL: You're now a high-priority target for law enforcement!</p> </div> <</if>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Criminal Record Updated</h3> <p style="margin: 5px 0; font-size: 15px;"><b>Crimes Committed:</b> $crimeSystem.crimesCommitted</p> <p style="margin: 5px 0; font-size: 15px;"><b>Heat Level:</b> $crimeSystem.heatLevel/100</p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Get Out of Here</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _scannerChance = setup.attemptScannerTheft()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #3498db; text-align: center; margin: 10px 0; font-size: 28px;">👮 Officer Spotted!</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Patrol Officer Nearby</h2> <div style="background: #1e3a5f; border: 2px solid #3498db; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #fff; margin: 0 0 12px 0; font-size: 15px;"> You spot a police officer on patrol. They haven't noticed you yet, but you can see a <b>Trait Scanner</b> clipped to their belt... </p> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> This is an extremely risky move. The scanner would let you see all traits when stealing, but getting caught means immediate arrest. </p> </div> <<if !$traitScanner>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 16px;">Attempt to Steal Scanner</h3> <p style="color: #ccc; margin: 0 0 10px 0; font-size: 15px;"><b>Success Chance:</b> <span style="color: <<if _scannerChance >= 30>>#2ecc71<<elseif _scannerChance >= 10>>#f39c12<<else>>#ff6b6b<</if>>;">_scannerChance%</span></p> <<if _scannerChance <= 5>> <div style="background: #4d1a1a; padding: 12px; border-radius: 5px; border-left: 4px solid #ff6b6b; margin-bottom: 10px;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px; font-weight: bold;">⚠️ NEARLY IMPOSSIBLE: You lack the skills and traits needed for this. You will almost certainly be caught!</p> </div> <<elseif _scannerChance <= 15>> <div style="background: #4d2a1a; padding: 12px; border-radius: 5px; border-left: 4px solid #f39c12; margin-bottom: 10px;"> <p style="color: #f39c12; margin: 0; font-size: 14px; font-weight: bold;">⚠️ VERY DIFFICULT: You have minimal chance of success. High risk of arrest!</p> </div> <</if>> <div style="background: #1a1a1a; padding: 10px; border-radius: 5px; margin: 10px 0;"> <p style="color: #aaa; margin: 0 0 8px 0; font-size: 14px;"><b>Bonuses:</b></p> <<set _totalDex = setup.getTotalStat("dexterity")>> <p style="color: #888; margin: 3px 0; font-size: 13px;">• Base Chance: 2%</p> <<if _totalDex >= 30>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Dexterity ≥30: +10%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Dexterity ≥30: +10%</p> <</if>> <<if _totalDex >= 50>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Dexterity ≥50: +10%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Dexterity ≥50: +10%</p> <</if>> <<if $skills.includes("Lock Picking")>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Lock Picking skill: +10%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Lock Picking skill: +10%</p> <</if>> <<if $skills.includes("Stealth")>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Stealth skill: +10%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Stealth skill: +10%</p> <</if>> <<if $physicalTraits.includes("Sly") || $mentalTraits.includes("Sly")>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Sly trait: +5%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Sly trait: +5%</p> <</if>> <<if $physicalTraits.includes("Quick Reflexes")>> <p style="color: #2ecc71; margin: 3px 0; font-size: 13px;">✓ Quick Reflexes trait: +8%</p> <<else>> <p style="color: #666; margin: 3px 0; font-size: 13px;">✗ Quick Reflexes trait: +8%</p> <</if>> </div> <div style="text-align: center; margin: 15px 0;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3); font-size: 16px;'>🎯 Attempt Scanner Theft</div>">> <<goto "AttemptOfficerScannerTheft">> <</link>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; text-align: center; margin-bottom: 15px;"> <p style="color: #3498db; margin: 0; font-size: 15px;"> You already have a Trait Scanner. No need to risk stealing another one. </p> </div> <</if>> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #95a5a6; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-size: 15px;'>Avoid the Officer</div>">> <<goto "ScoutForTarget">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _scannerChance = setup.attemptScannerTheft()>> <<set _roll = random(1, 100)>> <<set _success = _roll <= _scannerChance>> /* Advance time */ <<run advanceTime(random(5, 15))>> <div style="background: #1a1a1a; min-height: 100vh; padding: 15px;"> <h1 style="color: #e74c3c; text-align: center; margin: 10px 0; font-size: 28px;">🎯 Scanner Theft Attempt</h1> <h2 style="color: #888; text-align: center; margin: 5px 0 15px 0; font-size: 20px;">Stealing from an Officer</h2> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="margin: 5px 0; font-size: 15px;"><b>Success Chance:</b> _scannerChance%</p> <p style="margin: 5px 0; font-size: 15px;"><b>Your Roll:</b> _roll</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border-left: 4px solid #3498db;"> <p style="color: #ccc; margin: 0; font-size: 15px; font-style: italic;"> You wait for the right moment, then move in swiftly. Your fingers reach for the scanner on the officer's belt... </p> </div> <<if _success>> /* SUCCESS! Got the scanner */ <<set $traitScanner = true>> <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 15)>> <div style="background: #1a4d1a; border: 2px solid #2ecc71; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0; font-size: 18px;">✓ INCREDIBLE SUCCESS!</h3> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"> Against all odds, you managed to snatch the Trait Scanner! The officer doesn't even notice it's missing until you're long gone. </p> <div style="background: rgba(0,0,0,0.3); padding: 12px; border-radius: 5px; margin: 10px 0;"> <p style="color: #2ecc71; margin: 0; font-size: 16px; font-weight: bold;">✓ Acquired: Trait Scanner</p> <p style="color: #3498db; margin: 8px 0 0 0; font-size: 14px;">You can now see mental traits and skills on all targets!</p> </div> <p style="color: #ff6b6b; margin: 10px 0 0 0; font-size: 14px;"><b>Heat Level:</b> +15% (Now: $crimeSystem.heatLevel%)</p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 24px; border-radius: 6px; cursor: pointer; font-weight: bold; font-size: 16px;'>Leave the Area</div>">> <<goto "CrimeHub">> <</link>> </div> <<else>> /* FAILED - Caught! */ <<set $crimeSystem.heatLevel = Math.min(100, $crimeSystem.heatLevel + 35)>> <<set $crimeSystem.activeWarrant = true>> <div style="background: #4d1a1a; border: 2px solid #e74c3c; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <h3 style="color: #e74c3c; margin: 0 0 10px 0; font-size: 18px;">✗ CAUGHT!</h3> <p style="color: #fff; margin: 0 0 10px 0; font-size: 15px;"> The officer's hand clamps down on your wrist before you can get away! </p> <p style="color: #ff6b6b; margin: 0; font-size: 15px;"> "Trying to steal from a cop? You just made a VERY big mistake!" </p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px;"> <p style="color: #ff6b6b; margin: 0 0 10px 0; font-size: 15px;"><b>Heat Level:</b> +35% (Now: $crimeSystem.heatLevel%)</p> <p style="color: #f39c12; margin: 0; font-size: 15px;"><b>Active Warrant Issued!</b></p> </div> <<goto "CaughtByPolice">> <</if>> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Crime System Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">🦹 Crime System</h2> <!-- Trait Scanner Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">🔍 Trait Scanner</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #3498db;">Status:</strong> <span id="scannerStatus"> <<if $traitScanner>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> </span> </div> <<link "<div style='background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔍 Get Trait Scanner</div>">> <<set $traitScanner = true>> <<replace "#scannerStatus">> <<if $traitScanner>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Owned</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Not Owned</span> <</if>> <</replace>> <</link>> </div> <!-- Crime Heat Level --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🚔 Crime Heat</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff6b6b;">Heat Level:</strong> <span id="heatLevel" style="color: #ffd43b; font-size: 16px; font-weight: bold;"><<print $crimeSystem.heatLevel>>/100</span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Heat to 0</div>">> <<set $crimeSystem.heatLevel = 0>> <<set $crimeSystem.activeWarrant = false>> <<replace "#heatLevel">><<print $crimeSystem.heatLevel>>/100<</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Heat to 100</div>">> <<set $crimeSystem.heatLevel = 100>> <<set $crimeSystem.activeWarrant = true>> <<replace "#heatLevel">><<print $crimeSystem.heatLevel>>/100<</replace>> <</link>> </div> </div> </div> <!-- Crime Traits & Skills Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">⚡ Crime Traits & Skills</h2> <!-- Positive Crime Traits --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">✓ Positive Crime Traits & Skills</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 10px 0;">These traits and skills help with stealing and crime.</p> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0 0 5px 0; font-size: 14px;"><b>Traits:</b></p> <p style="color: #888; font-size: 12px; margin: 0;">Sly, Deceitful, Crafty, Shrewd, Cunning, Stealthy, Quick Reflexes, Nimble Fingers, Fast, Quick, Reckless, Impulsive, Corrupt, Selfish, Cruel, Cold, Sunfish</p> <p style="color: #ccc; margin: 10px 0 5px 0; font-size: 14px;"><b>Skills:</b></p> <p style="color: #888; font-size: 12px; margin: 0;">Stealth, Lock Picking, Acting, Persuasion</p> </div> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Positive Crime Traits & Skills</div>">> /* Get all theft bonus trait names from the object */ <<set _theftTraitNames = Object.keys(setup.theftBonusTraits)>> /* Add all theft bonus traits */ <<for _i = 0; _i < _theftTraitNames.length; _i++>> <<set _trait = _theftTraitNames[_i]>> <<if !$physicalTraits.includes(_trait) && !$mentalTraits.includes(_trait)>> /* Check if it's a physical or mental trait and add to appropriate array */ <<if ["Quick Reflexes", "Nimble Fingers", "Fast", "Quick", "Stealthy", "Sunfish"].includes(_trait)>> <<run $physicalTraits.push(_trait)>> <<else>> <<run $mentalTraits.push(_trait)>> <</if>> <</if>> <</for>> /* Get all theft bonus skill names from the object */ <<set _theftSkillNames = Object.keys(setup.theftBonusSkills)>> /* Add all theft bonus skills */ <<for _i = 0; _i < _theftSkillNames.length; _i++>> <<set _skill = _theftSkillNames[_i]>> <<if !$skills.includes(_skill)>> <<run $skills.push(_skill)>> <</if>> <</for>> <<run UI.alert("✓ Added all positive crime traits and skills!")>> <</link>> </div> <!-- Negative/Moral Traits --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">✗ Moral/Negative Crime Traits</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 10px 0;">These traits hinder or block stealing abilities.</p> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; margin-bottom: 10px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0 0 5px 0; font-size: 14px;"><b>Blocking Traits (Prevent Stealing):</b></p> <p style="color: #888; font-size: 12px; margin: 0 0 10px 0;">Kind, Honest, Considerate, Loyal, Polite, Warm, Empathetic, Supportive, Thoughtful, Trusting</p> <p style="color: #ccc; margin: 0 0 5px 0; font-size: 14px;"><b>Penalty Traits (Reduce Success):</b></p> <p style="color: #888; font-size: 12px; margin: 0;">Friendly, Diplomatic, Calm, Patient, Humble, Mature, Wise, Reassuring</p> </div> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Add All Moral/Blocking Traits</div>">> /* Add all moral blocking traits */ <<for _i = 0; _i < setup.moralTraitsBlockingTheft.length; _i++>> <<set _trait = setup.moralTraitsBlockingTheft[_i]>> <<if !$physicalTraits.includes(_trait) && !$mentalTraits.includes(_trait)>> <<run $mentalTraits.push(_trait)>> <</if>> <</for>> /* Add all moral penalty traits */ <<for _i = 0; _i < setup.moralTraitsPenalty.length; _i++>> <<set _trait = setup.moralTraitsPenalty[_i]>> <<if !$physicalTraits.includes(_trait) && !$mentalTraits.includes(_trait)>> <<run $mentalTraits.push(_trait)>> <</if>> <</for>> <<run UI.alert("✓ Added all moral/blocking traits!")>> <</link>> </div> </div> <!-- Crime Statistics Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #f39c12; margin: 0 0 15px 0;">📊 Crime Statistics</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 10px;"> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0; font-size: 14px;"><b>Total Thefts:</b> <span style="color: #ffd43b;">$crimeSystem.totalThefts</span></p> </div> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0; font-size: 14px;"><b>Successful:</b> <span style="color: #51cf66;">$crimeSystem.successfulThefts</span></p> </div> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0; font-size: 14px;"><b>Failed:</b> <span style="color: #ff6b6b;">$crimeSystem.failedThefts</span></p> </div> <div style="background-color: #0a0a0a; padding: 10px; border-radius: 6px; border: 1px solid #444;"> <p style="color: #ccc; margin: 0; font-size: 14px;"><b>Arrests:</b> <span style="color: #e74c3c;">$crimeSystem.arrestCount</span></p> </div> </div> <<link "<div style='background: linear-gradient(135deg, #95a5a6 0%, #7f8c8d 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset All Crime Statistics</div>">> <<set $crimeSystem.warnings = 0>> <<set $crimeSystem.witnessedCrimes = 0>> <<set $crimeSystem.totalThefts = 0>> <<set $crimeSystem.successfulThefts = 0>> <<set $crimeSystem.failedThefts = 0>> <<set $crimeSystem.arrestCount = 0>> <<set $crimeSystem.resistedArrestCount = 0>> <<set $crimeSystem.surrenderCount = 0>> <<set $crimeSystem.heatLevel = 0>> <<set $crimeSystem.activeWarrant = false>> <<goto "DebugCrime">> <</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> /* Reset consecutive escapes counter */ <<if !$crimeSystem.consecutiveEscapes>> <<set $crimeSystem.consecutiveEscapes = 0>> <</if>> <<set $crimeSystem.consecutiveEscapes = 0>> <<set _restoredJob = $jailSystem.previousJob || "Unemployed">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #f39c12; text-align: center; margin: 15px 0;">💰 Fine Paid</h1> <div style="background: linear-gradient(135deg, #f39c12 0%, #f1c40f 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #f39c12;"> <h3 style="color: #000; margin: 0 0 15px 0; text-align: center; font-size: 22px;">✅ Criminal Record Cleared</h3> <p style="color: #000; margin: 0; text-align: center; font-size: 16px;"> You've paid your fine and are no longer classified as a Criminal. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">Resolution Details:</h3> <p style="color: #ccc; margin: 5px 0; font-size: 15px;">✅ Fine Paid: $<<print $jailSystem.fineAmount>></p> <p style="color: #ccc; margin: 5px 0; font-size: 15px;">✅ Crimes Forgiven: <<print $crimeSystem.crimesCommitted>></p> <<if _restoredJob !== "Unemployed">> <p style="color: #51cf66; margin: 5px 0; font-size: 15px;">✅ Job Restored: _restoredJob</p> <<else>> <p style="color: #ccc; margin: 5px 0; font-size: 15px;">✅ Job Status: Unemployed (can get new job)</p> <</if>> <p style="color: #51cf66; margin: 15px 0 5px 0; font-size: 15px; font-weight: bold;">You can now trade for new jobs again!</p> <p style="color: #888; margin: 5px 0; font-size: 14px; font-style: italic;">Escape streak has been reset.</p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border-left: 4px solid #667eea;"> <p style="color: #aaa; margin: 0; font-size: 14px; font-style: italic;"> The authorities process your payment and update your records. You're free to go. </p> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; font-size: 16px;'>Continue</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _traitsGained = State.temporary.jailTraitsGained || []>> <<set _traitsLost = State.temporary.jailTraitsLost || []>> <<set _traitsReplaced = State.temporary.jailTraitsReplaced || []>> <<set _restoredJob = $jailSystem.previousJob || "Unemployed">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #51cf66; text-align: center; margin: 15px 0;">🚪 Released from Jail</h1> <div style="background: linear-gradient(135deg, #51cf66 0%, #2ecc71 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #51cf66;"> <h3 style="color: #fff; margin: 0 0 15px 0; text-align: center; font-size: 22px;">✅ Sentence Completed</h3> <p style="color: #fff; margin: 0; text-align: center; font-size: 16px;"> You've served your time and are now free to leave. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #667eea;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">Time Served:</h3> <p style="color: #ccc; margin: 5px 0; font-size: 15px;">📅 Days in Jail: <<print State.temporary.daysServedTotal || $jailSystem.daysServed>></p> <<if _restoredJob !== "Unemployed">> <p style="color: #51cf66; margin: 5px 0; font-size: 15px;">✅ Job Restored: _restoredJob</p> <<else>> <p style="color: #ccc; margin: 5px 0; font-size: 15px;">✅ Job Status: Unemployed (can get new job)</p> <</if>> <p style="color: #51cf66; margin: 15px 0 5px 0; font-size: 15px; font-weight: bold;">You can now trade for new jobs again!</p> </div> <!-- Trait Changes During Incarceration --> <<if _traitsGained.length > 0 || _traitsLost.length > 0 || _traitsReplaced.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 15px 0;">🔄 Prison Changed You:</h3> <<if _traitsGained.length > 0>> <div style="background: rgba(81, 207, 102, 0.2); padding: 12px; border-radius: 8px; margin-bottom: 10px; border-left: 3px solid #51cf66;"> <h4 style="color: #51cf66; margin: 0 0 8px 0; font-size: 16px;">Traits Gained:</h4> <<for _trait range _traitsGained>> <p style="color: #ccc; margin: 3px 0; font-size: 14px;">+ _trait</p> <</for>> </div> <</if>> <<if _traitsLost.length > 0>> <div style="background: rgba(255, 107, 107, 0.2); padding: 12px; border-radius: 8px; margin-bottom: 10px; border-left: 3px solid #ff6b6b;"> <h4 style="color: #ff6b6b; margin: 0 0 8px 0; font-size: 16px;">Traits Lost:</h4> <<for _trait range _traitsLost>> <p style="color: #ccc; margin: 3px 0; font-size: 14px;">- _trait</p> <</for>> </div> <</if>> <<if _traitsReplaced.length > 0>> <div style="background: rgba(243, 156, 18, 0.2); padding: 12px; border-radius: 8px; border-left: 3px solid #f39c12;"> <h4 style="color: #f39c12; margin: 0 0 8px 0; font-size: 16px;">Traits Replaced:</h4> <<for _replacement range _traitsReplaced>> <p style="color: #ccc; margin: 3px 0; font-size: 14px;">_replacement.old → _replacement.new</p> <</for>> </div> <</if>> </div> <</if>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border-left: 4px solid #888;"> <p style="color: #aaa; margin: 0; font-size: 14px; font-style: italic;"> The harsh reality of incarceration has left its mark. You walk out a different person than when you entered. </p> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; font-size: 16px;'>Continue</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* ---------------------------------- */ /* --- BROTHEL CLIENT GENERATION --- */ /* ---------------------------------- */ <<set setup.generateBrothelClients = function() { var v = State.variables; var clients = []; var numClients = 3 + (v.brothelLevel || 1); var maleNames = ["Marcus", "David", "James", "Ryan", "Alex", "Victor", "Dominic", "Xavier", "Gabriel", "Adrian", "Richard", "Michael", "Steven", "Robert", "Jonathan", "Daniel", "Timothy", "Nathan", "Benjamin", "Samuel", "William", "Christopher", "Nicholas", "Matthew", "Andrew", "Derek", "Kyle", "Brandon", "Trevor", "Damien", "Frank", "George", "Henry", "Charles", "Edward", "Tyler", "Justin", "Jason", "Kevin", "Brian", "Alexander", "Maximilian", "Sebastian", "Frederick", "Augustus", "Ethan", "Lucas", "Oliver", "Liam", "Noah", "Jackson", "Aiden", "Carter", "Mason", "Logan", "Caleb", "Dylan"]; var femaleNames = ["Sarah", "Emma", "Lisa", "Jennifer", "Michelle", "Dominique", "Veronica", "Scarlett", "Natasha", "Isabella", "Victoria", "Catherine", "Amanda", "Diane", "Rebecca", "Lily", "Grace", "Hannah", "Sophia", "Emily", "Rose", "Jasmine", "Elizabeth", "Charlotte", "Olivia", "Raven", "Jade", "Amber", "Crystal", "Trinity", "Margaret", "Patricia", "Barbara", "Dorothy", "Helen", "Ashley", "Brittany", "Jessica", "Stephanie", "Nicole", "Anastasia", "Valentina", "Gabriella", "Seraphina", "Cassandra", "Ava", "Mia", "Abigail", "Madison", "Chloe", "Ella", "Aria", "Zoey", "Luna"]; var hairColors = ["Black", "Brown", "Blonde", "Red", "Platinum Blonde"]; var hairLengths = ["short", "long"]; var positiveVoices = ["Smooth Voice", "Warm Tone", "Gentle Voice", "Silky Voice", "Charismatic Voice", "Charming Tone", "Melodic Voice", "Soothing Tone"]; var neutralVoices = ["Deep Voice", "Soft-Spoken", "Calm Voice", "Steady Voice"]; var negativeVoices = ["Raspy Voice", "Sharp Voice", "Monotone", "Nasally Tone"]; var positiveTraits = ["Confident", "Charming", "Friendly", "Funny", "Kind", "Polite", "Warm", "Outgoing", "Energetic", "Flirty", "Seductive", "Alluring"]; var dominantTraits = ["Dominant", "Aggressive", "Arrogant", "Bitchy", "Confident", "Assertive"]; var submissiveTraits = ["Submissive", "Shy", "Nervous", "Passive", "Awkward"]; var neutralTraits = ["Quiet", "Introverted", "Serious", "Reserved", "Calm", "Analytical"]; var negativeTraits = ["Rude", "Cold", "Impatient", "Demanding", "Selfish", "Moody"]; var stereotypes = ["Jock", "Nerd", "Geek", "Prep", "Goth", "Diva"]; var maxDifficulty = "medium"; if (v.brothelLevel >= 5) { maxDifficulty = "very hard"; } else if (v.brothelLevel >= 3) { maxDifficulty = "hard"; } for (var i = 0; i < numClients; i++) { var gender = random(1, 100) <= 50 ? "male" : "female"; var hasPenis = gender === "male"; var hasVagina = gender === "female"; if (random(1, 100) <= 5) { if (gender === "male") { hasVagina = true; hasPenis = false; } else { hasPenis = true; hasVagina = true; } } var name = gender === "male" ? maleNames[random(0, maleNames.length - 1)] : femaleNames[random(0, femaleNames.length - 1)]; var age = random(21, 55); var hairColor = hairColors[random(0, hairColors.length - 1)]; var hairLength = hairLengths[random(0, hairLengths.length - 1)]; var chestSize = "flat"; if (gender === "female") { var chestSizes = ["small", "medium", "large", "huge"]; chestSize = chestSizes[random(0, chestSizes.length - 1)]; } else if (random(1, 100) <= 10) { chestSize = "small"; } var voiceType = random(1, 100); var voice; if (voiceType <= 50) { voice = positiveVoices[random(0, positiveVoices.length - 1)]; } else if (voiceType <= 80) { voice = neutralVoices[random(0, neutralVoices.length - 1)]; } else { voice = negativeVoices[random(0, negativeVoices.length - 1)]; } var mentalTraits = []; var numTraits = random(1, 3); var personalityType = random(1, 100); var traitPool = []; if (personalityType <= 20) { traitPool = dominantTraits; } else if (personalityType <= 40) { traitPool = submissiveTraits; } else if (personalityType <= 60) { traitPool = positiveTraits; } else if (personalityType <= 80) { traitPool = neutralTraits; } else { traitPool = negativeTraits; } for (var t = 0; t < numTraits; t++) { var trait = traitPool[random(0, traitPool.length - 1)]; if (mentalTraits.indexOf(trait) === -1) { mentalTraits.push(trait); } } var stereotype = null; if (random(1, 100) <= 20) { stereotype = stereotypes[random(0, stereotypes.length - 1)]; } var preferences = []; var dislikes = []; var requiredPlayerTraits = []; var bonusPlayerTraits = []; var penaltyPlayerTraits = []; var preferredChestSize = null; var preferredGenitals = null; if (mentalTraits.indexOf("Dominant") !== -1 || mentalTraits.indexOf("Aggressive") !== -1 || mentalTraits.indexOf("Arrogant") !== -1) { preferences.push("submission", "rough", "dirtyTalk"); dislikes.push("domination"); requiredPlayerTraits.push("Submissive"); bonusPlayerTraits.push("Shy", "Passive", "Obedient"); penaltyPlayerTraits.push("Dominant", "Arrogant", "Stubborn"); if (mentalTraits.indexOf("Bitchy") !== -1 || mentalTraits.indexOf("Arrogant") !== -1) { bonusPlayerTraits.push("Bitchy"); } } if (mentalTraits.indexOf("Submissive") !== -1 || mentalTraits.indexOf("Shy") !== -1 || mentalTraits.indexOf("Passive") !== -1) { preferences.push("domination", "dirtyTalk"); dislikes.push("submission"); requiredPlayerTraits.push("Dominant"); bonusPlayerTraits.push("Confident", "Aggressive", "Arrogant"); penaltyPlayerTraits.push("Submissive", "Shy", "Passive"); } if (mentalTraits.indexOf("Friendly") !== -1 || mentalTraits.indexOf("Kind") !== -1 || mentalTraits.indexOf("Warm") !== -1) { preferences.push("sensual", "tantric", "teasing"); dislikes.push("rough"); bonusPlayerTraits.push("Kind", "Friendly", "Warm", "Gentle"); } if (mentalTraits.indexOf("Flirty") !== -1 || mentalTraits.indexOf("Seductive") !== -1) { preferences.push("teasing", "dirtyTalk", "roleplay"); bonusPlayerTraits.push("Flirty", "Seductive", "Alluring"); } if (mentalTraits.indexOf("Energetic") !== -1 || mentalTraits.indexOf("Outgoing") !== -1) { preferences.push("rough", "stamina", "rhythm"); bonusPlayerTraits.push("Energetic", "High Stamina"); } if (mentalTraits.indexOf("Rude") !== -1 || mentalTraits.indexOf("Cold") !== -1 || mentalTraits.indexOf("Impatient") !== -1) { preferences.push("professional", "quick"); dislikes.push("teasing", "tantric"); bonusPlayerTraits.push("Efficient", "Direct"); penaltyPlayerTraits.push("Talkative", "Slow"); } if (mentalTraits.indexOf("Quiet") !== -1 || mentalTraits.indexOf("Introverted") !== -1) { preferences.push("sensual", "gentle"); dislikes.push("dirtyTalk"); bonusPlayerTraits.push("Quiet", "Gentle", "Patient"); penaltyPlayerTraits.push("Loud", "Talkative"); } if (stereotype === "Jock") { preferences.push("rough", "stamina", "athletic"); bonusPlayerTraits.push("Athletic Build", "Fit", "Energetic"); } else if (stereotype === "Nerd" || stereotype === "Geek") { preferences.push("roleplay", "tantric"); bonusPlayerTraits.push("Intelligent", "Nerdy", "Geeky"); } else if (stereotype === "Goth") { preferences.push("rough", "fetishPlay", "dark"); bonusPlayerTraits.push("Goth", "Dark", "Mysterious"); } else if (stereotype === "Prep") { preferences.push("sensual", "clean", "fashionable"); bonusPlayerTraits.push("Fashionable", "Attractive", "Preppy"); } else if (stereotype === "Diva") { preferences.push("worship", "submission"); dislikes.push("domination"); bonusPlayerTraits.push("Submissive", "Obedient"); penaltyPlayerTraits.push("Arrogant", "Dominant"); } var chestPref = random(1, 100); if (chestPref <= 25) { preferredChestSize = "small"; } else if (chestPref <= 50) { preferredChestSize = "medium"; } else if (chestPref <= 75) { preferredChestSize = "large"; } else { preferredChestSize = "huge"; } var breastActivityPref = random(1, 100); if (breastActivityPref <= 30) { preferences.push("titPlay", "nipplePlay"); if (random(1, 100) <= 60) { bonusPlayerTraits.push("large_tits", "huge_tits", "giant_tits", "gigantic_tits"); } } if (hasPenis && hasVagina) { preferredGenitals = "futanari"; preferences.push("penisPlay", "vaginal"); } else if (hasPenis) { preferredGenitals = "vagina"; preferences.push("vaginal", "anal", "oralGiving"); var tightnessPref = random(1, 100); if (tightnessPref <= 40) { bonusPlayerTraits.push("tight_vagina"); } else if (tightnessPref <= 70) { bonusPlayerTraits.push("normal_vagina"); } else { bonusPlayerTraits.push("loose_vagina"); } } else if (hasVagina) { preferredGenitals = "penis"; preferences.push("vaginal", "anal", "oralReceiving"); if (random(1, 100) <= 30) { bonusPlayerTraits.push("player_has_penis"); } } var difficulty = "medium"; var basePay = 0; if (mentalTraits.indexOf("Rude") !== -1 || mentalTraits.indexOf("Demanding") !== -1 || mentalTraits.indexOf("Arrogant") !== -1) { difficulty = "hard"; } if (mentalTraits.indexOf("Shy") !== -1 || mentalTraits.indexOf("Nervous") !== -1 || mentalTraits.indexOf("Kind") !== -1) { difficulty = "easy"; } if (stereotype === "Diva") { difficulty = "very hard"; } if (random(1, 100) <= 10 && v.brothelLevel >= 5) { difficulty = "very hard"; mentalTraits.push("Wealthy"); mentalTraits.push("Demanding"); } if (maxDifficulty === "medium" && (difficulty === "hard" || difficulty === "very hard")) { difficulty = "medium"; } else if (maxDifficulty === "hard" && difficulty === "very hard") { difficulty = "hard"; } if (difficulty === "easy") { basePay = random(50, 100); } else if (difficulty === "medium") { basePay = random(100, 200); } else if (difficulty === "hard") { basePay = random(200, 350); } else if (difficulty === "very hard") { basePay = random(350, 700); } var description = setup.buildClientDescription(gender, age, hairColor, hairLength, chestSize, voice, mentalTraits, stereotype, hasPenis, hasVagina); clients.push({ name: name, gender: gender, age: age, hairColor: hairColor, hairLength: hairLength, chestSize: chestSize, voice: voice, mentalTraits: mentalTraits, stereotype: stereotype, hasPenis: hasPenis, hasVagina: hasVagina, description: description, basePay: basePay, preferences: preferences, dislikes: dislikes, difficulty: difficulty, requiredPlayerTraits: requiredPlayerTraits, bonusPlayerTraits: bonusPlayerTraits, penaltyPlayerTraits: penaltyPlayerTraits, preferredChestSize: preferredChestSize, preferredGenitals: preferredGenitals }); } return clients; }; setup.buildClientDescription = function(gender, age, hairColor, hairLength, chestSize, voice, mentalTraits, stereotype, hasPenis, hasVagina) { var desc = ""; var pronoun = gender === "male" ? "he" : "she"; var possessive = gender === "male" ? "his" : "her"; if (age < 25) { desc += "A young " + gender + " "; } else if (age < 35) { desc += "A " + gender + " in " + possessive + " late twenties "; } else if (age < 45) { desc += "A mature " + gender + " "; } else { desc += "An older " + gender + " "; } desc += "with " + hairLength + " " + hairColor.toLowerCase() + " hair. "; if (chestSize !== "flat") { if (gender === "female") { desc += "You notice " + possessive + " " + chestSize + " breasts. "; } else { desc += "Unusually, " + pronoun + " has noticeable chest development. "; } } desc += "Their " + voice.toLowerCase() + " catches your attention. "; if (mentalTraits.length > 0) { var trait = mentalTraits[random(0, mentalTraits.length - 1)]; if (trait === "Dominant" || trait === "Aggressive") { desc += "They carry themselves with dominant energy. "; } else if (trait === "Submissive" || trait === "Shy") { desc += "They seem shy and uncertain. "; } else if (trait === "Friendly" || trait === "Kind") { desc += "They have a warm, friendly demeanor. "; } else if (trait === "Arrogant" || trait === "Bitchy") { desc += "They radiate arrogance. "; } else if (trait === "Flirty" || trait === "Seductive") { desc += "They're already giving you flirtatious looks. "; } } if (hasPenis && hasVagina && gender === "female") { desc += "There's something... unusual about this client."; } else if (hasVagina && gender === "male") { desc += "Something seems different about this client."; } return desc; }; setup.calculateClientSatisfaction = function(client, choices, skills) { var satisfaction = 50; var v = State.variables; var difficulty = client.difficulty; /* Dominatrix override: if player is Dominatrix and performs domination, clients ignore their preferences and always respond positively */ var isDominatrix = v.mentalTraits && v.mentalTraits.includes("Dominatrix"); var performsDomination = choices && choices.indexOf("domination") !== -1; var dominatrixOverride = isDominatrix && performsDomination; /* If Dominatrix override is active, give massive satisfaction boost */ if (dominatrixOverride) { satisfaction = 85; } var bonusMultiplier = 1.0; var penaltyMultiplier = 1.0; if (difficulty === "easy") { bonusMultiplier = 0.8; penaltyMultiplier = 0.6; } else if (difficulty === "medium") { bonusMultiplier = 1.0; penaltyMultiplier = 1.0; } else if (difficulty === "hard") { bonusMultiplier = 1.3; penaltyMultiplier = 1.4; } else if (difficulty === "very hard") { bonusMultiplier = 1.6; penaltyMultiplier = 2.0; } if (client.requiredPlayerTraits && client.requiredPlayerTraits.length > 0) { for (var i = 0; i < client.requiredPlayerTraits.length; i++) { var trait = client.requiredPlayerTraits[i]; if (v.mentalTraits.indexOf(trait) !== -1) { satisfaction += Math.floor(20 * bonusMultiplier); } else { satisfaction -= Math.floor(30 * penaltyMultiplier); } } } if (client.bonusPlayerTraits && client.bonusPlayerTraits.length > 0) { for (var i = 0; i < client.bonusPlayerTraits.length; i++) { var trait = client.bonusPlayerTraits[i]; if (trait === "tight_vagina" && v.vaginaTightness === "tight") { satisfaction += Math.floor(15 * bonusMultiplier); } else if (trait === "normal_vagina" && v.vaginaTightness === "normal") { satisfaction += Math.floor(10 * bonusMultiplier); } else if (trait === "loose_vagina" && v.vaginaTightness === "loose") { satisfaction += Math.floor(15 * bonusMultiplier); } else if (trait === "player_has_penis" && v.bodyParts.genitals && v.bodyParts.genitals.toLowerCase().indexOf("penis") !== -1) { satisfaction += Math.floor(20 * bonusMultiplier); } else if (v.mentalTraits.indexOf(trait) !== -1 || v.physicalTraits.indexOf(trait) !== -1) { satisfaction += Math.floor(8 * bonusMultiplier); } } } if (client.penaltyPlayerTraits && client.penaltyPlayerTraits.length > 0) { for (var i = 0; i < client.penaltyPlayerTraits.length; i++) { var trait = client.penaltyPlayerTraits[i]; if (v.mentalTraits.indexOf(trait) !== -1 || v.physicalTraits.indexOf(trait) !== -1) { satisfaction -= Math.floor(10 * penaltyMultiplier); } } } if (client.preferredChestSize) { var playerChest = v.bodyParts.chest.toLowerCase(); var preferredChest = client.preferredChestSize.toLowerCase(); if (playerChest === preferredChest) { satisfaction += Math.floor(12 * bonusMultiplier); } else if (playerChest.indexOf(preferredChest) !== -1 || preferredChest.indexOf(playerChest) !== -1) { satisfaction += Math.floor(5 * bonusMultiplier); } else { satisfaction -= Math.floor(8 * penaltyMultiplier); } } if (choices.indexOf("titWorship") !== -1 || choices.indexOf("titfuck") !== -1) { var playerChest = v.bodyParts.chest.toLowerCase(); if (client.preferredChestSize) { var preferredChest = client.preferredChestSize.toLowerCase(); if (playerChest === preferredChest) { satisfaction += Math.floor(15 * bonusMultiplier); } else if (playerChest.indexOf(preferredChest) !== -1 || preferredChest.indexOf(playerChest) !== -1) { satisfaction += Math.floor(8 * bonusMultiplier); } } if (choices.indexOf("titfuck") !== -1) { if (playerChest.indexOf("huge") !== -1 || playerChest.indexOf("giant") !== -1 || playerChest.indexOf("gigantic") !== -1) { satisfaction += Math.floor(12 * bonusMultiplier); } else if (playerChest.indexOf("large") !== -1) { satisfaction += Math.floor(8 * bonusMultiplier); } } } for (var i = 0; i < choices.length; i++) { if (client.preferences.indexOf(choices[i]) !== -1) { satisfaction += Math.floor(10 * bonusMultiplier); } if (client.dislikes.indexOf(choices[i]) !== -1 && !dominatrixOverride) { satisfaction -= Math.floor(15 * penaltyMultiplier); } } var preferenceMatches = 0; var preferenceTotal = client.preferences.length; for (var i = 0; i < choices.length; i++) { if (client.preferences.indexOf(choices[i]) !== -1) { preferenceMatches++; } } /* Dominatrix override: skip preference match rate penalty */ if (preferenceTotal > 0 && !dominatrixOverride) { var matchRate = preferenceMatches / preferenceTotal; if (matchRate >= 0.75) { satisfaction += Math.floor(25 * bonusMultiplier); } else if (matchRate >= 0.5) { satisfaction += Math.floor(15 * bonusMultiplier); } else if (matchRate >= 0.25) { satisfaction += Math.floor(5 * bonusMultiplier); } else { satisfaction -= Math.floor(15 * penaltyMultiplier); } } else if (preferenceTotal > 0 && dominatrixOverride) { /* Dominatrix always gets bonus as if matching 75%+ preferences */ satisfaction += Math.floor(25 * bonusMultiplier); } if (v.sexualSkills) { for (var i = 0; i < choices.length; i++) { var skillKey = choices[i]; if (v.sexualSkills[skillKey]) { var level = v.sexualSkills[skillKey].level; var skillBonus = Math.floor(level / 2); satisfaction += Math.floor(skillBonus * bonusMultiplier); } } } var charisma = setup.getTotalStat("charisma"); var charismaBonus = Math.floor(charisma / 10); satisfaction += Math.floor(charismaBonus * bonusMultiplier); if (satisfaction > 100) satisfaction = 100; if (satisfaction < 0) satisfaction = 0; return satisfaction; }; setup.addBrothelLevelExp = function(expAmount) { var v = State.variables; if (!v.brothelLevelExp) v.brothelLevelExp = 0; if (!v.brothelMaxExp) v.brothelMaxExp = 100; if (!v.brothelLevel) v.brothelLevel = 1; if (v.brothelLevel >= 5) { return; } /* Trophy Wife 2x brothel XP bonus */ if (v.physicalTraits && v.physicalTraits.includes("Trophy Wife")) { expAmount = expAmount * 2; } /* Slut 2x brothel XP bonus */ if (v.physicalTraits && v.physicalTraits.includes("Slut")) { expAmount = expAmount * 2; } v.brothelLevelExp += expAmount; while (v.brothelLevelExp >= v.brothelMaxExp && v.brothelLevel < 5) { v.brothelLevelExp -= v.brothelMaxExp; v.brothelLevel++; v.brothelMaxExp = Math.floor(v.brothelMaxExp * 1.5); if (!v.brothelLevelUpMessages) { v.brothelLevelUpMessages = []; } var levelUpMsg = "Brothel Level Up! You are now Level " + v.brothelLevel; v.brothelLevelUpMessages.push(levelUpMsg); if (v.brothelLevel >= 5) { setup.achievements.unlock("brothel_max_level"); } } if (v.brothelLevel >= 5) { v.brothelLevel = 5; v.brothelLevelExp = 0; } }; setup.monitorSexuallySkilled = function() { var v = State.variables; if (v.sexualSkills && (!v.skills || v.skills.indexOf("Sexually Skilled") === -1)) { setup.resetSexualSkills(); if (v.jobs && v.jobs.indexOf("Brothel Worker") !== -1) { v.jobs.splice(v.jobs.indexOf("Brothel Worker"), 1); } } } >> <</nobr>>
<<nobr>> <<set $lastLocation = "Brothel">> <!-- Generate available clients --> <<set _availableClients = setup.generateBrothelClients()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💼 Available Clients</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 16px; margin: 0; text-align: center;"> Choose a client carefully. Their preferences and your skills will determine your success. </p> </div> <!-- Client Cards --> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _client range _availableClients>> <<capture _client>> <div style="background: #2a2a2a; border: 3px solid #e91e63; border-radius: 12px; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <!-- Client Header --> <div style="border-bottom: 2px solid #e91e63; padding-bottom: 10px; margin-bottom: 15px;"> <h3 style="color: #e91e63; margin: 0 0 5px 0;"> <<print _client.name>> <<if _client.type === "mystery">><span style="color: #ffc107;">⚠️</span><</if>> <<if _client.type === "vip">><span style="color: #FFD700;">👑</span><</if>> </h3> <div style="color: #aaa; font-size: 14px;"> <<print _client.gender.toUpperFirst()>>, <<print _client.age>> years old </div> </div> <!-- Description --> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; margin-bottom: 15px; border-left: 3px solid #e91e63;"> <p style="color: #ccc; margin: 0; font-size: 14px; font-style: italic;"> "<<print _client.description>>" </p> </div> <!-- Payment --> <div style="margin-bottom: 15px;"> <strong style="color: #51cf66;">Base Payment:</strong> <span style="color: #51cf66; font-size: 18px; font-weight: bold;">$<<print _client.basePay>></span> </div> <!-- Difficulty --> <div style="margin-bottom: 15px;"> <strong style="color: #aaa;">Difficulty:</strong> <<if _client.difficulty === "easy">> <span style="color: #51cf66;">Easy ⭐</span> <<elseif _client.difficulty === "medium">> <span style="color: #ffc107;">Medium ⭐⭐</span> <<elseif _client.difficulty === "hard">> <span style="color: #ff9800;">Hard ⭐⭐⭐</span> <<elseif _client.difficulty === "very hard">> <span style="color: #ff6b6b;">Very Hard ⭐⭐⭐⭐</span> <<else>> <span style="color: #9b59b6;">??? ⚠️</span> <</if>> </div> <!-- Hints about preferences (vague) --> <<if _client.type !== "mystery">> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: #667eea; font-size: 13px; font-weight: bold; margin-bottom: 5px;">Vibes:</div> <<if _client.preferences.includes("sensual") || _client.preferences.includes("tantric")>> <span style="color: #ccc; font-size: 12px;">• Seeks intimacy and connection</span><br> <</if>> <<if _client.preferences.includes("rough") || _client.preferences.includes("domination")>> <span style="color: #ccc; font-size: 12px;">• Wants intensity</span><br> <</if>> <<if _client.preferences.includes("submission")>> <span style="color: #ccc; font-size: 12px;">• Needs to be controlled</span><br> <</if>> <<if _client.preferences.includes("roleplay") || _client.preferences.includes("fetishPlay")>> <span style="color: #ccc; font-size: 12px;">• Has specific fantasies</span><br> <</if>> <<if _client.preferences.includes("oralGiving") || _client.preferences.includes("oralReceiving")>> <span style="color: #ccc; font-size: 12px;">• Appreciates oral attention</span><br> <</if>> </div> <</if>> <!-- Required/Penalty Traits Warning --> <<if _client.requiredTraits && _client.requiredTraits.length > 0>> <<set _hasRequired = false>> <<for _trait range _client.requiredTraits>> <<if $mentalTraits.includes(_trait)>> <<set _hasRequired = true>> <</if>> <</for>> <<if !_hasRequired>> <div style="background: #ff6b6b; padding: 8px; border-radius: 6px; margin-bottom: 10px;"> <span style="color: white; font-size: 12px; font-weight: bold;">⚠️ May be difficult without certain traits</span> </div> <</if>> <</if>> <!-- Select Button --> <<link "<div style='background: linear-gradient(135deg, #e91e63 0%, #c2185b 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Select This Client</div>">> <<set $currentBrothelClient = _client>> <<goto "BrothelSession">> <</link>> </div> <</capture>> <</for>> </div> <!-- Back Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #007FFF; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back to Lounge</div>">> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Brothel">> <!-- Initialize session variables --> <<if !$brothelSessionStage>> <<set $brothelSessionStage = 1>> <<set $brothelSessionChoices = []>> <<set $brothelSessionSkillsUsed = []>> <</if>> <<set _client = $currentBrothelClient>> <!-- Check player personality traits --> <<set _isDominant = $mentalTraits.includes("Dominant") || $mentalTraits.includes("Aggressive") || $mentalTraits.includes("Arrogant") || $physicalTraits.includes("Dominatrix")>> <<set _isSubmissive = $mentalTraits.includes("Submissive") || $mentalTraits.includes("Shy") || $mentalTraits.includes("Passive")>> <<set _isConfident = $mentalTraits.includes("Confident") || $mentalTraits.includes("Charming")>> <<set _isBitchy = $mentalTraits.includes("Bitchy") || $mentalTraits.includes("Arrogant") || $mentalTraits.includes("Rude") || $physicalTraits.includes("Gyaru")>> <<set _isKind = $mentalTraits.includes("Kind") || $mentalTraits.includes("Friendly") || $mentalTraits.includes("Warm")>> <<set _isFlirty = $mentalTraits.includes("Flirty") || $mentalTraits.includes("Seductive") || $mentalTraits.includes("Alluring") || $physicalTraits.includes("Dominatrix")>> <<set _isAwkward = $mentalTraits.includes("Awkward") || $mentalTraits.includes("Shy")>> <<set _isProfessional = $mentalTraits.includes("Efficient") || $mentalTraits.includes("Direct") || $mentalTraits.includes("Hardworking")>> <<set _isEnergetic = $mentalTraits.includes("Energetic") || $mentalTraits.includes("Outgoing")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Session with <<print _client.name>></h1> <!-- Client Details Display --> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #667eea;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; font-size: 13px; color: #ccc;"> <div><strong style="color: #667eea;">Age:</strong> <<print _client.age>></div> <div><strong style="color: #667eea;">Hair:</strong> <<print _client.hairLength.toUpperFirst()>> <<print _client.hairColor>></div> <<if _client.chestSize !== "flat">> <div><strong style="color: #667eea;">Chest:</strong> <<print _client.chestSize.toUpperFirst()>></div> <</if>> <div><strong style="color: #667eea;">Voice:</strong> <<print _client.voice>></div> <<if _client.mentalTraits.length > 0>> <div><strong style="color: #667eea;">Traits:</strong> <<print _client.mentalTraits.join(", ")>></div> <</if>> <<if _client.stereotype>> <div><strong style="color: #667eea;">Type:</strong> <<print _client.stereotype>></div> <</if>> </div> </div> <!-- Stage 1: First Impression --> <<if $brothelSessionStage === 1>> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> <<print _client.description>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0;">Choose Your Approach</h2> <p style="color: #ccc; margin: 0 0 20px 0;">How do you greet <<print _client.name>>?</p> <div style="display: grid; gap: 15px;"> <!-- Sensual approach --> <<link "<div style='background: #1a1a1a; border: 2px solid #e91e63; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #e91e63;'>Sensual & Welcoming</strong><br><span style='color: #aaa; font-size: 14px;'><<if _isFlirty>>Seductive touches, sultry smile<<elseif _isKind>>Gentle touches, warm embrace<<elseif _isConfident>>Confident allure, magnetic presence<<elseif _isAwkward>>Tentative but sweet approach<<else>>Soft touches, intimate eye contact<</if>></span></div>">> <<set $brothelSessionChoices.push("sensual")>> <<set $brothelSessionSkillsUsed.push("sensual")>> <<set $brothelSessionStage = 2>> <<goto "BrothelSession">> <</link>> <!-- Teasing approach --> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #9b59b6;'>Playful & Teasing</strong><br><span style='color: #aaa; font-size: 14px;'><<if _isFlirty>>Expert seduction, knowing exactly what you're doing<<elseif _isBitchy>>Bratty teasing, making them work for it<<elseif _isEnergetic>>Bubbly playfulness, infectious energy<<elseif _isAwkward>>Clumsy but endearing flirtation<<else>>Flirty banter, coy smiles<</if>></span></div>">> <<set $brothelSessionChoices.push("teasing")>> <<set $brothelSessionSkillsUsed.push("teasing")>> <<set $brothelSessionStage = 2>> <<goto "BrothelSession">> <</link>> <!-- Dominant approach --> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff6b6b;'>Dominant & Commanding</strong><br><span style='color: #aaa; font-size: 14px;'><<if _isDominant>>Natural authority, commanding presence<<elseif _isBitchy>>Demanding control, expect obedience<<elseif _isConfident>>Confident dominance, in charge<<elseif _isSubmissive>>Trying to be dominant (awkward)<<else>>Take control, establish authority<</if>></span></div>">> <<set $brothelSessionChoices.push("domination")>> <<set $brothelSessionSkillsUsed.push("domination")>> <<set $brothelSessionStage = 2>> <<goto "BrothelSession">> <</link>> <!-- Submissive approach --> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #51cf66;'>Submissive & Eager</strong><br><span style='color: #aaa; font-size: 14px;'><<if _isSubmissive>>Natural submission, eager to please<<elseif _isAwkward>>Nervous but willing<<elseif _isKind>>Gentle submission, wanting to serve<<elseif _isDominant>>Reluctant submission (unnatural for you)<<else>>Show willingness to please<</if>></span></div>">> <<set $brothelSessionChoices.push("submission")>> <<set $brothelSessionSkillsUsed.push("submission")>> <<set $brothelSessionStage = 2>> <<goto "BrothelSession">> <</link>> <!-- Professional approach --> <<link "<div style='background: #1a1a1a; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ffc107;'>Professional & Direct</strong><br><span style='color: #aaa; font-size: 14px;'><<if _isProfessional>>Efficient, no-nonsense approach<<elseif _isBitchy>>Cold professionalism, no time to waste<<elseif _isConfident>>Smooth professional, in control<<else>>Businesslike, get to the point<</if>></span></div>">> <<set $brothelSessionChoices.push("professional")>> <<set $brothelSessionStage = 2>> <<goto "BrothelSession">> <</link>> </div> </div> <!-- Stage 2: Service Selection --> <<elseif $brothelSessionStage === 2>> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 18px; margin: 0;"> <<if $brothelSessionChoices.includes("sensual")>> <<if _client.gender === "male">> <<if _isFlirty>> You press your body against <<print _client.name>>, your breasts pushing into his chest. "Mmm... hello handsome," you purr, running your fingers down his arm. He shivers under your expert touch. <<elseif _isKind>> You take <<print _client.name>>'s hand gently, giving him a warm smile. "Welcome," you say softly, leading him to the bed. Your touch is tender as you caress his arm. <<else>> <<print _client.name>>'s body relaxes under your gentle touch. You trail your fingers along his arm, feeling him shiver. "Mmm... that feels nice," he murmurs. <</if>> <<else>> <<if _isFlirty>> You pull <<print _client.name>> close, your hands exploring her curves boldly. "Mmm, you're gorgeous," you purr directly into her ear. She gasps as your fingers trace her waist. <<elseif _isKind>> You embrace <<print _client.name>> warmly, holding her with genuine care. "You're safe with me," you whisper softly. She relaxes into your arms. <<else>> <<print _client.name>> melts into your embrace as you pull her close. Your hand slides down her side, feeling her curves. "Oh... yes," she breathes. <</if>> <</if>> <<elseif $brothelSessionChoices.includes("teasing")>> <<if _client.gender === "male">> You flash <<print _client.name>> a playful smile, trailing your hand across his chest before pulling away. "You're quite the tease," he says with a nervous laugh. <<else>> <<print _client.name>>'s breath catches as you lean in close, only to pull away at the last moment. "You like to play games," she says with a smile. <</if>> <<elseif $brothelSessionChoices.includes("domination")>> <<if _client.mentalTraits.includes("Submissive") || _client.mentalTraits.includes("Shy")>> <<if _client.gender === "male">> You grab <<print _client.name>>'s wrist firmly, pulling him toward the bed. His eyes widen with interest. "Yes... that's exactly what I need," he breathes. <<else>> Your hand wraps around <<print _client.name>>'s throat gently but firmly. She gasps, her pupils dilating. "Yes... fuck, yes," she moans. <</if>> <<else>> <<print _client.name>> seems uncertain about your dominant approach. This might not be what they're looking for. <</if>> <<elseif $brothelSessionChoices.includes("submission")>> <<if _client.mentalTraits.includes("Dominant") || _client.mentalTraits.includes("Aggressive")>> <<if _client.gender === "male">> You kneel before <<print _client.name>>, eyes downcast. "I'm here to serve you," you whisper. A smile crosses his face. "Good girl," he growls. <<else>> You lower yourself before <<print _client.name>>, showing your submission. Her eyes light up with predatory hunger. "Perfect," she purrs. <</if>> <<else>> <<print _client.name>> seems uncertain how to respond to your submissiveness. This might not be what they're looking for. <</if>> <<else>> <<if _client.gender === "male">> <<print _client.name>> nods appreciatively at your professional approach. "I appreciate the efficiency. Let's not waste time," he says. <<else>> "Good," <<print _client.name>> says with approval. "No games. I like that." <</if>> <</if>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0;">What Services Do You Offer?</h2> <div style="display: grid; gap: 15px;"> <<if $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("penis")>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff9800; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff9800;'>Use Your Cock</strong><br><span style='color: #aaa; font-size: 14px;'>Penetrate them with your penis</span></div>">> <<set $brothelSessionChoices.push("penisPlay")>> <<set $brothelSessionSkillsUsed.push("vaginal")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <</if>> <<link "<div style='background: #1a1a1a; border: 2px solid #e91e63; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #e91e63;'>Focus on Oral</strong><br><span style='color: #aaa; font-size: 14px;'>Skilled mouth work, building pleasure slowly</span></div>">> <<set $brothelSessionChoices.push("oralGiving")>> <<set $brothelSessionSkillsUsed.push("oralGiving")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <<if $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("vagina")>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #9b59b6;'>Full Vaginal Service</strong><br><span style='color: #aaa; font-size: 14px;'>Let them fuck your pussy</span></div>">> <<set $brothelSessionChoices.push("vaginal")>> <<set $brothelSessionSkillsUsed.push("vaginal")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <</if>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff9800; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff9800;'>Anal Play</strong><br><span style='color: #aaa; font-size: 14px;'>Offer your ass (Advanced)</span></div>">> <<set $brothelSessionChoices.push("anal")>> <<set $brothelSessionSkillsUsed.push("anal")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #51cf66;'>Hands Only</strong><br><span style='color: #aaa; font-size: 14px;'>Sensual manual stimulation</span></div>">> <<set $brothelSessionChoices.push("handjobs")>> <<set $brothelSessionSkillsUsed.push("handjobs")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <<if _client.preferences.includes("roleplay")>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffc107; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ffc107;'>Roleplay Scenario</strong><br><span style='color: #aaa; font-size: 14px;'>Act out a fantasy together</span></div>">> <<set $brothelSessionChoices.push("roleplay")>> <<set $brothelSessionSkillsUsed.push("roleplay")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <</if>> <!-- Tit-Based Services (size dependent) --> <<set _playerChestSize = $bodyParts.chest.toLowerCase()>> <<if _playerChestSize !== "flat" && _playerChestSize !== "flat masculine">> <<link "<div style='background: #1a1a1a; border: 2px solid #ff69b4; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff69b4;'>Tit Worship & Nipple Play</strong><br><span style='color: #aaa; font-size: 14px;'>Let them worship your breasts</span></div>">> <<set $brothelSessionChoices.push("titWorship")>> <<set $brothelSessionSkillsUsed.push("titWorship")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <</if>> <<if _playerChestSize.includes("medium") || _playerChestSize.includes("large") || _playerChestSize.includes("huge") || _playerChestSize.includes("giant") || _playerChestSize.includes("gigantic")>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff1493; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff1493;'>Titfuck Service</strong><br><span style='color: #aaa; font-size: 14px;'>Slide their cock between your tits (Requires Medium+)</span></div>">> <<set $brothelSessionChoices.push("titfuck")>> <<set $brothelSessionSkillsUsed.push("titfuck")>> <<set $brothelSessionStage = 3>> <<goto "BrothelSession">> <</link>> <</if>> </div> </div> <!-- Stage 3: The Action --> <<elseif $brothelSessionStage === 3>> <!-- Brothel Service Image --> <<if $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _playerTraits = { isDominant: _isDominant, isSubmissive: _isSubmissive, isConfident: _isConfident, isBitchy: _isBitchy, isKind: _isKind, isFlirty: _isFlirty, isAwkward: _isAwkward, isProfessional: _isProfessional, isEnergetic: _isEnergetic, chestSize: $bodyParts.chest.toLowerCase(), hasVagina: $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("vagina"), hasPenis: $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("penis") }>> <<set _serviceType = "">> <<if $brothelSessionChoices.includes("oralGiving")>><<set _serviceType = "oralGiving">> <<elseif $brothelSessionChoices.includes("vaginal")>><<set _serviceType = "vaginal">> <<elseif $brothelSessionChoices.includes("anal")>><<set _serviceType = "anal">> <<elseif $brothelSessionChoices.includes("handjobs")>><<set _serviceType = "handjobs">> <<elseif $brothelSessionChoices.includes("roleplay")>><<set _serviceType = "roleplay">> <<elseif $brothelSessionChoices.includes("titWorship")>><<set _serviceType = "titWorship">> <<elseif $brothelSessionChoices.includes("titfuck")>><<set _serviceType = "titfuck">> <<elseif $brothelSessionChoices.includes("penisPlay")>><<set _serviceType = "penisPlay">> <</if>> <<set _brothelImagePath = setup.getBrothelImage(_serviceType, _client, _playerTraits, $brothelSessionChoices)>> <<if _brothelImagePath>> <div style="text-align: center; margin: 20px 0;"> <img src="<<print _brothelImagePath>>" style="max-width: 100%; width: 600px; border-radius: 15px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Brothel Session"> </div> <</if>> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 16px; margin: 0; line-height: 1.6;"> <<if $brothelSessionChoices.includes("oralGiving")>> You guide <<print _client.name>> to the bed and position yourself between their legs. <<if _client.hasPenis>> Their cock stands hard and ready. You wrap your hand around the base, feeling it pulse. "Fuck..." they groan as your tongue swirls around the head. You work your mouth up and down, taking them deeper each time. Saliva drips down their shaft as you increase the pace. "Don't stop... fuck, don't stop!" they pant. <<else>> Their pussy is already glistening with arousal. You spread their lips gently, exposing their clit. "Please," they whimper. Your tongue makes contact and they gasp. You work your tongue in circles, occasionally dipping lower to taste their wetness. "Fuck... oh fuck!" they cry. <</if>> <<elseif $brothelSessionChoices.includes("vaginal")>> You climb onto the bed, spreading your legs invitingly. <<print _client.name>> positions themselves between your thighs. <<if _client.hasPenis>> Their cock presses against your entrance. "Ready?" You nod eagerly. They push inside. <<if $vaginaTightness === "tight">> "Ohh!" you gasp as they stretch you. The fullness is intense. "So... so full..." "Fuck, you're gripping me so tight," they groan, working deeper. <<else>> "Mmm..." you moan as they fill you. The sensation sends pleasure through you. "God, your pussy feels amazing," they groan, beginning to thrust. <</if>> Their hips slam against yours rhythmically. "Yes! Fuck yes!" you cry out. <</if>> <<elseif $brothelSessionChoices.includes("anal")>> You position yourself on hands and knees, ass raised invitingly. <<print _client.name>> applies lube generously. <<if _client.hasPenis>> "Relax," they murmur, pressing the head of their cock against your tight hole. You breathe deeply as they begin to push inside. "Ahh!" you gasp at the intense sensation. They start to thrust, slowly at first. "Oh god!" you moan, the fullness overwhelming. Each stroke hits deeper. "More... I can take more!" <<else>> They work their fingers into your ass, stretching you carefully. "How does that feel?" "Good... really good," you pant. They add another finger, scissoring them to open you further. <</if>> <<elseif $brothelSessionChoices.includes("handjobs")>> You coat your hands with oil, watching it glisten on your skin. <<if _client.hasPenis>> Wrapping both hands around <<print _client.name>>'s cock, you begin to stroke. "Mmm..." they moan immediately. Your slick hands glide up and down their shaft. "That feels incredible," they breathe. Their hips buck into your grip. "Fuck... fuck I'm close already," they pant. <<else>> Your oiled fingers find <<print _client.name>>'s clit, rubbing in slow circles. "Ohh..." they gasp. You slide lower, two fingers pushing into their wet pussy while your thumb continues working their clit. "Yes! Right there!" they cry. <</if>> <<elseif $brothelSessionChoices.includes("roleplay")>> You slip into character, transforming into whatever fantasy <<print _client.name>> desires. The scene unfolds with increasing intensity. "Yes... that's perfect," they breathe, fully immersed in the scenario. The roleplay becomes more physical, more intimate. <<elseif $brothelSessionChoices.includes("titWorship")>> <<set _chestSize = $bodyParts.chest.toLowerCase()>> You strip off your top, revealing your <<if _chestSize.includes("small")>> small, perky tits. Your nipples are already hard. <<elseif _chestSize.includes("medium")>> medium-sized tits. They're the perfect handful. <<elseif _chestSize.includes("large")>> large tits. They bounce heavily as you move. <<elseif _chestSize.includes("huge") || _chestSize.includes("giant") || _chestSize.includes("gigantic")>> massive tits. The enormous mounds jiggle with every movement. <</if>> <<print _client.name>>'s eyes go wide. Their hands immediately cup your breasts, squeezing and kneading. Their mouth finds your nipple, sucking hard. "Ahh!" you moan. They switch to your other nipple, licking and sucking. Their hands never stop groping your tits. <<elseif $brothelSessionChoices.includes("titfuck")>> <<set _chestSize = $bodyParts.chest.toLowerCase()>> <<if _client.hasPenis>> <<print _client.name>> pulls out their cock - it's already rock hard. You push them onto the bed and kneel between their legs. You spit on their cock, the saliva making everything slick. Then you wrap your tits around their shaft and start moving. <<if _chestSize.includes("medium")>> Your medium tits slide up and down their cock. You press them together tightly to create enough pressure. "Oh fuck," they groan. <<elseif _chestSize.includes("large")>> Your large tits envelope their cock completely. You bounce them up and down, the soft flesh massaging their entire shaft. "Holy shit!" they moan. <<else>> Your massive tits completely swallow their cock. There's so much soft tit-flesh that they can barely feel where their cock ends. You bounce your tits vigorously. "Oh my god! Your tits are so fucking huge!" they gasp. <</if>> Their cock is throbbing between your tits. You lean down and suck the tip each time it emerges from your cleavage. <<else>> You realize <<print _client.name>> doesn't have a cock. Instead, you guide their hands to your breasts for worship. They knead and squeeze your soft flesh eagerly. <</if>> <<elseif $brothelSessionChoices.includes("penisPlay")>> <<if _client.hasVagina>> You guide <<print _client.name>> to the bed, spreading their legs wide. Your cock throbs with anticipation as you position yourself. You push forward slowly, watching your shaft disappear into their wet heat. "Ohhh fuck!" they cry out, back arching. The tight warmth envelops you as you begin to thrust. "Yes... yes... harder!" Their walls clench around you with each stroke. <</if>> <</if>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0;">How Do You Enhance the Experience?</h2> <div style="display: grid; gap: 15px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #e91e63; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #e91e63;'>Talk Dirty</strong><br><span style='color: #aaa; font-size: 14px;'>Whisper filthy things in their ear</span></div>">> <<set $brothelSessionChoices.push("dirtyTalk")>> <<set $brothelSessionSkillsUsed.push("dirtyTalk")>> <<set $brothelSessionStage = 4>> <<goto "BrothelSession">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #9b59b6;'>Slow & Sensual</strong><br><span style='color: #aaa; font-size: 14px;'>Take your time, savor every moment</span></div>">> <<set $brothelSessionChoices.push("tantric")>> <<set $brothelSessionSkillsUsed.push("tantric")>> <<set $brothelSessionStage = 4>> <<goto "BrothelSession">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #ff6b6b;'>Rough & Intense</strong><br><span style='color: #aaa; font-size: 14px;'>Increase the intensity and pace</span></div>">> <<set $brothelSessionChoices.push("rough")>> <<set $brothelSessionSkillsUsed.push("rough")>> <<set $brothelSessionStage = 4>> <<goto "BrothelSession">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #51cf66;'>Tease & Deny</strong><br><span style='color: #aaa; font-size: 14px;'>Build anticipation, make them beg</span></div>">> <<set $brothelSessionChoices.push("teasing")>> <<set $brothelSessionSkillsUsed.push("teasing")>> <<set $brothelSessionStage = 4>> <<goto "BrothelSession">> <</link>> </div> </div> <!-- Stage 4: Building to Climax --> <<elseif $brothelSessionStage === 4>> <div style="padding: 20px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e91e63;"> <p style="color: white; font-size: 16px; margin: 0; line-height: 1.6;"> <<if $brothelSessionChoices.includes("dirtyTalk")>> You lean in close, your breath hot against <<print _client.name>>'s ear. "You like that, don't you?" you whisper. "Fuck yes," they gasp. "Tell me how good it feels," you demand. "So good... oh god it's so fucking good!" they cry out. Their breathing becomes ragged, desperate. "Please... please let me cum!" <<elseif $brothelSessionChoices.includes("tantric")>> You slow everything down deliberately, making each touch meaningful. <<print _client.name>> whimpers at the change in pace. "No... don't slow down..." "Shh," you soothe. "Trust me." Minutes pass like hours. The slow build has them trembling, every nerve ending on fire. "I... I've never felt anything like this," they breathe. <<elseif $brothelSessionChoices.includes("rough")>> You grab <<print _client.name>> roughly, fingers digging into their flesh. "Is this what you wanted?" you growl. "Yes! Fuck yes!" they scream. The pace becomes frantic, almost violent. Skin slaps against skin loudly. "Harder!" they beg. "Fucking destroy me!" <<elseif $brothelSessionChoices.includes("teasing")>> Just as <<print _client.name>> gets close, you pull back. "No! Please!" they whimper desperately. "Not yet," you say with a wicked smile. You bring them to the edge again and again, each time denying their release. "Please... please I need to cum so badly," they beg. Their body is trembling, hypersensitive to every touch. <</if>> </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #667eea; margin: 0 0 15px 0;">The Finale</h2> <div style="display: grid; gap: 15px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #e91e63; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #e91e63;'>Finish Strong</strong><br><span style='color: #aaa; font-size: 14px;'>Give them an explosive climax</span></div>">> <<set $brothelSessionChoices.push("strong_finish")>> <<set $brothelSessionStage = 5>> <<goto "BrothelSessionResults">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #9b59b6;'>Multiple Orgasms</strong><br><span style='color: #aaa; font-size: 14px;'>Don't stop at just one (Requires Stamina)</span></div>">> <<set $brothelSessionChoices.push("multiple")>> <<set $brothelSessionSkillsUsed.push("stamina")>> <<set $brothelSessionStage = 5>> <<goto "BrothelSessionResults">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; padding: 15px; border-radius: 8px; cursor: pointer;'><strong style='color: #51cf66;'>Simultaneous Climax</strong><br><span style='color: #aaa; font-size: 14px;'>Perfectly timed together (Advanced)</span></div>">> <<set $brothelSessionChoices.push("simultaneous")>> <<set $brothelSessionSkillsUsed.push("rhythm")>> <<set $brothelSessionStage = 5>> <<goto "BrothelSessionResults">> <</link>> </div> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Brothel">> <<set _client = $currentBrothelClient>> <!-- Check player personality traits --> <<set _isDominant = $mentalTraits.includes("Dominant") || $mentalTraits.includes("Aggressive") || $mentalTraits.includes("Arrogant")>> <<set _isSubmissive = $mentalTraits.includes("Submissive") || $mentalTraits.includes("Shy") || $mentalTraits.includes("Passive")>> <<set _isConfident = $mentalTraits.includes("Confident") || $mentalTraits.includes("Charming")>> <<set _isBitchy = $mentalTraits.includes("Bitchy") || $mentalTraits.includes("Arrogant") || $mentalTraits.includes("Rude")>> <<set _isKind = $mentalTraits.includes("Kind") || $mentalTraits.includes("Friendly") || $mentalTraits.includes("Warm")>> <<set _isFlirty = $mentalTraits.includes("Flirty") || $mentalTraits.includes("Seductive") || $mentalTraits.includes("Alluring")>> <<set _isAwkward = $mentalTraits.includes("Awkward") || $mentalTraits.includes("Shy")>> <<set _isProfessional = $mentalTraits.includes("Efficient") || $mentalTraits.includes("Direct") || $mentalTraits.includes("Hardworking")>> <<set _isEnergetic = $mentalTraits.includes("Energetic") || $mentalTraits.includes("Outgoing")>> <!-- Calculate satisfaction --> <<set _satisfaction = setup.calculateClientSatisfaction(_client, $brothelSessionChoices, $brothelSessionSkillsUsed)>> <!-- Update vagina tightness if applicable --> <<if $brothelSessionChoices.includes("vaginal") && $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("vagina")>> <<run setup.updateVaginaTightness()>> <</if>> <!-- Add sexual skill experience (scaled by satisfaction) --> <<set _sexualExpGains = []>> <<if $sexualSkills>> <<set _baseExpGain = 15 + random(-5, 5)>> <<set _expMultiplier = Math.max(0.3, _satisfaction / 100)>> <<set _finalExpGain = Math.floor(_baseExpGain * _expMultiplier)>> <!-- ===== SKILL TREE: Apply brothel XP bonus ===== --> <<set _brothelXPBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _brothelXPBonus = setup.skillTree.getEffect("brothelXPBonus") || 0>> <</if>> <<set _finalExpGain = _finalExpGain + _brothelXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalExpGain = _finalExpGain * 3>> <</if>> <<for _i = 0; _i < $brothelSessionSkillsUsed.length; _i++>> <<set _skillKey = $brothelSessionSkillsUsed[_i]>> <<if $sexualSkills[_skillKey]>> <<run setup.addSexualSkillExp(_skillKey, _finalExpGain)>> <<run _sexualExpGains.push({skill: setup.getSexualSkillDisplayName(_skillKey), amount: _finalExpGain})>> <</if>> <</for>> <</if>> <!-- Calculate payment --> <<set _satisfactionMultiplier = _satisfaction / 100>> <<set _payment = Math.floor(_client.basePay * _satisfactionMultiplier)>> <<set _tip = 0>> <<if _satisfaction >= 90>> <<set _tip = Math.floor(_payment * 0.5)>> <<elseif _satisfaction >= 75>> <<set _tip = Math.floor(_payment * 0.25)>> <<elseif _satisfaction >= 60>> <<set _tip = Math.floor(_payment * 0.1)>> <</if>> <<set _totalEarnings = _payment + _tip>> <!-- ===== SKILL TREE: Apply brothel pay bonus ===== --> <<set _brothelPayBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _brothelPayBonus = setup.skillTree.getEffect("brothelPayBonus") || 0>> <</if>> <<set _skillTreePayBonus = 0>> <<if _brothelPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_totalEarnings * (_brothelPayBonus / 100))>> <<set _totalEarnings = _totalEarnings + _skillTreePayBonus>> <</if>> <!-- Dominatrix 3x cash bonus for dominant acts --> <<set _dominatrixActive = $physicalTraits.includes("Dominatrix") && $brothelSessionChoices.includes("domination")>> <<set _dominatrixBonus = 0>> <<if _dominatrixActive>> <<set _dominatrixBonus = _totalEarnings * 2>> <<set _totalEarnings = _totalEarnings * 3>> <</if>> <!-- Slut 2x cash bonus for all sexual jobs --> <<set _slutActive = $physicalTraits.includes("Slut")>> <<set _slutBonus = 0>> <<if _slutActive>> <<set _slutBonus = _totalEarnings>> <<set _totalEarnings = _totalEarnings * 2>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) - applies to total after skill tree bonus --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preArtifactEarnings = _totalEarnings>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.floor(_preArtifactEarnings * 0.5)>> <<set _totalEarnings = _preArtifactEarnings + _pearlBonus>> <</if>> <<set $money += _totalEarnings>> <<set $brothelClients += 1>> <<set $brothelClientsToday += 1>> <<set $timeInMinutes += 60>> <!-- Achievement for working in brothel --> <<run setup.achievements.unlock("work_brothel")>> <!-- Track jobs worked for work_every_job achievement --> <<if !$jobsWorked>> <<set $jobsWorked = []>> <</if>> <<if !$jobsWorked.includes("Brothel Worker")>> <<run $jobsWorked.push("Brothel Worker")>> <</if>> <!-- Add Brothel Level XP based on satisfaction --> <<set _brothelExpGain = Math.floor((_satisfaction / 100) * (15 + random(-3, 3)))>> <!-- ===== SKILL TREE: Apply brothel XP bonus to level XP ===== --> <<if _brothelXPBonus > 0>> <<set _brothelExpGain = _brothelExpGain + _brothelXPBonus>> <</if>> <<run setup.addBrothelLevelExp(_brothelExpGain)>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💋 Session Complete</h1> <!-- THE CLIMAX SCENE --> <div style="padding: 25px; background: linear-gradient(135deg, #4a1942 0%, #2d1628 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 6px 12px rgba(233,30,99,0.4);"> <h2 style="color: white; margin: 0 0 15px 0; text-align: center;">The Finale</h2> <p style="color: white; font-size: 16px; margin: 0; line-height: 1.8;"> <<if $brothelSessionChoices.includes("strong_finish")>> You push <<print _client.name>> over the edge with expert precision. Their whole body tenses, muscles clenching as the orgasm crashes through them. "FUCK! YES! OH GOD!" they scream, completely lost in ecstasy. <<elseif $brothelSessionChoices.includes("multiple")>> You don't let up after the first orgasm, pushing <<print _client.name>> through wave after wave of pleasure. "Again... oh god again!" they cry, body shaking uncontrollably as you coax another climax from them. <<elseif $brothelSessionChoices.includes("simultaneous")>> Your bodies move in perfect synchronization, building together toward the peak. "Together..." you gasp. "Together!" You both cry out in unison as the orgasm hits, perfectly timed. <</if>> <br><br> After catching your breath, you both clean up. <<print _client.name>> gets dressed with a satisfied smile. <<if _satisfaction >= 90>> "That was absolutely amazing. Best money I've ever spent," they say, handing you payment plus a generous tip. <<elseif _satisfaction >= 75>> "That was really good. You certainly know what you're doing," they say approvingly, including a nice tip. <<elseif _satisfaction >= 60>> "Not bad. Worth the money," they say, adding a small tip. <<elseif _satisfaction >= 40>> "It was... okay," they say with a shrug, paying exactly what was agreed. <<else>> "That didn't really do it for me," they admit with disappointment, paying the minimum. <</if>> </p> </div> <!-- ===== SKILL TREE: Get sex skill XP bonus for display ===== --> <<set _sexSkillXPBonus = 0>> <<if typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function">> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus") || 0>> <</if>> <!-- Sexual XP Gained Display --> <<if _sexualExpGains.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3);"> <h2 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if _sexSkillXPBonus > 0>> <span style="color: #CE93D8;">⭐ +<<print _sexSkillXPBonus>>%</span> <</if>> <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> <<if $physicalTraits && $physicalTraits.includes("Slut")>> <span style="color: #e6c4ff;">✓ Slut 3x</span> <<elseif $physicalTraits && $physicalTraits.includes("Trophy Wife")>> <span style="color: #ffd700;">✓ Trophy Wife 2x</span> <<elseif $physicalTraits && $physicalTraits.includes("Siren")>> <span style="color: #7dd3fc;">✓ Siren 1.5x</span> <</if>> </h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-top: 15px;"> <<for _xp range _sexualExpGains>> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px; border: 2px solid #ff69b4; text-align: center;"> <p style="color: #ff69b4; font-size: 14px; font-weight: bold; margin: 0;"><<print _xp.skill>></p> <p style="color: #51cf66; font-size: 16px; font-weight: bold; margin: 5px 0 0 0;">+<<print _xp.amount>> XP</p> </div> <</for>> </div> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4);"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <</if>> <!-- Results Summary --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #667eea;"> <h2 style="color: #667eea; margin: 0 0 15px 0;">Session Results</h2> <div style="display: grid; gap: 15px; font-size: 15px; color: #ccc;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #e91e63;"> <strong style="color: #e91e63;">Client Satisfaction:</strong> <<if _satisfaction >= 90>> <span style="color: #51cf66;"><<print _satisfaction>>% - Extremely Satisfied! 🔥</span> <<elseif _satisfaction >= 75>> <span style="color: #51cf66;"><<print _satisfaction>>% - Very Satisfied</span> <<elseif _satisfaction >= 60>> <span style="color: #ffc107;"><<print _satisfaction>>% - Satisfied</span> <<elseif _satisfaction >= 40>> <span style="color: #ff9800;"><<print _satisfaction>>% - Somewhat Satisfied</span> <<else>> <span style="color: #ff6b6b;"><<print _satisfaction>>% - Dissatisfied</span> <</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <strong style="color: #51cf66;">Earnings:</strong> <div style="margin-top: 8px;"> Base Pay: <span style="color: #51cf66;">$<<print _payment>></span><br> <<if _tip > 0>> Tip: <span style="color: #51cf66;">$<<print _tip>></span><br> <</if>> <<if _skillTreePayBonus > 0>> Skill Tree Bonus: <span style="color: #CE93D8;">$<<print _skillTreePayBonus>> (+<<print _brothelPayBonus>>%)</span><br> <</if>> <<if _dominatrixActive>> ✓ Dominatrix Bonus: <span style="color: #e91e63;">$<<print _dominatrixBonus>> (3x for domination)</span><br> <</if>> <<if _slutActive>> ✓ Slut Bonus: <span style="color: #ff69b4;">$<<print _slutBonus>> (2x sexual job cash)</span><br> <</if>> <<if _pearlActive>> Subtotal: <span style="color: #51cf66;">$<<print _preArtifactEarnings>></span><br> Pearl Bonus: <span style="color: #7dd3fc;">$<<print _pearlBonus>> (+50%)</span><br> <</if>> <strong>Total: <span style="color: #51cf66;">$<<print _totalEarnings>></span></strong> </div> </div> <<if $brothelSessionChoices.includes("vaginal") && $bodyParts.genitals && $bodyParts.genitals.toLowerCase().includes("vagina")>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ff9800;"> <strong style="color: #ff9800;">Vagina Status:</strong> <span style="color: #aaa;"> <<if $vaginaTightness === "tight">> Still tight (<<print $vaginalSexCount>> times used) <<elseif $vaginaTightness === "normal">> Normal (<<print $vaginalSexCount>> times used) <<else>> Loose (<<print $vaginalSexCount>> times used) <</if>> </span> </div> <</if>> </div> </div> <!-- Co-worker relationship bonus (25% chance per co-worker since sessions are 1 hour) --> <<set _coworkerBonuses = []>> <<set _coworkers = setup.getNPCsByJob("Brothel Worker")>> <<if _coworkers && _coworkers.length > 0>> <<for _i = 0; _i < _coworkers.length; _i++>> <<set _coworker = _coworkers[_i]>> <<set _coworkerName = _coworker.name>> <<if random(1, 100) <= 25>> <<set _relPoints = random(1, 3)>> <<run setup.meetNPC(_coworker)>> <<run setup.addRelationshipPoints(_coworkerName, _relPoints)>> <<run _coworkerBonuses.push({name: _coworkerName, points: _relPoints})>> <</if>> <</for>> <</if>> <<if _coworkerBonuses.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea;"> <h2 style="color: #667eea; margin: 0 0 15px 0;">👥 Co-Worker Bonding</h2> <p style="color: #aaa; margin-bottom: 15px;">You chatted with your co-workers between sessions!</p> <<for _cwb range _coworkerBonuses>> <div style="background: #1a2a3a; padding: 12px 15px; border-radius: 8px; margin-bottom: 8px; border: 2px solid #51cf66; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #ddd;">💚 <<print _cwb.name>></span> <span style="color: #51cf66; font-weight: bold;">+<<print _cwb.points>> points</span> </div> <</for>> </div> <</if>> <!-- Return to Brothel --> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-size: 18px; font-weight: bold; cursor: pointer; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.3);'>Return to Brothel</div>">> <<set $brothelSessionStage = null>> <<set $brothelSessionChoices = []>> <<set $brothelSessionSkillsUsed = []>> <<set $currentBrothelClient = null>> <<goto "Brothel">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* ---------------------------------- */ /* --- SEXUAL SKILLS SYSTEM INIT --- */ /* ---------------------------------- */ <<set setup.initializeSexualSkills = function() { var v = State.variables; if (!v.skills || v.skills.indexOf("Sexually Skilled") === -1) { v.sexualSkills = null; return; } if (v.sexualSkills) { return; } v.sexualSkills = { oralGiving: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, oralReceiving: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, vaginal: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, anal: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, handjobs: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, fingering: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, teasing: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, titWorship: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, titfuck: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, dirtyTalk: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, roleplay: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, domination: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, submission: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, sensual: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, rough: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, tantric: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, stamina: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, flexibility: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, rhythm: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, exhibitionism: {level: 1, exp: 0, maxExp: 100, tradedAway: false}, fetishPlay: {level: 1, exp: 0, maxExp: 100, tradedAway: false} }; if (!v.vaginaTightness && v.bodyParts.genitals && v.bodyParts.genitals.toLowerCase().indexOf("vagina") !== -1) { v.vaginaTightness = "tight"; v.vaginalSexCount = 0; } }>> <<set setup.updateVaginaTightness = function() { var v = State.variables; if (!v.bodyParts.genitals || v.bodyParts.genitals.toLowerCase().indexOf("vagina") === -1) { return; } if (!v.vaginalSexCount) v.vaginalSexCount = 0; if (!v.vaginaTightness) v.vaginaTightness = "tight"; v.vaginalSexCount++; if (v.vaginaTightness === "tight" && v.vaginalSexCount >= 15) { v.vaginaTightness = "normal"; v.bodyParts.genitals = "vagina"; } else if (v.vaginaTightness === "normal" && v.vaginalSexCount >= 50) { v.vaginaTightness = "loose"; v.bodyParts.genitals = "loose vagina"; } }>> <<set setup.addSexualSkillExp = function(skillKey, expAmount) { var v = State.variables; if (!v.sexualSkills || !v.sexualSkills[skillKey]) { return; } var skill = v.sexualSkills[skillKey]; var maxLevel = skill.tradedAway ? 5 : 10; if (skill.level >= maxLevel) { return; } var sexSkillXPBonus = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus") || 0; } if (sexSkillXPBonus > 0) { expAmount = Math.floor(expAmount * (1 + sexSkillXPBonus / 100)); } if ((v.skills && v.skills.indexOf("Quick Learner") !== -1) || (v.physicalTraits && v.physicalTraits.indexOf("Werefox") !== -1)) { expAmount = Math.floor(expAmount * 1.1); } /* Trophy Wife 2x sexual XP bonus */ if (v.physicalTraits && v.physicalTraits.includes("Trophy Wife")) { expAmount = expAmount * 2; } /* Siren 1.5x sexual XP bonus */ if (v.physicalTraits && v.physicalTraits.includes("Siren")) { expAmount = Math.floor(expAmount * 1.5); } /* Slut 3x sexual skill XP bonus */ if (v.physicalTraits && v.physicalTraits.includes("Slut")) { expAmount = expAmount * 3; } skill.exp += expAmount; while (skill.exp >= skill.maxExp && skill.level < maxLevel) { skill.exp -= skill.maxExp; skill.level++; skill.maxExp = Math.floor(skill.maxExp * 1.5); if (typeof setup.achievements !== "undefined" && setup.achievements.unlock) { setup.achievements.unlock("sex_skill_levelup"); } if (skill.level === 10 && !skill.tradedAway) { setup.unlockSexualTrait(skillKey); setup.checkAllSexualSkillsMaxed(); } } if (skill.level >= maxLevel) { skill.level = maxLevel; skill.exp = 0; } }>> <<set setup.checkAllSexualSkillsMaxed = function() { var v = State.variables; if (!v.sexualSkills) { return false; } var allMaxed = true; var skillKeys = Object.keys(v.sexualSkills); for (var i = 0; i < skillKeys.length; i++) { var skill = v.sexualSkills[skillKeys[i]]; var maxLevel = skill.tradedAway ? 5 : 10; if (skill.level < maxLevel) { allMaxed = false; break; } } if (allMaxed) { if (typeof setup.achievements !== "undefined" && setup.achievements.unlock) { setup.achievements.unlock("max_all_sex_skills"); } } return allMaxed; }>> <<set setup.unlockSexualTrait = function(skillKey) { var v = State.variables; var traitMap = { oralGiving: "Oral Expert", anal: "Anal Expert", dirtyTalk: "Dirty Talker", domination: "BDSM Enthusiast - Dom", submission: "BDSM Enthusiast - Sub", exhibitionism: "Exhibitionist", rough: "Rough Sex Enthusiast", sensual: "Sensual Lover", roleplay: "Roleplay Expert", tantric: "Tantric Master", stamina: "Sexual Stamina Expert", titWorship: "Tit Worship Expert", titfuck: "Titfuck Master" }; var traitToUnlock = traitMap[skillKey]; if (traitToUnlock && v.skills.indexOf(traitToUnlock) === -1) { v.skills.push(traitToUnlock); if (!v.sexualSkillUnlockMessages) { v.sexualSkillUnlockMessages = []; } v.sexualSkillUnlockMessages.push("🔥 Sexual Skill Maxed! You've unlocked the trait: " + traitToUnlock); } }>> <<set setup.checkTraitLoss = function(traitName) { var v = State.variables; var traitToSkill = { "Oral Expert": "oralGiving", "Anal Expert": "anal", "Dirty Talker": "dirtyTalk", "BDSM Enthusiast - Dom": "domination", "BDSM Enthusiast - Sub": "submission", "Exhibitionist": "exhibitionism", "Rough Sex Enthusiast": "rough", "Sensual Lover": "sensual", "Roleplay Expert": "roleplay", "Tantric Master": "tantric", "Sexual Stamina Expert": "stamina", "Tit Worship Expert": "titWorship", "Titfuck Master": "titfuck" }; var skillKey = traitToSkill[traitName]; if (skillKey && v.sexualSkills && v.sexualSkills[skillKey]) { v.sexualSkills[skillKey].level = 5; v.sexualSkills[skillKey].exp = 0; v.sexualSkills[skillKey].maxExp = Math.floor(100 * Math.pow(1.5, 4)); v.sexualSkills[skillKey].tradedAway = true; } }>> <<set setup.checkTraitGain = function(traitName) { var v = State.variables; var traitToSkill = { "Oral Expert": "oralGiving", "Anal Expert": "anal", "Dirty Talker": "dirtyTalk", "BDSM Enthusiast - Dom": "domination", "BDSM Enthusiast - Sub": "submission", "Exhibitionist": "exhibitionism", "Rough Sex Enthusiast": "rough", "Sensual Lover": "sensual", "Roleplay Expert": "roleplay", "Tantric Master": "tantric", "Sexual Stamina Expert": "stamina", "Tit Worship Expert": "titWorship", "Titfuck Master": "titfuck" }; var skillKey = traitToSkill[traitName]; if (skillKey && v.sexualSkills && v.sexualSkills[skillKey]) { v.sexualSkills[skillKey].level = 5; v.sexualSkills[skillKey].exp = 0; v.sexualSkills[skillKey].maxExp = Math.floor(100 * Math.pow(1.5, 4)); v.sexualSkills[skillKey].tradedAway = false; } }>> <<set setup.resetSexualSkills = function() { var v = State.variables; v.sexualSkills = null; }>> <<set setup.getSexualSkillBonus = function(skillKey) { var v = State.variables; if (!v.sexualSkills || !v.sexualSkills[skillKey]) { return 1.0; } return 1.0 + (v.sexualSkills[skillKey].level * 0.05); }>> <<set setup.getSexualSkillDisplayName = function(skillKey) { var names = { oralGiving: "Oral (Giving)", oralReceiving: "Oral (Receiving)", vaginal: "Vaginal", anal: "Anal", handjobs: "Handjobs", fingering: "Fingering", teasing: "Teasing", titWorship: "Tit Worship", titfuck: "Titfuck", dirtyTalk: "Dirty Talk", roleplay: "Roleplay", domination: "Domination", submission: "Submission", sensual: "Sensual", rough: "Rough", tantric: "Tantric", stamina: "Stamina", flexibility: "Flexibility", rhythm: "Rhythm", exhibitionism: "Exhibitionism", fetishPlay: "Fetish Play" }; return names[skillKey] || skillKey; }>> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Brothel Level System --> <<if $jobs && $jobs.includes("Brothel Worker")>> <div id="brothelLevelSection" style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #007FFF; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #007FFF; margin: 0 0 15px 0;">💼 Brothel Professional Level</h2> <!-- Initialize if needed --> <<if !$brothelLevel>> <<set $brothelLevel = 1>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = 100>> <</if>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #007FFF; margin-bottom: 15px;"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">📊 Current Level Status</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #007FFF;">Brothel Level:</strong> <span id="brothelLevel" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;">$brothelLevel</span> <<if $brothelLevel === 1>> <span style="color: #999; font-size: 14px; margin-left: 10px;">(Novice)</span> <<elseif $brothelLevel === 2>> <span style="color: #51cf66; font-size: 14px; margin-left: 10px;">(Experienced)</span> <<elseif $brothelLevel === 3>> <span style="color: #ffc107; font-size: 14px; margin-left: 10px;">(Professional)</span> <<elseif $brothelLevel === 4>> <span style="color: #ff9800; font-size: 14px; margin-left: 10px;">(Expert)</span> <<elseif $brothelLevel >= 5>> <span style="color: #e91e63; font-size: 14px; margin-left: 10px;">(Elite)</span> <</if>> </div> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #007FFF;">Experience:</strong> <span id="brothelExp" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;">$brothelLevelExp / $brothelMaxExp</span> </div> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #007FFF;">Total Clients Served:</strong> <span id="brothelClients" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;"><<= $brothelClients || 0>></span> </div> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #007FFF;">Today's Sessions:</strong> <span id="brothelClientsToday" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;"><<= $brothelClientsToday || 0>></span> </div> <!-- Level Benefits Display --> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; border: 1px solid #444;"> <strong style="color: #007FFF;">Current Benefits:</strong> <ul style="color: #aaa; font-size: 13px; margin: 5px 0 0 20px; padding: 0;"> <li>Available Clients: <span style="color: #51cf66;"><<= 3 + $brothelLevel>></span></li> <li>Max Work Hours/Day: <<if $brothelLevel === 1>> <span style="color: #51cf66;">3</span> <<elseif $brothelLevel === 2>> <span style="color: #51cf66;">4</span> <<elseif $brothelLevel === 3>> <span style="color: #51cf66;">5</span> <<elseif $brothelLevel === 4>> <span style="color: #51cf66;">6</span> <<elseif $brothelLevel >= 5>> <span style="color: #51cf66;">8</span> <</if>> </li> <li>Max Client Difficulty: <<if $brothelLevel <= 2>> <span style="color: #ffc107;">Medium</span> <<elseif $brothelLevel <= 4>> <span style="color: #ff9800;">Hard</span> <<else>> <span style="color: #e91e63;">Very Hard</span> <</if>> </li> </ul> </div> </div> <!-- Level Controls --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #007FFF; margin: 0 0 10px 0;">⚡ Level Controls</h3> <div style="display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-bottom: 15px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Level 1</div>">> <<set $brothelLevel = 1>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = 100>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Level 2</div>">> <<set $brothelLevel = 2>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = Math.floor(100 * Math.pow(1.5, 1))>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffc107; color: #ffc107; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Level 3</div>">> <<set $brothelLevel = 3>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = Math.floor(100 * Math.pow(1.5, 2))>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff9800; color: #ff9800; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Level 4</div>">> <<set $brothelLevel = 4>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = Math.floor(100 * Math.pow(1.5, 3))>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; color: #e91e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Level 5 (MAX)</div>">> <<set $brothelLevel = 5>> <<set $brothelLevelExp = 0>> <<set $brothelMaxExp = Math.floor(100 * Math.pow(1.5, 4))>> <<goto "CheatMenuSexualSkills">> <</link>> </div> <!-- Additional Controls --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+500 XP</div>">> <<run setup.addBrothelLevelExp(500)>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset Today's Sessions</div>">> <<set $brothelClientsToday = 0>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset Total Clients</div>">> <<set $brothelClients = 0>> <<goto "CheatMenuSexualSkills">> <</link>> </div> </div> </div> <</if>> <!-- Sexual Skills System --> <div id="sexualSkillsSection" style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e91e63; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e91e63; margin: 0 0 15px 0;">🔥 Sexual Skills System</h2> <!-- Check if Sexually Skilled trait exists --> <<if $skills && $skills.indexOf("Sexually Skilled") !== -1>> <<if !$sexualSkills>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #ffd43b; margin-bottom: 15px;"> <p style="color: #ffd43b; margin: 0; text-align: center;">Sexual skills not initialized. Reinitializing...</p> </div> <<run setup.initializeSexualSkills()>> <</if>> <!-- Vagina Tightness Status --> <<if $bodyParts.genitals && $bodyParts.genitals.toLowerCase().indexOf("vagina") !== -1>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #ff9800; margin-bottom: 15px;"> <h3 style="color: #ff9800; margin: 0 0 10px 0;">🌸 Vagina Status</h3> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff9800;">Current Tightness:</strong> <span id="vaginaTightness" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;"><<= $vaginaTightness || "tight">></span> </div> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 12px; border: 1px solid #444;"> <strong style="color: #ff9800;">Times Used:</strong> <span id="vaginalSexCount" style="color: #ffd43b; font-size: 16px; font-weight: bold; margin-left: 10px;"><<= $vaginalSexCount || 0>></span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; color: #e91e63; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Tight</div>">> <<set $vaginaTightness = "tight">> <<set $vaginalSexCount = 0>> <<set $bodyParts.genitals = "tight vagina">> <<replace "#vaginaTightness">><<= $vaginaTightness>><</replace>> <<replace "#vaginalSexCount">><<= $vaginalSexCount>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Normal</div>">> <<set $vaginaTightness = "normal">> <<set $vaginalSexCount = 20>> <<set $bodyParts.genitals = "vagina">> <<replace "#vaginaTightness">><<= $vaginaTightness>><</replace>> <<replace "#vaginalSexCount">><<= $vaginalSexCount>><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #667eea; color: #667eea; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set Loose</div>">> <<set $vaginaTightness = "loose">> <<set $vaginalSexCount = 60>> <<set $bodyParts.genitals = "loose vagina">> <<replace "#vaginaTightness">><<= $vaginaTightness>><</replace>> <<replace "#vaginalSexCount">><<= $vaginalSexCount>><</replace>> <</link>> </div> </div> <</if>> <!-- Sexual Skills Grid --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 15px;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">📊 Sexual Skills</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 15px 0;">Level 10 unlocks the associated trait. Traded traits cap at Level 5.</p> <<set _sexualSkillsList = [ {key: "oralGiving", name: "Oral (Giving)", trait: "Oral Expert"}, {key: "oralReceiving", name: "Oral (Receiving)", trait: null}, {key: "vaginal", name: "Vaginal", trait: null}, {key: "anal", name: "Anal", trait: "Anal Expert"}, {key: "handjobs", name: "Handjobs", trait: null}, {key: "fingering", name: "Fingering", trait: null}, {key: "teasing", name: "Teasing", trait: null}, {key: "titWorship", name: "Tit Worship", trait: "Tit Worship Expert"}, {key: "titfuck", name: "Titfuck", trait: "Titfuck Master"}, {key: "dirtyTalk", name: "Dirty Talk", trait: "Dirty Talker"}, {key: "roleplay", name: "Roleplay", trait: "Roleplay Expert"}, {key: "domination", name: "Domination", trait: "BDSM Enthusiast - Dom"}, {key: "submission", name: "Submission", trait: "BDSM Enthusiast - Sub"}, {key: "sensual", name: "Sensual", trait: "Sensual Lover"}, {key: "rough", name: "Rough", trait: "Rough Sex Enthusiast"}, {key: "tantric", name: "Tantric", trait: "Tantric Master"}, {key: "stamina", name: "Stamina", trait: "Sexual Stamina Expert"}, {key: "flexibility", name: "Flexibility", trait: null}, {key: "rhythm", name: "Rhythm", trait: null}, {key: "exhibitionism", name: "Exhibitionism", trait: "Exhibitionist"}, {key: "fetishPlay", name: "Fetish Play", trait: null} ]>> <<for _i = 0; _i < _sexualSkillsList.length; _i++>> <<set _skillData = _sexualSkillsList[_i]>> <<set _skillKey = _skillData.key>> <<set _skillName = _skillData.name>> <<set _traitName = _skillData.trait>> <<if $sexualSkills[_skillKey]>> <<set _skill = $sexualSkills[_skillKey]>> <<set _maxLevel = _skill.tradedAway ? 5 : 10>> <<set _hasTrait = _traitName && $skills.indexOf(_traitName) !== -1>> <div style="background-color: #0a0a0a; padding: 12px; border-radius: 6px; margin-bottom: 10px; border: 1px solid <<if _hasTrait>>#51cf66<<else>>#444<</if>>;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <div> <strong style="color: <<if _hasTrait>>#51cf66<<else>>#e91e63<</if>>;">_skillName</strong> <<if _skill.tradedAway>> <span style="color: #ff6b6b; font-size: 11px; margin-left: 5px;">(Traded - Max Lv 5)</span> <</if>> <<if _hasTrait>> <span style="color: #51cf66; font-size: 11px; margin-left: 5px;">✓ Trait Unlocked</span> <</if>> </div> <span id="sexSkill_<<= _skillKey>>" style="color: #ffd43b; font-weight: bold;"> <<if _skill.level >= _maxLevel>> MAX <<else>> Lv <<= _skill.level>> / <<= _maxLevel>> <</if>> </span> </div> <!-- Progress Bar --> <<set _progress = (_skill.level / _maxLevel) * 100>> <div style="background-color: #1a1a1a; height: 6px; border-radius: 3px; margin-bottom: 8px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #e91e63, #ff6b9d); height: 100%; width: <<= _progress>>%; transition: width 0.3s;"></div> </div> <!-- Level Controls --> <div style="display: grid; grid-template-columns: repeat(5, 1fr); gap: 5px;"> <<capture _skillKey, _maxLevel, _traitName>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>-1</div>">> <<if $sexualSkills[_skillKey].level > 0>> <<set $sexualSkills[_skillKey].level -= 1>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, $sexualSkills[_skillKey].level - 1))>> <<goto "CheatMenuSexualSkills">> <</if>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+1</div>">> <<if $sexualSkills[_skillKey].level < _maxLevel>> <<set $sexualSkills[_skillKey].level += 1>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, $sexualSkills[_skillKey].level - 1))>> <<if $sexualSkills[_skillKey].level === 10 && !$sexualSkills[_skillKey].tradedAway && _traitName>> <<run setup.unlockSexualTrait(_skillKey)>> <</if>> <<goto "CheatMenuSexualSkills">> <</if>> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff9800; color: #ff9800; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Lv 5</div>">> <<set $sexualSkills[_skillKey].level = 5>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, 4))>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Max</div>">> <<set $sexualSkills[_skillKey].level = _maxLevel>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, _maxLevel - 1))>> <<if _maxLevel === 10 && !$sexualSkills[_skillKey].tradedAway && _traitName>> <<run setup.unlockSexualTrait(_skillKey)>> <</if>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 12px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset</div>">> <<set $sexualSkills[_skillKey].level = 1>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = 100>> <<goto "CheatMenuSexualSkills">> <</link>> <</capture>> </div> <!-- Toggle Traded Status --> <<if _traitName>> <div style="margin-top: 8px;"> <<capture _skillKey>> <<if $sexualSkills[_skillKey].tradedAway>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 11px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Traded Status (Allow Lv 10)</div>">> <<set $sexualSkills[_skillKey].tradedAway = false>> <<goto "CheatMenuSexualSkills">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 5px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 11px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Mark as Traded (Cap at Lv 5)</div>">> <<set $sexualSkills[_skillKey].tradedAway = true>> <<if $sexualSkills[_skillKey].level > 5>> <<set $sexualSkills[_skillKey].level = 5>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, 4))>> <</if>> <<goto "CheatMenuSexualSkills">> <</link>> <</if>> <</capture>> </div> <</if>> </div> <</if>> <</for>> </div> <!-- Bulk Actions --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">⚡ Bulk Actions</h3> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Max All Skills</div>">> <<for _skillKey, _skillData range $sexualSkills>> <<set _maxLvl = _skillData.tradedAway ? 5 : 10>> <<set $sexualSkills[_skillKey].level = _maxLvl>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, _maxLvl - 1))>> <<if _maxLvl === 10 && !_skillData.tradedAway>> <<run setup.unlockSexualTrait(_skillKey)>> <</if>> <</for>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff9800; color: #ff9800; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Set All to Level 5</div>">> <<for _skillKey, _skillData range $sexualSkills>> <<set $sexualSkills[_skillKey].level = 5>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = Math.floor(100 * Math.pow(1.5, 4))>> <</for>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Reset All Skills</div>">> <<for _skillKey, _skillData range $sexualSkills>> <<set $sexualSkills[_skillKey].level = 1>> <<set $sexualSkills[_skillKey].exp = 0>> <<set $sexualSkills[_skillKey].maxExp = 100>> <</for>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd43b; color: #ffd43b; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Clear All Traded Status</div>">> <<for _skillKey, _skillData range $sexualSkills>> <<set $sexualSkills[_skillKey].tradedAway = false>> <</for>> <<goto "CheatMenuSexualSkills">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Unlock All Traits</div>">> <<set _traitsList = ["Oral Expert", "Anal Expert", "Dirty Talker", "BDSM Enthusiast - Dom", "BDSM Enthusiast - Sub", "Exhibitionist", "Rough Sex Enthusiast", "Sensual Lover", "Roleplay Expert", "Tantric Master", "Sexual Stamina Expert", "Tit Worship Expert", "Titfuck Master"]>> <<for _i = 0; _i < _traitsList.length; _i++>> <<if $skills.indexOf(_traitsList[_i]) === -1>> <<run $skills.push(_traitsList[_i])>> <</if>> <</for>> <<goto "CheatMenuSexualSkills">> <</link>> </div> </div> <<else>> <!-- Sexually Skilled trait not present --> <div style="background-color: #1a1a1a; padding: 20px; border-radius: 8px; border: 1px solid #ff6b6b; text-align: center;"> <p style="color: #ff6b6b; font-size: 16px; margin: 0 0 15px 0; font-weight: bold;">⚠️ Sexually Skilled Trait Required</p> <p style="color: #aaa; margin: 0 0 20px 0;">You need the "Sexually Skilled" trait to access the sexual skills system.</p> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3); display: inline-block;'>Add Sexually Skilled Trait</div>">> <<if $skills.indexOf("Sexually Skilled") === -1>> <<run $skills.push("Sexually Skilled")>> <</if>> <<run setup.initializeSexualSkills()>> <<goto "CheatMenuSexualSkills">> <</link>> </div> <</if>> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <span id="sexualSkillsSection"> <<include "CheatMenuSexualSkills">> </span> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPerformRemoveTop">> <!-- Higher requirements --> <<set _requiredStats = {charisma: 40, dexterity: 35}>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set $stripperTopPerformed = $stripperTopPerformed || false>> <<set $stripperTopResult = $stripperTopResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FF69B4; text-align: center; text-shadow: 0 0 20px rgba(255, 105, 180, 0.8);">👚 Tease & Reveal</h1> <!-- Stat Check Display --> <<if typeof _effectiveCha !== 'undefined' && typeof _effectiveDex !== 'undefined' && typeof _bonus !== 'undefined'>> <div class="stat-check-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid #FF69B4; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(255, 105, 180, 0.3);"> <h3 style="color: #FFB6C1; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveCha >= 40>>met<<else>>not-met<</if>>" style="color: <<if _effectiveCha >= 40>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Charisma: <<print _effectiveCha>> / 40 Required </div> <div class="stat-requirement <<if _effectiveDex >= 35>>met<<else>>not-met<</if>>" style="color: <<if _effectiveDex >= 35>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Dexterity: <<print _effectiveDex>> / 35 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <</if>> <!-- Action Choice --> <<if !$stripperTopPerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #FF69B4; box-shadow: 0 0 25px rgba(255, 105, 180, 0.4);"> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You strut to center stage, hips swaying. The music's rhythm pulses through you. Your fingers trace along your collarbone, down between your breasts, teasing the hem of your top... </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> Time to give them a show. </p> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, #FF69B4 0%, #FF1493 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(255, 105, 180, 0.6); border: 2px solid #FF69B4;'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $stripperTopResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $stripperTopPerformed = true>> <<goto "StripClubPerformRemoveTop">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $stripperTopResult.total >= 50>> <<set _score = $stripperTopResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $stripperTopResult.roll>> + Bonus: <<print $stripperTopResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Performance Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You move like liquid sin. Your hands glide over your body, tracing every curve as you sway to the beat. Slowly, teasingly, you lift your top inch by inch—revealing smooth skin, the swell of your breasts... </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd erupts in cheers as you finally pull it off, spinning it around before tossing it aside. You cup your bare breasts, squeezing them together, letting your hands roam. Every eye in the room is locked on you. Bills rain onto the stage. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You dance sensually, your top gradually riding up to show your midriff. With a coy smile, you turn around and slowly peel it off, revealing your bare back before spinning to show them your exposed breasts. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd hoots and hollers, clearly enjoying the view. Tips start appearing at the edge of the stage as you continue to move, topless and confident. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You dance to the music, gradually working your top off with playful movements. When it finally comes off, you continue dancing with your breasts bare, feeling the cool air on your skin. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd appreciates the show with some applause and a modest amount of tips. It was a solid performance. </p> <</if>> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to move sensually, but you feel awkward and stiff. Your top comes off clumsily, and you fumble a bit trying to maintain your rhythm. The exposure feels more embarrassing than empowering. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd's reaction is lukewarm. A few people toss some bills, but it's clear you didn't quite capture their attention. </p> <</if>> </div> <!-- Calculate tips --> <<set _baseTips = Math.floor(_score * 0.6)>> <<set _tipMultiplier = 1>> <<if $physicalTraits && $physicalTraits.includes("Attractive")>><<set _tipMultiplier += 0.2>><</if>> <<if $physicalTraits && $physicalTraits.includes("Alluring")>><<set _tipMultiplier += 0.15>><</if>> <<if $bodyParts.chest && ($bodyParts.chest.includes("large") || $bodyParts.chest.includes("huge") || $bodyParts.chest.includes("gigantic"))>> <<set _tipMultiplier += 0.25>> <</if>> <!-- Apply severe penalty for terrible performance (under 30) --> <<if _score < 30>> <<set _finalTips = Math.round((_baseTips * _tipMultiplier) * 0.1)>> <<else>> <<set _finalTips = Math.round(_baseTips * _tipMultiplier)>> <</if>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalTips * (_stripperPayBonus / 100))>> <<set _finalTips = _finalTips + _skillTreePayBonus>> <</if>> <!-- Slut 2x cash bonus for strip club --> <<set _slutActive = $physicalTraits.includes("Slut")>> <<set _slutBonus = 0>> <<if _slutActive>> <<set _slutBonus = _finalTips>> <<set _finalTips = _finalTips * 2>> <</if>> <!-- Gyaru 1.5x cash bonus for strip club --> <<set _gyaruActive = $physicalTraits.includes("Gyaru")>> <<set _gyaruBonus = 0>> <<if _gyaruActive>> <<set _gyaruBonus = Math.floor(_finalTips * 0.5)>> <<set _finalTips = _finalTips + _gyaruBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusTips = _finalTips>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusTips * 0.5)>> <<set _finalTips = _preBonusTips + _pearlBonus>> <</if>> <<set $money += _finalTips>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <span style="color: #ff69b4; font-weight: bold;">Exhibitionism</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Teasing</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Performance Earnings</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalTips>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> = $<<print _baseTips>><br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> (trait bonuses) </p> <</if>> </div> <!-- Increment performance counter --> <<set $stagePerformancesToday += 1>> <<set $stripperTopPerformed = false>> <<set $stripperTopResult = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to Stage</div>">> <<goto "StripClubStagePerformance">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPerformStripFull">> <!-- Higher requirements --> <<set _requiredStats = {charisma: 60, dexterity: 50}>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set $stripperFullPerformed = $stripperFullPerformed || false>> <<set $stripperFullResult = $stripperFullResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FF1493; text-align: center; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8);">🔥 Full Exposure</h1> <!-- Stat Check Display --> <<if typeof _effectiveCha !== 'undefined' && typeof _effectiveDex !== 'undefined' && typeof _bonus !== 'undefined'>> <div class="stat-check-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border: 3px solid #FF1493; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.4);"> <h3 style="color: #FFB6C1; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveCha >= 60>>met<<else>>not-met<</if>>" style="color: <<if _effectiveCha >= 60>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Charisma: <<print _effectiveCha>> / 60 Required </div> <div class="stat-requirement <<if _effectiveDex >= 50>>met<<else>>not-met<</if>>" style="color: <<if _effectiveDex >= 50>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Dexterity: <<print _effectiveDex>> / 50 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <</if>> <!-- Action Choice --> <<if !$stripperFullPerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #FF1493; box-shadow: 0 0 25px rgba(255, 20, 147, 0.5);"> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> The spotlight blazes down on you. This is it—the full show, nothing held back. Every piece of clothing is going to come off. Every inch of your body on display for their hungry eyes. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> You take a deep breath. Time to bare it all. </p> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 25px rgba(255, 20, 147, 0.7); border: 2px solid #FF1493;'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $stripperFullResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $stripperFullPerformed = true>> <<goto "StripClubPerformStripFull">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $stripperFullResult.total >= 50>> <<set _score = $stripperFullResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $stripperFullResult.roll>> + Bonus: <<print $stripperFullResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Performance Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You command the stage like a goddess. Each piece of clothing slides off with calculated precision—your top first, revealing your breasts to thunderous applause. Then your bottoms, inch by teasing inch... </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6;"> Finally, you're completely naked under the lights, every curve on display. You don't just stand there—you dance, you move, you touch yourself sensually. Your hands glide over your bare skin, cupping your breasts, sliding between your thighs. </p> <p style="color: #fff; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd goes absolutely wild. Money literally flies through the air. You've never felt more powerful, more desired. This is what being a star feels like. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You strip down methodically, piece by piece. Top off first, then bottoms. Soon you're completely nude, body exposed to the hungry crowd. You continue dancing, letting them admire every inch of you. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The audience loves it. Cheers fill the room as bills pile up on the stage. You feel sexy, confident, completely in control. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You manage to get all your clothes off, dancing naked for the crowd. It's not your smoothest performance, but you're fully exposed and that's what counts. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd appreciates the full nudity even if your technique wasn't perfect. Tips come in steadily. </p> <</if>> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You struggle through the routine, fumbling with your clothes. When you finally get naked, you feel awkward and exposed in a bad way. Your movements are stiff, self-conscious. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd's reaction is mixed. Some people tip out of pity, but it's clear you didn't deliver the sizzling performance they expected. </p> <</if>> </div> <!-- Calculate tips --> <<set _baseTips = Math.floor(_score * 1.5)>> <<set _tipMultiplier = 1>> <<if $physicalTraits && $physicalTraits.includes("Attractive")>><<set _tipMultiplier += 0.3>><</if>> <<if $physicalTraits && $physicalTraits.includes("Alluring")>><<set _tipMultiplier += 0.25>><</if>> <<if $physicalTraits && $physicalTraits.includes("Seductive")>><<set _tipMultiplier += 0.2>><</if>> <<if $bodyParts.chest && ($bodyParts.chest.includes("large") || $bodyParts.chest.includes("huge") || $bodyParts.chest.includes("gigantic"))>> <<set _tipMultiplier += 0.3>> <</if>> <<if $bodyParts.genitals && $bodyParts.genitals.includes("vagina")>> <<set _tipMultiplier += 0.2>> <</if>> <!-- Apply severe penalty for terrible performance (under 30) --> <<if _score < 30>> <<set _finalTips = Math.round((_baseTips * _tipMultiplier) * 0.1)>> <<else>> <<set _finalTips = Math.round(_baseTips * _tipMultiplier)>> <</if>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalTips * (_stripperPayBonus / 100))>> <<set _finalTips = _finalTips + _skillTreePayBonus>> <</if>> <!-- Slut 2x cash bonus for strip club --> <<set _slutActive = $physicalTraits.includes("Slut")>> <<set _slutBonus = 0>> <<if _slutActive>> <<set _slutBonus = _finalTips>> <<set _finalTips = _finalTips * 2>> <</if>> <!-- Gyaru 1.5x cash bonus for strip club --> <<set _gyaruActive = $physicalTraits.includes("Gyaru")>> <<set _gyaruBonus = 0>> <<if _gyaruActive>> <<set _gyaruBonus = Math.floor(_finalTips * 0.5)>> <<set _finalTips = _finalTips + _gyaruBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusTips = _finalTips>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusTips * 0.5)>> <<set _finalTips = _preBonusTips + _pearlBonus>> <</if>> <<set $money += _finalTips>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualExpGains.push({skill: "Sensual", amount: _finalXP})>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <span style="color: #ff69b4; font-weight: bold;">Exhibitionism</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Teasing</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Sensual</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Performance Earnings</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalTips>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> = $<<print _baseTips>><br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> (trait bonuses) </p> <</if>> </div> <!-- Increment performance counter --> <<set $stagePerformancesToday += 1>> <<set $stripperFullPerformed = false>> <<set $stripperFullResult = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to Stage</div>">> <<goto "StripClubStagePerformance">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPerformPole">> <!-- Higher requirements --> <<set _requiredStats = {dexterity: 70, strength: 65}>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set $stripperPolePerformed = $stripperPolePerformed || false>> <<set $stripperPoleResult = $stripperPoleResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9D00FF; text-align: center; text-shadow: 0 0 20px rgba(157, 0, 255, 0.8);">💫 Acrobatic Seduction</h1> <!-- Stat Check Display --> <<if typeof _effectiveDex !== 'undefined' && typeof _effectiveStr !== 'undefined' && typeof _bonus !== 'undefined'>> <div class="stat-check-display" style="background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); border: 3px solid #9D00FF; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.4);"> <h3 style="color: #D8BFD8; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveDex >= 70>>met<<else>>not-met<</if>>" style="color: <<if _effectiveDex >= 70>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Dexterity: <<print _effectiveDex>> / 70 Required </div> <div class="stat-requirement <<if _effectiveStr >= 65>>met<<else>>not-met<</if>>" style="color: <<if _effectiveStr >= 65>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Strength: <<print _effectiveStr>> / 65 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <</if>> <!-- Action Choice --> <<if !$stripperPolePerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4);"> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> The chrome pole gleams under the spotlight, waiting for you. This is where strength meets sensuality, where athletic prowess becomes erotic art. Time to show them what your body can really do. </p> <p style="color: #D8BFD8; font-size: 16px; margin: 0; line-height: 1.6;"> You grip the cold metal, feeling it against your palms. Let's fly. </p> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.6); border: 2px solid #9D00FF;'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $stripperPoleResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $stripperPolePerformed = true>> <<goto "StripClubPerformPole">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $stripperPoleResult.total >= 50>> <<set _score = $stripperPoleResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2a 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $stripperPoleResult.roll>> + Bonus: <<print $stripperPoleResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Performance Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You launch into motion like a professional. Gripping the pole, you spin—once, twice—your body a blur of graceful movement. Then you climb, muscles flexing beautifully as you ascend. </p> <p style="color: #D8BFD8; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6;"> At the top, you hook your leg and lean back, arching your spine until you're nearly upside down, hair cascading toward the floor. Your top slips off naturally during a spin, your bare breasts catching the light as you twirl. You execute a perfect fireman spin, your thighs gripping the pole as your body spirals down in a controlled descent. </p> <p style="color: #fff; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd erupts. You transition seamlessly into floor work, writhing sensually against the stage. Every movement is poetry, strength disguised as softness. Bills shower down like rain. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You work the pole confidently, executing spins and climbs with practiced skill. Your body moves fluidly, muscles working in harmony. You manage some impressive inverted poses that show off your physique. </p> <p style="color: #D8BFD8; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd cheers as you incorporate some sensual movements between the athletic tricks. Tips accumulate steadily as you demonstrate both skill and sex appeal. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You manage some basic pole moves—spins and climbs that look decent. Nothing too advanced, but you keep it going without any major mistakes. </p> <p style="color: #D8BFD8; font-size: 16px; margin: 0; line-height: 1.6;"> The audience appreciates the effort. A respectable amount of tips come in for your athletic display. </p> <</if>> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You grip the pole but struggle to execute the moves. Your spins are wobbly, your climbs shaky. At one point you nearly slip, catching yourself just in time. </p> <p style="color: #D8BFD8; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd watches with concern more than arousal. You get some sympathy tips, but it's clear pole work isn't your strong suit. </p> <</if>> </div> <!-- Calculate tips --> <<set _baseTips = Math.floor(_score * 1.0)>> <<set _tipMultiplier = 1>> <<if $physicalTraits && $physicalTraits.includes("Athletic")>><<set _tipMultiplier += 0.3>><</if>> <<if $physicalTraits && $physicalTraits.includes("Graceful")>><<set _tipMultiplier += 0.25>><</if>> <<if $physicalTraits && $physicalTraits.includes("Flexible")>><<set _tipMultiplier += 0.2>><</if>> <<if $bodyParts.chest && ($bodyParts.chest.includes("large") || $bodyParts.chest.includes("huge") || $bodyParts.chest.includes("gigantic"))>> <<set _tipMultiplier += 0.2>> <</if>> <!-- Apply severe penalty for terrible performance (under 30) --> <<if _score < 30>> <<set _finalTips = Math.round((_baseTips * _tipMultiplier) * 0.1)>> <<else>> <<set _finalTips = Math.round(_baseTips * _tipMultiplier)>> <</if>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalTips * (_stripperPayBonus / 100))>> <<set _finalTips = _finalTips + _skillTreePayBonus>> <</if>> <!-- Slut 2x cash bonus for strip club --> <<set _slutActive = $physicalTraits.includes("Slut")>> <<set _slutBonus = 0>> <<if _slutActive>> <<set _slutBonus = _finalTips>> <<set _finalTips = _finalTips * 2>> <</if>> <!-- Gyaru 1.5x cash bonus for strip club --> <<set _gyaruActive = $physicalTraits.includes("Gyaru")>> <<set _gyaruBonus = 0>> <<if _gyaruActive>> <<set _gyaruBonus = Math.floor(_finalTips * 0.5)>> <<set _finalTips = _finalTips + _gyaruBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusTips = _finalTips>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusTips * 0.5)>> <<set _finalTips = _preBonusTips + _pearlBonus>> <</if>> <<set $money += _finalTips>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <span style="color: #ff69b4; font-weight: bold;">Exhibitionism</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Teasing</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Performance Earnings</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalTips>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> = $<<print _baseTips>><br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> (trait bonuses) </p> <</if>> </div> <!-- Increment performance counter --> <<set $stagePerformancesToday += 1>> <<set $stripperPolePerformed = false>> <<set $stripperPoleResult = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to Stage</div>">> <<goto "StripClubStagePerformance">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPerformFreestyle">> <!-- Higher requirements --> <<set _requiredStats = {charisma: 55, dexterity: 45}>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set $stripperFreestylePerformed = $stripperFreestylePerformed || false>> <<set $stripperFreestyleResult = $stripperFreestyleResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: #FFD700; text-align: center; text-shadow: 0 0 20px rgba(255, 215, 0, 0.8);">✨ Improvised Desire</h1> <!-- Stat Check Display --> <<if typeof _effectiveCha !== 'undefined' && typeof _effectiveDex !== 'undefined' && typeof _bonus !== 'undefined'>> <div class="stat-check-display" style="background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); border: 3px solid #FFD700; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.4);"> <h3 style="color: #FFE4B5; margin-top: 0;">Requirements & Bonuses</h3> <div class="stat-requirement <<if _effectiveCha >= 55>>met<<else>>not-met<</if>>" style="color: <<if _effectiveCha >= 55>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Charisma: <<print _effectiveCha>> / 55 Required </div> <div class="stat-requirement <<if _effectiveDex >= 45>>met<<else>>not-met<</if>>" style="color: <<if _effectiveDex >= 45>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Dexterity: <<print _effectiveDex>> / 45 Required </div> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <</if>> <!-- Action Choice --> <<if !$stripperFreestylePerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #FFD700; box-shadow: 0 0 25px rgba(255, 215, 0, 0.4);"> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> No routine. No choreography. Just you, the music, and pure instinct. This is where raw charisma and natural sensuality shine brightest. Feel the beat and let your body express what words cannot. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Close your eyes, feel the rhythm, and dance like only you can. </p> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.6); border: 2px solid #FFD700;'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $stripperFreestyleResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $stripperFreestylePerformed = true>> <<goto "StripClubPerformFreestyle">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $stripperFreestyleResult.total >= 50>> <<set _score = $stripperFreestyleResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #1a1a0a 0%, #2a2010 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $stripperFreestyleResult.roll>> + Bonus: <<print $stripperFreestyleResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Performance Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> The music flows through you like electricity. You move with pure, unfiltered sensuality—every sway of your hips, every arch of your back feels natural, inevitable. Your hands explore your own body, caressing curves as if discovering them for the first time. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6;"> You lock eyes with someone in the crowd and dance just for them, making them feel like the only person in the room. Then you turn to someone else, giving them that same intense, personal connection. Your energy radiates outward, drawing everyone into your orbit. </p> <p style="color: #fff; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd is mesmerized. This isn't just a performance—it's an experience, a moment of pure erotic magic. Money rains down as they try to capture a piece of what you're giving. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You move freely to the music, letting it guide your body. Your dancing feels natural and sexy, a genuine expression of sensuality. You make eye contact with the crowd, smile, move in ways that feel right in the moment. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> The audience responds positively to your authentic energy. Your charisma shines through, earning you good tips and genuine appreciation. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You dance in your own style, moving however feels natural. It's not spectacular, but it's genuine. The crowd appreciates your effort and individual expression. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Decent tips come in. People respect that you're being yourself on stage. </p> <</if>> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to let loose, but you can't quite find the rhythm. Your movements feel awkward and uncertain. The freedom of freestyle becomes overwhelming rather than liberating. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> The crowd remains polite but uninspired. A few sympathy tips appear, but you didn't quite connect with them. </p> <</if>> </div> <!-- Calculate tips --> <<set _baseTips = Math.floor(_score * 0.8)>> <<set _tipMultiplier = 1>> <<if $physicalTraits && $physicalTraits.includes("Attractive")>><<set _tipMultiplier += 0.25>><</if>> <<if $physicalTraits && $physicalTraits.includes("Alluring")>><<set _tipMultiplier += 0.3>><</if>> <<if $physicalTraits && $physicalTraits.includes("Seductive")>><<set _tipMultiplier += 0.25>><</if>> <<if $bodyParts.chest && ($bodyParts.chest.includes("large") || $bodyParts.chest.includes("huge") || $bodyParts.chest.includes("gigantic"))>> <<set _tipMultiplier += 0.2>> <</if>> <!-- Apply severe penalty for terrible performance (under 30) --> <<if _score < 30>> <<set _finalTips = Math.round((_baseTips * _tipMultiplier) * 0.1)>> <<else>> <<set _finalTips = Math.round(_baseTips * _tipMultiplier)>> <</if>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalTips * (_stripperPayBonus / 100))>> <<set _finalTips = _finalTips + _skillTreePayBonus>> <</if>> <!-- Slut 2x cash bonus for strip club --> <<set _slutActive = $physicalTraits.includes("Slut")>> <<set _slutBonus = 0>> <<if _slutActive>> <<set _slutBonus = _finalTips>> <<set _finalTips = _finalTips * 2>> <</if>> <!-- Gyaru 1.5x cash bonus for strip club --> <<set _gyaruActive = $physicalTraits.includes("Gyaru")>> <<set _gyaruBonus = 0>> <<if _gyaruActive>> <<set _gyaruBonus = Math.floor(_finalTips * 0.5)>> <<set _finalTips = _finalTips + _gyaruBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusTips = _finalTips>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusTips * 0.5)>> <<set _finalTips = _preBonusTips + _pearlBonus>> <</if>> <<set $money += _finalTips>> <!-- Satisfy Slut sexual needs if applicable --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualExpGains.push({skill: "Sensual", amount: _finalXP})>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <span style="color: #ff69b4; font-weight: bold;">Exhibitionism</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Teasing</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Sensual</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Performance Earnings</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalTips>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> = $<<print _baseTips>><br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base: $<<print Math.floor(_baseTips / _tipMultiplier)>> × <<print _tipMultiplier.toFixed(2)>> (trait bonuses) </p> <</if>> </div> <!-- Increment performance counter --> <<set $stagePerformancesToday += 1>> <<set $stripperFreestylePerformed = false>> <<set $stripperFreestyleResult = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to Stage</div>">> <<goto "StripClubStagePerformance">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIPPrivateDanceStage2">> <<set $privateDanceStage = 2>> <<set _stripper = $currentVIPStriper>> <<set _stripperGender = (_stripper.bodyParts && _stripper.bodyParts.gender) || _stripper.gender || "female">> <<set _playerGender = $bodyParts.gender || "male">> <<set _tippedStage1 = $privateDanceActions.includes("tipped_stage1")>> <<set _touchedStage1 = $privateDanceActions.includes("touching_stage1")>> <<set _isSeductive = _stripper.physicalTraits && _stripper.physicalTraits.includes("Seductive")>> <<set _isConfident = _stripper.mentalTraits && _stripper.mentalTraits.includes("Confident")>> <<set _isShy = _stripper.mentalTraits && _stripper.mentalTraits.includes("Shy")>> <<set _isGraceful = _stripper.physicalTraits && _stripper.physicalTraits.includes("Graceful")>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.5), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <h1 style="color: #FF1493; text-align: center; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8);">🔥 Building Heat</h1> </div> <!-- Performance Description --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 35px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px;"> <<if _touchedStage1>> <!-- Player tipped for touching --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>> smiles at your generous tip and moves closer, straddling your lap. Her heat radiates against you as she grinds slowly, deliberately. "You can touch," she breathes, taking your hands and placing them on her hips. <<else>> <<= _stripper.name>> grins at your tip and straddles your lap, his body pressed close. "Go ahead," he murmurs, guiding your hands to his chest. His skin is warm under your palms as he grinds against you. <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<if _isSeductive>> She moves sinuously in your lap, her top already half-unbuttoned. Your hands explore her curves—the dip of her waist, the swell of her hips. She lets out a soft moan when you squeeze, leaning back to give you a better view of her cleavage. <<elseif _isShy>> She blushes as your hands roam, but doesn't pull away. Instead, she rocks her hips slowly, biting her lip. "Does that feel good?" she asks quietly, her shyness making the moment even more intimate. <<else>> She peels off her top, revealing her breasts. Your hands cup them immediately, thumbs brushing over her nipples as she grinds harder. "Mmm, that's it," she purrs, arching into your touch. <</if>> <<else>> <<if _isSeductive>> He strips off his shirt, revealing his toned torso. Your hands explore his chest, his abs, feeling the muscles flex under your fingers. He grinds his ass against your crotch, making sure you feel exactly how hard you're getting him. <<elseif _isShy>> He lets you explore his body, gasping softly when your hands find sensitive spots. His movements are less practiced but more genuine, his arousal obvious through his pants. <<else>> He rocks against you, letting you feel his body. Your hands slide over his chest, down his stomach, and he doesn't stop you when you grip his ass, pulling him harder against you. <</if>> <</if>> </p> <<elseif _tippedStage1>> <!-- Player tipped but no touching --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>> winks at your tip and ups her game. She slowly unbuttons her top, letting it fall open to reveal her breasts barely contained by a lacy bra. She cups them, squeezing, giving you a show. <<else>> <<= _stripper.name>> nods appreciatively at your tip and pulls off his shirt, revealing his toned chest. He runs his hands over his body, teasing, letting you see exactly what you're paying for. <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> She turns and bends over right in front of you, sliding her skirt down over the curve of her ass. Underneath, a tiny thong barely covers anything. She looks back, watching your reaction as she jiggles her ass for you. <<else>> He turns, giving you a view of his ass as he slides his pants down. His underwear clings to his muscled form. He looks over his shoulder with a smirk, knowing exactly what you're thinking. <</if>> </p> <<else>> <!-- No tip, standard performance --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>> continues her routine, moving sensually but keeping things professional. She dances just out of reach, teasing but not delivering. Her clothes come off slowly—a strap here, a button there. <<else>> <<= _stripper.name>> keeps up his routine, moving skillfully but maintaining distance. He strips gradually, showing skin but keeping the real show just out of reach. <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> It's a good performance, but you can tell <<if _stripperGender === "female">>she's<<else>>he's<</if>> saving the best for paying customers. </p> <</if>> </div> <!-- Tip Options Stage 2 --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 30px; border: 3px solid #FFD700; box-shadow: 0 0 20px rgba(255, 215, 0, 0.3);"> <h3 style="color: #FFD700; margin: 0 0 20px 0; text-align: center; text-shadow: 0 0 10px rgba(255, 215, 0, 0.6);">💵 Take It Further?</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Just Watch --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #666;"> <p style="color: #aaa; font-size: 14px; margin: 0 0 10px 0;">Continue watching</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>👀 Keep Watching</div>">> <<goto "StripClubVIPPrivateDanceStage3">> <</link>> </div> <!-- Tip $75 --> <<if $money >= 75>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 14px; margin: 0 0 10px 0;">Strip completely naked</p> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💵 Tip $75</div>">> <<set $money -= 75>> <<set $privateDanceTips += 75>> <<run $privateDanceActions.push("naked_stage2")>> <<goto "StripClubVIPPrivateDanceStage3">> <</link>> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #444; opacity: 0.5;"> <p style="color: #666; font-size: 14px; margin: 0 0 10px 0;">Strip completely naked</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💵 Tip $75 (Broke)</div> </div> <</if>> <!-- Tip $150 --> <<if $money >= 150>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #FF1493;"> <p style="color: #FF1493; font-size: 14px; margin: 0 0 10px 0;">Get intimate, make me cum</p> <<link "<div style='background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💎 Tip $150</div>">> <<set $money -= 150>> <<set $privateDanceTips += 150>> <<run $privateDanceActions.push("intimate_stage2")>> <<goto "StripClubVIPPrivateDanceStage3">> <</link>> </div> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #444; opacity: 0.5;"> <p style="color: #666; font-size: 14px; margin: 0 0 10px 0;">Get intimate, make me cum</p> <div style='background: #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>💎 Tip $150 (Broke)</div> </div> <</if>> <!-- Be Rude (Mistreatment) --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-size: 14px; margin: 0 0 10px 0;">Demand more without tipping</p> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #e74c3c 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>😠 Be Demanding</div>">> <<set $privateDanceMistreated = true>> <<run $privateDanceActions.push("mistreated")>> <<goto "StripClubVIPPrivateDanceStage3">> <</link>> </div> </div> <p style="color: #888; font-size: 13px; margin: 15px 0 0 0; text-align: center; font-style: italic;"> Tips given: $<<print $privateDanceTips>> • Current balance: $<<print $money>> </p> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIPPrivateDanceStage3">> <<set $privateDanceStage = 3>> <<set _stripper = $currentVIPStriper>> <<set _stripperGender = (_stripper.bodyParts && _stripper.bodyParts.gender) || _stripper.gender || "female">> <<set _playerGender = $bodyParts.gender || "male">> <<set _nakedStage2 = $privateDanceActions.includes("naked_stage2")>> <<set _intimateStage2 = $privateDanceActions.includes("intimate_stage2")>> <<set _mistreated = $privateDanceActions.includes("mistreated")>> <<set _isSeductive = _stripper.physicalTraits && _stripper.physicalTraits.includes("Seductive")>> <<set _isConfident = _stripper.mentalTraits && _stripper.mentalTraits.includes("Confident")>> <<set _isShy = _stripper.mentalTraits && _stripper.mentalTraits.includes("Shy")>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.5), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <h1 style="color: #FF1493; text-align: center; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8);">💦 The Finale</h1> </div> <!-- Performance Description --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 35px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px;"> <<if _mistreated>> <!-- Mistreatment Path --> <p style="color: #ff6b6b; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>>'s expression hardens when you demand more without paying. "I'm not doing this for free," she says coldly, stepping back. "You want more? Tip more. Otherwise, we're done here." <<else>> <<= _stripper.name>> stops moving, his friendly demeanor evaporating. "That's not how this works," he says flatly. "Pay up or the show's over." <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The rest of the session is awkward and tense. <<if _stripperGender === "female">>She<<else>>He<</if>> finishes the bare minimum of the performance, clearly irritated. You've ruined the mood completely. </p> <<elseif _intimateStage2>> <!-- Intimate/Sexual Path --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>> grins at your generous tip. "You want the full experience?" she purrs. "Then let's make it worth your money." <<if _playerGender === "female">> She strips completely naked, then helps you out of your clothes. Her hands explore your body expertly—cupping your breasts, sliding between your thighs. "Let me take care of you," she whispers. <<if _isSeductive>> She pushes you back onto the chair and kneels between your legs, her tongue finding your clit with practiced precision. She works you skillfully, fingers sliding inside as she sucks and licks. Your thighs tremble as pleasure builds. <<elseif _isShy>> She's hesitant at first, but when you guide her hand where you need it, she grows bolder. Her fingers circle your clit, finding the rhythm that makes you gasp. "Like that?" she asks breathlessly, watching your face. <<else>> She doesn't waste time. Her fingers plunge inside you while her thumb works your clit. She knows exactly what she's doing, bringing you right to the edge before backing off, teasing, making you beg. <</if>> <<else>> She strips naked and straddles you, grinding her bare pussy against the bulge in your pants. "Let's get these off," she murmurs, freeing your cock. It springs up, hard and ready. <<if _isSeductive>> She sinks down onto you slowly, eyes locked on yours. "Fuck," she moans as you fill her. She rides you with expert skill, rolling her hips, squeezing around you. Her hands brace on your shoulders as she bounces faster. <<elseif _isShy>> She blushes as she positions herself, sliding down onto your cock with a soft gasp. Her movements are slower, more tentative, but genuine. "You feel so good," she whispers, rocking against you. <<else>> She drops onto your cock in one smooth motion, moaning loudly. She rides you hard, breasts bouncing, head thrown back. "Yes, fuck yes," she groans, chasing her own pleasure as much as yours. <</if>> <</if>> <<else>> <<= _stripper.name>> smirks at your tip. "Alright, let's make this memorable," he says, stripping completely. <<if _playerGender === "female">> He helps you out of your clothes, his hands roaming over your body. His cock is already hard, pressing against you as he positions himself between your thighs. <<if _isSeductive>> He slides into you slowly, groaning at how wet you are. "Fuck, you feel amazing," he murmurs, starting to thrust. He knows how to use his body, hitting just the right spots, making you arch against him. <<elseif _isShy>> He enters you carefully, checking your reactions. When you pull him deeper, he starts moving with more confidence. His rhythm is less practiced but more intimate, genuine. <<else>> He pushes into you hard, starting a steady rhythm. His hips snap against yours, cock driving deep. "Take it," he grunts, fucking you thoroughly. <</if>> <<else>> He kneels in front of you, freeing your cock from your pants. "Let me show you what I can do," he murmurs before taking you into his mouth. <<if _isSeductive>> His technique is flawless—tongue swirling, throat relaxing to take you deep. He works your cock with expert skill, one hand massaging your balls, bringing you closer and closer to the edge. <<elseif _isShy>> He's less experienced but enthusiastic, bobbing his head eagerly. His hand strokes what won't fit in his mouth. He looks up at you, watching your reactions, learning what you like. <<else>> He deep-throats you without hesitation, gagging slightly but not stopping. He's rough, hungry for it, working to make you cum hard down his throat. <</if>> <</if>> <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<if _playerGender === "female">> She doesn't stop until you're crying out, thighs clamping around her head as you cum hard. She licks you through the aftershocks, grinning up at you. "Worth it?" she asks. <<else>> She rides you faster, chasing your orgasm and hers. When you finally cum, pumping into her, she moans and shudders through her own climax. She collapses against you, both of you breathing hard. <</if>> <<else>> <<if _playerGender === "female">> He fucks you until you're trembling, then groans as he cums inside you, his cock pulsing. He stays pressed against you for a moment, both of you catching your breath. <<else>> He doesn't let up until you're shooting down his throat. He swallows it all, pulling off with a satisfied grin. "Good?" he asks, wiping his mouth. <</if>> <</if>> </p> <<elseif _nakedStage2>> <!-- Naked but not sexual --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">> <<= _stripper.name>> strips completely, standing naked before you. She moves closer, letting you see every inch of her body—breasts, curves, the smooth skin between her thighs. She dances nude, hands sliding over her own body sensually. She touches herself—cupping her breasts, fingers teasing between her legs—giving you a show that's intimate and erotic. <<else>> <<= _stripper.name>> strips down to nothing, his cock semi-hard as he moves. He's comfortable in his skin, showing off his body with confidence. He touches himself as he dances, hand wrapping around his cock, stroking slowly. He's putting on a show, making sure you see everything. <</if>> </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> The performance is incredibly hot, even without direct contact. <<if _stripperGender === "female">>She<<else>>He<</if>> knows exactly how to tease, how to make you desperate for more. </p> <<else>> <!-- Standard finish --> <p style="color: #fff; font-size: 18px; line-height: 1.8; margin: 0 0 20px 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<= _stripper.name>> finishes the performance professionally. It was a good show—sexy, entertaining, worth the base price. </p> <p style="color: #FFB6C1; font-size: 17px; line-height: 1.8; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if _stripperGender === "female">>She<<else>>He<</if>> gives you a smile as the music fades. "Hope you enjoyed that," <<if _stripperGender === "female">>she<<else>>he<</if>> says, starting to get dressed. </p> <</if>> </div> <!-- Continue to Results --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Continue →</div>">> <<goto "StripClubVIPPrivateDanceFinale">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubVIPPrivateDanceFinale">> <<set _stripper = $currentVIPStriper>> <<set _stripperGender = (_stripper.bodyParts && _stripper.bodyParts.gender) || _stripper.gender || "female">> <<set _mistreated = $privateDanceActions.includes("mistreated")>> <<set _intimateStage2 = $privateDanceActions.includes("intimate_stage2")>> <!-- Calculate relationship change --> <<set _relationshipChange = 0>> <<if _mistreated>> <<set _relationshipChange = -5>> <<else>> <!-- Base relationship gain --> <<set _relationshipChange = 3>> <!-- Bonus for tips --> <<if $privateDanceTips >= 300>> <<set _relationshipChange += 5>> <<elseif $privateDanceTips >= 200>> <<set _relationshipChange += 3>> <<elseif $privateDanceTips >= 100>> <<set _relationshipChange += 2>> <</if>> <!-- Extra bonus for intimate --> <<if _intimateStage2>> <<set _relationshipChange += 3>> <</if>> <</if>> <!-- Apply Gentle Giant's Heart multiplier (4x) --> <<if $currentArtifact === "The Gentle Giant's Heart">> <<set _relationshipChange = _relationshipChange * 4>> <</if>> <!-- Apply relationship change --> <<run setup.addRelationshipPoints(_stripper.name, _relationshipChange)>> <!-- Advance time --> <<run advanceTime(30)>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="padding: 30px; background: linear-gradient(135deg, #1a0a1a 0%, #2a0510 100%); border-radius: 20px; margin-bottom: 30px; border: 3px solid #FF1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.5), inset 0 0 20px rgba(157, 0, 255, 0.2);"> <h1 style="color: #FF1493; text-align: center; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8);">✨ Session Complete</h1> </div> <!-- Relationship Change --> <<if _mistreated>> <div style="background: linear-gradient(135deg, #2a0a0a 0%, #1a0505 100%); padding: 25px; border-radius: 12px; margin-bottom: 30px; border: 3px solid #ff6b6b; box-shadow: 0 0 25px rgba(255, 107, 107, 0.4); text-align: center; animation: pulse-red 2s infinite;"> <p style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(255, 107, 107, 0.6);"> 💔 Relationship Damaged </p> <p style="color: #ff8787; font-size: 16px; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<= _stripper.name>> is clearly unhappy with how you treated <<if _stripperGender === "female">>her<<else>>him<</if>>. <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Penalty!)</span> <</if>> </p> <p style="color: #ff6b6b; font-size: 20px; font-weight: bold; margin: 10px 0 0 0;"> <<print _relationshipChange>> Relationship Points </p> </div> <style> @keyframes pulse-red { 0%, 100% { box-shadow: 0 0 25px rgba(255, 107, 107, 0.4); } 50% { box-shadow: 0 0 35px rgba(255, 107, 107, 0.7); } } </style> <<else>> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); padding: 25px; border-radius: 12px; margin-bottom: 30px; border: 3px solid #51cf66; box-shadow: 0 0 25px rgba(81, 207, 102, 0.4); text-align: center; animation: pulse-green 2s infinite;"> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(81, 207, 102, 0.6);"> 💕 Connection Deepened </p> <p style="color: #4ade80; font-size: 16px; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> Your relationship with <<= _stripper.name>> has improved! <<if $currentArtifact === "The Gentle Giant's Heart">> <span style="color: #e91e63;">(💖 4x Bonus!)</span> <</if>> </p> <p style="color: #51cf66; font-size: 20px; font-weight: bold; margin: 10px 0 0 0;"> +<<print _relationshipChange>> Relationship Points </p> </div> <style> @keyframes pulse-green { 0%, 100% { box-shadow: 0 0 25px rgba(81, 207, 102, 0.4); } 50% { box-shadow: 0 0 35px rgba(81, 207, 102, 0.7); } } </style> <</if>> <!-- Session Summary --> <div style="background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); padding: 35px; border-radius: 15px; border: 3px solid #9D00FF; box-shadow: 0 0 25px rgba(157, 0, 255, 0.4), 0 8px 16px rgba(0,0,0,0.6); margin-bottom: 30px; text-align: center;"> <h2 style="color: #FF69B4; margin: 0 0 20px 0; font-size: 28px; text-shadow: 0 0 15px rgba(255, 105, 180, 0.8);">Session Summary</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 20px;"> <p style="color: #FFD700; font-size: 20px; font-weight: bold; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(255, 215, 0, 0.6);"> Total Tips: $<<print $privateDanceTips>> </p> <p style="color: #aaa; font-size: 14px; margin: 0;"> Base session fee already paid separately </p> </div> <<if !_mistreated>> <p style="color: #fff; font-size: 17px; line-height: 1.6; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<if $privateDanceTips >= 300>> <<= _stripper.name>> gives you a genuine smile as <<if _stripperGender === "female">>she<<else>>he<</if>> gets dressed. "You're one of my favorite clients," <<if _stripperGender === "female">>she<<else>>he<</if>> says warmly. "Come back anytime." <<elseif $privateDanceTips >= 100>> <<= _stripper.name>> looks pleased as <<if _stripperGender === "female">>she<<else>>he<</if>> finishes getting dressed. "That was fun," <<if _stripperGender === "female">>she<<else>>he<</if>> says with a smile. "Hope to see you again." <<else>> <<= _stripper.name>> nods politely as <<if _stripperGender === "female">>she<<else>>he<</if>> gets dressed. "Thanks for coming in," <<if _stripperGender === "female">>she<<else>>he<</if>> says professionally. <</if>> </p> <<else>> <p style="color: #ff8787; font-size: 17px; line-height: 1.6; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.8);"> <<= _stripper.name>> gets dressed quickly, clearly wanting this to be over. <<if _stripperGender === "female">>She<<else>>He<</if>> leaves without another word. </p> <</if>> </div> <!-- Clean up variables --> <<set $currentVIPStriper = null>> <<set $privateDanceTips = 0>> <<set $privateDanceStage = 0>> <<set $privateDanceActions = []>> <<set $privateDanceMistreated = false>> <!-- Continue Button --> <div style="text-align: center; margin-top: 40px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>← Back to VIP Lounge</div>">> <<goto "StripClubVIP">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "StripClubPrivateShowPerform">> <!-- Get show type --> <<set _showType = $privateShowType>> <<set _stripper = $pc>> <!-- Player is the stripper --> <!-- Calculate bonus/penalty based on show type with HIGHER requirements --> <<if _showType === "lapdance">> <<set _requiredStats = {charisma: 35, dexterity: 30}>> <<set _duration = 15>> <<set _basePay = [50, 150]>> <<elseif _showType === "tease">> <<set _requiredStats = {charisma: 55, dexterity: 50}>> <<set _duration = 20>> <<set _basePay = [100, 250]>> <<elseif _showType === "pole">> <<set _requiredStats = {dexterity: 65, strength: 60}>> <<set _duration = 20>> <<set _basePay = [125, 300]>> <<elseif _showType === "roleplay">> <<set _requiredStats = {charisma: 75, intelligence: 70}>> <<set _duration = 30>> <<set _basePay = [150, 350]>> <<elseif _showType === "intimate">> <<set _requiredStats = {charisma: 35, dexterity: 35}>> <<set _duration = 20>> <<set _basePay = [60, 175]>> <<elseif _showType === "fullservice">> <<set _requiredStats = {charisma: 90}>> <<set _duration = 45>> <<set _basePay = [200, 500]>> <</if>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveDex = ($stats.dexterity || 0) + (_statBonuses.dexterity || 0)>> <<set _effectiveStr = ($stats.strength || 0) + (_statBonuses.strength || 0)>> <<set _effectiveInt = ($stats.intelligence || 0) + (_statBonuses.intelligence || 0)>> <<set $privateShowPerformed = $privateShowPerformed || false>> <<set $privateShowResult = $privateShowResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <<if _showType === "lapdance">> <h1 style="color: #FF69B4; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 105, 180, 0.8);">💋 Lap Dance</h1> <<elseif _showType === "tease">> <h1 style="color: #C71585; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(199, 21, 133, 0.8);">🌹 Sensual Tease</h1> <<elseif _showType === "pole">> <h1 style="color: #9D00FF; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(157, 0, 255, 0.8);">💫 Private Pole Show</h1> <<elseif _showType === "roleplay">> <h1 style="color: #FF1493; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 20, 147, 0.8);">🎭 Roleplay Fantasy</h1> <<elseif _showType === "intimate">> <h1 style="color: #FFD700; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(255, 215, 0, 0.8);">✨ Intimate Dance</h1> <<elseif _showType === "fullservice">> <h1 style="color: #DC143C; text-align: center; font-size: 36px; text-shadow: 0 0 20px rgba(220, 20, 60, 0.8);">🔥 Full Experience</h1> <</if>> <!-- Stat Check Display --> <<if typeof _requiredStats !== 'undefined' && typeof _bonus !== 'undefined'>> <div class="stat-check-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid #FF69B4; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(255, 105, 180, 0.3);"> <h3 style="color: #FFB6C1; margin-top: 0;">Requirements & Bonuses</h3> <<if _requiredStats.charisma>> <div style="color: <<if _effectiveCha >= _requiredStats.charisma>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Charisma: <<print _effectiveCha>> / <<print _requiredStats.charisma>> Required </div> <</if>> <<if _requiredStats.dexterity>> <div style="color: <<if _effectiveDex >= _requiredStats.dexterity>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Dexterity: <<print _effectiveDex>> / <<print _requiredStats.dexterity>> Required </div> <</if>> <<if _requiredStats.strength>> <div style="color: <<if _effectiveStr >= _requiredStats.strength>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Strength: <<print _effectiveStr>> / <<print _requiredStats.strength>> Required </div> <</if>> <<if _requiredStats.intelligence>> <div style="color: <<if _effectiveInt >= _requiredStats.intelligence>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Intelligence: <<print _effectiveInt>> / <<print _requiredStats.intelligence>> Required </div> <</if>> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <</if>> <!-- Action Choice or Result --> <<if !$privateShowPerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #FF1493; box-shadow: 0 0 25px rgba(255, 20, 147, 0.4);"> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You lead the client to a private room. The door closes, and you're alone with them. Time to earn your money. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0; line-height: 1.6;"> How well can you perform? </p> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, #FF1493 0%, #C71585 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(255, 20, 147, 0.6); border: 2px solid #FF1493;'>🎲 Perform (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $privateShowResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $privateShowPerformed = true>> <<goto "StripClubPrivateShowPerform">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $privateShowResult.total >= 50>> <<set _score = $privateShowResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Performance Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $privateShowResult.roll>> + Bonus: <<print $privateShowResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Performance Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <<if _showType === "lapdance">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You straddle the client's lap with expert confidence, grinding slowly and deliberately. Your body moves like silk, every roll of your hips calculated to drive them wild. You can feel their arousal pressing against you as you work. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client is absolutely mesmerized, hands gripping the chair to resist touching. You've given them the lap dance of their life, and they know it. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You move sensually in the client's lap, grinding against them with practiced skill. Your hands roam over your own body, giving them a show while maintaining that intimate contact. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client is clearly enjoying themselves, breathing heavily as you work. Solid performance. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You give them a decent lap dance, moving in their lap and keeping things sexy. Nothing spectacular, but competent enough to satisfy. </p> <</if>> <<elseif _showType === "tease">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You strip with agonizing slowness, making every piece of clothing a production. Each reveal is timed perfectly—a flash of skin here, a glimpse there. You touch yourself sensually, moaning softly, making sure they know exactly what they're seeing. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> By the time you're completely naked, the client is trembling with desire. You've teased them masterfully, and they're desperate for more. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You perform a sensual striptease, removing your clothes piece by piece while moving to the music. Your hands explore your body as you strip, putting on a good show. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client watches hungrily, clearly enjoying the intimate performance. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You strip down for them, moving sensually enough. It's a solid tease, nothing groundbreaking but satisfactory. </p> <</if>> <<elseif _showType === "pole">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You attack the pole with athletic grace, executing spins and inversions that showcase both strength and sensuality. You climb high, then drop into a controlled slide, your thighs gripping the chrome. Every move is both impressive and erotic. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client can't take their eyes off you. You've combined acrobatic skill with pure sex appeal, giving them a private show they'll never forget. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You work the pole confidently, executing impressive moves and combining them with sensual body rolls. It's both athletic and sexy. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client watches with appreciation, clearly impressed by your pole skills. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You manage some decent pole work, showing off your body while executing basic moves. Good enough. </p> <</if>> <<elseif _showType === "roleplay">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You embody the character perfectly, committing fully to the fantasy. Whether you're playing the innocent student, the dominant boss, or the seductive stranger, you make it feel real. Your improvisation is flawless, responding to their cues naturally. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client is completely immersed in the fantasy. You've given them an experience that blurs the line between performance and reality. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You play your role convincingly, maintaining character throughout and responding appropriately to the scenario. It's engaging and fun. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client enjoys the roleplay, appreciating your commitment to the fantasy. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You go through the roleplay scenario adequately, hitting the main beats even if not perfectly in character. </p> <</if>> <<elseif _showType === "intimate">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You dance inches from them, close enough that they can feel your body heat, smell your perfume. You maintain eye contact, making them feel like the only person in the world. Your movements are both sensual and personal, creating genuine connection. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The intimacy is electric. The client is captivated by you, lost in the moment. This felt less like a transaction and more like something real. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You dance close, creating an intimate atmosphere. Your eye contact and proximity make it feel personal and connected. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client responds well to the intimacy, clearly enjoying the personal attention. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You dance close and try to make it intimate. It's decent, if not particularly memorable. </p> <</if>> <<elseif _showType === "fullservice">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You give them everything. The dance transitions seamlessly into touching, then kissing, then more. You read their desires perfectly, knowing exactly when to lead and when to let them take control. Every moment is calculated to maximize their pleasure. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> By the time you're finished, the client is completely satisfied—physically, emotionally, and every other way that matters. You've delivered an experience they'll pay top dollar for again. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You provide the full experience—dancing, touching, and whatever else they paid for. You're skilled and attentive, making sure they get their money's worth. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client is clearly satisfied with what you've given them. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0;"> You deliver the services competently, meeting the basic expectations without going above and beyond. </p> <</if>> <</if>> <<else>> <!-- Failure descriptions --> <<if _showType === "lapdance">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to give them a lap dance, but your movements are awkward and uncertain. You can't quite find the rhythm, and the contact feels clumsy rather than sexy. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client sits through it politely, but you can tell they're disappointed. </p> <<elseif _showType === "tease">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> Your striptease feels rushed and graceless. You fumble with your clothes, losing the sensual momentum. It's more awkward than arousing. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client watches, but the magic isn't there. This wasn't the tease they paid for. </p> <<elseif _showType === "pole">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You struggle with the pole work, unable to execute the moves you planned. Your spins are shaky, your grip uncertain. It looks more difficult than sexy. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client watches with concern more than arousal. You need more practice. </p> <<elseif _showType === "roleplay">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You can't quite get into character, breaking the fantasy with awkward pauses and stilted dialogue. The roleplay feels forced and unconvincing. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client tries to play along, but the immersion is broken. This wasn't the fantasy they wanted. </p> <<elseif _showType === "intimate">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to create intimacy, but you can't quite connect. Your movements feel mechanical, the eye contact forced. The closeness feels awkward rather than sensual. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client seems uncomfortable. The intimacy never materialized. </p> <<elseif _showType === "fullservice">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You provide the services, but without skill or enthusiasm. It's perfunctory, mechanical. You're just going through the motions. </p> <p style="color: #FFB6C1; font-size: 16px; margin: 0;"> The client gets what they paid for technically, but there's no passion, no connection. They won't be back. </p> <</if>> <</if>> </div> <!-- Calculate payment with severe penalty for terrible performance --> <<if _score < 30>> <<set _paymentMultiplier = 0.1>> <<else>> <<set _paymentMultiplier = Math.max(0.5, Math.min(2.0, _score / 50))>> <</if>> <<set _baseAmount = Math.floor((_basePay[0] + _basePay[1]) / 2)>> <<set _finalPay = Math.round(_baseAmount * _paymentMultiplier)>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalPay * (_stripperPayBonus / 100))>> <<set _finalPay = _finalPay + _skillTreePayBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusPay = _finalPay>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusPay * 0.5)>> <<set _finalPay = _preBonusPay + _pearlBonus>> <</if>> <<set $money += _finalPay>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <!-- Apply XP based on show type --> <<if _showType === "lapdance" || _showType === "intimate">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<elseif _showType === "tease">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualExpGains.push({skill: "Sensual", amount: _finalXP})>> <<elseif _showType === "pole">> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<elseif _showType === "roleplay">> <<run setup.addSexualSkillExp("dirtyTalk", _finalXP)>> <<run _sexualExpGains.push({skill: "Dirty Talk", amount: _finalXP})>> <<run setup.addSexualSkillExp("roleplay", _finalXP)>> <<run _sexualExpGains.push({skill: "Roleplay", amount: _finalXP})>> <<elseif _showType === "fullservice">> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualExpGains.push({skill: "Sensual", amount: _finalXP})>> <<run setup.addSexualSkillExp("exhibitionism", _finalXP)>> <<run _sexualExpGains.push({skill: "Exhibitionism", amount: _finalXP})>> <!-- Satisfy Slut sexual needs for fullservice --> <<if typeof setup.satisfySlutSexualNeeds === "function">> <<run setup.satisfySlutSexualNeeds()>> <</if>> <</if>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <<for _i = 0; _i < _sexualExpGains.length; _i++>> <span style="color: #ff69b4; font-weight: bold;"><<print _sexualExpGains[_i].skill>></span> <span style="color: #51cf66;">+<<print _sexualExpGains[_i].amount>> XP</span><<if _i < _sexualExpGains.length - 1>> | <</if>> <</for>> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Performance Earnings</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalPay>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base performance: $<<print _basePay>> (score: <<print _score>>)<br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Performance score: <<print _score>> (<<print Math.round(_paymentMultiplier * 100)>>% of base pay) </p> <</if>> </div> <!-- Update counters --> <<set $privateShowsToday += 1>> <<run advanceTime(_duration)>> <<set $privateShowPerformed = false>> <<set $privateShowResult = null>> <<set $privateShowType = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to VIP Lounge</div>">> <<goto "StripClubPrivateShows">> <</link>> </div> <</if>> </div> <</nobr>>
<<set setup.calculateStripClubBonus = function(requiredStats) { var v = State.variables; var bonus = 0; // Calculate stat bonuses with HARSHER penalties (capped at -45 total) var statBonuses = setup.calculateStatBonuses(); var totalStatPenalty = 0; for (var stat in requiredStats) { var effectiveStat = (v.stats[stat] || 0) + (statBonuses[stat] || 0); var required = requiredStats[stat]; if (effectiveStat < required) { // HARSH PENALTY: -3 per point below requirement var deficit = required - effectiveStat; totalStatPenalty -= deficit * 3; } else if (effectiveStat > required) { // BONUS: +1 per point above requirement var surplus = effectiveStat - required; bonus += surplus * 1; } } // Cap the total stat penalty at -45 if (totalStatPenalty < -45) { totalStatPenalty = -45; } bonus += totalStatPenalty; // Sexual expertise trait bonuses (NOT Sexually Skilled) var sexualTraits = { "Exhibitionist": 8, "Sensual Lover": 10, "Dirty Talker": 6, "Roleplay Expert": 8, "Sexual Stamina Expert": 7, "Oral Expert": 5, "Tantric Master": 9, "Tit Worship Expert": 6, "Titfuck Master": 6 }; if (v.skills) { v.skills.forEach(function(skill) { if (sexualTraits[skill]) { bonus += sexualTraits[skill]; } }); } // Positive physical/mental traits var positiveTraits = { "Attractive": 7, "Alluring": 8, "Seductive": 9, "Graceful": 6, "Confident": 7, "Curvy": 5, "Voluptuous": 6, "Athletic": 5, "Flexible": 6, "High Energy": 4, "Charming": 6, "Flirty": 5 }; var applyTraitBonus = function(traitList) { if (!traitList) return; traitList.forEach(function(trait) { if (positiveTraits[trait]) { bonus += positiveTraits[trait]; } }); }; applyTraitBonus(v.physicalTraits); applyTraitBonus(v.mentalTraits); if (v.characterCreationTrait && positiveTraits[v.characterCreationTrait]) { bonus += positiveTraits[v.characterCreationTrait]; } // Negative traits (penalties) var negativeTraits = { "Shy": -10, "Awkward": -8, "Ugly": -12, "Plain": -6, "Clumsy": -8, "Weak": -5, "Insecure": -7, "Cowardly": -6, "Stiff": -7, "Slow": -5, "Underweight": -4, "Overweight": -5, "Blemished": -5 }; var applyTraitPenalty = function(traitList) { if (!traitList) return; traitList.forEach(function(trait) { if (negativeTraits[trait]) { bonus += negativeTraits[trait]; } }); }; applyTraitPenalty(v.physicalTraits); applyTraitPenalty(v.mentalTraits); if (v.characterCreationTrait && negativeTraits[v.characterCreationTrait]) { bonus += negativeTraits[v.characterCreationTrait]; } // Sunfish bonus (+10 to all rolls, but NOT XP) if (v.skills && v.skills.includes("Sunfish")) { bonus += 10; } return bonus; }>> <<set $stagePerformancesToday = 0>> <<set $mingleSessionsToday = 0>> <<set $privateShowsToday = 0>> <<set $maxStagePerformancesPerDay = 3>> <<set $maxMingleSessionsPerDay = 3>> <<set $maxPrivateShowsPerDay = 3>>
<<nobr>> <<set $lastLocation = "StripClubMingleInteraction">> <!-- Get customer type --> <<set _customerType = $mingleCustomerType>> <!-- Set requirements and pay based on customer type --> <<if _customerType === "shy">> <<set _requiredStats = {charisma: 30}>> <<set _duration = 10>> <<set _basePay = [13, 38]>> <<set _customerName = "Shy Regular">> <<set _customerColor = "#87CEEB">> <<elseif _customerType === "spender">> <<set _requiredStats = {charisma: 50}>> <<set _duration = 15>> <<set _basePay = [75, 200]>> <<set _customerName = "Big Spender">> <<set _customerColor = "#FFD700">> <<elseif _customerType === "bachelor">> <<set _requiredStats = {charisma: 40}>> <<set _duration = 20>> <<set _basePay = [25, 75]>> <<set _customerName = "Bachelor Party">> <<set _customerColor = "#FF6347">> <<elseif _customerType === "businessman">> <<set _requiredStats = {charisma: 45, intelligence: 35}>> <<set _duration = 15>> <<set _basePay = [30, 88]>> <<set _customerName = "Lonely Businessman">> <<set _customerColor = "#9370DB">> <<elseif _customerType === "couple">> <<set _requiredStats = {charisma: 65}>> <<set _duration = 20>> <<set _basePay = [90, 225]>> <<set _customerName = "Adventurous Couple">> <<set _customerColor = "#FF69B4">> <<elseif _customerType === "vip">> <<set _requiredStats = {charisma: 80}>> <<set _duration = 25>> <<set _basePay = [125, 300]>> <<set _customerName = "VIP High Roller">> <<set _customerColor = "#FF1493">> <</if>> <<set _bonus = setup.calculateStripClubBonus(_requiredStats)>> <!-- Calculate effective stats for display --> <<set _statBonuses = setup.calculateStatBonuses()>> <<set _effectiveCha = ($stats.charisma || 0) + (_statBonuses.charisma || 0)>> <<set _effectiveInt = ($stats.intelligence || 0) + (_statBonuses.intelligence || 0)>> <<set $minglePerformed = $minglePerformed || false>> <<set $mingleResult = $mingleResult || null>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <h1 style="color: <<print _customerColor>>; text-align: center; font-size: 36px; text-shadow: 0 0 20px <<print _customerColor>>;"><<print _customerName>></h1> <!-- Stat Check Display --> <div class="stat-check-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid <<print _customerColor>>; padding: 20px; border-radius: 12px; margin-bottom: 25px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.3);"> <h3 style="color: #FFE4B5; margin-top: 0;">Requirements & Bonuses</h3> <<if _requiredStats.charisma>> <div style="color: <<if _effectiveCha >= _requiredStats.charisma>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Charisma: <<print _effectiveCha>> / <<print _requiredStats.charisma>> Required </div> <</if>> <<if _requiredStats.intelligence>> <div style="color: <<if _effectiveInt >= _requiredStats.intelligence>>#4ade80<<else>>#ff6b6b<</if>>; margin: 8px 0;"> Intelligence: <<print _effectiveInt>> / <<print _requiredStats.intelligence>> Required </div> <</if>> <<if _bonus > 0>> <div style="color: #4ade80; margin-top: 10px;">✓ Total Bonus: +<<print _bonus>></div> <<elseif _bonus < 0>> <div style="color: #ff6b6b; margin-top: 10px;">⚠ Total Penalty: <<print _bonus>></div> <</if>> </div> <!-- Action Choice or Result --> <<if !$minglePerformed>> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<print _customerColor>>; box-shadow: 0 0 25px rgba(255, 215, 0, 0.4);"> <<if _customerType === "shy">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> They're sitting alone at a corner table, nursing a drink and trying not to make eye contact with anyone. You can see the nervousness in their posture—shoulders hunched, hands fidgeting. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A gentle approach should work here. Make them feel comfortable, not overwhelmed. </p> <<elseif _customerType === "spender">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> Designer suit, expensive cologne, confident demeanor. This one's dripping with money and knows it. They're used to getting what they want, and right now they're scanning the room like they own it. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Time to show them something worth paying for. Confidence and allure are key. </p> <<elseif _customerType === "bachelor">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> The group is loud, already several drinks in, laughing and shoving each other. The groom-to-be sits in the middle, wearing a ridiculous sash. They're rowdy, energetic, and looking for someone to amp up their celebration. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Play to the crowd. Keep the energy high and make it a night they'll remember. </p> <<elseif _customerType === "businessman">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> Loosened tie, tired eyes, wedding ring. They look stressed, isolated, probably in town for some conference. They're not here for wild entertainment—they're here because their hotel room felt too lonely. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> This one needs connection more than spectacle. Listen, engage, make them feel understood. </p> <<elseif _customerType === "couple">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> They're sitting close together, whispering and giggling, occasionally glancing at the dancers. There's an electric tension between them—they're here to add some spice to their relationship, push some boundaries together. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Tricky territory. Flirt with both, favor neither. Make them feel like a team, not rivals. </p> <<elseif _customerType === "vip">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> VIP section, bottle service, entourage keeping their distance. This is the club's biggest whale, the one everyone wants to impress. Their standards are impossibly high, their patience nonexistent. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> This is the ultimate test. You need to be perfect—charming, sexy, attentive, flawless. One mistake and you're dismissed. </p> <</if>> </div> <div style="text-align: center; margin: 30px 0;"> <<link "<div class='action-choice-btn' style='display: inline-block; background: linear-gradient(135deg, <<print _customerColor>> 0%, #C71585 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(255, 215, 0, 0.6); border: 2px solid <<print _customerColor>>;'>🎲 Work Your Magic (Roll d100)</div>">> <<set _rollValue = random(1, 100)>> <<set $mingleResult = {roll: _rollValue, bonus: _bonus, total: _rollValue + _bonus}>> <<set $minglePerformed = true>> <<goto "StripClubMingleInteraction">> <</link>> </div> <<else>> <!-- Show Result --> <<set _success = $mingleResult.total >= 50>> <<set _score = $mingleResult.total>> <div class="result-display" style="background: linear-gradient(135deg, #1a0a1a 0%, #2a0a1a 100%); border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.4)<<else>>rgba(255, 107, 107, 0.4)<</if>>;"> <h3 style="color: white; margin-top: 0;">Interaction Result</h3> <div style="color: #aaa; margin: 10px 0;"> Roll: <<print $mingleResult.roll>> + Bonus: <<print $mingleResult.bonus>> </div> <div class="result-score" style="font-size: 48px; font-weight: bold; color: <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; text-shadow: 0 0 20px <<if _success>>rgba(74, 222, 128, 0.6)<<else>>rgba(255, 107, 107, 0.6)<</if>>;"> <<print _score>> </div> </div> <!-- Interaction Description --> <div style="padding: 25px; background: linear-gradient(135deg, #1a0a1a 0%, #0a0520 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _success>>#4ade80<<else>>#ff6b6b<</if>>; box-shadow: 0 0 25px <<if _success>>rgba(74, 222, 128, 0.3)<<else>>rgba(255, 107, 107, 0.3)<</if>>;"> <<if _success>> <!-- Success outcomes --> <<if _customerType === "shy">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You approach with a warm smile, not too aggressive. "First time here?" you ask gently. They nod, clearly relieved you're being kind. You sit close—not too close—and chat about nothing important, making them laugh with light jokes. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Gradually, they open up. By the end, they're smiling genuinely, relaxed, grateful for the company. They tip generously for making them feel welcome and comfortable. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You chat with them kindly, making small talk and helping them relax. They appreciate the gentle attention and start to loosen up a bit. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They leave a decent tip with a shy smile, clearly glad you approached them. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You manage to get them talking a little. It's a bit awkward, but they seem to appreciate the effort. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A modest tip appears on the table as you leave. </p> <</if>> <<elseif _customerType === "spender">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You saunter over with perfect confidence, hip cocked, making eye contact that says you know exactly what they want. "Looking lonely over here," you purr. They grin—they like confidence. You flirt hard, touching their arm, leaning in close, letting them smell your perfume. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> You're witty, sexy, attentive—everything they're paying premium prices for. When you finally excuse yourself, they peel off bills from a thick stack without even counting. You've earned every dollar. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You flirt confidently, showing off your best assets and keeping their attention. They clearly enjoy the attention and your company. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A generous tip rewards your efforts—they got what they came for. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You do your best to impress them, flirting and chatting. They seem satisfied enough with the attention. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip decently, though you sense they've had better. </p> <</if>> <<elseif _customerType === "bachelor">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You charge in with high energy, immediately making the groom the center of attention. "So which one of you lucky bastards is getting married?" The table erupts in laughter and pointing. You tease him mercilessly, getting the whole group involved, making jokes and playing along with their energy. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> You keep them entertained, laughing, feeling like rock stars. Every guy at the table contributes to the tip pile, not wanting to look cheap in front of his friends. It adds up fast. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You join their party energy, laughing at their jokes and giving the groom special attention. They're having a great time with you at their table. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> The whole group chips in for tips, creating a nice pile of bills. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You hang out with the group, trying to keep up with their rowdy energy. It's decent entertainment for them. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip collectively—nothing spectacular but respectable. </p> <</if>> <<elseif _customerType === "businessman">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You slide into the seat across from them with a sympathetic smile. "Rough day?" They laugh bitterly—understatement of the year. You actually listen as they vent about work, the hotel, missing their family. You ask thoughtful questions, share your own stories, make them feel heard. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> For twenty minutes, you give them genuine human connection. When you leave, they press a hefty tip into your hand and thank you sincerely. You made their lonely night bearable. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You engage them in conversation, listening to their stories and making them feel less alone. They appreciate having someone to talk to. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A solid tip follows the conversation—they needed that. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You chat with them about their day and life. It's decent conversation, nothing deep but friendly enough. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip adequately for the company. </p> <</if>> <<elseif _customerType === "couple">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> This is delicate work. You approach with a flirtatious smile for both of them. "You two make a gorgeous couple," you start, making sure to compliment them as a unit. You flirt with her, then him, then back to her—keeping perfect balance, never playing favorites. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> You read their dynamic perfectly, knowing when to touch her hand, when to lean toward him, when to suggest they both deserve to feel sexy tonight. They leave glowing and excited, tipping big for adding fuel to their fire. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You navigate the couple dynamic well, flirting with both and making them both feel included. They seem to enjoy the attention together. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip generously as a couple, both contributing. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to balance attention between them, flirting with both. It's a bit awkward but they seem to appreciate the effort. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A decent combined tip appears. </p> <</if>> <<elseif _customerType === "vip">> <<if _score >= 90>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You approach the VIP table like you belong there. Perfect posture, perfect smile, perfect confidence. You read them instantly—what they want, how they want to be treated. You're charming without being desperate, sexy without being crude, attentive without being clingy. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> Every word, every gesture is calculated perfection. They're impressed—genuinely impressed. When you excuse yourself gracefully at just the right moment, they hand you a tip that makes your heart skip. You just earned VIP status yourself. </p> <<elseif _score >= 70>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You handle yourself well in the VIP section, staying professional and charming. They seem satisfied with the interaction. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A very generous tip—they pay for quality. </p> <<else>> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You do your best to impress the VIP, though you can tell you're not quite hitting their high standards. Still, they're courteous. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip well because they always do, not because you wowed them. </p> <</if>> <</if>> <<else>> <!-- Failure outcomes --> <<if _customerType === "shy">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to chat them up, but you come on too strong or too awkward. They shrink back, clearly uncomfortable. The conversation dies quickly. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They leave a small tip out of politeness, but you clearly made them more anxious than relaxed. </p> <<elseif _customerType === "spender">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to impress them, but you're not quite on their wavelength. Your flirting feels forced, your charm hollow. They check their phone while you're talking. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip minimally—they've had much better and they know it. </p> <<elseif _customerType === "bachelor">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to match their energy but can't quite get on their level. Your jokes fall flat, your timing is off. They're polite but not engaged. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A small collective tip emerges, mostly out of courtesy. </p> <<elseif _customerType === "businessman">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You try to engage them in conversation, but you can't quite connect. Your questions feel shallow, your responses generic. They remain polite but distant. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> A minimal tip—you didn't give them what they needed. </p> <<elseif _customerType === "couple">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You can't quite balance the dynamic. You favor one too much, or make the other feel excluded. Tension creeps into their body language. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> They tip small—you didn't enhance their experience, you complicated it. </p> <<elseif _customerType === "vip">> <p style="color: #fff; font-size: 18px; margin: 0 0 15px 0; line-height: 1.6;"> You're in over your head and it shows. You're trying too hard, or not hard enough. They see through everything—every forced smile, every calculated word. Within minutes, they politely dismiss you. </p> <p style="color: #FFE4B5; font-size: 16px; margin: 0; line-height: 1.6;"> The minimum tip appears out of obligation, not appreciation. You weren't ready for this level. </p> <</if>> <</if>> </div> <!-- Calculate tips with severe penalty for terrible performance --> <<if _score < 30>> <<set _paymentMultiplier = 0.1>> <<else>> <<set _paymentMultiplier = Math.max(0.5, Math.min(2.0, _score / 50))>> <</if>> <<set _baseAmount = Math.floor((_basePay[0] + _basePay[1]) / 2)>> <<set _finalPay = Math.round(_baseAmount * _paymentMultiplier)>> <!-- ===== SKILL TREE: Apply stripper pay bonus ===== --> <<set _stripperPayBonus = setup.skillTree.getEffect("stripperPayBonus")>> <<set _skillTreePayBonus = 0>> <<if _stripperPayBonus > 0>> <<set _skillTreePayBonus = Math.floor(_finalPay * (_stripperPayBonus / 100))>> <<set _finalPay = _finalPay + _skillTreePayBonus>> <</if>> <!-- Apply Pearl of Abundance bonus (+50%) --> <<set _pearlActive = $currentArtifact === "The Pearl of Abundance">> <<set _preBonusPay = _finalPay>> <<set _pearlBonus = 0>> <<if _pearlActive>> <<set _pearlBonus = Math.round(_preBonusPay * 0.5)>> <<set _finalPay = _preBonusPay + _pearlBonus>> <</if>> <<set $money += _finalPay>> <!-- Sexual XP Gain --> <<set _sexualExpGains = []>> <<if _score >= 85>> <<if !$sexualSkills>> <<run setup.initializeSexualSkills()>> <</if>> <!-- Calculate base XP --> <<set _baseXP = 5>> <!-- ===== SKILL TREE: Apply sex skill XP bonus ===== --> <<set _sexSkillXPBonus = setup.skillTree.getEffect("sexSkillXPBonus")>> <<set _baseXP = _baseXP + _sexSkillXPBonus>> <!-- Apply Basking Charm multiplier (3x) --> <<if $currentArtifact === "The Basking Charm">> <<set _finalXP = _baseXP * 3>> <<else>> <<set _finalXP = _baseXP>> <</if>> <<run setup.addSexualSkillExp("teasing", _finalXP)>> <<run _sexualExpGains.push({skill: "Teasing", amount: _finalXP})>> <<run setup.addSexualSkillExp("sensual", _finalXP)>> <<run _sexualExpGains.push({skill: "Sensual", amount: _finalXP})>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff69b4; box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); animation: pulse-pink 2s infinite;"> <h3 style="color: #ff69b4; margin-top: 0; text-align: center;"> 💕 Sexual Expertise Increased! <<if $currentArtifact === "The Basking Charm">> <span style="color: #ff9800;">☀️ 3x Bonus!</span> <</if>> </h3> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 10px 0;"> <span style="color: #ff69b4; font-weight: bold;">Teasing</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> | <span style="color: #ff69b4; font-weight: bold;">Sensual</span> <span style="color: #51cf66;">+<<print _finalXP>> XP</span> </p> <<if $currentArtifact === "The Basking Charm">> <p style="color: #ccc; font-size: 14px; text-align: center; margin: 10px 0 0 0; font-style: italic;"> The Basking Charm amplifies every sensation, every lesson learned... </p> <</if>> </div> <style> @keyframes pulse-pink { 0%, 100% { box-shadow: 0 8px 16px rgba(255, 105, 180, 0.3); } 50% { box-shadow: 0 8px 24px rgba(255, 105, 180, 0.6); } } </style> <</if>> <!-- ===== SKILL TREE: Display pay bonus notification ===== --> <<if _skillTreePayBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #CE93D8; box-shadow: 0 0 20px rgba(156, 39, 176, 0.4);"> <p style="color: #E1BEE7; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> ⭐ Skill Tree Bonus: +$<<print _skillTreePayBonus>> (+<<print _stripperPayBonus>>%) ⭐ </p> </div> <</if>> <!-- Pearl of Abundance Notification --> <<if _pearlActive>> <div style="background: linear-gradient(135deg, #7dd3fc 0%, #3b82f6 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 3px solid #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); animation: pulse-pearl 2s infinite;"> <p style="color: white; margin: 0; text-align: center; font-size: 16px; font-weight: bold;"> 🐚 The Pearl of Abundance has increased your earnings by 50%! 🐚 </p> </div> <style> @keyframes pulse-pearl { 0%, 100% { box-shadow: 0 0 20px rgba(125, 211, 252, 0.4); } 50% { box-shadow: 0 0 30px rgba(125, 211, 252, 0.7); } } </style> <</if>> <!-- Earnings Display --> <div style="background: linear-gradient(135deg, #1a4d1a 0%, #0a2a0a 100%); border: 3px solid #4ade80; padding: 25px; border-radius: 15px; text-align: center; margin-bottom: 25px; box-shadow: 0 0 25px rgba(74, 222, 128, 0.3);"> <h2 style="color: #4ade80; margin: 0 0 15px 0; text-shadow: 0 0 15px rgba(74, 222, 128, 0.6);">💰 Tips Earned</h2> <div style="font-size: 42px; font-weight: bold; color: #FFD700; text-shadow: 0 0 20px rgba(255, 215, 0, 0.6);"> +$<<print _finalPay>> <<if _pearlActive>> <span style="color: #7dd3fc; font-size: 24px;">(+50%)</span> <</if>> </div> <<if _pearlActive>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Base tips: $<<print _basePay>> (score: <<print _score>>)<br> Pearl Bonus: <span style="color: #7dd3fc;">+$<<print _pearlBonus>></span> </p> <<else>> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0;"> Performance score: <<print _score>> (<<print Math.round(_paymentMultiplier * 100)>>% of base pay) </p> <</if>> </div> <!-- Update counters --> <<set $mingleSessionsToday += 1>> <<run advanceTime(_duration)>> <!-- Co-worker relationship bonus (30% chance per co-worker during mingle sessions) --> <<set _coworkerBonuses = []>> <<set _coworkers = setup.getNPCsByJob("Stripper")>> <<if _coworkers && _coworkers.length > 0>> <<for _i = 0; _i < _coworkers.length; _i++>> <<set _coworker = _coworkers[_i]>> <<set _coworkerName = _coworker.name>> <<if random(1, 100) <= 30>> <<set _relPoints = random(1, 4)>> <<run setup.meetNPC(_coworker)>> <<run setup.addRelationshipPoints(_coworkerName, _relPoints)>> <<run _coworkerBonuses.push({name: _coworkerName, points: _relPoints})>> <</if>> <</for>> <</if>> <<if _coworkerBonuses.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-top: 20px; border: 3px solid #9D00FF;"> <h3 style="color: #9D00FF; margin: 0 0 15px 0;">👥 Backstage Bonding</h3> <p style="color: #aaa; margin-bottom: 15px;">You chatted with other dancers between sets!</p> <<for _cwb range _coworkerBonuses>> <div style="background: #1a2a3a; padding: 12px 15px; border-radius: 8px; margin-bottom: 8px; border: 2px solid #51cf66; display: flex; justify-content: space-between; align-items: center;"> <span style="color: #ddd;">💚 <<print _cwb.name>></span> <span style="color: #51cf66; font-weight: bold;">+<<print _cwb.points>> points</span> </div> <</for>> </div> <</if>> <<set $minglePerformed = false>> <<set $mingleResult = null>> <<set $mingleCustomerType = null>> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9D00FF 0%, #6A00B3 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 0 20px rgba(157, 0, 255, 0.5); border: 2px solid #9D00FF;'>Back to Floor</div>">> <<goto "StripClubMingleCustomers">> <</link>> </div> <</if>> </div> <</nobr>>
setup.getBrothelImage = function(serviceType, client, playerTraits, sessionChoices) { if (!serviceType || !client || !playerTraits) return null; let imagePath = "Images/Jobs/Brothel/"; let fileName = ""; // Helper function to get primary personality const getPrimaryPersonality = function() { if (playerTraits.isDominant) return "Dominant"; if (playerTraits.isSubmissive) return "Submissive"; if (playerTraits.isFlirty) return "Flirty"; if (playerTraits.isAwkward) return "Awkward"; if (playerTraits.isKind) return "Kind"; if (playerTraits.isProfessional) return "Professional"; if (playerTraits.isConfident) return "Confident"; if (playerTraits.isBitchy) return "Bitchy"; if (playerTraits.isEnergetic) return "Energetic"; return null; }; const personality = getPrimaryPersonality(); const hasRough = sessionChoices && sessionChoices.includes("rough"); switch(serviceType) { case "oralGiving": if (client.hasPenis) { if (client.gender === "male") { // Male client with penis if (personality === "Dominant") fileName = "OralGiving_Male_Dominant"; else if (personality === "Submissive") fileName = "OralGiving_Male_Submissive"; else if (personality === "Flirty") fileName = "OralGiving_Male_Flirty"; else if (personality === "Awkward") fileName = "OralGiving_Male_Awkward"; else if (personality === "Professional") fileName = "OralGiving_Male_Professional"; else fileName = "OralGiving_Male_Deepthroat"; } else { // Female client with penis if (personality === "Dominant") fileName = "OralGiving_Female_Dominant"; else if (personality === "Submissive") fileName = "OralGiving_Female_Submissive"; else if (personality === "Flirty") fileName = "OralGiving_Female_Flirty"; else if (personality === "Kind") fileName = "OralGiving_Female_Kind"; else fileName = "OralGiving_Female_Submissive"; } } else if (client.hasVagina) { if (client.gender === "female") { // Female client with pussy if (personality === "Dominant") fileName = "OralGiving_Pussy_Dominant"; else if (personality === "Submissive") fileName = "OralGiving_Pussy_Submissive"; else if (personality === "Flirty") fileName = "OralGiving_Pussy_Flirty"; else if (personality === "Kind") fileName = "OralGiving_Pussy_Kind"; else fileName = "OralGiving_Pussy_Submissive"; } else { // Male client with pussy if (personality === "Kind") fileName = "OralGiving_MalePussy_Kind"; else if (personality === "Confident") fileName = "OralGiving_MalePussy_Confident"; else fileName = "OralGiving_MalePussy_Kind"; } } break; case "vaginal": if (client.gender === "male") { // Male client fucking player if (personality === "Submissive") fileName = "Vaginal_Male_Submissive"; else if (personality === "Dominant") fileName = "Vaginal_Male_Dominant"; else if (personality === "Flirty") fileName = "Vaginal_Male_Flirty"; else if (personality === "Awkward") fileName = "Vaginal_Male_Awkward"; else if (hasRough) fileName = "Vaginal_Male_Rough"; else fileName = "Vaginal_Male_Submissive"; } else { // Female client fucking player if (personality === "Dominant") fileName = "Vaginal_Female_Dominant_Riding"; else if (personality === "Submissive") fileName = "Vaginal_Female_Submissive"; else if (personality === "Flirty") fileName = "Vaginal_Female_Flirty"; else fileName = "Vaginal_Female_Submissive"; } break; case "anal": if (client.hasPenis) { if (client.gender === "male") { // Male client fucking player's ass if (personality === "Submissive") fileName = "Anal_Male_Submission"; else if (hasRough) fileName = "Anal_Male_Rough"; else if (personality === "Dominant") fileName = "Anal_Male_Dominant"; else if (personality === "Awkward") fileName = "Anal_Male_Awkward"; else fileName = "Anal_Male_Submission"; } else { // Female client with penis fucking player's ass if (personality === "Submissive") fileName = "Anal_Female_Submissive"; else fileName = "Anal_Female_Toys"; } } else { // No penis - toys fileName = "Anal_Female_Toys"; } break; case "penisPlay": // Player using their cock if (client.gender === "male") { if (personality === "Dominant") fileName = "PenisPlay_Male_Dominant"; else if (personality === "Kind") fileName = "PenisPlay_Male_Kind"; else fileName = "PenisPlay_Male_Dominant"; } else { if (personality === "Dominant") fileName = "PenisPlay_Female_Dominant"; else if (personality === "Confident") fileName = "PenisPlay_Female_Confident"; else if (personality === "Flirty") fileName = "PenisPlay_Female_Flirty"; else fileName = "PenisPlay_Female_Dominant"; } break; case "handjobs": if (client.hasPenis) { if (personality === "Professional") fileName = "Handjob_Male_Professional"; else if (personality === "Flirty") fileName = "Handjob_Male_Flirty"; else if (personality === "Dominant") fileName = "Handjob_Male_Dominant"; else fileName = "Handjob_Male_Professional"; } else { if (personality === "Kind") fileName = "Fingering_Pussy_Kind"; else if (personality === "Confident") fileName = "Fingering_Pussy_Confident"; else if (personality === "Dominant") fileName = "Fingering_Pussy_Dominant"; else if (personality === "Submissive") fileName = "Fingering_Pussy_Submissive"; else fileName = "Fingering_Pussy_Expert"; } break; case "titWorship": // Determine chest size from playerTraits if available const chestSize = playerTraits.chestSize || ""; if (chestSize.includes("small")) { if (personality === "Dominant") fileName = "TitWorship_Small_Dominant"; else if (personality === "Submissive") fileName = "TitWorship_Small_Submissive"; else if (client.gender === "male") fileName = "TitWorship_Small_Male"; else fileName = "TitWorship_Small_Female"; } else if (chestSize.includes("medium")) { if (personality === "Dominant") fileName = "TitWorship_Medium_Dominant"; else if (personality === "Submissive") fileName = "TitWorship_Medium_Submissive"; else if (client.gender === "male") fileName = "TitWorship_Medium_Male"; else fileName = "TitWorship_Medium_Female"; } else if (chestSize.includes("large")) { if (personality === "Dominant") fileName = "TitWorship_Large_Dominant"; else if (client.gender === "male") fileName = "TitWorship_Large_Male"; else fileName = "TitWorship_Large_Female"; } else if (chestSize.includes("huge")) { if (client.gender === "male") fileName = "TitWorship_Huge_Male_Smothering"; else fileName = "TitWorship_Huge_Female"; } else if (chestSize.includes("giant")) { if (personality === "Dominant") fileName = "TitWorship_Giant_Dominant"; else fileName = "TitWorship_Giant_Male"; } else { // Default fileName = "TitWorship_Medium_Male"; } break; case "titfuck": if (!client.hasPenis) { // Redirect to tit worship if no penis return setup.getBrothelImage("titWorship", client, playerTraits, sessionChoices); } const titsSize = playerTraits.chestSize || ""; if (titsSize.includes("medium")) { if (personality === "Flirty") fileName = "Titfuck_Medium_Flirty"; else if (personality === "Submissive") fileName = "Titfuck_Medium_Submissive"; else fileName = "Titfuck_Medium_Standard"; } else if (titsSize.includes("large")) { if (personality === "Dominant") fileName = "Titfuck_Large_Dominant"; else fileName = "Titfuck_Large_Standard"; } else if (titsSize.includes("huge")) { if (personality === "Dominant") fileName = "Titfuck_Huge_Dominant"; else fileName = "Titfuck_Huge_Bouncing"; } else if (titsSize.includes("giant")) { if (personality === "Dominant") fileName = "Titfuck_Giant_Dominant"; else fileName = "Titfuck_Giant_Smothering"; } else if (titsSize.includes("gigantic")) { fileName = "Titfuck_Gigantic_Bouncing"; } else { fileName = "Titfuck_Medium_Standard"; } break; case "climax": // Climax images based on what service was used const primaryService = sessionChoices ? sessionChoices[sessionChoices.length - 2] : null; if (primaryService === "oralGiving" && client.hasPenis) { if (personality === "Submissive") fileName = "Climax_Oral_Swallow_Submissive"; else if (personality === "Dominant") fileName = "Climax_Oral_Facial_Dominant"; else if (personality === "Flirty") fileName = "Climax_Oral_Facial_Flirty"; else fileName = "Climax_Oral_Messy"; } else if (primaryService === "vaginal") { if (sessionChoices.includes("strong_finish")) fileName = "Climax_Creampie_Dripping"; else if (personality === "Submissive") fileName = "Climax_Creampie_Submissive"; else fileName = "Climax_Creampie_Breeding"; } else if (primaryService === "anal") { fileName = "Climax_Anal_Dripping"; } else if (primaryService === "titfuck") { const tSize = playerTraits.chestSize || ""; if (tSize.includes("huge") || tSize.includes("giant")) fileName = "Titfuck_Cumshot_Huge"; else fileName = "Titfuck_Cumshot_Medium"; } else if (sessionChoices && sessionChoices.includes("multiple")) { fileName = "Climax_Multiple_Exhausted"; } else if (sessionChoices && sessionChoices.includes("simultaneous")) { if (personality === "Flirty") fileName = "Climax_Simultaneous_Intimate"; else fileName = "Climax_Simultaneous_Intense"; } else { fileName = "Climax_Body_Covered"; } break; default: return null; } return fileName ? imagePath + fileName + ".webp" : null; };
<<nobr>> <<set _password = "S0m30neOngot@F15HN@m3forD01NGSometH1INGiFounDFunnyl0L">> <<if ndef $cheatMenuUnlocked>><<set $cheatMenuUnlocked = false>><</if>> <<if $cheatMenuUnlocked is true>><<goto "Debug">><</if>> <div style="background:#1a1a1a;min-height:100vh;padding:20px;display:flex;align-items:center;justify-content:center"> <div style="background:linear-gradient(135deg,#2d2d2d 0%,#1a1a1a 100%);padding:40px;border-radius:15px;border:3px solid #667eea;box-shadow:0 4px 8px rgba(0,0,0,0.4);max-width:500px;text-align:center"> <h1 style="color:#667eea;margin:0 0 20px 0">🔒 Cheat Menu Access</h1> <div style="background-color:#0a0a0a;padding:20px;border-radius:10px;margin-bottom:25px;border:2px solid #ffd43b"> <p style="color:#ffd43b;font-size:18px;font-weight:bold;margin:0">⭐ Patreon Tiers Spoon and up can access the cheat menu! ⭐</p> </div> <p style="color:#e0e0e0;margin-bottom:20px;font-size:16px">Enter the password to continue:</p> <div style="margin-bottom:20px"> <<textbox "_cheatPassword" "" "autofocus">> </div> <span id="passwordError" style="color:#ff6b6b;font-size:14px;display:none;margin-bottom:15px">❌ Incorrect password. Please try again.</span> <<link "<div style='background:linear-gradient(135deg,#51cf66 0%,#40c057 100%);color:white;padding:12px 30px;border-radius:8px;text-align:center;cursor:pointer;font-weight:bold;box-shadow:0 2px 4px rgba(0,0,0,0.3);display:inline-block;margin-top:10px'>Unlock</div>">> <<if _cheatPassword === _password>> <<set $cheatMenuUnlocked = true>> <<goto "Debug">> <<else>> <<script>>$("#passwordError").show();<</script>> <</if>> <</link>> <div style="margin-top:30px"> <<link "<div style='background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:white;padding:10px 20px;border-radius:6px;text-align:center;cursor:pointer;font-weight:bold;box-shadow:0 2px 4px rgba(0,0,0,0.3);display:inline-block'>← Back</div>">><<goto $lastLocation>><</link>> </div> </div></div> <</nobr>>
<<silently>> <!-- Placeholder init passage --> <</silently>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Beach")>> <<run $visitedLocations.push("Beach")>> <!-- Check for main locations achievement (bronze) --> <<set _mainLocations = ["Downtown", "BusinessDistrict", "RedLightDistrict", "Docks", "Alleyway", "Outskirts"]>> <<set _visitedMainCount = 0>> <<for _loc range _mainLocations>> <<if $visitedLocations.includes(_loc)>> <<set _visitedMainCount++>> <</if>> <</for>> <<if _visitedMainCount >= 6>> <<run setup.achievements.unlock("visit_main_locations")>> <</if>> <</if>> <!-- Initialize swimming minutes first --> <<if !$swimmingMinutesToday>><<set $swimmingMinutesToday = 0>><</if>> <<set $lastLocation = "Beach">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #f4a460; text-align: center;">🏖️ Beach</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/Beach.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #f4a460; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Beach"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #87ceeb 0%, #f4a460 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #f4a460;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> Warm sand stretches beneath your feet as ocean waves crash rhythmically against the shore. Seagulls cry overhead, and the scent of salt water mingles with sunscreen and beach food. Sunbathers dot the coastline, some seeking relaxation, others seeking attention. </p> </div> <h2 style="color: #f4a460;">Activities</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Swimming --> <<set _canSwim = $swimmingMinutesToday < 180>> <<set _minutesRemaining = 180 - $swimmingMinutesToday>> <div style="border: 3px solid #4fc3f7; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4fc3f7; margin: 0 0 10px 0;">🏊 Swimming Area</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take a refreshing swim in the ocean.</p> <<if _canSwim>> <p style="font-size: 12px; color: #4fc3f7; margin: 5px 0; text-align: center;">Time left today: _minutesRemaining minutes</p> <<link "<div style='background: #4fc3f7; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Swimming (60 min)</div>">> <<advancetime 60>> <<set $swimmingMinutesToday += 60>> <!-- Swimming removes shower buffs and messes hair --> <<run setup.removeBuff("shower_fresh")>> <<run setup.removeBuff("bath_relaxed")>> <<run setup.removeBuff("bath_luxury")>> <<set $appearance.hairStyle = "messy">> <!-- Swimming skill progression (Siren transformation includes Swimming) --> <<if !$beachSwimCount>><<set $beachSwimCount = 0>><</if>> <<set _hasSwimmingSkill = ($skills && ($skills.includes("Swimming") || $skills.includes("Swimmer"))) || ($physicalTraits && $physicalTraits.includes("Siren"))>> <<if !_hasSwimmingSkill>> <<set $beachSwimCount++>> <<if $beachSwimCount >= 25>> <!-- Grant one of the swimming skills randomly --> <<set _swimmingSkills = ["Swimming", "Swimmer"]>> <<set _grantedSkill = _swimmingSkills.random()>> <<run $skills.push(_grantedSkill)>> <<set $beachSwimCount = 0>> <<set $swimSkillLearned = _grantedSkill>> <</if>> <</if>> <<goto "BeachSwimming">> <</link>> <<else>> <p style="font-size: 12px; color: #ff6b6b; margin: 5px 0; text-align: center;">You've swum enough for today (180/180 minutes)</p> <div style='background: #666; color: #999; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold; margin-top: 10px; cursor: not-allowed;'>Too Tired to Swim</div> <</if>> </div> <!-- Walk Along the Beach --> <div style="border: 3px solid #90caf9; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #90caf9; margin: 0 0 10px 0;">🚶 Walk Along the Beach</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Take a stroll along the shoreline.</p> <<link "<div style='background: #90caf9; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Take a Walk</div>">> <<goto "BeachWalk">> <</link>> </div> <!-- Beach Fishing --> <div style="border: 3px solid #f4a460; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f4a460; margin: 0 0 10px 0;">🎣 Beach Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Fish from the sandy shores.</p> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Fishing</div>">> <<set $fishingLocation = "beach">> <<goto "FishingBeach">> <</link>> </div> <!-- Coral Reef (Only shows if unlocked) --><<if $coralReefUnlocked>> <div style="border: 3px solid #00bcd4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #00bcd4; margin: 0 0 10px 0;">🐠 Coral Reef</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Visit the vibrant underwater ecosystem.</p> <<link "<div style='background: #00bcd4; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Coral Reef</div>">> <<goto "CoralReef">> <</link>> </div><</if>> </div> <h2 style="color: #f4a460;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to the Bus Stop</div>">> <<bustravel>> <<goto "BusStop">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #3498db; margin: 0 0 10px 0;">⚓ Docks</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the industrial waterfront.</p> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to the Docks</div>">> <<travel>> <<goto "Docks">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsByJob("Lifeguard").concat(setup.getNPCsByJob("Beach Vendor"))>> <h2 style="color: #f4a460;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #f4a460; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #f4a460; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f4a460; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The beach is peaceful today. Just the sound of waves and seagulls. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<advancetime 60>> <!-- Initialize tracking variables if they don't exist --> <<if !$beachWalkEventsToday>><<set $beachWalkEventsToday = []>><</if>> <<if !$beachWalkEventsEver>><<set $beachWalkEventsEver = []>><</if>> <!-- Reset daily events at day change --> <<if !$lastBeachWalkDay || $lastBeachWalkDay != $dayNumber>> <<set $beachWalkEventsToday = []>> <<set $lastBeachWalkDay = $dayNumber>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #90caf9; text-align: center;">🚶 Walking Along the Beach</h1> <div style="padding: 20px; background: linear-gradient(135deg, #87ceeb 0%, #90caf9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #90caf9;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You stroll along the beach, feeling the warm sand between your toes and breathing in the salty ocean air... </p> </div> <!-- Event Roll --> <<set _eventRoll = random(1, 100)>> <<set _eventHappened = false>> <!-- Check if player has City Mayor job for increased chance --> <<set _isMayor = $jobs && $jobs.includes("City Mayor")>> <<set _sunfishRockChance = _isMayor ? 20 : 1>> <!-- Check pit chance - 3% first time, 15% after experiencing it once --> <<set _pitChance = $hasExperiencedRealityPit ? 15 : 3>> <!-- Event 1: Sunfish Rock (1/100 chance normally, 20/100 if City Mayor, once ever) --> <<if _eventRoll <= _sunfishRockChance && !$beachWalkEventsToday.includes("sunfishRock") && !$beachWalkEventsEver.includes("sunfishRock")>> <<set _eventHappened = true>> <<set $beachWalkEventsToday.push("sunfishRock")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">Something Strange...</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> As you walk along the beach, you notice a suspicious figure following you from a distance. The silhouette looks oddly... lumpy? Like multiple sunfish stacked in a trench coat, waddling awkwardly across the sand. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You quickly turn to get a better look, but when you do, there's nothing there except a small, sunfish-shaped rock half-buried in the sand. It gleams with an unusual iridescence in the sunlight. </p> <p style="color: #aaa; margin: 0 0 20px 0; font-style: italic;"> Something about this rock feels... significant. Do you touch it? </p> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='background: #ff6b6b; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Touch the Rock</div>">> <<set $beachWalkEventsEver.push("sunfishRock")>> <<set $artifactEntryMethod = "rock">> <<goto "Sunfish Tank">> <</link>> <<link "<div style='background: #666; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave It Alone</div>">> <<goto "Beach">> <</link>> </div> </div> <!-- Event 2: Reality Pit (3/100 chance first time, 15/100 after experiencing it) --> <<elseif _eventRoll <= _pitChance && !$beachWalkEventsToday.includes("realityPit")>> <<set _eventHappened = true>> <<set $beachWalkEventsToday.push("realityPit")>> <<set $hasExperiencedRealityPit = true>> <<run setup.achievements.unlock("beach_hole")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(156,39,176,0.3);"> <h3 style="color: #9c27b0; margin: 0 0 15px 0;">The World Shifts...</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You take a step forward and suddenly the sand beneath your feet gives way. But this isn't a normal sinkhole—the sand doesn't fall, it <em>warps</em>. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Reality bends and twists around you like water swirling down a drain. The beach, the ocean, the sky—everything spirals inward as you sink through layers of existence itself. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Colors you've never seen before flash past your eyes. You hear whispers in languages that shouldn't exist. Time becomes meaningless. </p> <p style="color: #9c27b0; margin: 0 0 20px 0; font-weight: bold; text-align: center; font-size: 18px;"> And then... you land. </p> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%); color: white; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(156,39,176,0.3); font-size: 16px;'>Continue...</div>">> <<set $artifactEntryMethod = "pit">> <<goto "ArtifactRoom">> <</link>> </div> </div> <!-- Event 3: Coral Reef Discovery (20/100 chance, once ever) --> <<elseif _eventRoll <= 20 && !$coralReefUnlocked && !$beachWalkEventsEver.includes("coralReefDiscovery")>> <<set _eventHappened = true>> <<set $beachWalkEventsToday.push("coralReefDiscovery")>> <<set $beachWalkEventsEver.push("coralReefDiscovery")>> <<set $coralReefUnlocked = true>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(0,188,212,0.3);"> <h3 style="color: #00bcd4; margin: 0 0 15px 0;">A Hidden Wonder</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> As you walk along the shoreline, you notice something unusual in the water. Just beyond where the waves break, you catch glimpses of vibrant colors beneath the surface—blues, purples, oranges, and greens dancing in the sunlight. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Curious, you wade in a bit deeper to get a better look. Your breath catches as you realize what you're seeing: a magnificent coral reef, teeming with life! Schools of tropical fish dart between the coral formations, and you can see anemones swaying gently in the current. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> How had you never noticed this before? The reef is shallow enough to explore, tucked away in a sheltered cove that's easy to miss unless you know where to look. </p> <p style="color: #00bcd4; margin: 0 0 20px 0; font-weight: bold; text-align: center; font-size: 18px;"> You've discovered the Coral Reef! You can now visit it from the beach. </p> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #00bcd4 0%, #0097a7 100%); color: white; padding: 15px 30px; border-radius: 8px; cursor: pointer; font-weight: bold; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(0,188,212,0.3); font-size: 16px;'>Return to Beach</div>">> <<goto "Beach">> <</link>> </div> </div> <!-- No Event or Already Pulled Today --> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #90caf9; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0;"> Nothing eventful happens during your walk. You enjoy the peaceful scenery and the rhythmic sound of the waves. </p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #f4a460; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #f4a460; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Beach</div>">> <<goto "Beach">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SunfishTank")>> <<run $visitedLocations.push("SunfishTank")>> <</if>> <!-- Check for drown achievement (player without Sunfish skill) --> <<if !$skills || !$skills.includes("Sunfish")>> <<run setup.achievements.unlock("drown_in_tank")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dd0e1; text-align: center;">🐟 Sunfish Tank</h1> <!-- Check if player has Sunfish skill --> <<if $skills && $skills.includes("Sunfish")>> <!-- SUNFISH SKILL VERSION --> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #4dd0e1 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dd0e1;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> The moment you touch the rock, reality warps around you. You find yourself submerged in crystal-clear water, surrounded by massive sunfish drifting lazily through the blue. </p> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You're in a tank. An aquarium. But something feels... different. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dd0e1; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You catch your reflection in the glass wall of the tank. The face staring back at you isn't human anymore. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Large, round eyes. A massive, flat body. Tiny fins that seem too small for your bulk. You've become a sunfish - a real one, swimming among your kind in this impossible place. </p> <p style="color: #4dd0e1; margin: 0 0 15px 0; font-weight: bold;"> Strangely, you can breathe perfectly fine. The water feels natural, comfortable even. This is where you belong now... isn't it? </p> <p style="color: #aaa; margin: 0; font-style: italic;"> What do you do? </p> </div> <!-- Options --> <div style="display: flex; flex-direction: column; gap: 15px; margin-bottom: 25px;"> <<link "<div style='background: #4dd0e1; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>🌊 Swim Around</div>">> <<goto "SunfishTankSwim">> <</link>> </div> <<else>> <!-- DEFAULT VERSION (NO SUNFISH SKILL) --> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #4dd0e1 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dd0e1;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> The moment you touch the rock, reality warps around you. </p> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You find yourself submerged in water, surrounded by massive sunfish drifting lazily through the blue void. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You're in a tank. An aquarium. The glass walls stretch impossibly high above and around you. Panic sets in as you realize the horrible truth. </p> <p style="color: #ff6b6b; margin: 0 0 15px 0; line-height: 1.6; font-weight: bold;"> You can't breathe. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Your lungs burn. You thrash desperately, trying to reach the surface, but there is no surface. The sunfish continue their peaceful drift, unbothered by your struggle. Water fills your mouth, your nose. Darkness creeps in at the edges of your vision. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Through the haze of suffocation, you see it - a figure standing just outside the glass. That same suspicious silhouette. Multiple sunfish stacked in a trench coat, standing impossibly upright. It stares directly at you with too many eyes. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> The figure doesn't move. Doesn't help. Just... watches. </p> <p style="color: #666; margin: 0; line-height: 1.6; font-style: italic;"> Everything goes black. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You wake up gasping on the beach, coughing up seawater. The sun beats down on your back. Sand clings to your wet clothes. </p> <p style="color: #ccc; margin: 0; line-height: 1.6;"> The sunfish-shaped rock is nowhere to be seen. Was it all real? The lingering taste of salt water suggests it was. </p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #f4a460; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #f4a460; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Get Up and Return to Beach</div>">> <<goto "Beach">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("CoralReef")>> <<run $visitedLocations.push("CoralReef")>> <</if>> <<set $lastLocation = "CoralReef">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #00bcd4; text-align: center;">🐠 Coral Reef</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/CoralReef.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Coral Reef"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00bcd4;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> Crystal clear waters reveal a vibrant underwater world. Colorful coral formations create a maze of life, while schools of tropical fish dart between the branches. The gentle current sways sea anemones, and the occasional sea turtle glides past. </p> </div> <h2 style="color: #00bcd4;">Activities</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Swimming --> <div style="border: 3px solid #4fc3f7; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #4fc3f7; margin: 0 0 10px 0;">🏊 Explore the Reef</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Swim through the coral formations.</p> <<link "<div style='background: #4fc3f7; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Swimming</div>">> <<advancetime 60>> <!-- Swimming removes shower buffs and messes hair --> <<run setup.removeBuff("shower_fresh")>> <<run setup.removeBuff("bath_relaxed")>> <<run setup.removeBuff("bath_luxury")>> <<set $appearance.hairStyle = "messy">> <!-- Check for cave discovery (Siren transformation includes Swimming) --> <<set _caveRoll = random(1, 100)>> <<set _hasSunfish = $skills && $skills.includes("Sunfish")>> <<set _hasSwimmingSkill = ($skills && ($skills.includes("Swimmer") || $skills.includes("Swimming"))) || ($physicalTraits && $physicalTraits.includes("Siren"))>> <<set _caveChance = 0>> <<if _hasSunfish>> <<set _caveChance = 50>> <<set $UnderWaterCaveEntryMethod = "sunfish">> <<elseif _hasSwimmingSkill>> <<set _caveChance = 5>> <<set $UnderWaterCaveEntryMethod = "swimmer">> <</if>> <<if (_hasSunfish || _hasSwimmingSkill) && _caveRoll <= _caveChance && !$foundUnderWaterCave>> <<set $foundUnderWaterCave = true>> <<goto "UnderWaterCaveDiscovery">> <<else>> <<goto "CoralReef">> <</if>> <</link>> </div> <!-- Fishing --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">🎣 Go Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Cast your line among the colorful coral formations.</p> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Fishing</div>">> <<goto "FishingCoralReef">> <</link>> </div> </div> <h2 style="color: #00bcd4;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Beach --> <div style="border: 3px solid #f4a460; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #f4a460; margin: 0 0 10px 0;">🏖️ Beach</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the sandy shore.</p> <<link "<div style='background: #f4a460; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Return to Beach</div>">> <<goto "Beach">> <</link>> </div> <!-- Underwater Cave (shows after discovery) --> <<if $foundUnderWaterCave>> <div style="border: 3px solid #00acc1; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #00acc1; margin: 0 0 10px 0;">🌊 Underwater Cave</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Swim to the hidden cave entrance.</p> <<link "<div style='background: #00acc1; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Cave</div>">> <<set $UnderWaterCaveEntryMethod = $skills && $skills.includes("Sunfish") ? "sunfish" : "swimmer">> <<goto "UnderWaterCave">> <</link>> </div> <</if>> <!-- ===== SKILL TREE: Secret Entrance ===== --> <<if setup.skillTree.getEffect("secretEntrance")>> <div style="border: 3px solid #FFD700; border-radius: 10px; padding: 15px; background: linear-gradient(135deg, #2a2a1a 0%, #1a1a0a 100%); box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(255, 215, 0, 0.3); display: flex; flex-direction: column;"> <h3 style="color: #FFD700; margin: 0 0 10px 0;">🐚 Suspicious Sand</h3> <p style="font-size: 14px; color: #d4c47a; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">A patch of sand on the ocean floor that seems to shimmer differently than the rest...</p> <<link "<div style='background: linear-gradient(135deg, #FFD700 0%, #FFA500 100%); color: #000; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 10px rgba(255, 215, 0, 0.4);'>Investigate</div>">> <<goto "ArtifactRoom">> <</link>> </div> <</if>> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("CoralReef")>> <h2 style="color: #00bcd4;">🐠 People at the Reef</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(0, 188, 212, 0.2);"> <p style="color: #4fc3f7; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic;"> You spot other people enjoying the reef's beauty... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #00bcd4; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px rgba(0, 188, 212, 0.15);"> <h3 style="color: #00bcd4; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #4fc3f7; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #00bcd4; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 10px rgba(0, 188, 212, 0.3);'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The reef is serene and empty. Just you and the colorful marine life. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SunfishTankSwim")>> <<run $visitedLocations.push("SunfishTankSwim")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dd0e1; text-align: center;">🐟 Swimming in the Tank</h1> <!-- Roll for trench coat encounter --> <<set _encounterRoll = random(1, 10)>> <<if _encounterRoll <= 3 && !$sawTrenchCoatSunfish>> <!-- Saw the trench coat person! --> <<set $sawTrenchCoatSunfish = true>> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #4dd0e1 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dd0e1;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You glide through the water with your fellow sunfish, your tiny fins propelling you in lazy circles... </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">A Familiar Presence</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Something catches your eye through the glass. You turn your bulbous sunfish body to look. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> There it is - that figure. Multiple sunfish stacked in a trench coat, standing just beyond the tank wall. It's staring directly at you with too many round, unblinking eyes. This close, you can see the trench coat is soaking wet, dripping onto the floor. </p> <p style="color: #ff6b6b; margin: 0; line-height: 1.6; font-style: italic;"> The moment you notice it watching, it quickly shuffles out of view and disappears. </p> </div> <<else>> <!-- Normal swimming --> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #4dd0e1 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dd0e1;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You glide through the water with your fellow sunfish, your tiny fins propelling you in lazy circles. The other sunfish pay you no mind - you're one of them now. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dd0e1; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0;"> The water is peaceful, almost meditative. You could get used to this life. </p> </div> <</if>> <!-- Discovery of the tunnel --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0;">Something Strange...</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> As you swim near the bottom of the tank, you notice something odd. There's a tunnel - a dark passage leading somewhere else. The other sunfish seem to avoid it. </p> <p style="color: #aaa; margin: 0; font-style: italic;"> Do you enter the tunnel? </p> </div> <div style="display: flex; flex-direction: column; gap: 15px; margin-bottom: 25px;"> <<link "<div style='background: #ffc107; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Enter the Tunnel</div>">> <<goto "SunfishTankTunnel">> <</link>> <<link "<div style='background: #666; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Keep Swimming Around</div>">> <<goto "SunfishTankSwim">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("UnderwaterCave")>> <<run $visitedLocations.push("UnderwaterCave")>> <<run setup.achievements.unlock("underwater_cave")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #00bcd4; text-align: center;">🌊 Underwater Cave</h1> <<if $UnderWaterCaveEntryMethod === "sunfish">> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00bcd4;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You swim upward through the sloping passage. The water grows lighter, brighter. You can see the surface above! </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> With a powerful thrust of your tiny fins, you break through the surface and into open air. You gasp, expecting to suffocate again, but instead you can breathe. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You look down at yourself. Your sunfish body is transforming, shifting back to human form. Within moments, you're treading water as yourself again, in an underwater cave with a small air pocket. </p> <p style="color: #4caf50; margin: 0; line-height: 1.6; font-weight: bold;"> You're human once more. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00bcd4;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You dive deeper into the reef, your swimming skills guiding you through the coral maze. A dark opening catches your eye—a hidden cave entrance. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You swim through the narrow passage, your lungs starting to burn. Just when you think you'll need to turn back, you spot light above—an air pocket! </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You break the surface, gasping for air. You've discovered a hidden underwater cave with a small chamber of breathable air. The walls glisten with moisture and bioluminescent algae cast an eerie blue glow. </p> <p style="color: #4caf50; margin: 0; line-height: 1.6; font-weight: bold;"> A secret sanctuary beneath the waves. </p> </div> <</if>> <!-- Secret Sunfish Wall --> <<set _hasSunfishTrait = ($skills && $skills.includes("Sunfish")) || ($physicalTraits && $physicalTraits.includes("Sunfish")) || ($mentalTraits && $mentalTraits.includes("Sunfish"))>> <<set _hasAnyArtifact = $currentArtifact ? true : false>> <<set _hasForeignLanguage = $skills && $skills.includes("Foreign Language")>> <<set _canOpenPassage = _hasSunfishTrait && _hasAnyArtifact>> <div style="background: #1a2a3a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4), inset 0 0 30px rgba(0,188,212,0.1);"> <h3 style="color: #00bcd4; margin: 0 0 15px 0; text-align: center;">🐟 Strange Wall Carving</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> As your eyes adjust to the bioluminescent glow, you notice something peculiar on the far wall of the cave. Carved into the ancient stone is the unmistakable silhouette of a <span style="color: #ffc107; font-weight: bold;">sunfish</span>—its distinctive round body and tall fins etched with incredible detail. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Embedded in the center of the carving is a <span style="color: #7c4dff; font-weight: bold;">glowing orb</span> that pulses with an ethereal purple light. The glow seems to respond to your presence, brightening slightly as you approach. </p> <!-- Cryptic Message - only readable with Foreign Language --> <div style="background: #0d1a26; padding: 15px; border-radius: 8px; margin: 15px 0; border: 1px solid #00bcd4;"> <<if _hasForeignLanguage>> <p style="color: #4fc3f7; margin: 0 0 10px 0; font-style: italic; text-align: center; font-size: 14px;"> Ancient text is inscribed beneath the carving. Your knowledge of foreign languages allows you to decipher it: </p> <p style="color: #ffc107; margin: 0; text-align: center; font-family: serif; font-size: 16px; line-height: 1.8;"> <em>"When the child of the ocean sun<br> Bears a gift from depths below,<br> Touch the light and be as one—<br> The hidden path shall then bestow."</em> </p> <<else>> <p style="color: #666; margin: 0; text-align: center; font-style: italic;"> Strange symbols are inscribed beneath the carving. The writing is in an ancient language you cannot read. </p> <</if>> </div> <!-- Interaction with the wall --> <<if _canOpenPassage>> <div style="background: linear-gradient(135deg, #4a148c 0%, #7c4dff 100%); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #b388ff;"> <p style="color: #e1bee7; margin: 0 0 10px 0; text-align: center;"> The orb pulses more intensely as you approach. You feel a strange resonance—your sunfish essence and the artifact you carry seem to <span style="color: #ffc107; font-weight: bold;">harmonize</span> with the ancient magic here. </p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #7c4dff 0%, #b388ff 100%); color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #b388ff; box-shadow: 0 0 20px rgba(124,77,255,0.5);'>✨ Touch the Glowing Orb</div>">> <<goto "SunfishSecretPassage">> <</link>> </div> <<elseif _hasSunfishTrait && !_hasAnyArtifact>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #ff9800;"> <p style="color: #ffb74d; margin: 0; text-align: center;"> You feel a faint connection to the sunfish carving, but something is missing. The orb flickers weakly, as if waiting for something more... </p> </div> <<elseif _hasAnyArtifact && !_hasSunfishTrait>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #ff9800;"> <p style="color: #ffb74d; margin: 0; text-align: center;"> Your artifact hums with energy near the wall, but the orb does not respond to you. Perhaps you lack the proper connection to this place... </p> </div> <<else>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #666;"> <p style="color: #888; margin: 0; text-align: center;"> The orb remains dim and unresponsive. Whatever magic lies here, it does not recognize you. </p> </div> <</if>> </div> <!-- Activities Section --> <h2 style="color: #7c4dff; margin-top: 25px;">Activities</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Fishing --> <div style="border: 3px solid #2ecc71; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">🎣 Go Fishing</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Fish in the bioluminescent waters of the cave.</p> <<link "<div style='background: #2ecc71; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Start Fishing</div>">> <<goto "FishingUnderwaterCave">> <</link>> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0;"> A current pulls you gently toward another passage that leads back to open water. You could let it carry you back to the beach. </p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #f4a460; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #f4a460; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Beach</div>">> <<goto "Beach">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SunfishSecretPassage")>> <<run $visitedLocations.push("SunfishSecretPassage")>> <</if>> <!-- Count met NPCs with relationships --> <<set _metNPCCount = 0>> <<if $metNPCs && $relationships>> <<for _npcName range $metNPCs>> <<if $relationships[_npcName]>> <<set _metNPCCount += 1>> <</if>> <</for>> <</if>> <<set _hasSoulTrait = ($skills && $skills.includes("Soul")) || ($physicalTraits && $physicalTraits.includes("Soul")) || ($mentalTraits && $mentalTraits.includes("Soul"))>> <<set _canObtainSoul = _metNPCCount >= 20 && !_hasSoulTrait>> <div style="background: #0a0a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #b388ff; text-align: center;">✨ The Hidden Sanctuary</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1a0a2e 0%, #4a148c 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #7c4dff; box-shadow: 0 0 30px rgba(124,77,255,0.3);"> <p style="color: #e1bee7; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> As your fingers touch the glowing orb, reality shifts around you. The wall dissolves into a shimmering veil of light, revealing a passage that shouldn't exist. </p> </div> <div style="background: #1a1a2e; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #7c4dff; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You step through into a vast underground chamber that defies natural law. Crystalline formations jut from the walls, ceiling, and floor, each one glowing with soft, pulsing light in shades of purple, blue, and gold. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> The air here is thick with ancient power. You feel your artifact resonate with the energy of this place, and your sunfish essence stirs within you, recognizing something primal and familiar. </p> <p style="color: #b388ff; margin: 0; line-height: 1.6; font-weight: bold;"> You have discovered a place lost to time—a sanctuary of the sunfish... </p> </div> <!-- The Vision Orb --> <div style="background: linear-gradient(135deg, #0d0d2b 0%, #1a0a3a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e040fb; box-shadow: 0 0 40px rgba(224,64,251,0.3);"> <h3 style="color: #e040fb; margin: 0 0 15px 0; text-align: center;">🔮 The Vision Orb</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> At the center of the chamber floats a massive crystalline orb, pulsing with inner light. As you approach, images begin to swirl within its depths—faces, familiar faces... </p> <<if _metNPCCount > 0>> <div style="background: rgba(0,0,0,0.5); padding: 15px; border-radius: 8px; margin: 15px 0; border: 1px solid #e040fb;"> <p style="color: #ce93d8; margin: 0 0 10px 0; text-align: center; font-style: italic;"> The orb flashes through visions of people you've encountered in Sunfish City... </p> <p style="color: #ffc107; margin: 0; text-align: center; font-weight: bold;"> _metNPCCount souls recognized by the orb </p> </div> <<else>> <div style="background: rgba(0,0,0,0.5); padding: 15px; border-radius: 8px; margin: 15px 0; border: 1px solid #666;"> <p style="color: #888; margin: 0; text-align: center; font-style: italic;"> The orb remains dark and still. You have not yet formed enough connections in this city... </p> </div> <</if>> <<if _hasSoulTrait>> <!-- Already has Soul trait --> <div style="background: linear-gradient(135deg, #1b5e20 0%, #2e7d32 100%); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #4caf50;"> <p style="color: #a5d6a7; margin: 0; text-align: center;"> ✨ The orb recognizes you. Your <span style="color: #ffc107; font-weight: bold;">Soul</span> trait pulses in harmony with its light. </p> </div> <<elseif _canObtainSoul>> <!-- Can obtain Soul trait --> <div style="background: linear-gradient(135deg, #b71c1c 0%, #c62828 100%); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #ef5350;"> <p style="color: #ffcdd2; margin: 0 0 15px 0; text-align: center;"> The orb pulses intensely. It has seen enough of your connections to this world. It offers you something... a piece of yourself made manifest. </p> <p style="color: #ffc107; margin: 0; text-align: center; font-weight: bold;"> "Take hold of your essence. Become whole." </p> </div> <div style="text-align: center; margin-top: 15px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #e040fb 0%, #7c4dff 100%); color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #e040fb; box-shadow: 0 0 20px rgba(224,64,251,0.5);'>🌟 Grasp Your Soul</div>">> <<if !$mentalTraits>><<set $mentalTraits = []>><</if>> <<run $mentalTraits.push("Soul")>> <<goto "SoulTraitAcquired">> <</link>> </div> <<else>> <!-- Not enough NPCs met --> <div style="background: rgba(0,0,0,0.5); padding: 15px; border-radius: 8px; margin-top: 15px; border: 2px solid #ff9800;"> <p style="color: #ffb74d; margin: 0; text-align: center;"> The orb flickers weakly. Your connections to this world are still forming... You sense you must know at least <span style="color: #ffc107; font-weight: bold;">20 souls</span> before the orb will respond to you. </p> <p style="color: #888; margin: 10px 0 0 0; text-align: center; font-size: 14px;"> (You have met _metNPCCount / 20 required NPCs) </p> </div> <</if>> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #00bcd4 0%, #006064 100%); color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #00bcd4; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to the Cave</div>">> <<goto "UnderWaterCave">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #0a0a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e040fb; text-align: center;">✨ Soul Awakened</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a148c 0%, #7c4dff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e040fb; box-shadow: 0 0 50px rgba(224,64,251,0.5);"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5); text-align: center;"> You reach into the orb and grasp... yourself. A piece of your very essence, crystallized and made tangible. </p> </div> <div style="background: #1a1a2e; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e040fb; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> The sensation is indescribable. You feel <em>complete</em> in a way you never knew you were incomplete. A warmth spreads through your chest as the essence merges with your being. </p> <p style="color: #e040fb; margin: 0; line-height: 1.6; font-weight: bold; text-align: center; font-size: 20px;"> You have acquired the "Soul" trait! </p> </div> <!-- Spoiler Section --> <div style="background: #1a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; text-align: center;">❓ What does the Soul trait do?</h3> <p style="color: #aaa; margin: 0 0 15px 0; text-align: center; font-style: italic;"> Click below to reveal the secrets of the Soul... </p> <div id="soul-spoiler-container" style="text-align: center;"> <<link "<div style='display: inline-block; background: #333; color: #ffc107; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #ffc107;'>🔓 Reveal Soul Mechanics</div>">> <<replace "#soul-spoiler-container">> <div style="background: #0d0d0d; padding: 20px; border-radius: 8px; border: 2px solid #ffc107; text-align: left;"> <h4 style="color: #ffc107; margin: 0 0 15px 0;">🌟 The Power of the Soul</h4> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.8;"> The Soul trait allows you to <span style="color: #e040fb; font-weight: bold;">permanently swap lives</span> with another person through the trading system. When trading with an NPC, a hidden option will appear allowing you to offer your Soul. </p> <h4 style="color: #ff9800; margin: 0 0 10px 0;">⚠️ Requirements to Swap Lives:</h4> <ul style="color: #ccc; margin: 0 0 15px 0; line-height: 2;"> <li>You must have <span style="color: #4caf50; font-weight: bold;">at least one stat at 50 or higher</span> (naturally, without bonuses)</li> <li>You must <span style="color: #f44336; font-weight: bold;">NOT</span> have: Unskilled, Unlucky, or Gambling Addiction</li> <li>You must have the <span style="color: #ffc107; font-weight: bold;">Sunfish trait</span> (it will be consumed in the swap)</li> <li>The NPC must not be <span style="color: #9c27b0; font-weight: bold;">protected from life swapping</span></li> </ul> <p style="color: #ff6b6b; margin: 0; font-weight: bold;"> Warning: This is a permanent decision. Choose wisely who you become. </p> </div> <</replace>> <</link>> </div> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #00bcd4 0%, #006064 100%); color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #00bcd4; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to the Sanctuary</div>">> <<goto "SunfishSecretPassage">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _npc = $soulSwapTarget>> <<if !_npc>> <<goto "Downtown">> <<else>> <<set _npcName = _npc.originalName || _npc.name>> <div style="background: #0a0a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e040fb; text-align: center;">🔮 Soul Exchange</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a148c 0%, #7c4dff 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e040fb; box-shadow: 0 0 50px rgba(224,64,251,0.5);"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5); text-align: center;"> You prepare to offer your very Soul to <strong><<= _npcName>></strong>... </p> </div> <div style="background: #1a1a2e; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff9800; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff9800; margin: 0 0 15px 0; text-align: center;">⚠️ Final Warning</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.8; text-align: center;"> This action is <span style="color: #f44336; font-weight: bold;">PERMANENT and IRREVERSIBLE</span>. </p> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> If you proceed: </p> <ul style="color: #ccc; margin: 0 0 15px 0; line-height: 2;"> <li>Your <span style="color: #e040fb; font-weight: bold;">Soul trait</span> will remain with you</li> <li>Your <span style="color: #ffc107; font-weight: bold;">Sunfish trait</span> will be sacrificed</li> <li>You will permanently become <span style="color: #4caf50; font-weight: bold;"><<= _npcName>></span></li> <li>You will gain <span style="color: #4caf50; font-weight: bold;">all of their traits</span> in addition to keeping Soul</li> <li>Your old identity will be gone forever</li> </ul> <p style="color: #ff6b6b; margin: 0; font-weight: bold; text-align: center;"> There is no going back. </p> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: linear-gradient(135deg, #f44336 0%, #c62828 100%); color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 0 30px rgba(244,67,54,0.5); border: 2px solid #ef5350;'>🔮 Offer My Soul</div>">> /* Soul swap: Player KEEPS Soul trait after swapping */ /* Only Sunfish trait is consumed */ /* Remove Sunfish trait from wherever it exists */ <<if $skills && $skills.includes("Sunfish")>> <<run $skills.delete("Sunfish")>> <</if>> <<if $physicalTraits && $physicalTraits.includes("Sunfish")>> <<run $physicalTraits.delete("Sunfish")>> <</if>> <<if $mentalTraits && $mentalTraits.includes("Sunfish")>> <<run $mentalTraits.delete("Sunfish")>> <</if>> /* Store old player info for transformation passage */ <<set $lifeSwapOldPlayerName = $playerFirstName + " " + $playerLastName>> <<set $lifeSwapOldPlayerTraits = { physicalTraits: JSON.parse(JSON.stringify($physicalTraits)), mentalTraits: JSON.parse(JSON.stringify($mentalTraits)), skills: JSON.parse(JSON.stringify($skills)), bodyParts: JSON.parse(JSON.stringify($bodyParts)), stats: JSON.parse(JSON.stringify($stats)) }>> <<set $lifeSwapNPCOldName = _npcName>> <<set $lifeSwapNPCOldTraits = { physicalTraits: JSON.parse(JSON.stringify(_npc.physicalTraits || [])), mentalTraits: JSON.parse(JSON.stringify(_npc.mentalTraits || [])), skills: JSON.parse(JSON.stringify(_npc.skills || [])), bodyParts: JSON.parse(JSON.stringify(_npc.bodyParts)), stats: JSON.parse(JSON.stringify(_npc.stats)) }>> <<run setup.performLifeSwap(_npc)>> <<goto "LifeSwapTransformation">> <</link>> <<link "<div style='background: #666; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Cancel</div>">> <<unset $soulSwapTarget>> <<goto "Downtown">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ChamberOfArtifacts")>> <<run $visitedLocations.push("ChamberOfArtifacts")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">✨ Chamber of Artifacts</h1> <<if $artifactEntryMethod === "pit">> <div style="padding: 20px; background: linear-gradient(135deg, #9c27b0 0%, #7b1fa2 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9c27b0; box-shadow: 0 0 20px rgba(156,39,176,0.3);"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You land softly on smooth stone, the warping sensation fading away like waking from a dream. The air here feels thick with power. </p> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> Looking around, you find yourself in a chamber that shouldn't exist—a secret place torn from reality itself. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #f57f17 0%, #ffc107 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You swim upward into the golden passage. The tunnel seems to shift and twist around you, reality bending in impossible ways. </p> </div> <</if>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> You emerge into a circular chamber. The water here glows with an otherworldly light. Arranged around the room are seven pedestals, each holding a glowing artifact of incredible beauty and power. </p> <p style="color: #ffc107; margin: 0; line-height: 1.6; font-weight: bold;"> The artifacts pulse with energy, calling to you... </p> </div> <!-- Check if player has Sunfish skill --> <<if !$skills || !$skills.includes("Sunfish")>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #dc3545; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #dc3545; margin: 0; text-align: center; font-weight: bold; font-size: 18px;"> The artifacts do not respond to you. You lack the connection needed to claim them. </p> <p style="color: #aaa; margin: 15px 0 0 0; text-align: center; font-style: italic;"> Only those who carry the essence of the sunfish may take from this place. </p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Empty-Handed</div>">> <<goto "Beach">> <</link>> </div> <<else>> <!-- Player has Sunfish skill - show artifacts --> <<if $currentArtifact>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4caf50; margin: 0 0 15px 0; text-align: center;">You Already Possess an Artifact</h3> <p style="color: #ccc; margin: 0 0 15px 0; text-align: center; line-height: 1.6;"> Current Artifact: <strong style="color: #ffc107;">$currentArtifact</strong> </p> <p style="color: #aaa; margin: 0; text-align: center; font-style: italic;"> You may exchange it for another, but doing so will once again consume your sunfish essence. </p> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #4dabf7; margin: 0; text-align: center; font-weight: bold; font-size: 16px;"> Choose wisely. Taking an artifact will consume your sunfish essence. </p> </div> <</if>> <h2 style="color: #ffc107; text-align: center;">The Seven Artifacts</h2> <div style="display: grid; grid-template-columns: 1fr; gap: 20px; margin-bottom: 25px; max-width: 800px; margin-left: auto; margin-right: auto;"> <!-- The Slippery Scales --> <div style="border: 3px solid #9c27b0; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9c27b0; margin: 0 0 10px 0;">🐟 The Slippery Scales</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A handful of iridescent sunfish scales that shimmer with an otherworldly sheen. They feel impossibly smooth to the touch. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "Sunfish slip through the water without resistance. So too shall you slip through consequences." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Unseen hands guide your movements, making detection nearly impossible </p> <<if $currentArtifact === "The Slippery Scales">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #9c27b0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Slippery Scales">> <<set $artifactStealthBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Gentle Giant's Heart --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💖 The Gentle Giant's Heart</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A smooth, rounded stone that radiates warmth and calm. It pulses gently like a beating heart. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "Despite their size, sunfish are harmless and curious. Your presence brings the same peaceful comfort." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Others find themselves drawn to you, bonds forming much faster than normal </p> <<if $currentArtifact === "The Gentle Giant's Heart">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Gentle Giant's Heart">> <<set $artifactRelationshipBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Basking Charm --> <div style="border: 3px solid #ff9800; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff9800; margin: 0 0 10px 0;">☀️ The Basking Charm</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A sun-warmed pendant shaped like a surfacing sunfish. It feels pleasantly warm against your skin. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "Sunfish bask openly in the warmth. Embrace exposure without shame." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Your body learns the arts of pleasure with supernatural speed </p> <<if $currentArtifact === "The Basking Charm">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #ff9800; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Basking Charm">> <<set $artifactSexSkillBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Drifter's Coin --> <div style="border: 3px solid #00bcd4; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #00bcd4; margin: 0 0 10px 0;">🪙 The Drifter's Coin</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> An ancient coin with a sunfish on one side and swirling ocean currents on the other. It never stays still in your hand. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "Go with the flow. Drift toward mutual benefit." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Negotiations always seem to go in your favor </p> <<if $currentArtifact === "The Drifter's Coin">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #00bcd4; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Drifter's Coin">> <<set $artifactTradingBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Pearl of Abundance --> <div style="border: 3px solid #f5f5f5; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f5f5f5; margin: 0 0 10px 0;">🔮 The Pearl of Abundance</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A massive pearl supposedly from a sunfish's belly. It glows with inner light and feels heavy with potential. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "What the sunfish consumes becomes treasure. Wealth follows naturally." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Every effort yields greater rewards, prosperity flowing like the tide </p> <<if $currentArtifact === "The Pearl of Abundance">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #f5f5f5; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Pearl of Abundance">> <<set $artifactMoneyBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Crowd's Eye --> <div style="border: 3px solid #673ab7; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #673ab7; margin: 0 0 10px 0;">👁️ The Crowd's Eye</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A preserved sunfish eye that never stops looking. Its gaze is magnetic, drawing attention wherever you go. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "All eyes turn to witness the sunfish. All eyes will turn to you." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Eyes turn to you, drawn by an irresistible magnetism </p> <<if $currentArtifact === "The Crowd's Eye">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #673ab7; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Crowd's Eye">> <<set $artifactPopularityBonus = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> <!-- The Tidal Memory Stone --> <div style="border: 3px solid #4dabf7; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">🌊 The Tidal Memory Stone</h3> <p style="color: #ccc; margin: 0 0 10px 0; line-height: 1.6;"> A stone that pulses with the rhythm of ocean currents. Images of places flicker across its surface. </p> <p style="color: #aaa; margin: 0 0 15px 0; font-style: italic; font-size: 14px;"> "Sunfish traverse all oceans, remembering every current. Return to where the tides once carried you." </p> <p style="color: #4caf50; margin: 0 0 15px 0; font-weight: bold;"> Effect: Distance becomes meaningless, places remembered can be revisited instantly </p> <<if $currentArtifact === "The Tidal Memory Stone">> <div style='background: #666; color: #aaa; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>Currently Possessed</div> <<else>> <<link "<div style='background: #4dabf7; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Claim This Artifact</div>">> <<set $currentArtifact = "The Tidal Memory Stone">> <<set $artifactTeleportation = true>> <<set $skills.delete("Sunfish")>> <<goto "ArtifactClaimed">> <</link>> <</if>> </div> </div> <!-- Leave Without Taking --> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #666; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Leave Without Claiming</div>">> <<goto "Beach">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("SunfishTankTunnel")>> <<run $visitedLocations.push("SunfishTankTunnel")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dd0e1; text-align: center;">🌑 The Tunnel</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1a1a1a 0%, #006064 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dd0e1;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> You swim into the darkness. The tunnel twists and turns, growing narrower. Just when you think it might close completely, it opens into a chamber. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dd0e1; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> The chamber splits into multiple passages. Each one beckons with a different quality of light: </p> <p style="color: #4dabf7; margin: 0 0 10px 0; line-height: 1.6;"> ← A passage on the left pulses with ancient blue-green light </p> <p style="color: #00bcd4; margin: 0 0 10px 0; line-height: 1.6;"> → A passage on the right slopes upward into brightness </p> <<if $sawTrenchCoatSunfish>> <p style="color: #ffc107; margin: 0; line-height: 1.6;"> ↑ A third passage above emanates a strange golden glow </p> <</if>> </div> <div style="display: flex; flex-direction: column; gap: 15px; margin-bottom: 25px;"> <<link "<div style='background: #4dabf7; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Swim Left</div>">> <<set $comingFromSunfishTank = true>> <<goto "TheAlter">> <</link>> <<link "<div style='background: #00bcd4; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>→ Swim Right</div>">> <<goto "UnderWaterCave">> <</link>> <<if $sawTrenchCoatSunfish>> <<link "<div style='background: #ffc107; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>↑ Swim Upward</div>">> <<goto "ArtifactRoom">> <</link>> <</if>> <<link "<div style='background: #666; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Turn Back</div>">> <<goto "SunfishTankSwim">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track artifacts obtained --> <<if !$artifactsObtained>><<set $artifactsObtained = []>><</if>> <<if !$artifactsObtained.includes($currentArtifact)>> <<run $artifactsObtained.push($currentArtifact)>> <</if>> <!-- Check for first artifact achievement --> <<if $artifactsObtained.length === 1>> <<run setup.achievements.unlock("first_artifact")>> <</if>> <!-- Check for all artifacts obtained achievement --> <<set _allArtifacts = ["The Slippery Scales", "The Gentle Giant's Heart", "The Basking Charm", "The Drifter's Coin", "The Pearl of Abundance", "The Crowd's Eye", "The Tidal Memory Stone"]>> <<set _hasAllArtifacts = true>> <<for _i = 0; _i < _allArtifacts.length; _i++>> <<if !$artifactsObtained.includes(_allArtifacts[_i])>> <<set _hasAllArtifacts = false>> <</if>> <</for>> <<if _hasAllArtifacts>> <<run setup.achievements.unlock("all_artifacts")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">✨ Artifact Claimed</h1> <div style="padding: 20px; background: linear-gradient(135deg, #f57f17 0%, #ffc107 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> As your hand closes around the artifact, you feel the sunfish essence drain from your body. The connection that allowed you to access this place flows out of you and into the artifact, consumed as the price of its power. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 8px 16px rgba(255, 193, 7, 0.4);"> <h3 style="color: #ffc107; margin: 0 0 15px 0; text-align: center;">You Have Claimed: $currentArtifact</h3> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6; text-align: center;"> The artifact pulses with life in your hands, now awakened by the essence you sacrificed. Its power flows into you like a warm current, imbuing you with its gift—permanent, undeniable, and yours to command. </p> <p style="color: #4caf50; margin: 0; line-height: 1.6; text-align: center; font-style: italic;"> You feel different. Changed. The artifact's blessing now courses through you. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0;"> A current pulls you gently through a hidden passage. Before you know it, you're washed up on the beach, the artifact clutched in your hand and its power humming within you. </p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #f4a460; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #f4a460; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Stand Up and Return to Beach</div>">> <<goto "Beach">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* ======================================== ARTIFACTS INITIALIZATION ======================================== */ // Initialize current artifact variable <<if !$currentArtifact>> <<set $currentArtifact = null>> <</if>> // Setup artifact data <<if !setup.artifacts>> <<set setup.artifacts = { "The Slippery Scales": { name: "The Slippery Scales", icon: "🐟", color: "#9c27b0", description: "A handful of iridescent sunfish scales that shimmer with an otherworldly sheen. They feel impossibly smooth to the touch.", lore: "Sunfish slip through the water without resistance. So too shall you slip through consequences.", effect: "Dramatically improves stealth and theft success rates" }, "The Gentle Giant's Heart": { name: "The Gentle Giant's Heart", icon: "💖", color: "#e91e63", description: "A smooth, rounded stone that radiates warmth and calm. It pulses gently like a beating heart.", lore: "Despite their size, sunfish are harmless and curious. Your presence brings the same peaceful comfort.", effect: "Quadruples relationship point gains with all NPCs" }, "The Basking Charm": { name: "The Basking Charm", icon: "☀️", color: "#ff9800", description: "A sun-warmed pendant shaped like a surfacing sunfish. It feels pleasantly warm against your skin.", lore: "Sunfish bask openly in the warmth. Embrace exposure without shame.", effect: "Triples sex skill XP gain and improves performance in sexual activities" }, "The Drifter's Coin": { name: "The Drifter's Coin", icon: "🪙", color: "#00bcd4", description: "An ancient coin with a sunfish on one side and swirling ocean currents on the other. It never stays still in your hand.", lore: "Go with the flow. Drift toward mutual benefit.", effect: "Double all trade bonuses" }, "The Pearl of Abundance": { name: "The Pearl of Abundance", icon: "🔮", color: "#f5f5f5", description: "A massive pearl supposedly from a sunfish's belly. It glows with inner light and feels heavy with potential.", lore: "What the sunfish consumes becomes treasure. Wealth follows naturally.", effect: "Earn 50% more money from hourly jobs and gambling" }, "The Crowd's Eye": { name: "The Crowd's Eye", icon: "👁️", color: "#673ab7", description: "A preserved sunfish eye that never stops looking. Its gaze is magnetic, drawing attention wherever you go.", lore: "All eyes turn to witness the sunfish. All eyes will turn to you.", effect: "Gain fame/popularity 3x faster" }, "The Tidal Memory Stone": { name: "The Tidal Memory Stone", icon: "🌊", color: "#4dabf7", description: "A stone that pulses with the rhythm of ocean currents. Images of places flicker across its surface.", lore: "Sunfish traverse all oceans, remembering every current. Return to where the tides once carried you.", effect: "Instant teleportation to any previously visited location" } }>> <</if>> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <!-- Current Artifact Status --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ffc107; margin: 0 0 15px 0;">Current Artifact Status</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <p style="color: #e0e0e0; font-size: 18px; margin: 0; text-align: center;"> <<if $currentArtifact>> <strong>Equipped:</strong> <span id="equippedArtifact" style="color: #51cf66;">$currentArtifact</span> <<else>> <strong>Equipped:</strong> <span id="equippedArtifact" style="color: #ff6b6b;">None</span> <</if>> </p> </div> </div> <!-- Artifacts Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ffc107; margin: 0 0 15px 0;">✨ Artifacts</h2> <!-- The Slippery Scales --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #9c27b0;"> <h3 style="color: #9c27b0; margin: 0 0 10px 0;">🐟 The Slippery Scales</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A handful of iridescent sunfish scales that shimmer with an otherworldly sheen.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Dramatically improves stealth and theft success rates</p> <<if $currentArtifact === "The Slippery Scales">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9c27b0; color: #9c27b0; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Slippery Scales">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Slippery Scales</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Gentle Giant's Heart --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #e91e63;"> <h3 style="color: #e91e63; margin: 0 0 10px 0;">💖 The Gentle Giant's Heart</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A smooth, rounded stone that radiates warmth and calm. It pulses gently like a beating heart.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Quadruples relationship point gains with all NPCs</p> <<if $currentArtifact === "The Gentle Giant's Heart">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e91e63; color: #e91e63; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Gentle Giant's Heart">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Gentle Giant's Heart</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Basking Charm --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #ff9800;"> <h3 style="color: #ff9800; margin: 0 0 10px 0;">☀️ The Basking Charm</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A sun-warmed pendant shaped like a surfacing sunfish. It feels pleasantly warm against your skin.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Triples sex skill XP gain and improves performance in sexual activities</p> <<if $currentArtifact === "The Basking Charm">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff9800; color: #ff9800; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Basking Charm">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Basking Charm</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Drifter's Coin --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #00bcd4;"> <h3 style="color: #00bcd4; margin: 0 0 10px 0;">🪙 The Drifter's Coin</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">An ancient coin with a sunfish on one side and swirling ocean currents on the other.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Double all trade bonuses</p> <<if $currentArtifact === "The Drifter's Coin">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #00bcd4; color: #00bcd4; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Drifter's Coin">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Drifter's Coin</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Pearl of Abundance --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #f5f5f5;"> <h3 style="color: #f5f5f5; margin: 0 0 10px 0;">🐚 The Pearl of Abundance</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A massive pearl supposedly from a sunfish's belly. It glows with inner light.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Earn 50% more money from all jobs, streaming, and gambling</p> <<if $currentArtifact === "The Pearl of Abundance">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f5f5f5; color: #f5f5f5; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Pearl of Abundance">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Pearl of Abundance</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Crowd's Eye --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #a78bfa;"> <h3 style="color: #a78bfa; margin: 0 0 10px 0;">👁️ The Crowd's Eye</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A preserved sunfish eye that never stops looking. Its gaze is magnetic.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Double follower gains when streaming</p> <<if $currentArtifact === "The Crowd's Eye">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #a78bfa; color: #a78bfa; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Crowd's Eye">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Crowd's Eye</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> <!-- The Tidal Memory Stone --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #4dabf7;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">🌊 The Tidal Memory Stone</h3> <p style="color: #aaa; font-size: 13px; margin: 0 0 8px 0; line-height: 1.4;">A stone that pulses with the rhythm of ocean currents. Images of places flicker across its surface.</p> <p style="color: #4caf50; font-size: 12px; margin: 0 0 10px 0; font-weight: bold;">Effect: Instant teleportation to any previously visited location</p> <<if $currentArtifact === "The Tidal Memory Stone">> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Remove Artifact</div>">> <<set $currentArtifact = null>> <<replace "#equippedArtifact">><span style="color: #ff6b6b;">None</span><</replace>> <<goto "DebugArtifacts">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 8px; border-radius: 6px; text-align: center; cursor: pointer; font-size: 13px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>Equip Artifact</div>">> <<set $currentArtifact = "The Tidal Memory Stone">> <<replace "#equippedArtifact">><span style="color: #51cf66;">The Tidal Memory Stone</span><</replace>> <<goto "DebugArtifacts">> <</link>> <</if>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dabf7; text-align: center;">🌀 Tidal Memory Stone - Teleport</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4dabf7 0%, #3b82f6 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dabf7; box-shadow: 0 0 20px rgba(77, 171, 247, 0.4);"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> The Tidal Memory Stone pulses with ancient power, allowing you to instantly travel to any location the stone has been before. </p> </div> <h2 style="color: #4dabf7;">Select Your Destination:</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- AdultStore --> <div style="border: 3px solid #ff1493; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff1493; margin-top: 0;">🔞 Adult Store</h3> <<link "<div style='background: #ff1493; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "AdultStore">> <</link>> </div> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #aaa; margin-top: 0;">🌆 Alleyway</h3> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Alleyway">> <</link>> </div> <!-- Apartments --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin-top: 0;">🏢 Apartments</h3> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Apartments">> <</link>> </div> <!-- Bakery --> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f39c12; margin-top: 0;">🥐 Bakery</h3> <<link "<div style='background: #f39c12; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Bakery">> <</link>> </div> <!-- Beach --> <div style="border: 3px solid #ffd43b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd43b; margin-top: 0;">🏖️ Beach</h3> <<link "<div style='background: #ffd43b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Beach">> <</link>> </div> <!-- BeautySalon --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin-top: 0;">💅 Beauty Salon</h3> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "BeautySalon">> <</link>> </div> <!-- Brothel --> <div style="border: 3px solid #e91e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e91e63; margin-top: 0;">💋 Brothel</h3> <<link "<div style='background: #e91e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Brothel">> <</link>> </div> <!-- BusStop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin-top: 0;">🚌 Bus Stop</h3> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "BusStop">> <</link>> </div> <!-- BusinessDistrict --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin-top: 0;">💼 Business District</h3> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Cafe --> <div style="border: 3px solid #8d6e63; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #8d6e63; margin-top: 0;">☕ Cafe</h3> <<link "<div style='background: #8d6e63; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Cafe">> <</link>> </div> <!-- Casino --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin-top: 0;">🎰 Casino</h3> <<link "<div style='background: #ffd700; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Casino">> <</link>> </div> <!-- CommercialDistrict --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #20c997; margin-top: 0;">🏪 Commercial District</h3> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "CommercialDistrict">> <</link>> </div> <!-- ChromisTunes --> <div style="border: 3px solid #9c27b0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9c27b0; margin-top: 0;">🎵 Chromis Tunes</h3> <<link "<div style='background: #9c27b0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "ChromisTunes">> <</link>> </div> <!-- CoralReef --> <div style="border: 3px solid #00bcd4; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #00bcd4; margin-top: 0;">🪸 Coral Reef</h3> <<link "<div style='background: #00bcd4; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "CoralReef">> <</link>> </div> <!-- DanceStudio --> <div style="border: 3px solid #ff4081; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff4081; margin-top: 0;">💃 Dance Studio</h3> <<link "<div style='background: #ff4081; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "DanceStudio">> <</link>> </div> <!-- Docks --> <div style="border: 3px solid #3498db; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #3498db; margin-top: 0;">⚓ Docks</h3> <<link "<div style='background: #3498db; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Docks">> <</link>> </div> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #667eea; margin-top: 0;">🏙️ Downtown</h3> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Downtown">> <</link>> </div> <!-- EcentricShop --> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin-top: 0;">🔮 Eccentric Shop</h3> <<link "<div style='background: #9b59b6; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "EcentricShop">> <</link>> </div> <!-- FitnessShop --> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff6b6b; margin-top: 0;">🏋️ Fitness Shop</h3> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "FitnessShop">> <</link>> </div> <!-- GroceryStore --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin-top: 0;">🛒 Grocery Store</h3> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "GroceryStore">> <</link>> </div> <!-- Hospital --> <div style="border: 3px solid #dc3545; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #dc3545; margin-top: 0;">🏥 Hospital</h3> <<link "<div style='background: #dc3545; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Hospital">> <</link>> </div> <!-- Mall --> <div style="border: 3px solid #845ef7; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #845ef7; margin-top: 0;">🛍️ Mall</h3> <<link "<div style='background: #845ef7; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Mall">> <</link>> </div> <!-- MailService --> <div style="border: 3px solid #007bff; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #007bff; margin-top: 0;">📮 Mail Service</h3> <<link "<div style='background: #007bff; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "MailService">> <</link>> </div> <!-- ModelingStudio --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e83e8c; margin-top: 0;">📸 Modeling Studio</h3> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "ModelingStudio">> <</link>> </div> <!-- OpahFitness --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #20c997; margin-top: 0;">💪 Opah Fitness</h3> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "OpahFitness">> <</link>> </div> <!-- Outskirts --> <div style="border: 3px solid #868e96; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #868e96; margin-top: 0;">🌾 Outskirts</h3> <<link "<div style='background: #868e96; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "Outskirts">> <</link>> </div> <!-- Park --> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin-top: 0;">🌳 Park</h3> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- RedLightDistrict --> <div style="border: 3px solid #f03e3e; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f03e3e; margin-top: 0;">🔴 Red Light District</h3> <<link "<div style='background: #f03e3e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "RedLightDistrict">> <</link>> </div> <!-- ResidentialDistrict --> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #6c757d; margin-top: 0;">🏘️ Residential District</h3> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "ResidentialDistrict">> <</link>> </div> <!-- SeabassPark --> <div style="border: 3px solid #37b24d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #37b24d; margin-top: 0;">🌳 Seabass Park</h3> <<link "<div style='background: #37b24d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "SeabassPark">> <</link>> </div> <!-- StripClub --> <div style="border: 3px solid #ff006e; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff006e; margin-top: 0;">💃 Strip Club</h3> <<link "<div style='background: #ff006e; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "StripClub">> <</link>> </div> <!-- TechStore --> <div style="border: 3px solid #339af0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #339af0; margin-top: 0;">💻 Tech Store</h3> <<link "<div style='background: #339af0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "TechStore">> <</link>> </div> <!-- BluefinDevelopmentCenter --> <div style="border: 3px solid #f76707; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f76707; margin-top: 0;">🥊 Bluefin Development Center</h3> <<link "<div style='background: #f76707; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Teleport</div>">> <<goto "TrainingCenter">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #00bcd4; text-align: center;">🌊 A Hidden Discovery</h1> <<if $UnderWaterCaveEntryMethod === "sunfish">> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00bcd4;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> Swimming through the reef, your sunfish instincts guide you toward something... a dark opening hidden among the coral. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Your small sunfish body slips easily through the cave entrance. The passage slopes upward, and you can sense an air pocket above. </p> <p style="color: #00bcd4; margin: 0; line-height: 1.6; font-weight: bold;"> You've discovered an underwater cave! You can now access it from the Coral Reef. </p> </div> <<else>> <div style="padding: 20px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00bcd4;"> <p style="color: white; font-size: 18px; margin: 0; text-shadow: 1px 1px 2px rgba(0,0,0,0.5);"> Your trained swimming skills allow you to explore deeper into the reef. You spot a dark opening—a cave entrance hidden in the coral. </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; margin: 0 0 15px 0; line-height: 1.6;"> Curious, you swim closer and peer inside. The passage looks navigable, sloping upward toward what might be an air pocket. </p> <p style="color: #00bcd4; margin: 0; line-height: 1.6; font-weight: bold;"> You've discovered an underwater cave! You can now access it from the Coral Reef. </p> </div> <</if>> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #00bcd4; color: white; padding: 12px 25px; border-radius: 6px; cursor: pointer; font-weight: bold; border: 2px solid #00bcd4; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Return to Coral Reef</div>">> <<goto "CoralReef">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _totalValue = $altarSacrificeValue>> <!-- Store old values for transformation text --> <<set _oldChest = $bodyParts.chest>> <<set _oldButt = $bodyParts.butt>> <!-- Remove sacrificed traits --> <<for _i = 0; _i < $altarSelectedTraits.length; _i++>> <<set _trait = $altarSelectedTraits[_i]>> <<if _trait.type === "physical">> <<run $physicalTraits.delete(_trait.name)>> <<elseif _trait.type === "mental">> <<run $mentalTraits.delete(_trait.name)>> <<elseif _trait.type === "skill">> <<run $skills.delete(_trait.name)>> <</if>> <</for>> <!-- Determine reward tier and what to grant --> <<set _rewardType = "">> <<set _rewardName = "">> <<if _totalValue >= 999>> <<if $skills && $skills.includes("Sunfish")>> <<set _rewardType = "money">> <<set _rewardName = "$100,000">> <<set $money += 100000>> <<else>> <<set _rewardType = "sunfish">> <<run $skills.push("Sunfish")>> <</if>> <<elseif _totalValue >= 800>> <<set _hasWere = $skills && $skills.includes("Were-Creature")>> <<set _hasDefVamp = $physicalTraits && $physicalTraits.includes("Definitely not a Vampire")>> <<set _hasTotVamp = $physicalTraits && $physicalTraits.includes("Totally not a Vampire")>> <<set _hasLucky = $mentalTraits && $mentalTraits.includes("Lucky")>> <!-- Check if traits are blocked by transformation --> <<set _luckyBlockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation("Lucky", "mental")>> <<set _wereBlockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation("Were-Creature", "physical")>> <<set _defVampBlockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation("Definitely not a Vampire", "physical")>> <<set _totVampBlockedByTransform = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation("Totally not a Vampire", "physical")>> <<if (_hasWere || _wereBlockedByTransform) && (_hasDefVamp || _defVampBlockedByTransform) && (_hasTotVamp || _totVampBlockedByTransform) && (_hasLucky || _luckyBlockedByTransform)>> <<set _rewardType = "money">> <<set _rewardName = "$50,000">> <<set $money += 50000>> <<else>> <<set _options = []>> <<if !_hasWere && !_wereBlockedByTransform>><<set _options.push("were")>><</if>> <<if !_hasDefVamp && !_defVampBlockedByTransform>><<set _options.push("defvamp")>><</if>> <<if !_hasTotVamp && !_totVampBlockedByTransform>><<set _options.push("totvamp")>><</if>> <<if !_hasLucky && !_luckyBlockedByTransform>><<set _options.push("lucky")>><</if>> <<set _choice = _options.random()>> <<if _choice === "were">> <<set _rewardType = "were">> <<run $skills.push("Were-Creature")>> <<elseif _choice === "defvamp">> <<set _rewardType = "defvamp">> <<run $physicalTraits.push("Definitely not a Vampire")>> <<elseif _choice === "totvamp">> <<set _rewardType = "totvamp">> <<run $physicalTraits.push("Totally not a Vampire")>> <<else>> <<set _rewardType = "lucky">> <<run $mentalTraits.push("Lucky")>> <</if>> <</if>> <<elseif _totalValue >= 500>> <<if $bodyParts.chest === "gigantic" && $bodyParts.butt === "gigantic">> <<set _rewardType = "money">> <<set _rewardName = "$25,000">> <<set $money += 25000>> <<else>> <<set _options = []>> <<if $bodyParts.chest !== "gigantic">><<set _options.push("gigchest")>><</if>> <<if $bodyParts.butt !== "gigantic">><<set _options.push("gigbutt")>><</if>> <<set _choice = _options.random()>> <<if _choice === "gigchest">> <<set _rewardType = "gigchest">> <<set $bodyParts.chest = "gigantic">> <<else>> <<set _rewardType = "gigbutt">> <<set $bodyParts.butt = "gigantic">> <</if>> <</if>> <<elseif _totalValue >= 300>> <<set _hasGiantChest = ($bodyParts.chest === "gigantic" || $bodyParts.chest === "giant")>> <<set _hasGiantButt = ($bodyParts.butt === "gigantic" || $bodyParts.butt === "giant")>> <<set _hasBimbo = $mentalTraits && $mentalTraits.includes("Bimbo")>> <<set _hasOccult = $skills && $skills.includes("Occult Expert")>> <<if _hasGiantChest && _hasGiantButt && _hasBimbo && _hasOccult>> <<set _rewardType = "money">> <<set _rewardName = "$10,000">> <<set $money += 10000>> <<else>> <<set _options = []>> <<if !_hasGiantChest>><<set _options.push("giantchest")>><</if>> <<if !_hasGiantButt>><<set _options.push("giantbutt")>><</if>> <<if !_hasBimbo>><<set _options.push("bimbo")>><</if>> <<if !_hasOccult>><<set _options.push("occult")>><</if>> <<set _choice = _options.random()>> <<if _choice === "giantchest">> <<set _rewardType = "giantchest">> <<set $bodyParts.chest = "giant">> <<elseif _choice === "giantbutt">> <<set _rewardType = "giantbutt">> <<set $bodyParts.butt = "giant">> <<elseif _choice === "bimbo">> <<set _rewardType = "bimbo">> <<run $mentalTraits.push("Bimbo")>> <!-- Only the Bimbo mental trait is gained, no physical changes to body parts --> <<else>> <<set _rewardType = "occult">> <<run $skills.push("Occult Expert")>> <</if>> <</if>> <<elseif _totalValue >= 100>> <<set _hasHugeChest = ($bodyParts.chest === "gigantic" || $bodyParts.chest === "giant" || $bodyParts.chest === "huge")>> <<set _hasHugeButt = ($bodyParts.butt === "gigantic" || $bodyParts.butt === "giant" || $bodyParts.butt === "huge")>> <<set _hasVoluptuous = $physicalTraits && $physicalTraits.includes("Voluptuous")>> <<if _hasHugeChest && _hasHugeButt && _hasVoluptuous>> <<set _rewardType = "money">> <<set _rewardName = "$5,000">> <<set $money += 5000>> <<else>> <<set _options = []>> <<if !_hasHugeChest>><<set _options.push("hugechest")>><</if>> <<if !_hasHugeButt>><<set _options.push("hugebutt")>><</if>> <<if !_hasVoluptuous>><<set _options.push("voluptuous")>><</if>> <<set _choice = _options.random()>> <<if _choice === "hugechest">> <<set _rewardType = "hugechest">> <<set $bodyParts.chest = "huge">> <<elseif _choice === "hugebutt">> <<set _rewardType = "hugebutt">> <<set $bodyParts.butt = "huge">> <<else>> <<set _rewardType = "voluptuous">> <<run $physicalTraits.push("Voluptuous")>> <</if>> <</if>> <<else>> <<set _rewardType = "money">> <<set _rewardName = "$100">> <<set $money += 100>> <</if>> <!-- Achievement checks --> <<if _rewardType === "bimbo">> <<run setup.achievements.unlock("become_bimbo")>> <</if>> <<if _rewardType === "lucky">> <<run setup.achievements.unlock("get_lucky_trait")>> <</if>> <<if _rewardType === "gigchest" || _rewardType === "gigbutt">> <!-- Check if both are now gigantic --> <<if $bodyParts.chest === "gigantic" && $bodyParts.butt === "gigantic">> <<run setup.achievements.unlock("gigantic_proportions")>> <</if>> <</if>> <div style="background: linear-gradient(135deg, #0a1a2a 0%, #000000 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #9c27b0; text-align: center; text-shadow: 0 0 30px #9c27b0, 0 0 50px #9c27b0, 0 0 70px #9c27b0;">🔥 The Sacrifice</h1> <div style="padding: 25px; background: linear-gradient(135deg, #4a148c 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 8px 16px rgba(156, 39, 176, 0.6), 0 0 40px rgba(156, 39, 176, 0.4), inset 0 0 30px rgba(156, 39, 176, 0.2);"> <p style="color: #e1bee7; font-size: 18px; margin: 0; text-align: center; line-height: 1.6; text-shadow: 0 0 15px rgba(225, 190, 231, 0.5);"> You place your hands on the jewel. It pulses with hunger, eager to consume. Your sacrificed traits begin to flow out of you like wisps of colored smoke—memories, abilities, aspects of yourself spiraling into the gem's depths. </p> </div> <div style="background: linear-gradient(135deg, #152535 0%, #0a1520 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.6), 0 0 30px rgba(156, 39, 176, 0.3);"> <h3 style="color: #9c27b0; margin: 0 0 15px 0; text-align: center; text-shadow: 0 0 20px #9c27b0;">Traits Sacrificed:</h3> <<for _i = 0; _i < $altarSelectedTraits.length; _i++>> <p style="color: #ff6b6b; margin: 5px 0; text-align: center; text-shadow: 0 0 10px rgba(255, 107, 107, 0.5);">- $altarSelectedTraits[_i].name ($altarSelectedTraits[_i].value points)</p> <</for>> </div> <!-- TRANSFORMATION SCENES --> <<if _rewardType === "sunfish">> <div style="padding: 25px; background: linear-gradient(135deg, #006064 0%, #00bcd4 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #00bcd4; box-shadow: 0 8px 16px rgba(0,188,212, 0.6), 0 0 50px rgba(0,188,212, 0.5), inset 0 0 40px rgba(0,188,212, 0.2);"> <p style="color: #e0f7fa; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(224, 247, 250, 0.6);"> The jewel flares brilliant blue-green, the color of deep ocean waters. The light engulfs you completely. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #00bcd4;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSunfishTransformationText(true)>> </p> </div> </div> <<elseif _rewardType === "were">> <div style="padding: 25px; background: linear-gradient(135deg, #3e2723 0%, #5d4037 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #795548; box-shadow: 0 8px 16px rgba(121, 85, 72, 0.6), 0 0 50px rgba(121, 85, 72, 0.5), inset 0 0 40px rgba(121, 85, 72, 0.2);"> <p style="color: #d7ccc8; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(215, 204, 200, 0.6);"> The jewel pulses with primal energy. You feel your teeth sharpen, then return to normal. Your muscles spasm and flex with impossible strength for just a moment before settling. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #795548;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getWereCreatureTransformationText(true, "wolf")>> </p> </div> </div> <<elseif _rewardType === "defvamp" || _rewardType === "totvamp">> <div style="padding: 25px; background: linear-gradient(135deg, #1a0000 0%, #4a0000 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #c62828; box-shadow: 0 8px 16px rgba(198, 40, 40, 0.6), 0 0 50px rgba(198, 40, 40, 0.5), inset 0 0 40px rgba(198, 40, 40, 0.2);"> <p style="color: #ffcdd2; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(255, 205, 210, 0.6);"> The jewel turns crimson, pulsing like a heartbeat. Your own heart... slows. And slows. You feel cold spread through your veins, yet you're more alive than ever. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #c62828;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getVampireTransformationText(true)>> </p> </div> <p style="color: #ffcdd2; font-size: 16px; margin: 15px 0 0 0; text-align: center; line-height: 1.6; text-shadow: 0 0 15px rgba(255, 205, 210, 0.6);"> You are <<if _rewardType === "defvamp">>definitely<<else>>totally<</if>> not a vampire. <<if _rewardType === "defvamp">>Definitely.<<else>>Totally.<</if>> </p> </div> <<elseif _rewardType === "lucky">> <div style="padding: 25px; background: linear-gradient(135deg, #f57f17 0%, #fbc02d 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #ffd600; box-shadow: 0 8px 16px rgba(255, 214, 0, 0.6), 0 0 50px rgba(255, 214, 0, 0.5), inset 0 0 40px rgba(255, 214, 0, 0.2);"> <p style="color: #1a1a1a; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(255, 255, 255, 0.8);"> The jewel shimmers with golden light. You feel... lighter. As if invisible chains have fallen away. The universe shifts ever so slightly in your favor. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ffd600;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getMentalTraitChangeText("Lucky", true)>> </p> </div> </div> <<elseif _rewardType === "gigchest">> <div style="padding: 25px; background: linear-gradient(135deg, #880e4f 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 8px 16px rgba(233, 30, 99, 0.6), 0 0 50px rgba(233, 30, 99, 0.5), inset 0 0 40px rgba(233, 30, 99, 0.2);"> <p style="color: #f8bbd0; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(248, 187, 208, 0.6);"> Heat blooms in your chest. Not painful—pleasurable. Your nipples harden instantly as warmth spreads across your torso. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #e91e63;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getChestTransformationText(_oldChest, "gigantic")>> </p> </div> </div> <<elseif _rewardType === "gigbutt">> <div style="padding: 25px; background: linear-gradient(135deg, #4a148c 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 8px 16px rgba(156, 39, 176, 0.6), 0 0 50px rgba(156, 39, 176, 0.5), inset 0 0 40px rgba(156, 39, 176, 0.2);"> <p style="color: #e1bee7; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(225, 190, 231, 0.6);"> Warmth spreads through your hips and thighs, pooling in your rear. You feel a tingling sensation, then a rush of pleasure as the transformation begins. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #9c27b0;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getButtTransformationText(_oldButt, "gigantic")>> </p> </div> </div> <<elseif _rewardType === "giantchest">> <div style="padding: 25px; background: linear-gradient(135deg, #880e4f 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 8px 16px rgba(233, 30, 99, 0.6), 0 0 50px rgba(233, 30, 99, 0.5), inset 0 0 40px rgba(233, 30, 99, 0.2);"> <p style="color: #f8bbd0; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(248, 187, 208, 0.6);"> A warm tingling spreads across your chest. You feel pressure building, pleasant and insistent. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #e91e63;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getChestTransformationText(_oldChest, "giant")>> </p> </div> </div> <<elseif _rewardType === "giantbutt">> <div style="padding: 25px; background: linear-gradient(135deg, #4a148c 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 8px 16px rgba(156, 39, 176, 0.6), 0 0 50px rgba(156, 39, 176, 0.5), inset 0 0 40px rgba(156, 39, 176, 0.2);"> <p style="color: #e1bee7; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(225, 190, 231, 0.6);"> Heat blooms in your rear, spreading through your hips. You gasp as the transformation begins. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #9c27b0;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getButtTransformationText(_oldButt, "giant")>> </p> </div> </div> <<elseif _rewardType === "bimbo">> <div style="padding: 25px; background: linear-gradient(135deg, #c2185b 0%, #f06292 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #ff4081; box-shadow: 0 8px 16px rgba(255, 64, 129, 0.6), 0 0 50px rgba(255, 64, 129, 0.5), inset 0 0 40px rgba(255, 64, 129, 0.2);"> <h3 style="color: #fce4ec; margin: 0 0 15px 0; text-align: center; font-size: 24px; text-shadow: 0 0 20px rgba(252, 228, 236, 0.8);">💋 Bimbo Transformation</h3> <p style="color: #fce4ec; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(252, 228, 236, 0.6);"> Pink light floods through you. Your entire body tingles with building pleasure. The transformation starts everywhere at once. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #ff4081;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getBimboTransformationText(true)>> </p> </div> </div> <<elseif _rewardType === "occult">> <div style="padding: 25px; background: linear-gradient(135deg, #311b92 0%, #512da8 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #673ab7; box-shadow: 0 8px 16px rgba(103, 58, 183, 0.6), 0 0 50px rgba(103, 58, 183, 0.5), inset 0 0 40px rgba(103, 58, 183, 0.2);"> <p style="color: #d1c4e9; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(209, 196, 233, 0.6);"> The jewel pulses with eldritch energy. Symbols flash through your mind—ancient, powerful, forbidden. Knowledge floods into you. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #673ab7;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getSkillGainText("Occult Expert")>> </p> </div> </div> <<elseif _rewardType === "hugechest">> <div style="padding: 25px; background: linear-gradient(135deg, #880e4f 0%, #c2185b 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #e91e63; box-shadow: 0 8px 16px rgba(233, 30, 99, 0.6), 0 0 50px rgba(233, 30, 99, 0.5), inset 0 0 40px rgba(233, 30, 99, 0.2);"> <p style="color: #f8bbd0; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(248, 187, 208, 0.6);"> Warmth spreads across your chest. You feel a pleasant tingling as your breasts begin to grow. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #e91e63;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getChestTransformationText(_oldChest, "huge")>> </p> </div> </div> <<elseif _rewardType === "hugebutt">> <div style="padding: 25px; background: linear-gradient(135deg, #4a148c 0%, #6a1b9a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 8px 16px rgba(156, 39, 176, 0.6), 0 0 50px rgba(156, 39, 176, 0.5), inset 0 0 40px rgba(156, 39, 176, 0.2);"> <p style="color: #e1bee7; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(225, 190, 231, 0.6);"> A pleasant warmth spreads through your rear. You feel tingling as the transformation begins. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #9c27b0;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getButtTransformationText(_oldButt, "huge")>> </p> </div> </div> <<elseif _rewardType === "voluptuous">> <div style="padding: 25px; background: linear-gradient(135deg, #ad1457 0%, #d81b60 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #f06292; box-shadow: 0 8px 16px rgba(240, 98, 146, 0.6), 0 0 50px rgba(240, 98, 146, 0.5), inset 0 0 40px rgba(240, 98, 146, 0.2);"> <p style="color: #f8bbd0; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(248, 187, 208, 0.6);"> Warmth floods through your entire body. Your curves... amplify. Everything becomes more pronounced, more sensual. </p> <div style="background: #1a1a1a; padding: 15px; margin: 15px 0; border-radius: 8px; border: 2px solid #f06292;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<print setup.getPhysicalTraitChangeText("Voluptuous", true)>> </p> </div> </div> <<elseif _rewardType === "money">> <div style="padding: 25px; background: linear-gradient(135deg, #1b5e20 0%, #2e7d32 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #4caf50; box-shadow: 0 8px 16px rgba(76, 175, 80, 0.6), 0 0 50px rgba(76, 175, 80, 0.5), inset 0 0 40px rgba(76, 175, 80, 0.2);"> <p style="color: #c8e6c9; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6; text-shadow: 0 0 15px rgba(200, 230, 201, 0.6);"> The jewel flashes green. You feel... nothing physical. But when you look down, a stack of bills has materialized at your feet. </p> <p style="color: #c8e6c9; font-size: 16px; margin: 0; text-align: center; text-shadow: 0 0 15px rgba(200, 230, 201, 0.6);"> The altar grants you _rewardName in compensation. </p> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #4fd1c5 0%, #339af0 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(79, 209, 197, 0.5); text-shadow: 0 0 10px rgba(255, 255, 255, 0.6);'>Continue</div>">> <<set $altarSelectedTraits = []>> <<set $altarSacrificeValue = 0>> <<goto "TheAlter">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(135deg, #1e3a5f 0%, #0d1b2a 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #4fc3f7; text-align: center; text-shadow: 0 0 20px #4fc3f7;">🏊 Swimming</h1> <!-- Swimming time tracking display --> <<set _totalSwimTime = $swimmingMinutesToday>> <<set _remainingSwimTime = 180 - _totalSwimTime>> <div style="background: #1a2a3a; padding: 12px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #4fc3f7; text-align: center;"> <p style="color: #4fc3f7; margin: 0; font-size: 14px;"> Today's Swimming: _totalSwimTime / 180 minutes <<if _remainingSwimTime > 0>> (_remainingSwimTime minutes remaining) <<else>> <span style="color: #ff6b6b;">(Daily limit reached!)</span> <</if>> </p> </div> <<if $swimSkillLearned>> <!-- Skill learned message --> <div style="padding: 25px; background: linear-gradient(135deg, #1565c0 0%, #0d47a1 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #4fc3f7; box-shadow: 0 8px 16px rgba(79, 195, 247, 0.6), 0 0 40px rgba(79, 195, 247, 0.4);"> <p style="color: #bbdefb; font-size: 18px; margin: 0 0 15px 0; text-align: center; line-height: 1.6; text-shadow: 0 0 10px rgba(187, 222, 251, 0.5);"> You dive into the cool ocean water, your movements becoming more fluid and natural with each stroke. After weeks of practice, swimming has become second nature to you. </p> <p style="color: #4caf50; font-size: 20px; margin: 0; text-align: center; font-weight: bold; text-shadow: 0 0 20px #4caf50;"> You have gained the $swimSkillLearned skill! </p> </div> <<set $swimSkillLearned = null>> <<else>> <!-- Normal swimming message --> <div style="padding: 20px; background: linear-gradient(135deg, #1565c0 0%, #0d47a1 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4fc3f7; box-shadow: 0 4px 8px rgba(79, 195, 247, 0.3);"> <p style="color: #bbdefb; font-size: 16px; margin: 0; text-align: center; line-height: 1.6;"> You spend an hour swimming in the refreshing ocean water. The waves are gentle today, and the water is the perfect temperature. </p> </div> <!-- Progress indicator (only show if they don't have the skills, Siren includes Swimming) --> <<set _hasSwimmingSkill = ($skills && ($skills.includes("Swimming") || $skills.includes("Swimmer"))) || ($physicalTraits && $physicalTraits.includes("Siren"))>> <<if !_hasSwimmingSkill && $beachSwimCount > 0>> <div style="background: #1a2a3a; padding: 15px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #4fc3f7;"> <p style="color: #4fc3f7; margin: 0 0 10px 0; text-align: center; font-weight: bold;">Swimming Practice Progress</p> <div style="background: #0a1a2a; height: 30px; border-radius: 15px; overflow: hidden; border: 1px solid #4fc3f7;"> <<set _progress = ($beachSwimCount / 25) * 100>> <div style="background: linear-gradient(90deg, #4fc3f7 0%, #2196f3 100%); height: 100%; width: _progress%; transition: width 0.3s;"></div> </div> <p style="color: #aaa; margin: 10px 0 0 0; text-align: center; font-size: 14px;">$beachSwimCount / 25 sessions completed</p> </div> <</if>> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #4fc3f7 0%, #2196f3 100%); color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.3);'>Return to Beach</div>">> <<goto "Beach">> <</link>> </div> </div> <</nobr>>
<<if $phoneBackground and $phoneBackground neq "">> <<set _bgStyle = "background-image: url('" + $phoneBackground + "'); background-size: cover; background-position: center; background-repeat: no-repeat;">> <<else>> <<set _bgStyle = "background: linear-gradient(135deg, #3b82f6 0%, #ec4899 100%);">> <</if>> <div class="phone-wrapper"> <div class="phone-device"> <div class="phone-notch-container"> <div class="notch-base"></div> </div> <div class="phone-screen" @style="_bgStyle"> <div class="phone-statusbar"> <span class="status-left"><<= getTimeString()>></span> <span class="status-right">📶 🔋</span> </div> <div class="phone-content"> <!-- 6 rows of 4 apps --> <div class="apps-grid"> <!-- Row 1 --> <div class="app-row"> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/notes.webp"> <span>Notes</span> </div> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/maps.webp"> <span>Maps</span> </div> <div class="app-slot" onclick="SugarCube.Engine.play('BankApp')"> <img src="Images/Phone/App_Icons/bank.webp"> <span>Bank</span> </div> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/instafin.webp"> <span>InstaFin</span> </div> </div> <!-- Row 2 --> <div class="app-row"> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/sunfishnet.webp"> <span>SunfishNet</span> </div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> </div> <!-- Row 3 --> <div class="app-row"> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> </div> <!-- Row 4 --> <div class="app-row"> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> </div> <!-- Row 5 --> <div class="app-row"> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> </div> <!-- Row 6 --> <div class="app-row"> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> <div class="app-slot empty"></div> </div> </div> <!-- Dock --> <div class="apps-dock"> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/messages.webp"> <span>Messages</span> </div> <div class="app-slot" onclick="SugarCube.Engine.play('Gallery')"> <img src="Images/Phone/App_Icons/gallery.webp"> <span>Gallery</span> </div> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/contacts.webp"> <span>Contacts</span> </div> <div class="app-slot" onclick="alert('This function will be added in a future update.')"> <img src="Images/Phone/App_Icons/settings.webp"> <span>Settings</span> </div> </div> </div> <div class="phone-homebtn"></div> </div> </div> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #1a1a1a; color: white; padding: 10px 20px; border-radius: 8px; cursor: pointer; font-weight: bold; border: 2px solid #667eea; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<if $lastLocation && $lastLocation !== "">> <<goto $lastLocation>> <<else>> <<goto "Alleyway">> <</if>> <</link>> </div> <style> .phone-wrapper { display: flex; justify-content: center; align-items: center; padding: 20px; } .phone-device { width: 360px; height: 680px; background: #0a0a0a; border-radius: 42px; padding: 6px; box-shadow: 0 25px 50px rgba(0,0,0,0.9); position: relative; display: flex; flex-direction: column; } .phone-notch-container { position: absolute; top: -24px; left: 50%; transform: translateX(-50%); z-index: 100; } .notch-base { width: 140px; height: 28px; background: #0a0a0a; border-radius: 0 0 18px 18px; } .phone-screen { border-radius: 36px; flex: 1; overflow: hidden; display: flex; flex-direction: column; position: relative; } .phone-statusbar { display: flex; justify-content: space-between; padding: 32px 25px 8px 25px; font-size: 12px; color: white; font-weight: 600; position: relative; z-index: 50; } .status-left { text-align: left; flex: 1; } .status-right { text-align: right; flex: 1; } .phone-content { flex: 1; display: flex; flex-direction: column; padding: 10px 18px 0 18px; overflow: hidden; } .apps-grid { flex: 1; display: flex; flex-direction: column; gap: 18px; } .app-row { display: flex; justify-content: space-around; align-items: flex-start; } .apps-dock { display: flex; justify-content: space-around; align-items: center; margin: 25px 0 0 0; padding: 14px 8px; background: rgba(255,255,255,0.2); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-radius: 20px; } .app-slot { display: flex; flex-direction: column; align-items: center; width: 70px; cursor: pointer; transition: transform 0.2s; } .app-slot.empty { visibility: hidden; pointer-events: none; } .app-slot:not(.empty):hover { transform: scale(1.1); } .app-slot:not(.empty):active { transform: scale(0.95); } .app-slot img { width: 56px; height: 56px; border-radius: 14px; box-shadow: 0 4px 12px rgba(0,0,0,0.5); display: block; } .app-slot span { margin-top: 5px; font-size: 10px; color: white; text-shadow: 0 1px 3px rgba(0,0,0,0.9); font-weight: 500; text-align: center; max-width: 70px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .phone-homebtn { width: 110px; height: 4px; background: rgba(255,255,255,0.5); border-radius: 2px; margin: 8px auto 8px auto; } </style>
<<if not $galleryViewMode>><<set $galleryViewMode = false>><</if>> <<if not $galleryViewIndex>><<set $galleryViewIndex = 0>><</if>> <<if $galleryViewMode>> <!-- Full Image View --> <div class="gallery-wrapper"> <div class="gallery-device"> <div class="gallery-notch-container"> <div class="gallery-notch-base"></div> </div> <div class="gallery-screen gallery-view-screen"> <div class="gallery-view-header"> <span class="back-btn" id="close-view">← Back</span> <span class="view-counter"><<print $galleryViewIndex + 1>> / 8</span> <span class="spacer"></span> </div> <div class="image-viewer" id="image-viewer"> <<if $galleryViewIndex == 0>> <img src="Images/Phone/Gallery/Background_1.webp" class="view-image"> <<elseif $galleryViewIndex == 1>> <img src="Images/Phone/Gallery/Background_2.webp" class="view-image"> <<elseif $galleryViewIndex == 2>> <img src="Images/Phone/Gallery/Background_3.webp" class="view-image"> <<elseif $galleryViewIndex == 3>> <img src="Images/Phone/Gallery/Background_4.webp" class="view-image"> <<elseif $galleryViewIndex == 4>> <img src="Images/Phone/Gallery/Background_5.webp" class="view-image"> <<elseif $galleryViewIndex == 5>> <img src="Images/Phone/Gallery/Background_6.webp" class="view-image"> <<elseif $galleryViewIndex == 6>> <div class="view-gradient"></div> <<elseif $galleryViewIndex == 7>> <<if $customUploadedImage>> <img @src="$customUploadedImage" class="view-image"> <<else>> <div class="view-placeholder">No custom image</div> <</if>> <</if>> </div> <div class="view-actions"> <button class="set-wallpaper-btn" id="set-wallpaper">Set as Wallpaper</button> </div> <div class="gallery-homebtn"></div> </div> </div> </div> <script> (function() { let startX = 0; let currentX = 0; let isDragging = false; const viewer = document.getElementById('image-viewer'); const threshold = 50; viewer.addEventListener('touchstart', handleStart, false); viewer.addEventListener('touchmove', handleMove, false); viewer.addEventListener('touchend', handleEnd, false); viewer.addEventListener('mousedown', handleStart, false); viewer.addEventListener('mousemove', handleMove, false); viewer.addEventListener('mouseup', handleEnd, false); viewer.addEventListener('mouseleave', handleEnd, false); function handleStart(e) { isDragging = true; startX = e.type.includes('mouse') ? e.clientX : e.touches[0].clientX; } function handleMove(e) { if (!isDragging) return; currentX = e.type.includes('mouse') ? e.clientX : e.touches[0].clientX; const diff = currentX - startX; viewer.style.transform = `translateX(${diff}px)`; } function handleEnd(e) { if (!isDragging) return; isDragging = false; const diff = currentX - startX; viewer.style.transform = ''; if (Math.abs(diff) > threshold) { if (diff > 0) { if (SugarCube.State.variables.galleryViewIndex > 0) { SugarCube.State.variables.galleryViewIndex--; SugarCube.Engine.play('Gallery'); } } else { if (SugarCube.State.variables.galleryViewIndex < 7) { SugarCube.State.variables.galleryViewIndex++; SugarCube.Engine.play('Gallery'); } } } } document.getElementById('close-view').addEventListener('click', function() { SugarCube.State.variables.galleryViewMode = false; SugarCube.Engine.play('Gallery'); }); document.getElementById('set-wallpaper').addEventListener('click', function() { const index = SugarCube.State.variables.galleryViewIndex; if (index === 6) { // Default gradient - set to empty string SugarCube.State.variables.phoneBackground = ''; } else { const images = [ 'Images/Phone/Gallery/Background_1.webp', 'Images/Phone/Gallery/Background_2.webp', 'Images/Phone/Gallery/Background_3.webp', 'Images/Phone/Gallery/Background_4.webp', 'Images/Phone/Gallery/Background_5.webp', 'Images/Phone/Gallery/Background_6.webp', '', SugarCube.State.variables.customUploadedImage || '' ]; SugarCube.State.variables.phoneBackground = images[index]; } SugarCube.Engine.play('Phone'); }); })(); </script> <<else>> <!-- Gallery Grid View --> <div class="gallery-wrapper"> <div class="gallery-device"> <div class="gallery-notch-container"> <div class="gallery-notch-base"></div> </div> <div class="gallery-screen"> <div class="gallery-statusbar"> <span class="status-left"><<link "← Phone" "Phone">><</link>></span> <h2>Gallery</h2> <span class="spacer"></span> </div> <div class="gallery-content"> <div class="photo-grid"><img src="Images/Phone/Gallery/Background_1.webp" class="grid-photo"><img src="Images/Phone/Gallery/Background_2.webp" class="grid-photo"><img src="Images/Phone/Gallery/Background_3.webp" class="grid-photo"><img src="Images/Phone/Gallery/Background_4.webp" class="grid-photo"><img src="Images/Phone/Gallery/Background_5.webp" class="grid-photo"><img src="Images/Phone/Gallery/Background_6.webp" class="grid-photo"><div class="grid-photo grid-gradient"></div><<if $customUploadedImage>><img @src="$customUploadedImage" class="grid-photo"><<else>><label for="custom-wallpaper" class="grid-photo grid-upload"><span class="upload-icon">+</span><input type="file" id="custom-wallpaper" accept="image/*" style="display: none;"></label><</if>></div> </div> <div class="gallery-homebtn"></div> </div> </div> </div> <script> (function() { // Apply click handlers to images const grid = document.querySelector('.photo-grid'); const imgs = grid.querySelectorAll('img:not([type="file"])'); imgs.forEach((img, index) => { if (index < 6) { img.style.cursor = 'pointer'; img.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); SugarCube.State.variables.galleryViewMode = true; SugarCube.State.variables.galleryViewIndex = index; SugarCube.Engine.play('Gallery'); }); } else if (index === 6) { // This is the custom uploaded image img.addEventListener('click', function(e) { e.preventDefault(); e.stopPropagation(); SugarCube.State.variables.galleryViewMode = true; SugarCube.State.variables.galleryViewIndex = 7; SugarCube.Engine.play('Gallery'); }); } }); // Add click handler to gradient const gradient = document.querySelector('.grid-gradient'); if (gradient) { gradient.addEventListener('click', function() { SugarCube.State.variables.galleryViewMode = true; SugarCube.State.variables.galleryViewIndex = 6; SugarCube.Engine.play('Gallery'); }); } const uploadInput = document.getElementById('custom-wallpaper'); if (uploadInput) { uploadInput.addEventListener('change', function(e) { const file = e.target.files[0]; if (file && file.type.startsWith('image/')) { const reader = new FileReader(); reader.onload = function(event) { SugarCube.State.variables.customUploadedImage = event.target.result; SugarCube.Engine.play('Gallery'); }; reader.readAsDataURL(file); } }); } })(); </script> <</if>> <style> .gallery-wrapper { display: flex; justify-content: center; align-items: center; padding: 20px; min-height: 100vh; background: #0a0a0a; } .gallery-device { width: 360px; height: 680px; background: #0a0a0a; border-radius: 42px; padding: 6px; box-shadow: 0 25px 50px rgba(0,0,0,0.9); position: relative; display: flex; flex-direction: column; } .gallery-notch-container { position: absolute; top: -24px; left: 50%; transform: translateX(-50%); z-index: 100; } .gallery-notch-base { width: 140px; height: 28px; background: #0a0a0a; border-radius: 0 0 18px 18px; } .gallery-screen { background: #2a2a2a; border-radius: 36px; flex: 1; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; position: relative; } .gallery-statusbar { display: flex; justify-content: space-between; align-items: center; padding: 32px 20px 12px 20px; font-size: 12px; color: white; font-weight: 600; position: sticky; top: 0; background: #2a2a2a; z-index: 50; border-bottom: 1px solid #3a3a3a; } .gallery-statusbar a { color: #3b82f6; text-decoration: none; font-size: 14px; } .gallery-statusbar h2 { margin: 0; font-size: 16px; color: #ffffff; } .spacer { width: 50px; } .gallery-content { padding: 8px; flex: 1; } .photo-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; } .photo-grid img { width: 100%; height: 108px; object-fit: cover; border-radius: 4px; display: block; } .grid-photo { width: 100%; height: 108px; object-fit: cover; border-radius: 4px; display: block; cursor: pointer; } .grid-gradient { background: linear-gradient(135deg, #3b82f6 0%, #ec4899 100%); cursor: pointer; } .grid-upload { background: #3a3a3a; display: flex; align-items: center; justify-content: center; } .upload-icon { font-size: 32px; color: #888; } .gallery-homebtn { width: 110px; height: 4px; background: rgba(255,255,255,0.5); border-radius: 2px; margin: 8px auto 8px auto; } /* Image Viewer Styles */ .gallery-view-screen { background: #000000; } .gallery-view-header { display: flex; justify-content: space-between; align-items: center; padding: 32px 20px 12px 20px; color: white; font-weight: 600; background: rgba(0,0,0,0.8); z-index: 50; } .back-btn { color: #3b82f6; cursor: pointer; font-size: 14px; } .view-counter { font-size: 14px; color: #ffffff; } .image-viewer { flex: 1; display: flex; align-items: center; justify-content: center; padding: 20px; touch-action: pan-y; user-select: none; transition: transform 0.2s ease-out; } .view-image { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain; border-radius: 8px; } .view-gradient { width: 100%; height: 400px; background: linear-gradient(135deg, #3b82f6 0%, #ec4899 100%); border-radius: 8px; } .view-placeholder { color: #888; font-size: 16px; text-align: center; } .view-actions { padding: 15px 20px; background: rgba(0,0,0,0.8); } .set-wallpaper-btn { width: 100%; background: #555555; color: white; border: none; padding: 12px; border-radius: 8px; font-size: 15px; font-weight: 600; cursor: pointer; } .set-wallpaper-btn:hover { background: #666666; } </style>
<!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("SecretLocation")>> <h2 style="color: #ff6b9d; text-shadow: 0 0 15px #ff6b9d;">🔮 Mysterious Visitors</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b9d; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(255, 107, 157, 0.3);"> <p style="color: #ffa5c5; font-size: 14px; margin: 0 0 15px 0; text-align: center; font-style: italic; text-shadow: 0 0 10px rgba(255, 165, 197, 0.5);"> Others who know of this hidden place gather here... </p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6b9d; border-radius: 10px; padding: 15px; background: #0f0f1e; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 107, 157, 0.2);"> <h3 style="color: #ff6b9d; margin: 0 0 10px 0; text-shadow: 0 0 10px rgba(255, 107, 157, 0.5);">_npc.name</h3> <p style="font-size: 14px; color: #ffa5c5; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #c44569 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; box-shadow: 0 0 15px rgba(255, 107, 157, 0.3);'>💬 Approach _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #888; margin: 0; font-style: italic;"> The secret location is empty. You are alone in the shadows. </p> </div> <</if>>
<<nobr>> <<set _npc = $tradingWithNPC>> <!-- Initialize if needed --> <<if !$selectedTraitsToSell>> <<set $selectedTraitsToSell = []>> <</if>> <!-- ===== SKILL TREE: Get bonuses ===== --> <<set _sellValueBonus = setup.skillTree.getEffect("sellValueBonus")>> <<set _sellWeeklyBonus = setup.skillTree.getEffect("sellWeeklyBonus")>> <<set _sellRelationshipBonus = setup.skillTree.getEffect("sellRelationshipBonus")>> <!-- Calculate total value and cash --> <<set _totalValue = 0>> <<set _baseCash = 0>> <<for _i = 0; _i < $selectedTraitsToSell.length; _i++>> <<set _totalValue += $selectedTraitsToSell[_i].value>> <<set _baseCash += ($selectedTraitsToSell[_i].value * 3)>> <</for>> <!-- ===== SKILL TREE: Apply sell value bonus ===== --> <<set _bonusMultiplier = 1 + (_sellValueBonus / 100)>> <<set _totalCash = Math.floor(_baseCash * _bonusMultiplier)>> <<set _bonusCash = _totalCash - _baseCash>> <!-- ===== SKILL TREE: Apply weekly bonus if available ===== --> <<set _weeklyBonusCash = 0>> <<set _weeklyBonusApplied = false>> <<if _sellWeeklyBonus > 0 && !$sellWeeklyBonusUsed && $selectedTraitsToSell.length > 0>> <<set _weeklyBonusCash = _sellWeeklyBonus * 3>> <<set _totalCash += _weeklyBonusCash>> <<set $sellWeeklyBonusUsed = true>> <<set _weeklyBonusApplied = true>> <</if>> <!-- Punk 1.5x cash bonus when selling traits to Roisin --> <<set _punkBonusApplied = false>> <<set _punkBonusCash = 0>> <<if $physicalTraits && $physicalTraits.includes("Punk")>> <<set _punkBonusCash = Math.floor(_totalCash * 0.5)>> <<set _totalCash = Math.floor(_totalCash * 1.5)>> <<set _punkBonusApplied = true>> <</if>> <!-- Remove traits from player --> <<for _i = 0; _i < $selectedTraitsToSell.length; _i++>> <<set _trait = $selectedTraitsToSell[_i]>> <<if _trait.type === "physical">> <<run $physicalTraits.delete(_trait.name)>> <<elseif _trait.type === "mental">> <<run $mentalTraits.delete(_trait.name)>> <<elseif _trait.type === "skill">> <<run $skills.delete(_trait.name)>> <</if>> <</for>> <!-- Unlock achievement for first trait sale --> <<if $selectedTraitsToSell.length > 0>> <<run setup.achievements.unlock("sell_trait")>> <</if>> <!-- Add cash --> <<set $money += _totalCash>> <!-- Update tracking --> <<set $roisinTraitsSoldValue += _totalValue>> <<set $roisinWeeklySoldValue += _totalValue>> <!-- Calculate relationship increase (1 point per 50 points sold) --> <<set _baseRelationshipIncrease = Math.floor(_totalValue / 50)>> <!-- ===== SKILL TREE: Apply relationship bonus ===== --> <<set _relationshipIncrease = _baseRelationshipIncrease>> <<if _sellRelationshipBonus > 0 && $selectedTraitsToSell.length > 0>> <<set _relationshipIncrease += _sellRelationshipBonus>> <</if>> <<if _relationshipIncrease > 0>> <<set _npc.relationship += _relationshipIncrease>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">✅ Sale Complete!</h1> </div> <!-- Sale Summary --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 15px 0;">💰 Transaction Summary</h3> <<if $selectedTraitsToSell.length > 0>> <p style="color: #ccc; margin: 5px 0;">Traits Sold: <<print $selectedTraitsToSell.length>></p> <p style="color: #ffc107; margin: 5px 0; font-size: 18px; font-weight: bold;">Total Points: _totalValue</p> <!-- Show breakdown if bonuses applied --> <<if _bonusCash > 0 || _weeklyBonusCash > 0>> <p style="color: #888; margin: 5px 0; font-size: 14px;">Base Cash: $<<print _baseCash>></p> <<if _bonusCash > 0>> <p style="color: #9C27B0; margin: 2px 0; font-size: 14px;">⭐ Value Bonus (+<<print _sellValueBonus>>%): +$<<print _bonusCash>></p> <</if>> <<if _weeklyBonusApplied>> <p style="color: #51cf66; margin: 2px 0; font-size: 14px;">⭐ Weekly Bonus (+<<print _sellWeeklyBonus>> pts): +$<<print _weeklyBonusCash>></p> <</if>> <<if _punkBonusApplied>> <p style="color: #ff6b9d; margin: 2px 0; font-size: 14px;">✓ Punk Bonus (1.5x): +$<<print _punkBonusCash>></p> <</if>> <</if>> <p style="color: #28a745; margin: 5px 0; font-size: 20px; font-weight: bold;">Cash Received: $<<print _totalCash>></p> <<if _relationshipIncrease > 0>> <p style="color: #e91e63; margin: 10px 0 0 0; font-size: 18px; font-weight: bold;"> 💕 Relationship with _npc.name increased by _relationshipIncrease! <<if _sellRelationshipBonus > 0 && _baseRelationshipIncrease < _relationshipIncrease>> <span style="color: #9C27B0; font-size: 14px;">(⭐ +<<print _sellRelationshipBonus>> from skill tree)</span> <</if>> </p> <</if>> <<else>> <p style="color: #888; margin: 0; font-style: italic;">No traits were sold.</p> <</if>> </div> <!-- Roisin's Response --> <<if $selectedTraitsToSell.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ccc; font-size: 18px; font-style: italic; margin: 0; text-align: center;"> <<if _totalValue >= 100>> "Now that's a proper deal! Pleasure doin' business with ye." <<elseif _totalValue >= 50>> "Not bad at all. I'll take what I can get." <<else>> "A small deal, but money's money, eh?" <</if>> </p> </div> <</if>> <!-- Continue Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<set $selectedTraitsToSell = []>> <<goto "NPCInteraction">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.95); padding: 30px; border-radius: 15px; max-width: 600px; margin: 50px auto; border: 3px solid #e040fb; box-shadow: 0 0 30px rgba(224, 64, 251, 0.3);"> <div style="text-align: center;"> <div style="font-size: 64px; margin-bottom: 20px;">🧬</div> <h1 style="color: #e040fb; margin: 0 0 20px 0;">Trait Storage Unlocked!</h1> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #7c4dff;"> <p style="color: #ccc; font-size: 16px; margin: 0 0 15px 0; line-height: 1.6;"> Róisín nods approvingly as the money changes hands. </p> <p style="color: #e040fb; font-size: 18px; margin: 0; font-style: italic;"> "Smart investment. Now you can store traits for later... very useful for someone in our line of work." </p> </div> <div style="background: linear-gradient(135deg, #2d1f3d 0%, #1a1a2a 100%); padding: 20px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #e040fb;"> <h3 style="color: #e040fb; margin: 0 0 15px 0;">What You Can Do:</h3> <ul style="color: #ccc; text-align: left; margin: 0; padding-left: 25px; line-height: 2;"> <li>Store positive traits from your body for safekeeping</li> <li>Retrieve stored traits when you want them back</li> <li>Access trait storage from your Inventory menu</li> </ul> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #e040fb 0%, #7c4dff 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<goto "NPCInteraction">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _npc = $tradingWithNPC>> <!-- Initialize tracking variable if needed --> <<if !$roisinTraitsSoldValue>> <<set $roisinTraitsSoldValue = 0>> <</if>> <!-- Initialize weekly tracking --> <<if !$roisinWeeklySoldValue>> <<set $roisinWeeklySoldValue = 0>> <</if>> <<if !$roisinLastWeekReset>> <<set $roisinLastWeekReset = $weekNumber || 0>> <</if>> <!-- Initialize weekly bonus tracking --> <<if !$sellWeeklyBonusUsed>> <<set $sellWeeklyBonusUsed = false>> <</if>> <!-- Reset weekly counter if new week --> <<if $weekNumber > $roisinLastWeekReset>> <<set $roisinWeeklySoldValue = 0>> <<set $roisinLastWeekReset = $weekNumber>> <<set $sellWeeklyBonusUsed = false>> <</if>> <!-- ===== SKILL TREE: Get bonuses for display ===== --> <<set _sellValueBonus = setup.skillTree.getEffect("sellValueBonus")>> <<set _sellWeeklyBonus = setup.skillTree.getEffect("sellWeeklyBonus")>> <<set _sellRelationshipBonus = setup.skillTree.getEffect("sellRelationshipBonus")>> <!-- Check if player is lifeswapped (not in original body) --> <<if $lifeSwapPortraitSource && $lifeSwapPortraitSource !== "player">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #9C27B0;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">🔄 Wrong Body</h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9C27B0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #CE93D8; font-size: 20px; font-weight: bold; margin: 0 0 15px 0; text-align: center;"> Roisin squints at you suspiciously. </p> <p style="color: #ccc; font-size: 18px; font-style: italic; margin: 0; text-align: center;"> "Hold on a feckin' minute... Ye're not in yer own body, are ye? I can smell it on ye. Come back when ye're yerself again - I don't deal in stolen goods, and sellin' someone else's traits counts as thievery in me book." </p> </div> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>↠Back</div>">> <<set $selectedTraitsToSell = []>> <<goto "NPCInteraction">> <</link>> </div> </div> <<else>> <!-- Check if player is a bimbo --> <<if $mentalTraits && $mentalTraits.includes("Bimbo")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #dc3545 0%, #c82333 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #dc3545;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">🚫 No Deal</h1> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #dc3545; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #ff6b6b; font-size: 20px; font-weight: bold; margin: 0 0 15px 0; text-align: center;"> Roisin looks you up and down with disgust. </p> <p style="color: #ccc; font-size: 18px; font-style: italic; margin: 0; text-align: center;"> "I don't do business with stupid fuckin' bimbos, ye hear? Now piss off before I lose me patience entirely." </p> </div> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<set $selectedTraitsToSell = []>> <<goto "NPCInteraction">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">💰 Sell Traits to _npc.name</h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center; font-style: italic;"> "Right then, I'll pay ye for any trait yer willin' to part with. Cash up front, no questions asked." </p> </div> <!-- Info Box --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">ℹ️ How This Works</h3> <p style="color: #ccc; margin: 5px 0;">• Select traits to sell for cash</p> <p style="color: #ccc; margin: 5px 0;">• Cannot sell worthless or certain traits</p> <p style="color: #ccc; margin: 5px 0;">• Base rate: 3x trait value in cash</p> <p style="color: #ffc107; margin: 10px 0 0 0; font-weight: bold;">Total Sold This Week: $roisinWeeklySoldValue points</p> </div> <!-- ===== SKILL TREE: Bonus Display ===== --> <<if _sellValueBonus > 0 || _sellWeeklyBonus > 0 || _sellRelationshipBonus > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #9C27B0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #CE93D8; margin: 0 0 10px 0;">⭐ Skill Tree Bonuses Active</h3> <<if _sellValueBonus > 0>> <p style="color: #CE93D8; margin: 5px 0;">• +<<print _sellValueBonus>>% bonus cash on all sales</p> <</if>> <<if _sellWeeklyBonus > 0>> <<if !$sellWeeklyBonusUsed>> <p style="color: #51cf66; margin: 5px 0;">• +<<print _sellWeeklyBonus>> bonus points on first sale this week (AVAILABLE!)</p> <<else>> <p style="color: #888; margin: 5px 0;">• +<<print _sellWeeklyBonus>> bonus points on first sale this week (already claimed)</p> <</if>> <</if>> <<if _sellRelationshipBonus > 0>> <p style="color: #CE93D8; margin: 5px 0;">• +<<print _sellRelationshipBonus>> extra relationship per sale</p> <</if>> </div> <</if>> <!-- Selected Traits to Sell --> <<if !$selectedTraitsToSell>> <<set $selectedTraitsToSell = []>> <</if>> <<set _totalValue = 0>> <<set _baseCash = 0>> <<for _i = 0; _i < $selectedTraitsToSell.length; _i++>> <<set _totalValue += $selectedTraitsToSell[_i].value>> <<set _baseCash += ($selectedTraitsToSell[_i].value * 3)>> <</for>> <!-- ===== SKILL TREE: Apply sell value bonus ===== --> <<set _bonusMultiplier = 1 + (_sellValueBonus / 100)>> <<set _totalCash = Math.floor(_baseCash * _bonusMultiplier)>> <<set _bonusCash = _totalCash - _baseCash>> <!-- ===== SKILL TREE: Apply weekly bonus if available ===== --> <<set _weeklyBonusCash = 0>> <<if _sellWeeklyBonus > 0 && !$sellWeeklyBonusUsed && $selectedTraitsToSell.length > 0>> <<set _weeklyBonusCash = _sellWeeklyBonus * 3>> <<set _totalCash += _weeklyBonusCash>> <</if>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 15px 0;">📦 Selected Traits to Sell</h3> <<if $selectedTraitsToSell.length === 0>> <p style="color: #888; margin: 0; font-style: italic;">None selected yet, c'mon then...</p> <<else>> <<for _i = 0; _i < $selectedTraitsToSell.length; _i++>> <<capture _i>> <<set _trait = $selectedTraitsToSell[_i]>> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; border: 2px solid #28a745;"> <span style="color: #51cf66;">_trait.name (_trait.value pts = $<<print _trait.value * 3>>)</span> <<link "<span style='color: #ff6b6b; cursor: pointer; font-weight: bold;'>✖ Remove</span>">> <<run $selectedTraitsToSell.deleteAt(_i)>> <<goto "SellTraits">> <</link>> </div> <</capture>> <</for>> <div style="margin-top: 15px; padding: 15px; background: #1a1a1a; border-radius: 6px; border: 2px solid #ffc107;"> <p style="color: #ffc107; margin: 0; font-size: 18px; font-weight: bold;">Total Points: _totalValue</p> <<if _bonusCash > 0 || _weeklyBonusCash > 0>> <p style="color: #888; margin: 5px 0 0 0; font-size: 14px;">Base Cash: $<<print _baseCash>></p> <<if _bonusCash > 0>> <p style="color: #9C27B0; margin: 2px 0 0 0; font-size: 14px;">⭐ Value Bonus (+<<print _sellValueBonus>>%): +$<<print _bonusCash>></p> <</if>> <<if _weeklyBonusCash > 0>> <p style="color: #51cf66; margin: 2px 0 0 0; font-size: 14px;">⭐ Weekly Bonus (+<<print _sellWeeklyBonus>> pts): +$<<print _weeklyBonusCash>></p> <</if>> <</if>> <p style="color: #28a745; margin: 5px 0 0 0; font-size: 20px; font-weight: bold;">Total Cash: $<<print _totalCash>></p> </div> <</if>> </div> <!-- Available Traits --> <<set _availableTraits = []>> <!-- Get all player traits --> <<set _physicalTraits = $physicalTraits || []>> <<set _mentalTraits = $mentalTraits || []>> <<set _skills = $skills || []>> <!-- Stereotypes and forbidden traits --> <<set _forbiddenTraits = ["Bimbo", "Sunfish", "Short Hair", "Long Hair", "Awkward", "Bookworm", "Corrupt", "Cynical", "Flirty", "Introverted", "Kind", "Loyal", "Musky", "Negotiator", "Nonchalant", "Paranoid", "Quiet", "Shy", "Tease", "Tone Deaf", "Unlucky", "Unpredictable", "Unskilled", "Blemished", "Clumsy", "Definitely not a Vampire", "Monotone Expression", "Overweight", "Petite", "Plain", "Short", "Slow", "Soft", "Stiff", "Ugly", "Underweight", "Voluptuous", "Weak"]>> <!-- Add physical traits --> <<for _i = 0; _i < _physicalTraits.length; _i++>> <<set _trait = _physicalTraits[_i]>> <<set _value = setup.getTraitValue("physical", _trait)>> <<if !_forbiddenTraits.includes(_trait) && _value && _value > 0>> <<set _availableTraits.push({name: _trait, type: "physical", value: _value})>> <</if>> <</for>> <!-- Add mental traits --> <<for _i = 0; _i < _mentalTraits.length; _i++>> <<set _trait = _mentalTraits[_i]>> <<set _value = setup.getTraitValue("mental", _trait)>> <<if !_forbiddenTraits.includes(_trait) && _value && _value > 0>> <<set _availableTraits.push({name: _trait, type: "mental", value: _value})>> <</if>> <</for>> <!-- Add skills --> <<for _i = 0; _i < _skills.length; _i++>> <<set _trait = _skills[_i]>> <<set _value = setup.getTraitValue("skill", _trait)>> <<if !_forbiddenTraits.includes(_trait) && _value && _value > 0>> <<set _availableTraits.push({name: _trait, type: "skill", value: _value})>> <</if>> <</for>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 3px solid #667eea; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #667eea; margin: 0 0 15px 0;">📋 Available Traits to Sell</h3> <<if _availableTraits.length === 0>> <p style="color: #888; margin: 0; font-style: italic;">"Nothin' worth sellin', eh? Shame, that."</p> <<else>> <div style="max-height: 400px; overflow-y: auto;"> <<for _i = 0; _i < _availableTraits.length; _i++>> <<set _trait = _availableTraits[_i]>> <<set _alreadySelected = false>> <<for _j = 0; _j < $selectedTraitsToSell.length; _j++>> <<if $selectedTraitsToSell[_j].name === _trait.name>> <<set _alreadySelected = true>> <</if>> <</for>> <<if !_alreadySelected>> <<capture _trait>> <div style="background: #1a1a1a; padding: 12px; border-radius: 6px; margin-bottom: 8px; display: flex; justify-content: space-between; align-items: center; border: 2px solid #667eea;"> <span style="color: #a5b4fc;">_trait.name (_trait.value pts = $<<print _trait.value * 3>>)</span> <<link "<span style='color: #28a745; cursor: pointer; font-weight: bold;'>✚ Add</span>">> <<run $selectedTraitsToSell.push(_trait)>> <<goto "SellTraits">> <</link>> </div> <</capture>> <</if>> <</for>> </div> <</if>> </div> <!-- Sell Button --> <<if $selectedTraitsToSell.length > 0>> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); color: white; padding: 20px 40px; border-radius: 12px; font-weight: bold; font-size: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(40, 167, 69, 0.3);'>💰 Complete Sale ($<<print _totalCash>>)</div>">> <<goto "SellTraitsComplete">> <</link>> </div> <</if>> <!-- Back Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<set $selectedTraitsToSell = []>> <<goto "NPCInteraction">> <</link>> </div> </div> <</if>> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "BeautySalonJobOffer">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e91e63; text-align: center;">💼 Job Opportunity</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 16px; margin: 0;"> The salon manager looks impressed with your credentials. "We'd love to have you join our team! As a stylist here, you'll earn $18 per hour. You can work shifts between 9 AM and 6 PM, up to 8 hours per day. Plus, you'll get free hair services while you work here. What do you say?" </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Accept Job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin-top: 0;">✅ Accept Job</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Become a Beauty Salon Stylist.</p> <<if $jobs && $jobs.includes("Criminal")>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I'll take it!\"</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "jobApplication">> <<goto "CaughtByPolice">> <</link>> <<else>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I'll take it!\"</div>">> <<set $jobs = ["Beauty Salon Stylist"]>> <<set $homeless = false>> <<goto "BeautySalonJobAccepted">> <</link>> <</if>> </div> <!-- Decline Job --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin-top: 0;">❌ Decline</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Politely decline the offer.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"Not right now\"</div>">> <<goto "BeautySalon">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BeautySalonJobAccepted">> <!-- Achievement for getting hired --> <<run setup.achievements.unlock("get_hired")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">✅ Job Accepted!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-align: center; font-weight: bold;"> Welcome to Angelfish Beauty Salon! </p> <p style="color: white; font-size: 16px; margin: 0;"> "Excellent! Welcome aboard. You can start working whenever you're ready. Just come by during business hours and clock in for your shift. Looking forward to working with you!" </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0;">📋 Job Details</h3> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Position:</strong> Beauty Salon Stylist</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Pay:</strong> $18 per hour</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Hours:</strong> 9 AM - 6 PM</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Max Daily:</strong> 8 hours</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Benefits:</strong> Free hair services</p> </div> <<link "<div style='background: #28a745; color: white; padding: 15px 40px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); margin: 0 auto; display: inline-block;'>Continue</div>">> <<goto "BeautySalon">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "DocksJobOffer">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #3498db; text-align: center;">💼 Job Opportunity</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 16px; margin: 0;"> The dock foreman looks you up and down, then nods approvingly. "You look like you can handle the work. We need strong backs down here loading cargo. Pay is $23 per hour. Shifts run from 6 AM to 10 PM, and you can work up to 8 hours a day. It's hard work, but honest pay. You in?" </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Accept Job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin-top: 0;">✅ Accept Job</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Become a Dock Worker.</p> <<if $jobs && $jobs.includes("Criminal")>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I'll take it!\"</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "jobApplication">> <<goto "CaughtByPolice">> <</link>> <<else>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I'll take it!\"</div>">> <<set $jobs = ["Dock Worker"]>> <<set $homeless = false>> <<goto "DocksJobAccepted">> <</link>> <</if>> </div> <!-- Decline Job --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin-top: 0;">❌ Decline</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Politely decline the offer.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"Not right now\"</div>">> <<goto "Docks">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "DocksJobAccepted">> <!-- Achievement for getting hired --> <<run setup.achievements.unlock("get_hired")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">✅ Job Accepted!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #28a745 0%, #20c997 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-align: center; font-weight: bold;"> Welcome to the Docks! </p> <p style="color: white; font-size: 16px; margin: 0;"> "Good! Report to the loading bay whenever you're ready to work. Just remember - we work hard down here, so keep up or get out. See you on the docks." </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0;">📋 Job Details</h3> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Position:</strong> Dock Worker</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Pay:</strong> $23 per hour</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Hours:</strong> 6 AM - 10 PM</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #28a745;">Max Daily:</strong> 8 hours</p> </div> <<link "<div style='background: #28a745; color: white; padding: 15px 40px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); margin: 0 auto; display: inline-block;'>Continue</div>">> <<goto "Docks">> <</link>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BrothelJobOffer">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #007FFF; text-align: center;">💼 Job Opportunity</h1> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 16px; margin: 0;"> The madam looks you over with an appraising eye, then smiles. "You have the grace and charm we look for here at the Azure Angelfish Lounge. This is a high-end establishment - our clients expect discretion, sophistication, and skill. The work is demanding but the compensation is excellent. Are you interested in joining our team?" </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-top: 20px;"> <!-- Accept Job --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin-top: 0;">✅ Accept Position</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Become a Brothel Worker.</p> <<if $jobs && $jobs.includes("Criminal")>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I accept\"</div>">> <<set $arrestedAtStation = true>> <<set $arrestType = "jobApplication">> <<goto "CaughtByPolice">> <</link>> <<else>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"I accept\"</div>">> <<set $jobs = ["Brothel Worker"]>> <<set $homeless = false>> <<goto "BrothelJobAccepted">> <</link>> <</if>> </div> <!-- Decline Job --> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e74c3c; margin-top: 0;">❌ Decline</h3> <p style="font-size: 14px; color: #aaa; flex-grow: 1;">Politely decline the offer.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>\"Not at this time\"</div>">> <<goto "Brothel">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BrothelJobAccepted">> <!-- Achievement for getting hired --> <<run setup.achievements.unlock("get_hired")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">✅ Position Accepted!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #007FFF 0%, #0059b3 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #007FFF;"> <p style="color: white; font-size: 18px; margin: 0 0 15px 0; text-align: center; font-weight: bold;"> Welcome to the Azure Angelfish Lounge </p> <p style="color: white; font-size: 16px; margin: 0;"> "Excellent. You'll start at our professional level and work your way up as you gain experience. Remember - discretion, charm, and skill are what set us apart from other establishments. Make yourself comfortable, and when you're ready, we'll introduce you to your first client." </p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 15px 0;">📋 Position Details</h3> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #007FFF;">Position:</strong> Brothel Worker</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #007FFF;">Establishment:</strong> High-end luxury lounge</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #007FFF;">Pay:</strong> Performance-based + tips</p> <p style="color: #ccc; margin: 5px 0;"><strong style="color: #007FFF;">Benefits:</strong> Level progression system</p> </div> <<link "<div style='background: #007FFF; color: white; padding: 15px 40px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); margin: 0 auto; display: inline-block;'>Continue</div>">> <<goto "Brothel">> <</link>> </div> <</nobr>>
<<nobr>> <<set _result = setup.spinRoulette($rouletteBetType, $rouletteBetValue, $currentBetAmount)>> <<advancetime 5>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center; text-shadow: 0 0 20px #ffd700;">🎡 The Wheel Spins...</h1> <div style="padding: 20px; background: linear-gradient(135deg, #0f4c3a 0%, #1a5c4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(46, 204, 113, 0.3);"> <p style="color: #a8e6cf; font-size: 18px; margin: 0; text-align: center;"> The dealer releases the ball... it bounces and rattles around the spinning wheel... </p> </div> <!-- Spinning Animation Section --> <div style="padding: 40px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid <<if _result.won>>#51cf66<<else>>#c62828<</if>>; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px <<if _result.won>>rgba(81, 207, 102, 0.5)<<else>>rgba(198, 40, 40, 0.5)<</if>>;"> <div style="text-align: center;"> <!-- Winning Number Display --> <div style="display: inline-block; background: <<if _result.winningColor === 'green'>>linear-gradient(135deg, #2ecc71 0%, #1b7943 100%)<<elseif _result.winningColor === 'red'>>linear-gradient(135deg, #c62828 0%, #8b0000 100%)<<else>>linear-gradient(135deg, #1a1a1a 0%, #000000 100%)<</if>>; padding: 30px; border-radius: 50%; margin: 20px 0; box-shadow: 0 0 40px <<if _result.winningColor === 'green'>>rgba(46, 204, 113, 0.8)<<elseif _result.winningColor === 'red'>>rgba(198, 40, 40, 0.8)<<else>>rgba(26, 26, 26, 0.8)<</if>>; border: 5px solid #ffd700;"> <p style="color: white; font-size: 72px; font-weight: bold; margin: 0; text-shadow: 0 0 20px rgba(0,0,0,0.8);"> _result.winningNumber </p> </div> <p style="color: #ffd700; font-size: 24px; font-weight: bold; margin: 20px 0 0 0; text-transform: uppercase; text-shadow: 0 0 15px #ffd700;"> <<if _result.winningColor === "green">>🟢 Green<<elseif _result.winningColor === "red">>🔴 Red<<else>>⚫ Black<</if>> </p> </div> </div> <!-- Result Section --> <<if _result.won>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px rgba(81, 207, 102, 0.5);"> <h2 style="color: #51cf66; text-align: center; margin: 0 0 20px 0; font-size: 32px; text-shadow: 0 0 20px #51cf66;">🎉 WINNER! 🎉</h2> <div style="text-align: center;"> <p style="color: #a8e6cf; font-size: 20px; margin: 0 0 15px 0;"> Your bet: <b style="color: #ffd700;"><<if $rouletteBetType === "color">><<print $rouletteBetValue.toUpperCase()>><<else>>Number _result.winningNumber<</if>></b> </p> <p style="color: #a8e6cf; font-size: 20px; margin: 0 0 15px 0;"> Wagered: <b style="color: #ffd700;">$<<print $currentBetAmount.toLocaleString()>></b> </p> <<if _result.pearlBonus && _result.pearlBonus > 0>> <p style="color: #51cf66; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #51cf66;"> Won: $<<print (_result.payout + _result.pearlBonus).toLocaleString()>> </p> <p style="color: #a8e6cf; font-size: 16px; margin: 5px 0 0 0; font-style: italic;"> ($<<print _result.payout.toLocaleString()>> base + $<<print _result.pearlBonus.toLocaleString()>> Pearl bonus) </p> <<else>> <p style="color: #51cf66; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #51cf66;"> Won: $<<print _result.payout.toLocaleString()>> </p> <</if>> <<if $rouletteBetType === "number">> <p style="color: #a8e6cf; font-size: 16px; margin: 15px 0 0 0; font-style: italic;"> (35:1 payout - Incredible luck!) </p> <<else>> <p style="color: #a8e6cf; font-size: 16px; margin: 15px 0 0 0; font-style: italic;"> (2:1 payout - Nice win!) </p> <</if>> <<if _result.luckyBoost>> <div style="background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); padding: 12px; border-radius: 6px; margin-top: 15px; border: 2px solid #ffd700; box-shadow: 0 0 15px rgba(255, 215, 0, 0.5);"> <p style="color: #000; font-size: 15px; font-weight: bold; margin: 0;"> ✨ Your Lucky trait turned the odds in your favor! ✨ </p> </div> <</if>> <<if _result.pearlBonus && _result.pearlBonus > 0>> <div style="background: linear-gradient(135deg, #f5f5f5 0%, #e0e0e0 100%); padding: 12px; border-radius: 6px; margin-top: 15px; border: 2px solid #f5f5f5; box-shadow: 0 0 15px rgba(245, 245, 245, 0.5);"> <p style="color: #333; font-size: 15px; font-weight: bold; margin: 0;"> 🔮 Pearl of Abundance grants +$<<print _result.pearlBonus.toLocaleString()>> bonus! 🔮 </p> <p style="color: #666; font-size: 13px; margin: 5px 0 0 0; font-style: italic;"> (This bonus doesn't count toward your limit) </p> </div> <</if>> </div> <<if _result.kickedOut>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 8px; margin-top: 25px; border: 3px solid #c62828; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(198, 40, 40, 0.5);"> <p style="color: #c62828; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-align: center; text-shadow: 0 0 10px #c62828;"> ⚠️ CASINO SECURITY NOTICE ⚠️ </p> <p style="color: #ffcdd2; font-size: 16px; margin: 0; text-align: center;"> You've won $50,000 at roulette. The casino has asked you to take a break. Come back in 30 days! </p> </div> <</if>> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #c62828; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px rgba(198, 40, 40, 0.5);"> <h2 style="color: #c62828; text-align: center; margin: 0 0 20px 0; font-size: 32px; text-shadow: 0 0 20px #c62828;">❌ Better Luck Next Time</h2> <div style="text-align: center;"> <p style="color: #ffcdd2; font-size: 20px; margin: 0 0 15px 0;"> Your bet: <b style="color: #ffd700;"><<if $rouletteBetType === "color">><<print $rouletteBetValue.toUpperCase()>><<else>>Number <<print $rouletteBetValue>><</if>></b> </p> <p style="color: #ffcdd2; font-size: 20px; margin: 0 0 15px 0;"> Winning result: <b style="color: #ffd700;"><<if _result.winningColor === "green">>🟢 GREEN<<elseif _result.winningColor === "red">>🔴 RED<<else>>⚫ BLACK<</if>> (_result.winningNumber)</b> </p> <p style="color: #c62828; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #c62828;"> Lost: $<<print $currentBetAmount.toLocaleString()>> </p> <p style="color: #ffcdd2; font-size: 16px; margin: 15px 0 0 0; font-style: italic;"> The house always wins... eventually. </p> <<if _result.unluckyCurse>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 12px; border-radius: 6px; margin-top: 15px; border: 2px solid #c62828; box-shadow: 0 0 15px rgba(198, 40, 40, 0.5);"> <p style="color: #ff6b6b; font-size: 15px; font-weight: bold; margin: 0;"> 💀 Your Unlucky trait cursed what should have been a win! 💀 </p> </div> <</if>> </div> </div> <</if>> <!-- Current Status --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <h3 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">Your Current Status</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="text-align: center;"> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Available Cash</p> </div> <div style="text-align: center;"> <p style="color: <<if $rouletteSystem.periodWinnings >= 50000>>#c62828<<elseif $rouletteSystem.periodWinnings >= 25000>>#f39c12<<else>>#51cf66<</if>>; font-size: 24px; font-weight: bold; margin: 0;">$<<print $rouletteSystem.periodWinnings.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Period Winnings</p> </div> <div style="text-align: center;"> <p style="color: #ffd43b; font-size: 24px; font-weight: bold; margin: 0;">$<<print (50000 - $rouletteSystem.periodWinnings).toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Until 30-Day Ban</p> </div> </div> </div> <!-- Action Buttons --> <div style="text-align: center;"> <<if _result.kickedOut>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #c62828; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #c6282844; margin: 10px;'>🚫 Leave Casino (Banned for 30 Days)</div>">> <<set $currentBetAmount = null>> <<set $forcedGambling = false>> <<goto "Casino">> <</link>> <<elseif $forcedGambling>> <!-- Forced Gambling Mode --> <<if _result.won>> <!-- Won - can leave now --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0; font-weight: bold;"> ✓ You won! Your compulsion is satisfied... for now. </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #51cf6644; margin: 10px;'>← Leave Casino</div>">> <<set $currentBetAmount = null>> <<set $forcedGambling = false>> <<goto "Casino">> <</link>> <<elseif $money < 100>> <!-- Lost everything - forced to leave --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #c62828;"> <p style="color: #c62828; font-size: 16px; margin: 0; font-weight: bold;"> You don't have enough for the minimum bet... Security escorts you out. </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #c62828; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #c6282844; margin: 10px;'>← Leave Casino (Broke)</div>">> <<set $currentBetAmount = null>> <<set $forcedGambling = false>> <<goto "RedLightDistrict">> <</link>> <<else>> <!-- Lost but still have money - must continue --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-size: 16px; margin: 0; font-weight: bold;"> The addiction grips you... You can't leave until you win or go broke! </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #ff6b6b44; margin: 10px;'>🎡 Bet Again (Compelled)</div>">> <<goto "RouletteRoom">> <</link>> <</if>> <<else>> <!-- Normal Mode --> <<if $money >= 100>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #51cf6644; margin: 10px;'>🎰 Bet Again</div>">> <<goto "RouletteRoom">> <</link>> <</if>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44; margin: 10px;'>← Leave Table</div>">> <<set $currentBetAmount = null>> <<goto "Casino">> <</link>> <</if>> </div> </div> <</nobr>>
/* ========================================== * CASINO ROULETTE SYSTEM * ==========================================*/ <<set $rouletteSystem = { periodWinnings: 0, lockoutStartDay: 0, kickedOut: false, lastBetAmount: 0, lastBetType: "", lastBetValue: null }>> /* Check and reset roulette winnings after 30 days */ <<set setup.checkRouletteReset = function() { var v = State.variables; // Only check if currently kicked out if (v.rouletteSystem.kickedOut && v.rouletteSystem.lockoutStartDay > 0) { var daysSinceLockout = v.dayNumber - v.rouletteSystem.lockoutStartDay; if (daysSinceLockout >= 30) { console.log("Resetting roulette winnings - 30 days have passed since lockout"); v.rouletteSystem.periodWinnings = 0; v.rouletteSystem.kickedOut = false; v.rouletteSystem.lockoutStartDay = 0; } } }>> /* Legacy function for compatibility - now just calls checkRouletteReset */ <<set setup.resetRouletteWeeklyWinnings = function() { setup.checkRouletteReset(); }>> /* Check if player can access roulette */ <<set setup.canPlayRoulette = function() { var v = State.variables; // First check if 30 days have passed since lockout setup.checkRouletteReset(); // Check if kicked out (banned for 30 days after hitting $50k) if (v.rouletteSystem.kickedOut) { var daysRemaining = 30 - (v.dayNumber - v.rouletteSystem.lockoutStartDay); if (daysRemaining < 0) daysRemaining = 0; return { canPlay: false, reason: "You've won $50,000 at roulette. The casino has asked you to take a break. Come back in " + daysRemaining + " day" + (daysRemaining === 1 ? "" : "s") + "." }; } // Check winnings limit ($50,000) if (v.rouletteSystem.periodWinnings >= 50000) { // Start the 30-day timer now v.rouletteSystem.kickedOut = true; v.rouletteSystem.lockoutStartDay = v.dayNumber; return { canPlay: false, reason: "You've won $50,000 at roulette. The casino has asked you to take a break. Come back in 30 days." }; } return { canPlay: true }; }>> /* Spin the roulette wheel */ <<set setup.spinRoulette = function(betType, betValue, betAmount) { var v = State.variables; // Check for Lucky/Unlucky traits var hasLucky = v.mentalTraits && v.mentalTraits.includes("Lucky"); var hasUnlucky = v.mentalTraits && v.mentalTraits.includes("Unlucky"); // Generate winning number (0-36) var winningNumber = random(0, 36); // Determine color (0 is green, odd is red, even is black) var winningColor; if (winningNumber === 0) { winningColor = "green"; } else if (winningNumber % 2 === 1) { winningColor = "red"; } else { winningColor = "black"; } // Store bet info v.rouletteSystem.lastBetAmount = betAmount; v.rouletteSystem.lastBetType = betType; v.rouletteSystem.lastBetValue = betValue; // Calculate win/loss with trait modifiers var won = false; var payout = 0; var naturalWin = false; // Did they naturally win? if (betType === "number") { naturalWin = (winningNumber === betValue); // Base probability: 2.7% (1 in 37) // Lucky: +10% = 12.7% chance // Unlucky: -10% = 0% chance (can't win) if (naturalWin) { won = true; } else if (hasLucky) { // Lucky trait gives 10% additional chance to force a win var luckyRoll = random(1, 100); if (luckyRoll <= 10) { won = true; winningNumber = betValue; // Force the number to match // Update color to match if (winningNumber === 0) { winningColor = "green"; } else if (winningNumber % 2 === 1) { winningColor = "red"; } else { winningColor = "black"; } } } // Unlucky trait: 10% chance to force a loss even if they won if (won && hasUnlucky) { var unluckyRoll = random(1, 100); if (unluckyRoll <= 10) { won = false; // Pick a different random number var newNumber = random(0, 36); while (newNumber === betValue) { newNumber = random(0, 36); } winningNumber = newNumber; // Update color if (winningNumber === 0) { winningColor = "green"; } else if (winningNumber % 2 === 1) { winningColor = "red"; } else { winningColor = "black"; } } } if (won) { payout = betAmount * 35; // 35:1 payout } } else if (betType === "color") { naturalWin = (winningColor === betValue); // Base probability: ~48.6% (18 in 37) // Lucky: +10% = 58.6% chance // Unlucky: -10% = 38.6% chance if (naturalWin) { won = true; } else if (hasLucky) { // Lucky trait gives 10% additional chance to force a win var luckyRoll = random(1, 100); if (luckyRoll <= 10) { won = true; winningColor = betValue; // Force the color to match // Pick a random number of that color var validNumbers = []; for (var i = 1; i <= 36; i++) { var checkColor = (i % 2 === 1) ? "red" : "black"; if (checkColor === betValue) { validNumbers.push(i); } } if (validNumbers.length > 0) { winningNumber = validNumbers[random(0, validNumbers.length - 1)]; } } } // Unlucky trait: 10% chance to force a loss even if they won if (won && hasUnlucky) { var unluckyRoll = random(1, 100); if (unluckyRoll <= 10) { won = false; // Force opposite color or green var oppositeColor = (betValue === "red") ? "black" : "red"; var greenOrOpposite = random(1, 100); if (greenOrOpposite <= 5) { winningNumber = 0; winningColor = "green"; } else { // Pick random number of opposite color var validNumbers = []; for (var i = 1; i <= 36; i++) { var checkColor = (i % 2 === 1) ? "red" : "black"; if (checkColor === oppositeColor) { validNumbers.push(i); } } winningNumber = validNumbers[random(0, validNumbers.length - 1)]; winningColor = oppositeColor; } } } if (won) { payout = betAmount * 2; // 1:1 payout (double money) } } // Process result if (won) { v.money += payout; var profit = payout - betAmount; // Net profit from this win v.rouletteSystem.periodWinnings += profit; // Only base profit counts toward limit // Pearl of Abundance bonus: +50% extra money (doesn't count toward limit) var pearlBonus = 0; var hasPearl = (v.currentArtifact === "The Pearl of Abundance"); if (hasPearl) { pearlBonus = Math.floor(profit * 0.5); // 50% bonus on profit v.money += pearlBonus; // Add bonus to money WITHOUT adding to period limit } // Check if player needs to be kicked out ($50k period winnings) if (v.rouletteSystem.periodWinnings >= 50000) { v.rouletteSystem.kickedOut = true; v.rouletteSystem.lockoutStartDay = v.dayNumber; // Start 30-day timer } } else { v.money -= betAmount; } return { won: won, winningNumber: winningNumber, winningColor: winningColor, payout: payout, kickedOut: (v.rouletteSystem.periodWinnings >= 50000), luckyBoost: (hasLucky && won && !naturalWin), unluckyCurse: (hasUnlucky && !won && naturalWin), pearlBonus: pearlBonus }; }>>
/* ========================================== * SLOT MACHINE SYSTEM * ==========================================*/ <<set $slotMachineSystem = { totalPlays: 0, lastResult: null }>> /* Slot machine spin function with trait and Pearl modifiers */ <<set setup.spinSlotMachine = function() { var v = State.variables; // Track plays for gambling addiction v.slotMachineSystem.totalPlays++; // Check for traits var hasLucky = v.mentalTraits && v.mentalTraits.includes("Lucky"); var hasUnlucky = v.mentalTraits && v.mentalTraits.includes("Unlucky"); var hasPearl = (v.currentArtifact === "The Pearl of Abundance"); // ===== SKILL TREE: Get gambling bonuses ===== var slotsWinBonus = 0; var slotsPayoutBonus = 0; if (typeof setup.skillTree !== "undefined" && typeof setup.skillTree.getEffect === "function") { slotsWinBonus = setup.skillTree.getEffect("slotsWinBonus") || 0; slotsPayoutBonus = setup.skillTree.getEffect("slotsPayoutBonus") || 0; } // Check if player is in beginner phase (first 25 rolls) var isBeginnerPhase = (v.slotMachineSystem.totalPlays <= 25); // Define base odds var odds = {}; if (isBeginnerPhase) { // BEGINNER ODDS: More favorable for first 25 spins odds = { nothing: 61.945, // Decreased by 30 percentage points win100: 27.945, // Increased by 22 percentage points win250: 8, // Increased by 7 percentage points win1000: 2, // Increased by 1 percentage point win10000: 0.1, win1000000: 0.01 }; } else { // NORMAL ODDS: Standard house edge odds = { nothing: 91.945, win100: 5.945, win250: 1, win1000: 1, win10000: 0.1, win1000000: 0.01 }; } // Lucky trait: -10% nothing, +10% to $100 if (hasLucky) { odds.nothing = odds.nothing - 10; odds.win100 = odds.win100 + 10; } // Unlucky trait: different odds structure if (hasUnlucky) { if (isBeginnerPhase) { // Even with unlucky, beginner phase is slightly better than normal odds.nothing = 75.89; odds.win100 = 17; odds.win250 = 5; odds.win1000 = 2; odds.win10000 = 0.1; odds.win1000000 = 0.01; } else { // Normal unlucky odds odds.nothing = 95.89; odds.win100 = 3; odds.win250 = 1; odds.win1000 = 0.1; odds.win10000 = 0.01; odds.win1000000 = 0; } } // ===== SKILL TREE: Apply win bonus (reduce nothing chance, boost wins) ===== if (slotsWinBonus > 0) { // Each 1% bonus reduces "nothing" by 1% and distributes to wins odds.nothing = Math.max(50, odds.nothing - slotsWinBonus); odds.win100 = odds.win100 + (slotsWinBonus * 0.6); // 60% to $100 odds.win250 = odds.win250 + (slotsWinBonus * 0.25); // 25% to $250 odds.win1000 = odds.win1000 + (slotsWinBonus * 0.1); // 10% to $1000 odds.win10000 = odds.win10000 + (slotsWinBonus * 0.04); // 4% to $10000 odds.win1000000 = odds.win1000000 + (slotsWinBonus * 0.01); // 1% to jackpot } // Roll for result var roll = Math.random() * 100; var payout = 0; var symbols = []; // Determine outcome if (roll < odds.win1000000) { payout = 1000000; symbols = ["💎", "💎", "💎"]; } else if (roll < odds.win1000000 + odds.win10000) { payout = 10000; symbols = ["👑", "👑", "👑"]; } else if (roll < odds.win1000000 + odds.win10000 + odds.win1000) { payout = 1000; symbols = ["🍀", "🍀", "🍀"]; } else if (roll < odds.win1000000 + odds.win10000 + odds.win1000 + odds.win250) { payout = 250; symbols = ["🎰", "🎰", "🎰"]; } else if (roll < 100 - odds.nothing) { payout = 100; symbols = ["🍒", "🍒", "🍒"]; } else { payout = 0; // Random losing combination var allSymbols = ["🍒", "🍋", "🍊", "🍇", "⭐", "7️⃣"]; symbols = [ allSymbols[random(0, allSymbols.length - 1)], allSymbols[random(0, allSymbols.length - 1)], allSymbols[random(0, allSymbols.length - 1)] ]; // Make sure they don't all match while (symbols[0] === symbols[1] && symbols[1] === symbols[2]) { symbols[2] = allSymbols[random(0, allSymbols.length - 1)]; } } // ===== SKILL TREE: Apply payout bonus ===== var skillTreePayoutBonus = 0; if (slotsPayoutBonus > 0 && payout > 0) { skillTreePayoutBonus = Math.floor(payout * (slotsPayoutBonus / 100)); } // Apply Pearl of Abundance bonus (on base payout only) var pearlBonus = 0; if (hasPearl && payout > 0) { pearlBonus = Math.floor(payout * 0.5); // 50% bonus } // Calculate total winnings var totalWon = payout + skillTreePayoutBonus + pearlBonus; // Add winnings to money if (totalWon > 0) { v.money += totalWon; } // Deduct cost (with casino staff discount if applicable) var slotCost = setup.getSlotCost(); v.money -= slotCost; // Check for gambling addiction (25+ plays) var gainedAddiction = false; if (v.slotMachineSystem.totalPlays >= 25 && v.mentalTraits && !v.mentalTraits.includes("Gambling Addiction")) { v.mentalTraits.push("Gambling Addiction"); gainedAddiction = true; } // Store result v.slotMachineSystem.lastResult = { symbols: symbols, payout: payout, skillTreePayoutBonus: skillTreePayoutBonus, pearlBonus: pearlBonus, totalWon: totalWon, gainedAddiction: gainedAddiction, slotsWinBonus: slotsWinBonus, slotsPayoutBonus: slotsPayoutBonus }; return v.slotMachineSystem.lastResult; }>> /* Calculate slot machine cost with casino staff discount */ <<set setup.getSlotCost = function() { var v = State.variables; var baseCost = 50; // Check if player works at the casino (Security Guard or Cocktail Waitress) var isCasinoStaff = false; if (v.jobs && (v.jobs.includes("Security Guard") || v.jobs.includes("Cocktail Waitress"))) { isCasinoStaff = true; } // 5% discount for casino staff if (isCasinoStaff) { baseCost = Math.floor(baseCost * 0.95); // $47 } return baseCost; }>> /* Check for forced gambling when entering casino */ <<set setup.checkGamblingAddiction = function() { var v = State.variables; if (v.mentalTraits && v.mentalTraits.includes("Gambling Addiction") && v.money >= 50) { var roll = random(1, 100); if (roll <= 50) { return true; // Force gambling } } return false; }>>
<<nobr>> <<set _result = setup.spinSlotMachine()>> <<advancetime 2>> <!-- Check for jackpot achievement and grant lucky trait --> <<if _result.payout >= 1000000>> <<run setup.achievements.unlock("casino_jackpot")>> <!-- Only grant Lucky if player doesn't have it AND it's not blocked by transformation --> <<set _luckyBlocked = setup.isTraitBlockedByTransformation && setup.isTraitBlockedByTransformation("Lucky", "mental")>> <<if !$mentalTraits.includes("Lucky") && !_luckyBlocked>> <<set $mentalTraits.push("Lucky")>> <<run setup.achievements.unlock("lucky_trait")>> <<set _gainedLucky = true>> <</if>> <</if>> <!-- Check for gambling addiction achievement --> <<if _result.gainedAddiction>> <<run setup.achievements.unlock("gambling_addiction")>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center; text-shadow: 0 0 20px #ffd700;">🎰 Spinning...</h1> <div style="padding: 20px; background: linear-gradient(135deg, #0f4c3a 0%, #1a5c4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(46, 204, 113, 0.3);"> <p style="color: #a8e6cf; font-size: 18px; margin: 0; text-align: center;"> The reels spin and click into place... </p> </div> <!-- Slot Machine Result Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 40px 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid <<if _result.payout > 0>>#51cf66<<else>>#c62828<</if>>; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px <<if _result.payout > 0>>rgba(81, 207, 102, 0.5)<<else>>rgba(198, 40, 40, 0.5)<</if>>;"> <div style="display: flex; justify-content: center; gap: 20px; margin-bottom: 30px;"> <div style="background: <<if _result.payout > 0>>#1b5e20<<else>>#1a1a1a<</if>>; border: 3px solid <<if _result.payout > 0>>#51cf66<<else>>#667eea<</if>>; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: 0 0 30px <<if _result.payout > 0>>rgba(81, 207, 102, 0.5)<<else>>rgba(0,0,0,0.5)<</if>>;"> <span><<print _result.symbols[0]>></span> </div> <div style="background: <<if _result.payout > 0>>#1b5e20<<else>>#1a1a1a<</if>>; border: 3px solid <<if _result.payout > 0>>#51cf66<<else>>#667eea<</if>>; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: 0 0 30px <<if _result.payout > 0>>rgba(81, 207, 102, 0.5)<<else>>rgba(0,0,0,0.5)<</if>>;"> <span><<print _result.symbols[1]>></span> </div> <div style="background: <<if _result.payout > 0>>#1b5e20<<else>>#1a1a1a<</if>>; border: 3px solid <<if _result.payout > 0>>#51cf66<<else>>#667eea<</if>>; border-radius: 10px; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center; font-size: 64px; box-shadow: 0 0 30px <<if _result.payout > 0>>rgba(81, 207, 102, 0.5)<<else>>rgba(0,0,0,0.5)<</if>>;"> <span><<print _result.symbols[2]>></span> </div> </div> </div> <!-- Win/Loss Result --> <<if _result.payout > 0>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px rgba(81, 207, 102, 0.5);"> <h2 style="color: #51cf66; text-align: center; margin: 0 0 20px 0; font-size: 32px; text-shadow: 0 0 20px #51cf66;">🎉 WINNER! 🎉</h2> <div style="text-align: center;"> <p style="color: #a8e6cf; font-size: 20px; margin: 0 0 15px 0;"> Cost: <b style="color: #ffd700;">$50</b> </p> <!-- Check if any bonuses apply --> <<set _hasBonuses = (_result.skillTreePayoutBonus > 0) || (_result.pearlBonus > 0)>> <<if _hasBonuses>> <p style="color: #51cf66; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #51cf66;"> Won: $<<print _result.totalWon.toLocaleString()>> </p> <!-- Breakdown of bonuses --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin: 15px auto; max-width: 300px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 5px 0;">Base: $<<print _result.payout.toLocaleString()>></p> <!-- ===== SKILL TREE: Show payout bonus ===== --> <<if _result.skillTreePayoutBonus > 0>> <p style="color: #CE93D8; font-size: 14px; margin: 5px 0;">⭐ Skill Tree (+<<print _result.slotsPayoutBonus>>%): +$<<print _result.skillTreePayoutBonus.toLocaleString()>></p> <</if>> <<if _result.pearlBonus > 0>> <p style="color: #f5f5f5; font-size: 14px; margin: 5px 0;">🔮 Pearl (+50%): +$<<print _result.pearlBonus.toLocaleString()>></p> <</if>> </div> <<else>> <p style="color: #51cf66; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #51cf66;"> Won: $<<print _result.payout.toLocaleString()>> </p> <</if>> <p style="color: #51cf66; font-size: 20px; margin: 15px 0 0 0; font-weight: bold;"> Net Profit: $<<print (_result.totalWon - 50).toLocaleString()>> </p> <!-- ===== SKILL TREE: Highlight if skill tree bonus contributed ===== --> <<if _result.skillTreePayoutBonus > 0>> <div style="background: linear-gradient(135deg, #9C27B0 0%, #7B1FA2 100%); padding: 12px; border-radius: 6px; margin-top: 15px; border: 2px solid #CE93D8; box-shadow: 0 0 15px rgba(156, 39, 176, 0.5);"> <p style="color: #E1BEE7; font-size: 15px; font-weight: bold; margin: 0;"> ⭐ Skill Tree Bonus: +$<<print _result.skillTreePayoutBonus.toLocaleString()>>! ⭐ </p> </div> <</if>> <<if _result.pearlBonus > 0>> <div style="background: linear-gradient(135deg, #f5f5f5 0%, #e0e0e0 100%); padding: 12px; border-radius: 6px; margin-top: 15px; border: 2px solid #f5f5f5; box-shadow: 0 0 15px rgba(245, 245, 245, 0.5);"> <p style="color: #333; font-size: 15px; font-weight: bold; margin: 0;"> 🔮 Pearl of Abundance: +$<<print _result.pearlBonus.toLocaleString()>>! 🔮 </p> </div> <</if>> <!-- Lucky trait gained from jackpot --> <<if _gainedLucky>> <div style="background: linear-gradient(135deg, #ffd700 0%, #ffb300 100%); padding: 15px; border-radius: 8px; margin-top: 20px; border: 3px solid #ffd700; box-shadow: 0 0 30px rgba(255, 215, 0, 0.7); animation: pulse 1s infinite;"> <p style="color: #1a1a1a; font-size: 18px; font-weight: bold; margin: 0; text-align: center;"> 🍀 JACKPOT BLESSING! 🍀 </p> <p style="color: #1a1a1a; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> Your incredible luck has blessed you with the <b>Lucky</b> trait! </p> </div> <</if>> </div> </div> <<else>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #c62828; box-shadow: 0 8px 16px rgba(0,0,0,0.6), 0 0 40px rgba(198, 40, 40, 0.5);"> <h2 style="color: #c62828; text-align: center; margin: 0 0 20px 0; font-size: 32px; text-shadow: 0 0 20px #c62828;">❌ No Match</h2> <div style="text-align: center;"> <p style="color: #ffcdd2; font-size: 20px; margin: 0 0 15px 0;"> The symbols don't match... </p> <p style="color: #c62828; font-size: 36px; font-weight: bold; margin: 0; text-shadow: 0 0 25px #c62828;"> Lost: $50 </p> <p style="color: #ffcdd2; font-size: 16px; margin: 15px 0 0 0; font-style: italic;"> Better luck next time! </p> <!-- ===== SKILL TREE: Remind player of their bonuses ===== --> <<if _result.slotsWinBonus > 0>> <p style="color: #CE93D8; font-size: 14px; margin: 15px 0 0 0;"> ⭐ Your skill tree gave you +<<print _result.slotsWinBonus>>% better odds </p> <</if>> </div> </div> <</if>> <!-- Gambling Addiction Warning --> <<if _result.gainedAddiction>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 8px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 107, 107, 0.5);"> <p style="color: #ff6b6b; font-size: 18px; font-weight: bold; margin: 0 0 10px 0; text-align: center; text-shadow: 0 0 10px #ff6b6b;"> ⚠️ GAMBLING ADDICTION ACQUIRED ⚠️ </p> <p style="color: #ffcdd2; font-size: 16px; margin: 0; text-align: center;"> You've played the slots 25 times... You can't stop thinking about the next spin. When you enter the casino with money, you may be compelled to gamble! </p> </div> <</if>> <!-- Current Status --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <h3 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">Your Current Status</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="text-align: center;"> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Available Cash</p> </div> <div style="text-align: center;"> <p style="color: #4dabf7; font-size: 24px; font-weight: bold; margin: 0;">$slotMachineSystem.totalPlays</p> <p style="color: #888; font-size: 14px; margin: 5px 0 0 0;">Total Plays</p> </div> </div> </div> <!-- Action Buttons --> <div style="text-align: center;"> <<if $forcedGambling>> <!-- Forced Gambling Mode --> <<if _result.payout > 0>> <!-- Won - can leave now --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0; font-weight: bold;"> ✓ You won! Your compulsion is satisfied... for now. </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #51cf6644; margin: 10px;'>← Leave Casino</div>">> <<set $forcedGambling = false>> <<goto "Casino">> <</link>> <<elseif $money < 50>> <!-- Lost everything - forced to leave --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #c62828;"> <p style="color: #c62828; font-size: 16px; margin: 0; font-weight: bold;"> You're broke... Security escorts you out. </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #c62828; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #c6282844; margin: 10px;'>← Leave Casino (Broke)</div>">> <<set $forcedGambling = false>> <<goto "RedLightDistrict">> <</link>> <<else>> <!-- Lost but still have money - must continue --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-size: 16px; margin: 0; font-weight: bold;"> The addiction grips you... You can't leave until you win or go broke! </p> </div> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; color: #ff6b6b; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #ff6b6b44; margin: 10px;'>🎰 Spin Again (Compelled)</div>">> <<goto "SlotMachineResult">> <</link>> <</if>> <<else>> <!-- Normal Mode --> <<if $money >= 50>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #51cf66; color: #51cf66; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #51cf6644; margin: 10px;'>🎰 Spin Again</div>">> <<goto "SlotMachineResult">> <</link>> <</if>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44; margin: 10px;'>← Back to Casino</div>">> <<goto "Casino">> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center; text-shadow: 0 0 20px #ff6b6b;">🎲 Gambling Compulsion</h1> <<if $money >= 50>> <!-- Has enough money for at least slots - must gamble --> <div style="padding: 20px; background: linear-gradient(135deg, #4a0000 0%, #1a0000 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 30px rgba(255, 107, 107, 0.5);"> <p style="color: #ffcdd2; font-size: 20px; margin: 0; text-align: center; font-weight: bold;"> The casino lights call to you. Your fingers itch. You NEED to play... just one more time... </p> </div> <!-- Gambling Addiction Notice --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 107, 107, 0.5);"> <h2 style="color: #ff6b6b; text-align: center; margin: 0 0 20px 0; font-size: 28px; text-shadow: 0 0 15px #ff6b6b;">⚠️ Your Addiction Compels You ⚠️</h2> <p style="color: #ffcdd2; font-size: 18px; margin: 0 0 20px 0; text-align: center;"> You have $<<print $money.toLocaleString()>> and your gambling addiction has taken hold. You can't leave until you either win something... or lose everything. </p> <p style="color: #ff9e9e; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> Choose your poison... but you MUST play. </p> </div> <!-- Forced Choice --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <h3 style="color: #ffd700; margin: 0 0 20px 0; text-align: center;">What Will It Be?</h3> <div style="text-align: center;"> <!-- Slot Machine Option (Only option for forced gambling) --> <<if $money >= 50>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: #ffd700; padding: 25px 50px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(255, 215, 0, 0.5);'>🎰 Slot Machine<br><span style=\"font-size: 14px;\">($50 per spin)</span></div>">> <<set $forcedGambling = true>> <<goto "SlotMachine">> <</link>> <<else>> <div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #444; color: #888; padding: 25px 50px; border-radius: 10px; text-align: center; font-weight: bold; font-size: 20px; cursor: not-allowed; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>🎰 Slot Machine<br><span style="font-size: 14px;">(Need $50)</span></div> <</if>> </div> </div> <<else>> <!-- Not enough money for any game - can leave --> <div style="padding: 20px; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border-radius: 15px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #888; font-size: 20px; margin: 0; text-align: center; font-weight: bold;"> The casino lights flicker... but your empty pockets break the spell. </p> </div> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #888; text-align: center; margin: 0 0 20px 0; font-size: 28px;">💸 Too Broke to Gamble</h2> <p style="color: #888; font-size: 18px; margin: 0 0 20px 0; text-align: center;"> You have $<<print $money.toLocaleString()>>. You don't have enough money to satisfy your gambling addiction... The compulsion fades as reality sets in. </p> <p style="color: #666; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> You need at least $50 to play the slot machines. </p> </div> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44;'>← Leave Casino (Broke)</div>">> <<set $forcedGambling = false>> <<goto "RedLightDistrict">> <</link>> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "Bank">> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Bank")>> <<run $visitedLocations.push("Bank")>> <</if>> /* Check if player is a Criminal and arrest them */ <<if $jobs && $jobs.includes("Criminal")>> <<set $arrestedAtStation = true>> <<goto "CaughtByPolice">> <</if>> <!-- Check business hours (8 AM - 5 PM) --> <<set _currentHour = Math.floor($timeInMinutes / 60) % 24>> <<set _isOpen = _currentHour >= 8 && _currentHour < 17>> <!-- Initialize bank system if not exists --> <<if !$bankAccount>> <<set $bankAccount = { hasAccount: false, balance: 0, atmWithdrawalsToday: 0, lastWithdrawDay: 0 }>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #2ecc71; text-align: center; text-shadow: 0 0 20px #2ecc71;">🏦 Sunfish City Bank</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: white; font-size: 18px; margin: 0;"> A modern banking facility with polished marble floors and professional staff behind secure counters. Digital displays show current rates and services. The atmosphere is quiet and professional. </p> </div> <!-- Business Hours Display --> <<set _displayHour = Math.floor($timeInMinutes / 60) % 24>> <<set _displayMinute = $timeInMinutes % 60>> <div style="background: <<if _isOpen>>#2a3a2a<<else>>#3a2020<</if>>; padding: 15px; border-radius: 10px; margin-bottom: 25px; border: 2px solid <<if _isOpen>>#2ecc71<<else>>#c62828<</if>>; text-align: center;"> <p style="color: <<if _isOpen>>#2ecc71<<else>>#ff6b6b<</if>>; font-size: 18px; font-weight: bold; margin: 0 0 5px 0;"> <<if _isOpen>>🟢 OPEN<<else>>🔴 CLOSED<</if>> </p> <p style="color: #aaa; font-size: 14px; margin: 0;"> Business Hours: 8:00 AM - 5:00 PM<br> Current Time: <<if _displayHour === 0>>12<<elseif _displayHour > 12>><<print _displayHour - 12>><<else>><<print _displayHour>><</if>>:<<if _displayMinute < 10>>0<</if>><<print _displayMinute>> <<if _displayHour < 12>>AM<<else>>PM<</if>> </p> </div> <<if !_isOpen>> <!-- Bank Closed Message --> <div style="background: linear-gradient(135deg, #3a2020 0%, #2a1515 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #c62828; box-shadow: 0 4px 8px rgba(0,0,0,0.4); text-align: center;"> <h2 style="color: #ff6b6b; margin: 0 0 20px 0;">🔒 Bank is Currently Closed</h2> <p style="color: #ff8787; font-size: 16px; margin: 0 0 20px 0;"> The bank is open from <strong>8:00 AM to 5:00 PM</strong>.<br> Please come back during business hours. </p> <div style="background: #2a2a2a; padding: 20px; border-radius: 8px; border: 2px solid #444; margin-bottom: 20px;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">💡 While the Bank is Closed:</h3> <ul style="color: #aaa; text-align: left; line-height: 1.8; font-size: 15px;"> <li>ATMs are available 24/7 throughout the city ($30,000/day limit)</li> <li>Funds in your account are safe and secure</li> <li>Your bank card works for purchases anytime</li> <li>Check your balance via your phone app (coming soon)</li> </ul> </div> <<if $bankAccount && $bankAccount.hasAccount>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #2ecc71; margin-bottom: 20px;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Your Current Balance:</p> <p style="color: #2ecc71; font-size: 28px; font-weight: bold; margin: 0;">$<<print $bankAccount.balance.toLocaleString()>></p> </div> <</if>> </div> <!-- Navigation when closed --> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44;'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <<else>> <!-- Bank is OPEN - Normal Banking Services --> <<if !$bankAccount.hasAccount>> <!-- No Account - Open Account Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 30px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(46, 204, 113, 0.3);"> <h2 style="color: #2ecc71; margin: 0 0 20px 0; text-align: center;">💳 Open a Bank Account</h2> <p style="color: #ccc; font-size: 16px; margin: 0 0 15px 0; text-align: center;"> Welcome to Sunfish City Bank! Open an account today and enjoy secure banking services. </p> <div style="background: #2a2a2a; padding: 20px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #333;"> <h3 style="color: #2ecc71; margin: 0 0 15px 0;">Account Benefits:</h3> <ul style="color: #aaa; font-size: 15px; line-height: 1.8;"> <li>✅ Secure storage for your money</li> <li>✅ Pay for purchases with your bank card</li> <li>✅ Earn 5% more from jobs when paid via direct deposit</li> <li>✅ Access ATMs throughout the city ($30,000/day limit)</li> <li>✅ Check balance anytime via phone app</li> <li>✅ Unlimited fee-free withdrawals at bank teller (8 AM - 5 PM)</li> </ul> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 20px; border: 2px solid #f39c12;"> <p style="color: #f39c12; font-size: 16px; margin: 0; text-align: center; font-weight: bold;"> ⚠️ One-time account opening fee: $250 </p> </div> <div style="text-align: center;"> <<if $money >= 250>> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(46, 204, 113, 0.5); cursor: pointer;'>💳 Open Account ($250)</div>">> <<set $money -= 250>> <<set $bankAccount.hasAccount = true>> <<run setup.achievements.unlock("unlock_bank_account")>> <<goto "Bank">> <</link>> <<else>> <div style='display: inline-block; background: #444; color: #888; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; cursor: not-allowed;'> Not Enough Cash </div> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0; font-style: italic;"> You need $<<print (250 - $money).toLocaleString()>> more cash </p> <</if>> </div> </div> <<else>> <!-- Has Account - Banking Services --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(46, 204, 113, 0.3);"> <h2 style="color: #2ecc71; margin: 0 0 20px 0; text-align: center;">Your Account</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 20px;"> <div style="text-align: center; background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Cash on Hand</p> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> </div> <div style="text-align: center; background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Bank Balance</p> <p style="color: #2ecc71; font-size: 24px; font-weight: bold; margin: 0;">$<<print $bankAccount.balance.toLocaleString()>></p> </div> </div> </div> <!-- Deposit Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(77, 171, 247, 0.3);"> <h3 style="color: #4dabf7; margin: 0 0 15px 0;">💰 Deposit Cash</h3> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0;"> Deposit your cash into your bank account for safekeeping. </p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px;"> <<if $money >= 100>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(77, 171, 247, 0.3);'>$100</div>">> <<set $money -= 100>> <<set $bankAccount.balance += 100>> <<goto "Bank">> <</link>> <<else>> <div style='background: #2a2a2a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>$100</div> <</if>> <<if $money >= 500>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(77, 171, 247, 0.3);'>$500</div>">> <<set $money -= 500>> <<set $bankAccount.balance += 500>> <<goto "Bank">> <</link>> <<else>> <div style='background: #2a2a2a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>$500</div> <</if>> <<if $money >= 1000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(77, 171, 247, 0.3);'>$1,000</div>">> <<set $money -= 1000>> <<set $bankAccount.balance += 1000>> <<goto "Bank">> <</link>> <<else>> <div style='background: #2a2a2a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>$1,000</div> <</if>> <<if $money >= 5000>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(77, 171, 247, 0.3);'>$5,000</div>">> <<set $money -= 5000>> <<set $bankAccount.balance += 5000>> <<goto "Bank">> <</link>> <<else>> <div style='background: #2a2a2a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>$5,000</div> <</if>> <<if $money > 0>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #2ecc71; color: #2ecc71; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 10px rgba(46, 204, 113, 0.3);'>ALL ($<<print $money.toLocaleString()>>)</div>">> <<set $bankAccount.balance += $money>> <<set $money = 0>> <<goto "Bank">> <</link>> <<else>> <div style='background: #2a2a2a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center; font-weight: bold;'>ALL</div> <</if>> </div> </div> <!-- Bank Teller Withdrawal Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(155, 89, 182, 0.3);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">👤 Bank Teller Withdrawal</h3> <p style="color: #aaa; font-size: 14px; margin: 0 0 15px 0;"> Withdraw any amount from your account with no fees or daily limits. </p> <<if $bankAccount.balance > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 8px; border: 2px solid #333; margin-bottom: 15px;"> <p style="color: #888; font-size: 14px; margin: 0 0 10px 0;">Enter withdrawal amount:</p> <div style="display: flex; gap: 10px; align-items: stretch;"> <input type="number" id="tellerWithdrawAmount" min="1" @max="$bankAccount.balance" placeholder="Amount" style="flex: 1; padding: 12px; border-radius: 6px; border: 2px solid #9b59b6; background: #1a1a1a; color: white; font-size: 16px; font-weight: bold;"> <button onclick="withdrawFromTeller()" style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; border: none; padding: 12px 30px; border-radius: 6px; font-weight: bold; font-size: 16px; cursor: pointer; box-shadow: 0 0 10px rgba(155, 89, 182, 0.3);"> Withdraw </button> </div> <p style="color: #888; font-size: 12px; margin: 10px 0 0 0; font-style: italic;"> Max: $<<print $bankAccount.balance.toLocaleString()>> • No fees • No limits </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 8px;"> <button onclick="document.getElementById('tellerWithdrawAmount').value = 100" style="background: #2a2a2a; border: 2px solid #666; color: #aaa; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px;"> $100 </button> <button onclick="document.getElementById('tellerWithdrawAmount').value = 500" style="background: #2a2a2a; border: 2px solid #666; color: #aaa; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px;"> $500 </button> <button onclick="document.getElementById('tellerWithdrawAmount').value = 1000" style="background: #2a2a2a; border: 2px solid #666; color: #aaa; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px;"> $1,000 </button> <button onclick="document.getElementById('tellerWithdrawAmount').value = 5000" style="background: #2a2a2a; border: 2px solid #666; color: #aaa; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px;"> $5,000 </button> <button onclick="document.getElementById('tellerWithdrawAmount').value = 10000" style="background: #2a2a2a; border: 2px solid #666; color: #aaa; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px;"> $10,000 </button> <button @onclick="'document.getElementById(\'tellerWithdrawAmount\').value = ' + $bankAccount.balance" style="background: #2a2a2a; border: 2px solid #2ecc71; color: #2ecc71; padding: 8px; border-radius: 6px; cursor: pointer; font-size: 14px; font-weight: bold;"> ALL </button> </div> <<else>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #666;"> <p style="color: #888; font-size: 15px; margin: 0; text-align: center;"> Your account balance is $0 </p> </div> <</if>> </div> <<script>> window.withdrawFromTeller = function() { const amount = parseInt(document.getElementById('tellerWithdrawAmount').value); const balance = SugarCube.State.variables.bankAccount.balance; if (!amount || amount <= 0) { alert('Please enter a valid amount'); return; } if (amount > balance) { alert('Insufficient funds. Your balance is $' + balance.toLocaleString()); return; } SugarCube.State.variables.bankAccount.balance -= amount; SugarCube.State.variables.money += amount; SugarCube.Engine.play('Bank'); }; <</script>> <!-- ATM Information --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 2px solid #444; margin-bottom: 25px;"> <h3 style="color: #667eea; margin: 0 0 15px 0; text-align: center;">ℹ️ ATM Locations</h3> <p style="color: #aaa; font-size: 14px; text-align: center; margin: 0;"> ATMs are available 24/7 at various locations throughout the city.<br> <span style="color: #ffc107;">Daily limit: $30,000</span> </p> </div> <</if>> <!-- Navigation when open --> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3), 0 0 20px #667eea44;'>← Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <</if>> <!-- NPCs at Bank --> <<set _npcsHere = setup.getNPCsAtLocation("Bank")>> <h2 style="color: #2ecc71;">People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #1e1e1e; padding: 20px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 0 20px #2ecc7133; margin-bottom: 25px;"> <div style="display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #2ecc71; transition: all 0.3s;"> <<set _relLevel = setup.getRelationshipLevel(_npc.originalName || _npc.name)>> <<set _relColor = setup.getRelationshipColor(_relLevel)>> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <span style="color: #2ecc71; font-weight: bold; font-size: 16px;"><<print _npc.name>></span> <span @style="'color: ' + _relColor + '; font-size: 13px; font-weight: bold;'"> <<print setup.getRelationshipStatus(_npc.originalName || _npc.name)>> </span> </div> <div style="color: #aaa; font-size: 14px; margin-bottom: 12px;"> <div><strong style="color: #2ecc71;">Job:</strong> <<print _npc.job>></div> <<if _npc.primaryPersonality>> <div><strong style="color: #2ecc71;">Personality:</strong> <<print _npc.primaryPersonality>></div> <</if>> </div> <div style="display: flex; gap: 10px; flex-wrap: wrap;"> <<link "<div style='background: #2ecc71; color: black; padding: 8px 15px; border-radius: 6px; font-weight: bold; font-size: 13px; text-align: center; flex: 1; min-width: 80px;'>Talk</div>">> <<set $talkingToNPC = _npc>> <<goto "NPCTalk">> <</link>> <<link "<div style='background: #444; color: #2ecc71; padding: 8px 15px; border-radius: 6px; border: 2px solid #2ecc71; font-weight: bold; font-size: 13px; text-align: center; flex: 1; min-width: 80px;'>Trade</div>">> <<set $tradingWithNPC = _npc>> <<goto "TradeHub">> <</link>> </div> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 2px solid #444; margin-bottom: 25px;"> <p style="color: #888; text-align: center; margin: 0; font-size: 15px;"> No staff members are currently visible in the bank. </p> </div> <</if>> </div> <</nobr>>
/* ========================================== * BANK SYSTEM INITIALIZATION & FUNCTIONS * ========================================== */ /* Initialize bank account structure */ <<if !$bankAccount>> <<set $bankAccount = { hasAccount: false, balance: 0, atmWithdrawalsToday: 0, lastWithdrawDay: 0 }>> <</if>> /* Reset ATM daily withdrawal limit (call this in daily reset) */ <<set setup.resetATMLimit = function() { var v = State.variables; if (v.bankAccount && v.bankAccount.hasAccount) { v.bankAccount.atmWithdrawalsToday = 0; } }>> /* Check if player can afford with cash + bank */ <<set setup.canAffordTotal = function(amount) { var v = State.variables; var totalFunds = v.money; if (v.bankAccount && v.bankAccount.hasAccount) { totalFunds += v.bankAccount.balance; } return totalFunds >= amount; }>> /* Pay with cash first, then bank card if needed */ <<set setup.payAmount = function(amount, cashOnly) { var v = State.variables; cashOnly = cashOnly || false; // If cash only or no bank account, must pay with cash if (cashOnly || !v.bankAccount || !v.bankAccount.hasAccount) { if (v.money >= amount) { v.money -= amount; return { success: true, method: "cash" }; } return { success: false, method: "none" }; } // Try to pay with cash first if (v.money >= amount) { v.money -= amount; return { success: true, method: "cash" }; } // Not enough cash, try bank card if (v.bankAccount.balance >= amount) { v.bankAccount.balance -= amount; return { success: true, method: "card" }; } // Not enough in either return { success: false, method: "none" }; }>> /* Add money - with 5% bonus if has bank account and using credit */ <<set setup.addMoneyWithBonus = function(amount, useCredit) { var v = State.variables; useCredit = useCredit || false; // If no bank account or useCredit is false, just add to cash if (!v.bankAccount || !v.bankAccount.hasAccount || !useCredit) { v.money += amount; return { total: amount, bonus: 0, method: "cash" }; } // With bank account and credit, add 5% bonus var bonus = Math.floor(amount * 0.05); var total = amount + bonus; v.bankAccount.balance += total; return { total: total, bonus: bonus, method: "credit" }; }>> /* Check if player has a bank account */ <<set setup.hasBankAccount = function() { var v = State.variables; return v.bankAccount && v.bankAccount.hasAccount; }>> /* Get total available funds (cash + bank) */ <<set setup.getTotalFunds = function() { var v = State.variables; var total = v.money; if (v.bankAccount && v.bankAccount.hasAccount) { total += v.bankAccount.balance; } return total; }>>
<<nobr>> <!-- Initialize bank account if not exists --> <<if !$bankAccount>> <<set $bankAccount = { hasAccount: false, balance: 0, atmWithdrawalsToday: 0, lastWithdrawDay: 0 }>> <</if>> <div class="bank-app-wrapper"> <div class="bank-app-device"> <div class="bank-app-notch-container"> <div class="bank-app-notch-base"></div> </div> <div class="bank-app-screen"> <div class="bank-app-statusbar"> <span class="status-left"><<= getTimeString()>></span> <span class="status-right">📶 🔋</span> </div> <div class="bank-app-content"> <<if !$bankAccount.hasAccount>> <!-- No Account --> <div style="text-align: center; padding: 60px 30px;"> <div style="font-size: 64px; margin-bottom: 20px;">🏦</div> <h2 style="color: #888; margin: 0 0 15px 0; font-size: 20px;">No Bank Account</h2> <p style="color: #666; font-size: 14px; line-height: 1.6; margin: 0 0 25px 0;"> Visit Sunfish City Bank in Downtown to open an account and access mobile banking. </p> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 13px; margin: 0;"> 💵 Cash on Hand: <span style="color: #51cf66; font-weight: bold;">$<<print $money.toLocaleString()>></span> </p> </div> </div> <<else>> <!-- Has Account --> <div style="padding: 20px;"> <!-- Header --> <div style="text-align: center; margin-bottom: 25px;"> <div style="font-size: 48px; margin-bottom: 10px;">🏦</div> <h2 style="color: #2ecc71; margin: 0; font-size: 18px;">Sunfish City Bank</h2> </div> <!-- Account Balance --> <div style="background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); padding: 25px; border-radius: 12px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.3);"> <p style="color: rgba(255,255,255,0.8); font-size: 12px; margin: 0 0 5px 0; text-transform: uppercase; letter-spacing: 1px;">Account Balance</p> <p style="color: white; font-size: 32px; font-weight: bold; margin: 0;">$<<print $bankAccount.balance.toLocaleString()>></p> </div> <!-- Cash on Hand --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 15px; border: 2px solid #333;"> <p style="color: #888; font-size: 12px; margin: 0 0 5px 0; text-transform: uppercase; letter-spacing: 1px;">Cash on Hand</p> <p style="color: #51cf66; font-size: 24px; font-weight: bold; margin: 0;">$<<print $money.toLocaleString()>></p> </div> <!-- Total Funds --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #333;"> <p style="color: #888; font-size: 12px; margin: 0 0 5px 0; text-transform: uppercase; letter-spacing: 1px;">Total Funds</p> <p style="color: #4dabf7; font-size: 24px; font-weight: bold; margin: 0;">$<<print ($money + $bankAccount.balance).toLocaleString()>></p> </div> <!-- ATM Daily Limit --> <<set _atmUsed = $bankAccount.atmWithdrawalsToday>> <<set _atmRemaining = Math.max(0, 500 - _atmUsed)>> <<set _atmPercent = Math.min(100, (_atmUsed / 500) * 100)>> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; border: 2px solid #333;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <p style="color: #888; font-size: 12px; margin: 0; text-transform: uppercase; letter-spacing: 1px;">ATM Daily Limit</p> <p style="color: #e91e63; font-size: 12px; margin: 0; font-weight: bold;">$<<print _atmRemaining.toLocaleString()>> / $500</p> </div> <div style="background: #1a1a1a; height: 8px; border-radius: 4px; overflow: hidden;"> <div @style="'background: linear-gradient(90deg, #e91e63 0%, #c2185b 100%); height: 100%; width: ' + _atmPercent + '%; transition: width 0.3s;'"></div> </div> <p style="color: #666; font-size: 11px; margin: 8px 0 0 0; font-style: italic;"> <<if _atmRemaining > 0>> Resets daily at midnight <<else>> ⚠️ Daily limit reached - visit bank teller for unlimited withdrawals <</if>> </p> </div> <!-- Quick Info --> <div style="margin-top: 20px; padding: 15px; background: #1a1a1a; border-radius: 8px; border-left: 4px solid #2ecc71;"> <p style="color: #888; font-size: 12px; margin: 0; line-height: 1.6;"> 💡 <strong style="color: #aaa;">Tip:</strong> Earn 5% more from jobs when paid via direct deposit to your account! </p> </div> </div> <</if>> </div> <div class="bank-app-homebtn"></div> </div> </div> </div> <div style="text-align: center; margin-top: 20px;"> [[← Back to Phone|Phone]] </div> <style> .bank-app-wrapper { display: flex; justify-content: center; align-items: center; padding: 20px; min-height: 100vh; background: #0a0a0a; } .bank-app-device { width: 360px; height: 680px; background: #0a0a0a; border-radius: 42px; padding: 6px; box-shadow: 0 25px 50px rgba(0,0,0,0.9); position: relative; display: flex; flex-direction: column; } .bank-app-notch-container { position: absolute; top: -24px; left: 50%; transform: translateX(-50%); z-index: 100; } .bank-app-notch-base { width: 140px; height: 28px; background: #0a0a0a; border-radius: 0 0 18px 18px; } .bank-app-screen { background: #1a1a1a; border-radius: 36px; flex: 1; overflow-y: auto; overflow-x: hidden; display: flex; flex-direction: column; position: relative; } .bank-app-statusbar { display: flex; justify-content: space-between; align-items: center; padding: 32px 20px 12px 20px; font-size: 12px; color: white; font-weight: 600; position: sticky; top: 0; background: #1a1a1a; z-index: 50; } .status-left { text-align: left; flex: 1; } .status-right { text-align: right; flex: 1; } .bank-app-content { flex: 1; overflow-y: auto; } .bank-app-homebtn { width: 110px; height: 4px; background: rgba(255,255,255,0.5); border-radius: 2px; margin: 8px auto 8px auto; } /* Scrollbar styling */ .bank-app-screen::-webkit-scrollbar { width: 6px; } .bank-app-screen::-webkit-scrollbar-track { background: transparent; } .bank-app-screen::-webkit-scrollbar-thumb { background: #333; border-radius: 3px; } .bank-app-screen::-webkit-scrollbar-thumb:hover { background: #444; } </style> <</nobr>>
<<nobr>> <<run Dialog.close()>> <<set $lastPatrolEndTime = $timeInMinutes>> <<set $onPatrol = false>> <<set $patrolBonuses = []>> <<set $patrolPenalties = []>> <<set $lastLocation = "PoliceBreakRoom">> <<goto "PoliceBreakRoom">> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ATM")>> <<run $visitedLocations.push("ATM")>> <</if>> <!-- Check if player has bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<if !_hasBankAccount>> <<goto $lastLocation>> <</if>> <<set _atmLimitRemaining = Math.max(0, 30000 - ($bankAccount.atmWithdrawalsToday || 0))>> <<set _hasATMAccess = _atmLimitRemaining > 0>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #4dabf7; text-align: center;">🏧 ATM</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4dabf7 0%, #339af0 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #4dabf7;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> A standard ATM terminal. The screen prompts you to insert your card. </p> </div> <!-- Account Summary --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #4dabf7; margin: 0 0 20px 0; text-align: center;">💳 Account Summary</h2> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">Cash on Hand:</p> <p style="color: #51cf66; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney($money)>></p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #4dabf7;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">Bank Balance:</p> <p style="color: #4dabf7; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney($bankAccount.balance)>></p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ffc107;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">ATM Limit Today:</p> <p style="color: #ffc107; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney(_atmLimitRemaining)>></p> </div> </div> <div style="text-align: center; padding-top: 10px; border-top: 1px solid #444;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Funds:</p> <p style="color: #ffd43b; margin: 0; font-size: 26px; font-weight: bold;"><<print setup.formatMoney($money + $bankAccount.balance)>></p> </div> </div> <!-- ATM Withdrawal Interface --> <<if _hasATMAccess && $bankAccount.balance > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 3px solid #4dabf7; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">💵 Quick Withdrawal</h3> <p style="color: #51cf66; font-size: 14px; text-align: center; margin: 0 0 20px 0; font-weight: bold;"> ✓ FREE withdrawals - No fees! </p> <!-- Quick Amount Buttons --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin-bottom: 20px;"> <<set _quickAmounts = [100, 500, 1000, 5000, 10000]>> <<for _amount range _quickAmounts>> <<capture _amount>> <<set _canWithdraw = $bankAccount.balance >= _amount && _atmLimitRemaining >= _amount>> <<if _canWithdraw>> <<link `"<div style='background: #51cf66; color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(81, 207, 102, 0.4); transition: all 0.3s;'>💰 $" + _amount.toLocaleString() + "<br><span style='font-size: 12px; opacity: 0.9;'>FREE - No Fee!</span></div>"`>> <<set $bankAccount.balance -= _amount>> <<set $money += _amount>> <<set $bankAccount.atmWithdrawalsToday = ($bankAccount.atmWithdrawalsToday || 0) + _amount>> <<goto "ATM">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 15px; border-radius: 8px; text-align: center; font-weight: bold; border: 2px solid #6b4a4a; cursor: not-allowed;'> 💰 $<<print _amount.toLocaleString()>><br><span style='font-size: 12px;'>(Unavailable)</span> </div> <</if>> <</capture>> <</for>> </div> <!-- Max Withdrawal Button --> <<set _maxWithdrawal = Math.min($bankAccount.balance, _atmLimitRemaining)>> <<if _maxWithdrawal > 0>> <div style="text-align: center; padding-top: 15px; border-top: 2px solid #444;"> <<link `"<div style='display: inline-block; background: linear-gradient(135deg, #51cf66 0%, #40a854 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; box-shadow: 0 0 20px rgba(81, 207, 102, 0.4); font-size: 16px;'>💎 Withdraw Maximum<br><span style='font-size: 14px;'>$" + _maxWithdrawal.toLocaleString() + " (FREE!)</span></div>"`>> <<set $bankAccount.balance -= _maxWithdrawal>> <<set $money += _maxWithdrawal>> <<set $bankAccount.atmWithdrawalsToday = ($bankAccount.atmWithdrawalsToday || 0) + _maxWithdrawal>> <<goto "ATM">> <</link>> </div> <</if>> </div> <<elseif !_hasATMAccess>> <div style="background: linear-gradient(135deg, #3a2020 0%, #2a1515 100%); padding: 25px; border-radius: 12px; border: 3px solid #c62828; margin-bottom: 25px; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">🚫 Daily ATM Limit Reached</h3> <p style="color: #ff8787; margin: 0; font-size: 16px;"> You've withdrawn your maximum daily limit of $30,000.<br> Come back tomorrow for more withdrawals! </p> <p style="color: #aaa; margin: 15px 0 0 0; font-size: 14px; font-style: italic;"> Or visit the bank teller during business hours (8 AM - 5 PM) for unlimited fee-free withdrawals. </p> </div> <<elseif $bankAccount.balance <= 0>> <div style="background: linear-gradient(135deg, #3a2020 0%, #2a1515 100%); padding: 25px; border-radius: 12px; border: 3px solid #c62828; margin-bottom: 25px; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">💸 Insufficient Funds</h3> <p style="color: #ff8787; margin: 0; font-size: 16px;"> Your bank account is empty.<br> Visit the bank teller to make a deposit! </p> </div> <</if>> <!-- ATM Information --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 2px solid #444; margin-bottom: 25px;"> <h3 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">ℹ️ ATM Information</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;">• <strong style="color: #51cf66;">FREE</strong> withdrawals - no fees!</p> <p style="margin: 5px 0;">• <strong style="color: #51cf66;">$30,000 daily limit</strong> (resets at midnight)</p> <p style="margin: 5px 0;">• Visit the <strong style="color: #4dabf7;">bank teller</strong> (8 AM - 5 PM) for unlimited withdrawals</p> <p style="margin: 5px 0;">• Deposits can only be made at the bank branch</p> <p style="margin: 5px 0;">• All ATMs share the same daily limit</p> </div> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #4dabf7; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>← Go Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Casino")>> <<run $visitedLocations.push("Casino")>> <</if>> <<set $lastLocation = "Casino">> <!-- Check if player has bank account --> <<set _hasBankAccount = $bankAccount && $bankAccount.hasAccount>> <<if !_hasBankAccount>> <<goto "Casino">> <</if>> <<set _atmLimitRemaining = Math.max(0, 25000 - ($bankAccount.atmWithdrawalsToday || 0))>> <<set _hasATMAccess = _atmLimitRemaining > 0>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff1493; text-align: center;">🏧 Casino ATM</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff1493 0%, #c71585 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff1493; box-shadow: 0 0 30px rgba(255, 20, 147, 0.4);"> <p style="color: white; font-size: 18px; margin: 0; text-align: center;"> A sleek ATM terminal glows in hot pink neon. The screen flickers with casino-themed animations. </p> </div> <!-- Account Summary --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff1493; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff1493; margin: 0 0 20px 0; text-align: center;">💳 Account Summary</h2> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">Cash on Hand:</p> <p style="color: #51cf66; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney($money)>></p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #667eea;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">Bank Balance:</p> <p style="color: #667eea; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney($bankAccount.balance)>></p> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ff1493;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px; text-align: center;">ATM Limit Today:</p> <p style="color: #ff1493; margin: 0; font-size: 22px; font-weight: bold; text-align: center;"><<print setup.formatMoney(_atmLimitRemaining)>></p> </div> </div> <div style="text-align: center; padding-top: 10px; border-top: 1px solid #444;"> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 14px;">Total Funds:</p> <p style="color: #ffd43b; margin: 0; font-size: 26px; font-weight: bold;"><<print setup.formatMoney($money + $bankAccount.balance)>></p> </div> </div> <!-- ATM Withdrawal Interface --> <<if _hasATMAccess && $bankAccount.balance > 0>> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 3px solid #ff1493; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ff1493; margin: 0 0 15px 0; text-align: center;">💵 Quick Withdrawal</h3> <p style="color: #51cf66; font-size: 14px; text-align: center; margin: 0 0 20px 0; font-weight: bold;"> ✓ FREE withdrawals - No fees! </p> <!-- Quick Amount Buttons --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; margin-bottom: 20px;"> <<set _quickAmounts = [100, 500, 1000, 5000, 10000]>> <<for _amount range _quickAmounts>> <<capture _amount>> <<set _canWithdraw = $bankAccount.balance >= _amount && _atmLimitRemaining >= _amount>> <<if _canWithdraw>> <<link `"<div style='background: linear-gradient(135deg, #51cf66 0%, #40a854 100%); color: white; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 0 15px rgba(81, 207, 102, 0.4); transition: all 0.3s;'>💰 $" + _amount.toLocaleString() + "<br><span style='font-size: 12px; opacity: 0.9;'>FREE - No Fee!</span></div>"`>> <<set $bankAccount.balance -= _amount>> <<set $money += _amount>> <<set $bankAccount.atmWithdrawalsToday = ($bankAccount.atmWithdrawalsToday || 0) + _amount>> <<goto "CasinoATM">> <</link>> <<else>> <div style='background: #4a2a2a; color: #c9a8a8; padding: 15px; border-radius: 8px; text-align: center; font-weight: bold; border: 2px solid #6b4a4a; cursor: not-allowed;'> 💰 $<<print _amount.toLocaleString()>><br><span style='font-size: 12px;'>(Unavailable)</span> </div> <</if>> <</capture>> <</for>> </div> <!-- Max Withdrawal Button --> <<set _maxWithdrawal = Math.min($bankAccount.balance, _atmLimitRemaining)>> <<if _maxWithdrawal > 0>> <div style="text-align: center; padding-top: 15px; border-top: 2px solid #444;"> <<link `"<div style='display: inline-block; background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 15px 40px; border-radius: 10px; font-weight: bold; box-shadow: 0 0 20px rgba(255, 215, 0, 0.5); font-size: 16px;'>💎 Withdraw Maximum<br><span style='font-size: 14px;'>$" + _maxWithdrawal.toLocaleString() + " (FREE!)</span></div>"`>> <<set $bankAccount.balance -= _maxWithdrawal>> <<set $money += _maxWithdrawal>> <<set $bankAccount.atmWithdrawalsToday = ($bankAccount.atmWithdrawalsToday || 0) + _maxWithdrawal>> <<goto "CasinoATM">> <</link>> </div> <</if>> </div> <<elseif !_hasATMAccess>> <div style="background: linear-gradient(135deg, #3a2020 0%, #2a1515 100%); padding: 25px; border-radius: 12px; border: 3px solid #c62828; margin-bottom: 25px; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">🚫 Daily ATM Limit Reached</h3> <p style="color: #ff8787; margin: 0; font-size: 16px;"> You've withdrawn your maximum daily limit of $25,000.<br> Come back tomorrow for more withdrawals! </p> <p style="color: #aaa; margin: 15px 0 0 0; font-size: 14px; font-style: italic;"> Or visit the bank teller during business hours (8 AM - 5 PM) for unlimited withdrawals. </p> </div> <<elseif $bankAccount.balance <= 0>> <div style="background: linear-gradient(135deg, #3a2020 0%, #2a1515 100%); padding: 25px; border-radius: 12px; border: 3px solid #c62828; margin-bottom: 25px; text-align: center;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">💸 Insufficient Funds</h3> <p style="color: #ff8787; margin: 0; font-size: 16px;"> Your bank account is empty.<br> Visit the bank during business hours (8 AM - 5 PM) to make a deposit! </p> </div> <</if>> <!-- ATM Information --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; border: 2px solid #444; margin-bottom: 25px;"> <h3 style="color: #ff1493; margin: 0 0 15px 0; text-align: center;">ℹ️ ATM Information</h3> <div style="color: #aaa; line-height: 1.8;"> <p style="margin: 5px 0;">• <strong style="color: #51cf66;">FREE</strong> withdrawals - no fees!</p> <p style="margin: 5px 0;">• <strong style="color: #ff1493;">$25,000 daily limit</strong> (resets at midnight)</p> <p style="margin: 5px 0;">• Visit the <strong style="color: #667eea;">bank teller</strong> (8 AM - 5 PM) for unlimited withdrawals</p> <p style="margin: 5px 0;">• Deposits can only be made at the bank branch during business hours</p> <p style="margin: 5px 0;">• ATMs are available 24/7 for your convenience</p> </div> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ffd700 0%, #d4af37 100%); color: #000; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>← Back to Casino</div>">> <<goto "Casino">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- WorkCompleteTraitResult - Shows result after player chooses to accept or decline trait swap --> <<set _pendingTrait = $pendingWorkTrait>> <<set _conflictingTrait = $pendingWorkTraitConflict>> <<set _gainedWorkTraitName = _pendingTrait ? _pendingTrait.name : "">> <<set _gainedWorkTraitType = _pendingTrait ? _pendingTrait.type : "">> <!-- Process the player's choice --> <<if $workTraitSwapped && _pendingTrait>> <!-- Player chose to replace trait --> <<if _gainedWorkTraitType === "physical">> <<set $physicalTraits.delete(_conflictingTrait)>> <<if !$physicalTraits.includes(_gainedWorkTraitName)>> <<set $physicalTraits.push(_gainedWorkTraitName)>> <</if>> <<elseif _gainedWorkTraitType === "mental">> <<set $mentalTraits.delete(_conflictingTrait)>> <<if !$mentalTraits.includes(_gainedWorkTraitName)>> <<set $mentalTraits.push(_gainedWorkTraitName)>> <</if>> <</if>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #28a745 0%, #20c997 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 6px 12px rgba(0,0,0,0.4); text-align: center; border: 2px solid #28a745;"> <h1 style="color: white; margin: 0 0 10px 0; font-size: 36px;">✅ Shift Complete!</h1> <p style="color: white; margin: 0; font-size: 18px;">You've finished your shift as a <<print $lastWorkJob>></p> </div> <!-- Show trait change result --> <<if $workTraitSwapped && _pendingTrait>> <!-- Trait was replaced --> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 25px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px rgba(155, 89, 182, 0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🔄 Trait Replaced!</h2> <p style="color: #ffd; font-size: 18px; margin: 0 0 10px 0;"> You've replaced <strong style="color: #ff6b6b;"><<print _conflictingTrait>></strong><br> with <strong style="color: #51cf66;"><<print _gainedWorkTraitName>></strong> </p> <p style="color: #ccc; font-size: 14px; margin: 0;"> <<if _gainedWorkTraitType === "mental">> (Mental Trait) <<elseif _gainedWorkTraitType === "physical">> (Physical Trait) <</if>> </p> </div> <!-- Transformation text for the swap --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; text-align: center;">🔄 Transformation</h3> <<if _gainedWorkTraitType === "mental">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #764ba2;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<set _transformText = "">> <<if typeof setup.getMutuallyExclusiveSwapText === "function">> <<set _transformText = setup.getMutuallyExclusiveSwapText(_conflictingTrait, _gainedWorkTraitName)>> <</if>> <<if _transformText && _transformText.length > 0>> <<print _transformText>> <<else>> The demands of your work have gradually shifted your personality. Where once you were <strong><<print _conflictingTrait>></strong>, you now find yourself becoming increasingly <strong><<print _gainedWorkTraitName>></strong>. The change feels natural, as if this was always who you were meant to be. <</if>> </p> </div> <<elseif _gainedWorkTraitType === "physical">> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #28a745;"> <p style="color: #ccc; font-size: 16px; line-height: 1.8; margin: 0;"> <<set _transformText = "">> <<if typeof setup.getMutuallyExclusiveSwapText === "function">> <<set _transformText = setup.getMutuallyExclusiveSwapText(_conflictingTrait, _gainedWorkTraitName)>> <</if>> <<if _transformText && _transformText.length > 0>> <<print _transformText>> <<else>> The physical nature of your work has reshaped your body. Your <strong><<print _conflictingTrait>></strong> form has transformed, and you now possess a more <strong><<print _gainedWorkTraitName>></strong> physique. You catch your reflection and barely recognize the changes. <</if>> </p> </div> <</if>> </div> <<else>> <!-- Player kept their current trait --> <div style="background: linear-gradient(135deg, #6c757d 0%, #495057 100%); padding: 25px; border-radius: 12px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 25px; text-align: center;"> <h2 style="color: white; margin: 0 0 15px 0;">🛡️ Trait Preserved</h2> <p style="color: #ddd; font-size: 16px; margin: 0;"> You resisted the change and kept your <strong style="color: #ffd43b;"><<print _conflictingTrait>></strong> trait. </p> <p style="color: #aaa; font-size: 14px; margin: 10px 0 0 0; font-style: italic;"> The potential for <strong><<print _gainedWorkTraitName>></strong> fades away... </p> </div> <</if>> <!-- Include earnings summary --> <<include "WorkCompleteEarnings">> </div> <!-- Clean up temporary variables --> <<unset $pendingWorkTrait>> <<unset $pendingWorkTraitConflict>> <<unset $workTraitSwapped>> <<set $lastWorkProcessed = false>> <</nobr>>
<<nobr>> <!-- Earnings Display Section --> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #28a745; margin-top: 0; font-size: 24px; border-bottom: 3px solid #28a745; padding-bottom: 10px;">💰 Earnings</h2> <div style="background: #1a1a1a; padding: 20px; border-radius: 8px; margin-top: 15px;"> <!-- Base Earnings --> <div style="display: flex; justify-content: space-between; margin-bottom: 10px;"> <span style="color: #ccc;">Base Pay ($lastWorkJob - $lastWorkHours hours):</span> <span style="color: #51cf66; font-weight: bold;">$<<print $lastWorkBaseEarnings>></span> </div> <!-- Pearl Bonus if active --> <<if $lastWorkPearlActive>> <div style="display: flex; justify-content: space-between; margin-bottom: 10px; padding: 8px; background: #2a1a3a; border-radius: 6px; border: 1px solid #9b59b6;"> <span style="color: #d4a5ff;">🦪 Pearl of Abundance (+50%):</span> <span style="color: #d4a5ff; font-weight: bold;">+$<<print $lastWorkPearlBonus>></span> </div> <</if>> <!-- ===== SKILL TREE: Hourly Pay Bonus Display ===== --> <<if $lastWorkSkillTreeBonus && $lastWorkSkillTreeBonus > 0>> <div style="display: flex; justify-content: space-between; margin-bottom: 10px; padding: 8px; background: #1a2a1a; border-radius: 6px; border: 1px solid #9C27B0;"> <span style="color: #CE93D8;">⭐ Skill Tree Bonus (+<<print setup.skillTree.getEffect("hourlyPayBonus")>>%):</span> <span style="color: #CE93D8; font-weight: bold;">+$<<print $lastWorkSkillTreeBonus>></span> </div> <</if>> <!-- ===== BUFF: Food Money Bonus Display ===== --> <<if $lastWorkFoodMoneyBonus && $lastWorkFoodMoneyBonus > 0>> <div style="display: flex; justify-content: space-between; margin-bottom: 10px; padding: 8px; background: #2a2a1a; border-radius: 6px; border: 1px solid #f59f00;"> <span style="color: #ffd43b;">🍽️ Food Buff Bonus:</span> <span style="color: #ffd43b; font-weight: bold;">+$<<print $lastWorkFoodMoneyBonus>></span> </div> <</if>> <!-- Bank Direct Deposit if applicable --> <<if $lastWorkHasBankAccount>> <div style="border-top: 2px solid #444; margin: 15px 0; padding-top: 15px;"> <div style="display: flex; justify-content: space-between; margin-bottom: 10px;"> <span style="color: #ccc;">Subtotal:</span> <span style="color: #51cf66; font-weight: bold;">$<<print $lastWorkBaseEarnings + ($lastWorkPearlBonus || 0) + ($lastWorkSkillTreeBonus || 0) + ($lastWorkFoodMoneyBonus || 0)>></span> </div> <div style="display: flex; justify-content: space-between; margin-bottom: 10px; padding: 8px; background: #1a2a3a; border-radius: 6px; border: 1px solid #17a2b8;"> <span style="color: #4dabf7;">🏦 Direct Deposit Bonus (+5%):</span> <span style="color: #4dabf7; font-weight: bold;">+$<<print $lastWorkCreditBonus>></span> </div> </div> <div style="border-top: 2px solid #28a745; margin-top: 15px; padding-top: 15px;"> <div style="display: flex; justify-content: space-between;"> <span style="color: #28a745; font-size: 18px; font-weight: bold;">Total Deposited to Bank:</span> <span style="color: #28a745; font-size: 20px; font-weight: bold;">$<<print $lastWorkTotalDeposited>></span> </div> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> Bank Balance: $<<print $bankAccount.balance>> </p> </div> <<else>> <div style="border-top: 2px solid #28a745; margin-top: 15px; padding-top: 15px;"> <div style="display: flex; justify-content: space-between;"> <span style="color: #28a745; font-size: 18px; font-weight: bold;">Total Cash Received:</span> <span style="color: #28a745; font-size: 20px; font-weight: bold;">$<<print $lastWorkBaseEarnings + ($lastWorkPearlBonus || 0) + ($lastWorkSkillTreeBonus || 0) + ($lastWorkFoodMoneyBonus || 0)>></span> </div> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0; text-align: center;"> Cash on Hand: $<<print $money>> </p> </div> <div style="background: #3a3a1a; padding: 12px; border-radius: 6px; margin-top: 15px; border: 1px solid #ffc107;"> <p style="color: #ffc107; margin: 0; font-size: 14px; text-align: center;"> 💡 Open a bank account for a 5% direct deposit bonus! </p> </div> <</if>> </div> </div> <!-- Continue Button --> <div style="text-align: center;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>Continue</div>">> <<set $lastWorkTraitChanges = []>> <<set $lastWorkProcessed = false>> <<goto $lastLocation || "Downtown">> <</link>> </div> <</nobr>>
/* ============================================== */ /* DREAM STATE CHARACTER CREATION SYSTEM */ /* ============================================== */ /* Initialize Dream State Variables */ <<set setup.initializeDreamState = function() { var v = State.variables; // Starting trade points v.dreamTradePoints = 150; v.dreamStartingPoints = 150; // Player's dream selections (before finalization) v.dreamPlayer = { firstName: "Water", lastName: "Bottle", gender: null, bodyParts: { gender: null, chest: null, butt: null, genitals: null }, appearance: { skinTone: "pale", hairColor: "Black", hairLength: "short", age: "Adult" }, physicalTraits: [], mentalTraits: [], skills: [], negativeTraits: [] // Negative traits taken for extra points }; // Track completed trades (for undo functionality) v.dreamTradeHistory = []; // Initialize dream NPCs v.dreamNPCs = []; return true; }>> /* Create Dream NPC (simplified version without stats) */ <<set setup.createDreamNPC = function(config) { var hairLengthTrait = config.hairLength === "short" ? "Short Hair" : "Long Hair"; var allPhysicalTraits = config.physicalTraits ? config.physicalTraits.slice() : []; if (!allPhysicalTraits.includes(hairLengthTrait)) { allPhysicalTraits.push(hairLengthTrait); } var npc = { name: config.name, gender: config.gender, bodyParts: { gender: config.gender, chest: config.chest || "flat", butt: config.butt || "flat", genitals: config.genitals || (config.gender === "male" ? "penis" : "vagina") }, appearance: { skinTone: config.skinTone || "pale", hairColor: config.hairColor || "Black", hairLength: config.hairLength || "short", age: config.age || "Adult" }, physicalTraits: allPhysicalTraits, mentalTraits: config.mentalTraits || [], skills: config.skills || [], jobs: config.jobs || [], isDreamNPC: true // Flag to identify dream NPCs }; return npc; }>> /* Initialize the 3 Dream NPCs */ <<set setup.initializeDreamNPCs = function() { var v = State.variables; v.dreamNPCs = []; // NPC 1: Bilian Asstown v.dreamNPCs.push(setup.createDreamNPC({ name: "Bilian Asstown", gender: "male", chest: "medium", butt: "large", genitals: "penis", skinTone: "pale", hairColor: "Platinum Blonde", hairLength: "long", age: "Adult", physicalTraits: ["Detail-Oriented", "Pierced", "Quick", "Sarcastic"], mentalTraits: ["Analytical", "Charming", "Direct", "Outgoing", "Sly", "Witty", "Unlucky", "Unskilled"], skills: ["Quick Learner", "Cleaning", "Dancing", "Driving", "Guitar", "Hair Styling", "High Heels Proficient", "Makeup", "Modeling", "Piano"], jobs: [] })); // NPC 2: Placeholder (to be defined later) // v.dreamNPCs.push(setup.createDreamNPC({...})); // NPC 3: Placeholder (to be defined later) // v.dreamNPCs.push(setup.createDreamNPC({...})); return v.dreamNPCs; }>> /* Calculate the trade value of an item (uses existing getTraitValue) */ <<set setup.getDreamTradeValue = function(type, name, size) { // Use existing trait value system return setup.getTraitValue(type, name, size); }>> /* Calculate total value of player's current dream selections */ <<set setup.calculateDreamPlayerValue = function() { var v = State.variables; var dp = v.dreamPlayer; var totalValue = 0; // Body parts if (dp.bodyParts.chest) { totalValue += setup.getDreamTradeValue("bodyPart", "chest", dp.bodyParts.chest); } if (dp.bodyParts.butt) { totalValue += setup.getDreamTradeValue("bodyPart", "butt", dp.bodyParts.butt); } if (dp.bodyParts.genitals) { totalValue += setup.getDreamTradeValue("bodyPart", "genitals", dp.bodyParts.genitals); } // Physical traits dp.physicalTraits.forEach(function(trait) { totalValue += setup.getDreamTradeValue("physical", trait); }); // Mental traits dp.mentalTraits.forEach(function(trait) { totalValue += setup.getDreamTradeValue("mental", trait); }); // Skills dp.skills.forEach(function(skill) { totalValue += setup.getDreamTradeValue("skill", skill); }); return totalValue; }>> /* Get value of a specific item from dream NPC */ <<set setup.getDreamNPCItemValue = function(npc, type, item) { if (type === "bodyPart") { var size = npc.bodyParts[item]; return setup.getDreamTradeValue("bodyPart", item, size); } else if (type === "physical") { return setup.getDreamTradeValue("physical", item); } else if (type === "mental") { return setup.getDreamTradeValue("mental", item); } else if (type === "skill") { return setup.getDreamTradeValue("skill", item); } else if (type === "name") { return 50; // Fixed value for names } else if (type === "appearance") { return 10; // Fixed value for appearance items } return 0; }>> /* Execute a dream trade */ <<set setup.executeDreamTrade = function(npcIndex, playerOffer, npcOffer) { var v = State.variables; var npc = v.dreamNPCs[npcIndex]; var dp = v.dreamPlayer; // Calculate values var playerOfferValue = 0; var npcOfferValue = 0; // Calculate player offer value playerOffer.forEach(function(item) { if (item.type === "points") { playerOfferValue += item.value; } else { playerOfferValue += setup.getDreamNPCItemValue(dp, item.type, item.name); } }); // Calculate NPC offer value npcOffer.forEach(function(item) { npcOfferValue += setup.getDreamNPCItemValue(npc, item.type, item.name); }); // Check if trade is valid (player must offer equal or greater value) if (playerOfferValue < npcOfferValue) { return { success: false, reason: "Insufficient value offered" }; } // Record the trade for undo var tradeRecord = { npcIndex: npcIndex, npcName: npc.name, playerOffer: JSON.parse(JSON.stringify(playerOffer)), npcOffer: JSON.parse(JSON.stringify(npcOffer)), playerOfferValue: playerOfferValue, npcOfferValue: npcOfferValue, timestamp: Date.now() }; // Execute the trade // Remove from player, add to NPC playerOffer.forEach(function(item) { if (item.type === "points") { v.dreamTradePoints -= item.value; } else if (item.type === "bodyPart") { // Swap body parts var playerValue = dp.bodyParts[item.name]; tradeRecord.playerOriginal = tradeRecord.playerOriginal || {}; tradeRecord.playerOriginal[item.name] = playerValue; } else if (item.type === "physical") { var idx = dp.physicalTraits.indexOf(item.name); if (idx > -1) dp.physicalTraits.splice(idx, 1); } else if (item.type === "mental") { var idx = dp.mentalTraits.indexOf(item.name); if (idx > -1) dp.mentalTraits.splice(idx, 1); } else if (item.type === "skill") { var idx = dp.skills.indexOf(item.name); if (idx > -1) dp.skills.splice(idx, 1); } else if (item.type === "name") { tradeRecord.playerOriginalName = { firstName: dp.firstName, lastName: dp.lastName }; } }); // Add to player, remove from NPC npcOffer.forEach(function(item) { if (item.type === "bodyPart") { var npcValue = npc.bodyParts[item.name]; // Store NPC's original for undo tradeRecord.npcOriginal = tradeRecord.npcOriginal || {}; tradeRecord.npcOriginal[item.name] = npcValue; // Swap var temp = dp.bodyParts[item.name]; dp.bodyParts[item.name] = npcValue; npc.bodyParts[item.name] = temp; } else if (item.type === "physical") { if (!dp.physicalTraits.includes(item.name)) { dp.physicalTraits.push(item.name); } var idx = npc.physicalTraits.indexOf(item.name); if (idx > -1) npc.physicalTraits.splice(idx, 1); } else if (item.type === "mental") { if (!dp.mentalTraits.includes(item.name)) { dp.mentalTraits.push(item.name); } var idx = npc.mentalTraits.indexOf(item.name); if (idx > -1) npc.mentalTraits.splice(idx, 1); } else if (item.type === "skill") { if (!dp.skills.includes(item.name)) { dp.skills.push(item.name); } var idx = npc.skills.indexOf(item.name); if (idx > -1) npc.skills.splice(idx, 1); } else if (item.type === "name") { // Parse NPC name var nameParts = npc.name.split(" "); if (item.which === "first") { dp.firstName = nameParts[0]; npc.name = tradeRecord.playerOriginalName.firstName + " " + nameParts.slice(1).join(" "); } else if (item.which === "last") { dp.lastName = nameParts.slice(1).join(" "); npc.name = nameParts[0] + " " + tradeRecord.playerOriginalName.lastName; } else if (item.which === "full") { dp.firstName = nameParts[0]; dp.lastName = nameParts.slice(1).join(" "); npc.name = tradeRecord.playerOriginalName.firstName + " " + tradeRecord.playerOriginalName.lastName; } } else if (item.type === "appearance") { var npcValue = npc.appearance[item.name]; tradeRecord.npcOriginalAppearance = tradeRecord.npcOriginalAppearance || {}; tradeRecord.npcOriginalAppearance[item.name] = npcValue; tradeRecord.playerOriginalAppearance = tradeRecord.playerOriginalAppearance || {}; tradeRecord.playerOriginalAppearance[item.name] = dp.appearance[item.name]; // Swap appearance var temp = dp.appearance[item.name]; dp.appearance[item.name] = npcValue; npc.appearance[item.name] = temp; // Handle hair length trait if (item.name === "hairLength") { // Remove old hair length trait var oldTrait = temp === "short" ? "Short Hair" : "Long Hair"; var newTrait = npcValue === "short" ? "Short Hair" : "Long Hair"; var oldIdx = dp.physicalTraits.indexOf(oldTrait); if (oldIdx > -1) dp.physicalTraits.splice(oldIdx, 1); if (!dp.physicalTraits.includes(newTrait)) { dp.physicalTraits.push(newTrait); } } } else if (item.type === "job") { if (!dp.jobs) dp.jobs = []; if (!dp.jobs.includes(item.name)) { dp.jobs.push(item.name); } var idx = npc.jobs.indexOf(item.name); if (idx > -1) npc.jobs.splice(idx, 1); } }); // Refund excess points var excessPoints = playerOfferValue - npcOfferValue; if (excessPoints > 0) { v.dreamTradePoints += excessPoints; tradeRecord.refundedPoints = excessPoints; } // Save trade to history v.dreamTradeHistory.push(tradeRecord); return { success: true, playerOfferValue: playerOfferValue, npcOfferValue: npcOfferValue, refundedPoints: excessPoints, tradeIndex: v.dreamTradeHistory.length - 1 }; }>> /* Undo a dream trade */ <<set setup.undoDreamTrade = function(tradeIndex) { var v = State.variables; if (tradeIndex < 0 || tradeIndex >= v.dreamTradeHistory.length) { return { success: false, reason: "Invalid trade index" }; } var trade = v.dreamTradeHistory[tradeIndex]; var npc = v.dreamNPCs[trade.npcIndex]; var dp = v.dreamPlayer; // Reverse the trade // Return points spent trade.playerOffer.forEach(function(item) { if (item.type === "points") { v.dreamTradePoints += item.value; } }); // Remove refunded points if (trade.refundedPoints) { v.dreamTradePoints -= trade.refundedPoints; } // Reverse body part swaps if (trade.npcOriginal) { for (var partName in trade.npcOriginal) { // Swap back var temp = dp.bodyParts[partName]; dp.bodyParts[partName] = npc.bodyParts[partName]; npc.bodyParts[partName] = temp; } } // Reverse appearance swaps if (trade.npcOriginalAppearance) { for (var appName in trade.npcOriginalAppearance) { var temp = dp.appearance[appName]; dp.appearance[appName] = npc.appearance[appName]; npc.appearance[appName] = temp; // Handle hair length trait if (appName === "hairLength") { var oldTrait = dp.appearance[appName] === "short" ? "Short Hair" : "Long Hair"; var newTrait = npc.appearance[appName] === "short" ? "Short Hair" : "Long Hair"; // Remove current, add back original var idx = dp.physicalTraits.indexOf(newTrait); if (idx > -1) dp.physicalTraits.splice(idx, 1); if (!dp.physicalTraits.includes(oldTrait)) { dp.physicalTraits.push(oldTrait); } } } } // Reverse name swap if (trade.playerOriginalName) { var currentPlayerFirst = dp.firstName; var currentPlayerLast = dp.lastName; // Find which name parts were traded trade.npcOffer.forEach(function(item) { if (item.type === "name") { if (item.which === "first" || item.which === "full") { dp.firstName = trade.playerOriginalName.firstName; } if (item.which === "last" || item.which === "full") { dp.lastName = trade.playerOriginalName.lastName; } } }); // Restore NPC name var npcNameParts = npc.name.split(" "); // This is complex - simplified version npc.name = trade.npcOffer.find(function(i) { return i.type === "name"; }) ? (dp.firstName !== trade.playerOriginalName.firstName ? currentPlayerFirst : npcNameParts[0]) + " " + (dp.lastName !== trade.playerOriginalName.lastName ? currentPlayerLast : npcNameParts.slice(1).join(" ")) : npc.name; } // Return traits to NPC, remove from player trade.npcOffer.forEach(function(item) { if (item.type === "physical") { var idx = dp.physicalTraits.indexOf(item.name); if (idx > -1) dp.physicalTraits.splice(idx, 1); if (!npc.physicalTraits.includes(item.name)) { npc.physicalTraits.push(item.name); } } else if (item.type === "mental") { var idx = dp.mentalTraits.indexOf(item.name); if (idx > -1) dp.mentalTraits.splice(idx, 1); if (!npc.mentalTraits.includes(item.name)) { npc.mentalTraits.push(item.name); } } else if (item.type === "skill") { var idx = dp.skills.indexOf(item.name); if (idx > -1) dp.skills.splice(idx, 1); if (!npc.skills.includes(item.name)) { npc.skills.push(item.name); } } else if (item.type === "job") { if (dp.jobs) { var idx = dp.jobs.indexOf(item.name); if (idx > -1) dp.jobs.splice(idx, 1); } if (!npc.jobs.includes(item.name)) { npc.jobs.push(item.name); } } }); // Return player's traded traits trade.playerOffer.forEach(function(item) { if (item.type === "physical") { if (!dp.physicalTraits.includes(item.name)) { dp.physicalTraits.push(item.name); } } else if (item.type === "mental") { if (!dp.mentalTraits.includes(item.name)) { dp.mentalTraits.push(item.name); } } else if (item.type === "skill") { if (!dp.skills.includes(item.name)) { dp.skills.push(item.name); } } }); // Remove from history v.dreamTradeHistory.splice(tradeIndex, 1); return { success: true }; }>> /* Finalize dream state - transfer to actual player */ <<set setup.finalizeDreamState = function() { var v = State.variables; var dp = v.dreamPlayer; // Transfer name v.firstName = dp.firstName; v.lastName = dp.lastName; // Transfer body parts v.bodyParts = { gender: dp.bodyParts.gender, chest: dp.bodyParts.chest, butt: dp.bodyParts.butt, genitals: dp.bodyParts.genitals }; // Transfer appearance v.appearance = { skinTone: dp.appearance.skinTone, hairColor: dp.appearance.hairColor, hairLength: dp.appearance.hairLength, hairStyle: "messy", age: dp.appearance.age }; // Transfer traits v.physicalTraits = dp.physicalTraits.slice(); v.mentalTraits = dp.mentalTraits.slice(); v.skills = dp.skills.slice(); // Set pronouns based on gender if (dp.bodyParts.gender === "female") { v.playerPronouns = "she/her"; } else if (dp.bodyParts.gender === "male") { v.playerPronouns = "he/him"; } else { v.playerPronouns = "they/them"; } // Convert remaining points to money ($10 per point) v.money = (v.money || 0) + (v.dreamTradePoints * 10); // Initialize other required variables v.stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }; v.statMaxCaps = { charisma: 999, dexterity: 999, strength: 999, intelligence: 999 }; // Set jobs from trades, or unemployed if (dp.jobs && dp.jobs.length > 0) { v.jobs = dp.jobs.slice(); v.homeless = false; } else { v.jobs = []; v.homeless = true; } // Initialize other game variables v.maxTraits = 100; // Clean up dream state delete v.dreamPlayer; delete v.dreamNPCs; delete v.dreamTradeHistory; delete v.dreamTradePoints; delete v.dreamStartingPoints; return { success: true, startingMoney: v.money }; }>> /* Get list of negative traits player can take for extra points */ <<set setup.getNegativeTraitsForPoints = function() { return { physical: [ { name: "Blemished", points: 20 }, { name: "Clumsy", points: 30 }, { name: "Overweight", points: 30 }, { name: "Plain", points: 15 }, { name: "Slow", points: 28 }, { name: "Stiff", points: 25 }, { name: "Ugly", points: 40 }, { name: "Underweight", points: 28 }, { name: "Weak", points: 35 } ], mental: [ { name: "Arrogant", points: 35 }, { name: "Awkward", points: 10 }, { name: "Cowardly", points: 38 }, { name: "Dull", points: 38 }, { name: "Foolish", points: 40 }, { name: "Forgetful", points: 25 }, { name: "Impatient", points: 28 }, { name: "Insecure", points: 25 }, { name: "Lazy", points: 38 }, { name: "Rude", points: 30 }, { name: "Selfish", points: 30 }, { name: "Short Tempered", points: 28 }, { name: "Slow Learner", points: 30 }, { name: "Unlucky", points: 28 } ] }; }>> /* Add negative trait and gain points */ <<set setup.addNegativeTraitForPoints = function(trait, type, points) { var v = State.variables; var dp = v.dreamPlayer; if (type === "physical") { if (!dp.physicalTraits.includes(trait)) { dp.physicalTraits.push(trait); dp.negativeTraits.push({ name: trait, type: type, points: points }); v.dreamTradePoints += points; return true; } } else if (type === "mental") { if (!dp.mentalTraits.includes(trait)) { dp.mentalTraits.push(trait); dp.negativeTraits.push({ name: trait, type: type, points: points }); v.dreamTradePoints += points; return true; } } return false; }>> /* Remove negative trait and lose points */ <<set setup.removeNegativeTraitForPoints = function(trait, type, points) { var v = State.variables; var dp = v.dreamPlayer; // Check if we have enough points to remove if (v.dreamTradePoints < points) { return false; } if (type === "physical") { var idx = dp.physicalTraits.indexOf(trait); if (idx > -1) { dp.physicalTraits.splice(idx, 1); var negIdx = dp.negativeTraits.findIndex(function(t) { return t.name === trait; }); if (negIdx > -1) dp.negativeTraits.splice(negIdx, 1); v.dreamTradePoints -= points; return true; } } else if (type === "mental") { var idx = dp.mentalTraits.indexOf(trait); if (idx > -1) { dp.mentalTraits.splice(idx, 1); var negIdx = dp.negativeTraits.findIndex(function(t) { return t.name === trait; }); if (negIdx > -1) dp.negativeTraits.splice(negIdx, 1); v.dreamTradePoints -= points; return true; } } return false; }>>
/* ============================================== */ /* DREAM STATE CHARACTER CREATION SYSTEM */ /* ============================================== */ /* Initialize Dream State Variables */ <<set setup.initializeDreamState = function() { var v = State.variables; // Starting trade points v.dreamTradePoints = 150; v.dreamStartingPoints = 150; // Player's dream selections (before finalization) v.dreamPlayer = { firstName: "Water", lastName: "Bottle", gender: null, bodyParts: { gender: null, chest: null, butt: null, genitals: null }, appearance: { skinTone: "pale", hairColor: "Black", hairLength: "short", age: "Adult" }, physicalTraits: [], mentalTraits: [], skills: [], jobs: [], // Jobs acquired from spirits negativeTraits: [] // Negative traits taken for extra points }; // Track completed trades (for undo functionality) v.dreamTradeHistory = []; // Initialize dream NPCs v.dreamNPCs = []; return true; }>> /* Create Dream NPC (simplified version without stats) */ <<set setup.createDreamNPC = function(config) { var hairLengthTrait = config.hairLength === "short" ? "Short Hair" : "Long Hair"; var allPhysicalTraits = config.physicalTraits ? config.physicalTraits.slice() : []; if (!allPhysicalTraits.includes(hairLengthTrait)) { allPhysicalTraits.push(hairLengthTrait); } var npc = { name: config.name, gender: config.gender, bodyParts: { gender: config.gender, chest: config.chest || "flat", butt: config.butt || "flat", genitals: config.genitals || (config.gender === "male" ? "penis" : "vagina") }, appearance: { skinTone: config.skinTone || "pale", hairColor: config.hairColor || "Black", hairLength: config.hairLength || "short", age: config.age || "Adult" }, physicalTraits: allPhysicalTraits, mentalTraits: config.mentalTraits || [], skills: config.skills || [], jobs: config.jobs || [], isDreamNPC: true // Flag to identify dream NPCs }; return npc; }>> /* Initialize the 3 Dream NPCs */ <<set setup.initializeDreamNPCs = function() { var v = State.variables; v.dreamNPCs = []; // NPC 1: Mercy Velvet v.dreamNPCs.push(setup.createDreamNPC({ name: "Mercy Velvet", gender: "male", chest: "large", butt: "large", genitals: "penis", skinTone: "pale", hairColor: "Platinum Blonde", hairLength: "long", age: "Adult", physicalTraits: ["Detail-Oriented", "Pierced", "Quick", "Sarcastic"], mentalTraits: ["Analytical", "Charming", "Direct", "Outgoing", "Sly", "Witty"], skills: ["Quick Learner", "Cleaning", "Dancing", "Driving", "Guitar", "Hair Styling", "High Heels Proficient", "Makeup", "Modeling", "Piano", "Definitely not a Vampire"], jobs: ["Beauty Salon Stylist"] })); // NPC 2: No Problem v.dreamNPCs.push(setup.createDreamNPC({ name: "No Problem", gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "big penis", skinTone: "tan", hairColor: "Red", hairLength: "short", age: "Mature Adult", physicalTraits: ["Athletic Build", "Broad-Shouldered", "Muscular", "Strong", "Sturdy", "Tall", "Scarred"], mentalTraits: ["Humorous", "Brave", "Competitive", "Determined", "Focused", "High Stamina", "Negotiator", "Optimistic", "Resourceful", "Shrewd", "Thoughtful", "Workaholic", "Dominant"], skills: ["Baking", "Forklift Certified", "Heavy Lifting", "Inventory Management", "Swimmer", "Were-Creature"], jobs: ["Dock Worker"] })); // NPC 3: Damn lol v.dreamNPCs.push(setup.createDreamNPC({ name: "Damn lol", gender: "female", chest: "flat", butt: "flat", genitals: "loose vagina", skinTone: "dark", hairColor: "Black", hairLength: "short", age: "Mature Adult", physicalTraits: ["Attractive", "Graceful", "Mature", "Sharp Features", "Soft", "Short", "Tattooed"], mentalTraits: ["Bookworm", "Considerate", "Empathetic", "Honest", "Sly", "Steadfast", "Goth"], skills: ["Combat", "Art", "Cooking", "Lock Picking", "Medicine", "Painting", "Photography", "Retail", "Sexually Skilled", "Singing", "Social Media", "Trading", "Yoga"], jobs: ["Barista"] })); // NPC 4: Sam Handwich v.dreamNPCs.push(setup.createDreamNPC({ name: "Sam Handwich", gender: "female", chest: "flat", butt: "medium", genitals: "vagina", skinTone: "pale", hairColor: "Brown", hairLength: "long", age: "Adult", physicalTraits: [], mentalTraits: [], skills: [], jobs: [] })); return v.dreamNPCs; }>> /* Calculate the trade value of an item (uses existing getTraitValue) */ <<set setup.getDreamTradeValue = function(type, name, size) { // Use existing trait value system return setup.getTraitValue(type, name, size); }>> /* Calculate total value of player's current dream selections */ <<set setup.calculateDreamPlayerValue = function() { var v = State.variables; var dp = v.dreamPlayer; var totalValue = 0; // Body parts if (dp.bodyParts.chest) { totalValue += setup.getDreamTradeValue("bodyPart", "chest", dp.bodyParts.chest); } if (dp.bodyParts.butt) { totalValue += setup.getDreamTradeValue("bodyPart", "butt", dp.bodyParts.butt); } if (dp.bodyParts.genitals) { totalValue += setup.getDreamTradeValue("bodyPart", "genitals", dp.bodyParts.genitals); } // Physical traits dp.physicalTraits.forEach(function(trait) { totalValue += setup.getDreamTradeValue("physical", trait); }); // Mental traits dp.mentalTraits.forEach(function(trait) { totalValue += setup.getDreamTradeValue("mental", trait); }); // Skills dp.skills.forEach(function(skill) { totalValue += setup.getDreamTradeValue("skill", skill); }); return totalValue; }>> /* Get value of a specific item from dream NPC */ <<set setup.getDreamNPCItemValue = function(npc, type, item) { if (type === "bodyPart") { var size = npc.bodyParts[item]; return setup.getDreamTradeValue("bodyPart", item, size); } else if (type === "physical") { return setup.getDreamTradeValue("physical", item); } else if (type === "mental") { return setup.getDreamTradeValue("mental", item); } else if (type === "skill") { return setup.getDreamTradeValue("skill", item); } else if (type === "job") { return setup.getDreamTradeValue("job", item); } else if (type === "name") { return 0; // Names are free to trade } else if (type === "appearance") { return 10; // Fixed value for appearance items } return 0; }>> /* Execute a dream trade */ <<set setup.executeDreamTrade = function(npcIndex, playerOffer, npcOffer) { var v = State.variables; var npc = v.dreamNPCs[npcIndex]; var dp = v.dreamPlayer; // Calculate values var playerOfferValue = 0; var npcOfferValue = 0; // Calculate player offer value playerOffer.forEach(function(item) { if (item.type === "points") { playerOfferValue += item.value; } else { playerOfferValue += setup.getDreamNPCItemValue(dp, item.type, item.name); } }); // Calculate NPC offer value npcOffer.forEach(function(item) { npcOfferValue += setup.getDreamNPCItemValue(npc, item.type, item.name); }); // Check if trade is valid (player must offer equal or greater value) if (playerOfferValue < npcOfferValue) { return { success: false, reason: "Insufficient value offered" }; } // Record the trade for undo var tradeRecord = { npcIndex: npcIndex, npcName: npc.name, playerOffer: JSON.parse(JSON.stringify(playerOffer)), npcOffer: JSON.parse(JSON.stringify(npcOffer)), playerOfferValue: playerOfferValue, npcOfferValue: npcOfferValue, timestamp: Date.now() }; // ALWAYS save player's original name (with fallback defaults) tradeRecord.playerOriginalName = { firstName: dp.firstName || "Water", lastName: dp.lastName || "Bottle" }; // Also ensure dp has firstName/lastName defined if (!dp.firstName) dp.firstName = "Water"; if (!dp.lastName) dp.lastName = "Bottle"; // Execute the trade // Remove from player, add to NPC playerOffer.forEach(function(item) { if (item.type === "points") { v.dreamTradePoints -= item.value; } else if (item.type === "bodyPart") { // Swap body parts var playerValue = dp.bodyParts[item.name]; tradeRecord.playerOriginal = tradeRecord.playerOriginal || {}; tradeRecord.playerOriginal[item.name] = playerValue; } else if (item.type === "physical") { var idx = dp.physicalTraits.indexOf(item.name); if (idx > -1) dp.physicalTraits.splice(idx, 1); } else if (item.type === "mental") { var idx = dp.mentalTraits.indexOf(item.name); if (idx > -1) dp.mentalTraits.splice(idx, 1); } else if (item.type === "skill") { var idx = dp.skills.indexOf(item.name); if (idx > -1) dp.skills.splice(idx, 1); } else if (item.type === "name") { // Already saved above if needed } }); // Add to player, remove from NPC npcOffer.forEach(function(item) { if (item.type === "bodyPart") { var npcValue = npc.bodyParts[item.name]; // Store NPC's original for undo tradeRecord.npcOriginal = tradeRecord.npcOriginal || {}; tradeRecord.npcOriginal[item.name] = npcValue; // Swap var temp = dp.bodyParts[item.name]; dp.bodyParts[item.name] = npcValue; npc.bodyParts[item.name] = temp; } else if (item.type === "physical") { if (!dp.physicalTraits.includes(item.name)) { dp.physicalTraits.push(item.name); } var idx = npc.physicalTraits.indexOf(item.name); if (idx > -1) npc.physicalTraits.splice(idx, 1); } else if (item.type === "mental") { if (!dp.mentalTraits.includes(item.name)) { dp.mentalTraits.push(item.name); } var idx = npc.mentalTraits.indexOf(item.name); if (idx > -1) npc.mentalTraits.splice(idx, 1); } else if (item.type === "skill") { if (!dp.skills.includes(item.name)) { dp.skills.push(item.name); } var idx = npc.skills.indexOf(item.name); if (idx > -1) npc.skills.splice(idx, 1); } else if (item.type === "job") { // Jobs are swapped, not stacked - player can only have one job if (!dp.jobs) dp.jobs = []; // Store the job we're receiving var receivedJob = item.name; // Get player's old job from the item (passed from passage) var givenJob = item.playerOldJob || null; // Store for undo tradeRecord.playerOriginalJob = givenJob; // Clear player's current jobs and set the new one dp.jobs = [receivedJob]; // Remove received job from NPC var idx = npc.jobs.indexOf(receivedJob); if (idx > -1) npc.jobs.splice(idx, 1); // Give player's old job to NPC (if they had one that wasn't Unemployed) if (givenJob && givenJob !== "Unemployed" && !npc.jobs.includes(givenJob)) { npc.jobs.push(givenJob); } } else if (item.type === "name") { // Parse NPC name var nameParts = npc.name.split(" "); var playerFirstName = tradeRecord.playerOriginalName ? tradeRecord.playerOriginalName.firstName : (dp.firstName || "Water"); var playerLastName = tradeRecord.playerOriginalName ? tradeRecord.playerOriginalName.lastName : (dp.lastName || "Bottle"); if (item.which === "first") { dp.firstName = nameParts[0]; npc.name = playerFirstName + " " + nameParts.slice(1).join(" "); } else if (item.which === "last") { dp.lastName = nameParts.slice(1).join(" "); npc.name = nameParts[0] + " " + playerLastName; } else if (item.which === "full") { dp.firstName = nameParts[0]; dp.lastName = nameParts.slice(1).join(" "); npc.name = playerFirstName + " " + playerLastName; } } else if (item.type === "appearance") { var npcValue = npc.appearance[item.name]; tradeRecord.npcOriginalAppearance = tradeRecord.npcOriginalAppearance || {}; tradeRecord.npcOriginalAppearance[item.name] = npcValue; tradeRecord.playerOriginalAppearance = tradeRecord.playerOriginalAppearance || {}; tradeRecord.playerOriginalAppearance[item.name] = dp.appearance[item.name]; // Swap appearance var temp = dp.appearance[item.name]; dp.appearance[item.name] = npcValue; npc.appearance[item.name] = temp; // Handle hair length trait if (item.name === "hairLength") { // Remove old hair length trait var oldTrait = temp === "short" ? "Short Hair" : "Long Hair"; var newTrait = npcValue === "short" ? "Short Hair" : "Long Hair"; var oldIdx = dp.physicalTraits.indexOf(oldTrait); if (oldIdx > -1) dp.physicalTraits.splice(oldIdx, 1); if (!dp.physicalTraits.includes(newTrait)) { dp.physicalTraits.push(newTrait); } } } else if (item.type === "job") { if (!dp.jobs) dp.jobs = []; if (!dp.jobs.includes(item.name)) { dp.jobs.push(item.name); } var idx = npc.jobs.indexOf(item.name); if (idx > -1) npc.jobs.splice(idx, 1); } }); // Refund excess points var excessPoints = playerOfferValue - npcOfferValue; if (excessPoints > 0) { v.dreamTradePoints += excessPoints; tradeRecord.refundedPoints = excessPoints; } // Save trade to history v.dreamTradeHistory.push(tradeRecord); return { success: true, playerOfferValue: playerOfferValue, npcOfferValue: npcOfferValue, refundedPoints: excessPoints, tradeIndex: v.dreamTradeHistory.length - 1 }; }>> /* Undo a dream trade */ <<set setup.undoDreamTrade = function(tradeIndex) { var v = State.variables; if (tradeIndex < 0 || tradeIndex >= v.dreamTradeHistory.length) { return { success: false, reason: "Invalid trade index" }; } var trade = v.dreamTradeHistory[tradeIndex]; var npc = v.dreamNPCs[trade.npcIndex]; var dp = v.dreamPlayer; // Reverse the trade // Return points spent trade.playerOffer.forEach(function(item) { if (item.type === "points") { v.dreamTradePoints += item.value; } }); // Remove refunded points if (trade.refundedPoints) { v.dreamTradePoints -= trade.refundedPoints; } // Reverse body part swaps if (trade.npcOriginal) { for (var partName in trade.npcOriginal) { // Swap back var temp = dp.bodyParts[partName]; dp.bodyParts[partName] = npc.bodyParts[partName]; npc.bodyParts[partName] = temp; } } // Reverse appearance swaps if (trade.npcOriginalAppearance) { for (var appName in trade.npcOriginalAppearance) { var temp = dp.appearance[appName]; dp.appearance[appName] = npc.appearance[appName]; npc.appearance[appName] = temp; // Handle hair length trait if (appName === "hairLength") { var oldTrait = dp.appearance[appName] === "short" ? "Short Hair" : "Long Hair"; var newTrait = npc.appearance[appName] === "short" ? "Short Hair" : "Long Hair"; // Remove current, add back original var idx = dp.physicalTraits.indexOf(newTrait); if (idx > -1) dp.physicalTraits.splice(idx, 1); if (!dp.physicalTraits.includes(oldTrait)) { dp.physicalTraits.push(oldTrait); } } } } // Reverse name swap if (trade.playerOriginalName) { var currentPlayerFirst = dp.firstName; var currentPlayerLast = dp.lastName; // Find which name parts were traded trade.npcOffer.forEach(function(item) { if (item.type === "name") { if (item.which === "first" || item.which === "full") { dp.firstName = trade.playerOriginalName.firstName; } if (item.which === "last" || item.which === "full") { dp.lastName = trade.playerOriginalName.lastName; } } }); // Restore NPC name var npcNameParts = npc.name.split(" "); // This is complex - simplified version npc.name = trade.npcOffer.find(function(i) { return i.type === "name"; }) ? (dp.firstName !== trade.playerOriginalName.firstName ? currentPlayerFirst : npcNameParts[0]) + " " + (dp.lastName !== trade.playerOriginalName.lastName ? currentPlayerLast : npcNameParts.slice(1).join(" ")) : npc.name; } // Return traits to NPC, remove from player trade.npcOffer.forEach(function(item) { if (item.type === "physical") { var idx = dp.physicalTraits.indexOf(item.name); if (idx > -1) dp.physicalTraits.splice(idx, 1); if (!npc.physicalTraits.includes(item.name)) { npc.physicalTraits.push(item.name); } } else if (item.type === "mental") { var idx = dp.mentalTraits.indexOf(item.name); if (idx > -1) dp.mentalTraits.splice(idx, 1); if (!npc.mentalTraits.includes(item.name)) { npc.mentalTraits.push(item.name); } } else if (item.type === "skill") { var idx = dp.skills.indexOf(item.name); if (idx > -1) dp.skills.splice(idx, 1); if (!npc.skills.includes(item.name)) { npc.skills.push(item.name); } } else if (item.type === "job") { // Return received job to NPC var receivedJob = item.name; if (!npc.jobs.includes(receivedJob)) { npc.jobs.push(receivedJob); } // Restore player's original job (from tradeRecord) var originalJob = trade.playerOriginalJob || item.playerOldJob; if (originalJob && originalJob !== "Unemployed") { dp.jobs = [originalJob]; // Remove from NPC if we gave it to them var idx = npc.jobs.indexOf(originalJob); if (idx > -1) npc.jobs.splice(idx, 1); } else { // Player was unemployed dp.jobs = []; } } }); // Return player's traded traits (physical, mental, skill only - jobs handled above) trade.playerOffer.forEach(function(item) { if (item.type === "physical") { if (!dp.physicalTraits.includes(item.name)) { dp.physicalTraits.push(item.name); } } else if (item.type === "mental") { if (!dp.mentalTraits.includes(item.name)) { dp.mentalTraits.push(item.name); } } else if (item.type === "skill") { if (!dp.skills.includes(item.name)) { dp.skills.push(item.name); } } // Jobs are handled in npcOffer section above }); // Remove from history v.dreamTradeHistory.splice(tradeIndex, 1); return { success: true }; }>> /* Finalize dream state - transfer to actual player */ <<set setup.finalizeDreamState = function() { var v = State.variables; var dp = v.dreamPlayer; // Transfer name v.firstName = dp.firstName; v.lastName = dp.lastName; // Transfer body parts v.bodyParts = { gender: dp.bodyParts.gender, chest: dp.bodyParts.chest, butt: dp.bodyParts.butt, genitals: dp.bodyParts.genitals }; // Transfer appearance v.appearance = { skinTone: dp.appearance.skinTone, hairColor: dp.appearance.hairColor, hairLength: dp.appearance.hairLength, hairStyle: "messy", age: dp.appearance.age }; // Transfer traits v.physicalTraits = dp.physicalTraits.slice(); v.mentalTraits = dp.mentalTraits.slice(); v.skills = dp.skills.slice(); // Convert remaining points to money ($10 per point) v.money = (v.money || 0) + (v.dreamTradePoints * 10); // Initialize other required variables v.stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }; v.statMaxCaps = { charisma: 999, dexterity: 999, strength: 999, intelligence: 999 }; // Set jobs from trades, or unemployed if (dp.jobs && dp.jobs.length > 0) { v.jobs = dp.jobs.slice(); v.homeless = false; } else { v.jobs = []; v.homeless = true; } // Initialize other game variables v.maxTraits = 100; // Clean up dream state delete v.dreamPlayer; delete v.dreamNPCs; delete v.dreamTradeHistory; delete v.dreamTradePoints; delete v.dreamStartingPoints; return { success: true, startingMoney: v.money }; }>> /* Get list of negative traits player can take for extra points */ <<set setup.getNegativeTraitsForPoints = function() { return { physical: [ { name: "Awkward", points: 5 }, { name: "Clumsy", points: 15 }, { name: "Overweight", points: 15 }, { name: "Plain", points: 8 }, { name: "Slow", points: 14 }, { name: "Stiff", points: 13 }, { name: "Ugly", points: 20 }, { name: "Underweight", points: 14 } ], mental: [ { name: "Arrogant", points: 18 }, { name: "Cowardly", points: 19 }, { name: "Dull", points: 19 }, { name: "Foolish", points: 20 }, { name: "Forgetful", points: 13 }, { name: "Lazy", points: 19 }, { name: "Unlucky", points: 70 }, { name: "Unskilled", points: 50 } ] }; }>> /* Add negative trait and gain points */ <<set setup.addNegativeTraitForPoints = function(trait, type, points) { var v = State.variables; var dp = v.dreamPlayer; if (type === "physical") { if (!dp.physicalTraits.includes(trait)) { dp.physicalTraits.push(trait); dp.negativeTraits.push({ name: trait, type: type, points: points }); v.dreamTradePoints += points; return true; } } else if (type === "mental") { if (!dp.mentalTraits.includes(trait)) { dp.mentalTraits.push(trait); dp.negativeTraits.push({ name: trait, type: type, points: points }); v.dreamTradePoints += points; return true; } } return false; }>> /* Remove negative trait and lose points */ <<set setup.removeNegativeTraitForPoints = function(trait, type, points) { var v = State.variables; var dp = v.dreamPlayer; // Check if we have enough points to remove if (v.dreamTradePoints < points) { return false; } if (type === "physical") { var idx = dp.physicalTraits.indexOf(trait); if (idx > -1) { dp.physicalTraits.splice(idx, 1); var negIdx = dp.negativeTraits.findIndex(function(t) { return t.name === trait; }); if (negIdx > -1) dp.negativeTraits.splice(negIdx, 1); v.dreamTradePoints -= points; return true; } } else if (type === "mental") { var idx = dp.mentalTraits.indexOf(trait); if (idx > -1) { dp.mentalTraits.splice(idx, 1); var negIdx = dp.negativeTraits.findIndex(function(t) { return t.name === trait; }); if (negIdx > -1) dp.negativeTraits.splice(negIdx, 1); v.dreamTradePoints -= points; return true; } } return false; }>>
/* DreamStateStyles - Shared CSS for all dream state passages */ <style> /* Dream State Animations */ @keyframes dreamPulse { 0%, 100% { text-shadow: 0 0 10px #7dd3fc, 0 0 20px #7dd3fc, 0 0 30px #7dd3fc; opacity: 0.9; } 50% { text-shadow: 0 0 20px #7dd3fc, 0 0 40px #7dd3fc, 0 0 60px #7dd3fc, 0 0 80px #3b82f6; opacity: 1; } } @keyframes dreamFloat { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-10px); } } @keyframes dreamFade { 0% { opacity: 0; transform: translateY(20px); } 100% { opacity: 1; transform: translateY(0); } } @keyframes voidSwirl { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } @keyframes starTwinkle { 0%, 100% { opacity: 0.3; } 50% { opacity: 1; } } @keyframes ghostFloat { 0%, 100% { transform: translateY(0px) scale(1); opacity: 0.9; } 50% { transform: translateY(-8px) scale(1.02); opacity: 1; } } @keyframes spiritGlow { 0%, 100% { box-shadow: 0 0 20px rgba(192, 132, 252, 0.4); } 50% { box-shadow: 0 0 40px rgba(192, 132, 252, 0.7), 0 0 60px rgba(125, 211, 252, 0.3); } } .dream-container { background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2e 50%, #0a1a2e 100%); min-height: 100vh; padding: 30px 20px; position: relative; overflow: hidden; } .dream-container::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: radial-gradient(2px 2px at 20px 30px, white, transparent), radial-gradient(2px 2px at 40px 70px, rgba(255,255,255,0.8), transparent), radial-gradient(1px 1px at 90px 40px, white, transparent), radial-gradient(2px 2px at 130px 80px, rgba(255,255,255,0.6), transparent), radial-gradient(1px 1px at 160px 120px, white, transparent); background-repeat: repeat; background-size: 200px 200px; animation: starTwinkle 4s ease-in-out infinite; pointer-events: none; } .dream-title { color: #c084fc; font-size: 36px; text-align: center; text-shadow: 0 0 20px #c084fc, 0 0 40px #a855f7; margin-bottom: 30px; letter-spacing: 2px; } .dream-points-display { background: linear-gradient(135deg, rgba(192, 132, 252, 0.3) 0%, rgba(125, 211, 252, 0.3) 100%); border: 3px solid #c084fc; border-radius: 15px; padding: 20px; text-align: center; margin: 0 auto 30px auto; max-width: 400px; box-shadow: 0 0 30px rgba(192, 132, 252, 0.4); } .dream-points-label { color: #c084fc; font-size: 18px; margin-bottom: 10px; } .dream-points-value { color: #7dd3fc; font-size: 48px; font-weight: bold; text-shadow: 0 0 20px #7dd3fc; animation: dreamPulse 2s ease-in-out infinite; } .dream-section { background: rgba(10, 10, 30, 0.9); border: 2px solid rgba(125, 211, 252, 0.3); border-radius: 15px; padding: 25px; margin: 20px auto; max-width: 900px; box-shadow: 0 0 20px rgba(125, 211, 252, 0.15); } .dream-section-title { color: #7dd3fc; font-size: 24px; margin: 0 0 20px 0; padding-bottom: 10px; border-bottom: 2px solid rgba(125, 211, 252, 0.3); text-shadow: 0 0 10px #7dd3fc; } .dream-option-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; } .dream-option { background: rgba(20, 20, 40, 0.8); border: 2px solid rgba(125, 211, 252, 0.3); border-radius: 10px; padding: 15px; cursor: pointer; transition: all 0.3s ease; text-align: center; } .dream-option:hover { border-color: #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.3); transform: translateY(-3px); } .dream-option.selected { border-color: #c084fc; background: rgba(192, 132, 252, 0.2); box-shadow: 0 0 25px rgba(192, 132, 252, 0.4); } .dream-option-label { color: #ccc; font-size: 18px; font-weight: bold; } .dream-option.selected .dream-option-label { color: #c084fc; } .dream-option-desc { color: #888; font-size: 13px; margin-top: 8px; } .dream-negative-trait { background: rgba(40, 20, 20, 0.8); border: 2px solid rgba(255, 107, 107, 0.3); border-radius: 10px; padding: 12px 15px; display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; transition: all 0.3s ease; cursor: pointer; white-space: nowrap; } .dream-negative-trait:hover { border-color: #ff6b6b; box-shadow: 0 0 15px rgba(255, 107, 107, 0.2); } .dream-negative-trait.taken { background: rgba(255, 107, 107, 0.2); border-color: #ff6b6b; } .dream-negative-name { color: #ff6b6b; font-weight: bold; font-size: 16px; } .dream-negative-points { color: #51cf66; font-weight: bold; font-size: 16px; } .dream-button { background: linear-gradient(135deg, rgba(125, 211, 252, 0.3) 0%, rgba(192, 132, 252, 0.3) 100%); border: 2px solid #7dd3fc; color: #7dd3fc; padding: 15px 40px; border-radius: 25px; font-size: 18px; font-weight: bold; cursor: pointer; transition: all 0.3s ease; text-shadow: 0 0 10px #7dd3fc; box-shadow: 0 0 20px rgba(125, 211, 252, 0.3); display: inline-block; } .dream-button:hover { background: linear-gradient(135deg, rgba(125, 211, 252, 0.5) 0%, rgba(192, 132, 252, 0.5) 100%); box-shadow: 0 0 40px rgba(125, 211, 252, 0.5); transform: scale(1.05); } .dream-button.disabled { opacity: 0.4; cursor: not-allowed; } .dream-voice { color: #7dd3fc; font-size: 18px; text-align: center; font-style: italic; margin: 15px 0; text-shadow: 0 0 10px rgba(125, 211, 252, 0.5); } .dream-voice-emphasis { color: #c084fc; font-weight: bold; text-shadow: 0 0 15px #c084fc, 0 0 30px #a855f7; } .dream-current-body { background: rgba(20, 20, 40, 0.8); border: 2px solid rgba(192, 132, 252, 0.4); border-radius: 10px; padding: 15px; margin-top: 15px; } .dream-body-item { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid rgba(125, 211, 252, 0.1); color: #ccc; } .dream-body-item:last-child { border-bottom: none; } .dream-body-label { color: #888; } .dream-body-value { color: #c084fc; font-weight: bold; } .dream-divider { height: 2px; background: linear-gradient(90deg, transparent, #7dd3fc, #c084fc, #7dd3fc, transparent); margin: 30px 0; opacity: 0.5; } /* Spirit NPC Cards */ .spirit-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; max-width: 1200px; margin: 0 auto 30px auto; } .spirit-card { background: rgba(20, 10, 40, 0.95); border: 3px solid rgba(192, 132, 252, 0.5); border-radius: 20px; padding: 20px; animation: ghostFloat 5s ease-in-out infinite; box-shadow: 0 0 25px rgba(192, 132, 252, 0.4); } .spirit-card:nth-child(2) { animation-delay: 0.5s; } .spirit-card:nth-child(3) { animation-delay: 1s; } .spirit-name { color: #c084fc; font-size: 24px; text-align: center; margin: 0 0 15px 0; text-shadow: 0 0 15px #c084fc; } .spirit-section { margin-bottom: 15px; } .spirit-section-title { color: #7dd3fc; font-size: 14px; font-weight: bold; margin-bottom: 8px; padding-bottom: 5px; border-bottom: 1px solid rgba(125, 211, 252, 0.3); } .spirit-trait-list { display: flex; flex-wrap: wrap; gap: 6px; } .spirit-trait { background: rgba(125, 211, 252, 0.15); border: 1px solid rgba(125, 211, 252, 0.4); color: #ccc; padding: 4px 10px; border-radius: 12px; font-size: 12px; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; } .spirit-trait:hover { background: rgba(125, 211, 252, 0.3); border-color: #7dd3fc; color: #fff; } .spirit-trait .trait-value { color: #51cf66; font-weight: bold; margin-left: 5px; } .spirit-body-info { background: rgba(30, 20, 50, 0.8); border-radius: 10px; padding: 10px; font-size: 13px; color: #aaa; } .spirit-body-row { display: flex; justify-content: space-between; padding: 4px 0; } .spirit-body-value { color: #c084fc; font-weight: bold; } /* Trade History */ .trade-history-item { background: rgba(20, 20, 40, 0.8); border: 2px solid rgba(192, 132, 252, 0.3); border-radius: 10px; padding: 15px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; } .trade-history-info { flex: 1; } .trade-history-npc { color: #c084fc; font-weight: bold; font-size: 16px; } .trade-history-details { color: #aaa; font-size: 13px; margin-top: 5px; } .undo-button { background: rgba(255, 107, 107, 0.2); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px 15px; border-radius: 15px; cursor: pointer; font-weight: bold; transition: all 0.2s ease; } .undo-button:hover { background: rgba(255, 107, 107, 0.4); } /* Player traits display */ .your-trait { background: rgba(81, 207, 102, 0.15); border: 1px solid rgba(81, 207, 102, 0.4); color: #ccc; padding: 4px 10px; border-radius: 12px; font-size: 12px; display: inline-block; margin: 3px; white-space: nowrap; } /* Point conversion info */ .conversion-info { background: rgba(255, 193, 7, 0.1); border: 2px solid rgba(255, 193, 7, 0.4); border-radius: 10px; padding: 15px; text-align: center; margin-top: 20px; } .conversion-text { color: #ffc107; font-size: 16px; } .conversion-amount { color: #51cf66; font-size: 24px; font-weight: bold; text-shadow: 0 0 10px rgba(81, 207, 102, 0.5); } /* Summary page styles */ .summary-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } .summary-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid rgba(125, 211, 252, 0.1); } .summary-item:last-child { border-bottom: none; } .summary-label { color: #888; font-size: 16px; } .summary-value { color: #c084fc; font-weight: bold; font-size: 16px; } .trait-tag { display: inline-block; padding: 6px 14px; border-radius: 20px; font-size: 14px; margin: 4px; font-weight: 500; white-space: nowrap; } .trait-physical { background: rgba(81, 207, 102, 0.2); border: 1px solid rgba(81, 207, 102, 0.5); color: #51cf66; } .trait-mental { background: rgba(155, 89, 182, 0.2); border: 1px solid rgba(155, 89, 182, 0.5); color: #9b59b6; } .trait-skill { background: rgba(255, 193, 7, 0.2); border: 1px solid rgba(255, 193, 7, 0.5); color: #ffc107; } .trait-negative { background: rgba(255, 107, 107, 0.2); border: 1px solid rgba(255, 107, 107, 0.5); color: #ff6b6b; } .money-display { background: linear-gradient(135deg, rgba(81, 207, 102, 0.3) 0%, rgba(40, 167, 69, 0.3) 100%); border: 3px solid #51cf66; border-radius: 15px; padding: 25px; text-align: center; margin: 25px auto; max-width: 400px; box-shadow: 0 0 30px rgba(81, 207, 102, 0.3); } .money-label { color: #51cf66; font-size: 18px; margin-bottom: 10px; } .money-value { color: #51cf66; font-size: 48px; font-weight: bold; text-shadow: 0 0 20px rgba(81, 207, 102, 0.5); } .money-detail { color: #aaa; font-size: 14px; margin-top: 10px; } .warning-box { background: rgba(255, 193, 7, 0.1); border: 2px solid rgba(255, 193, 7, 0.5); border-radius: 10px; padding: 20px; margin: 20px auto; max-width: 600px; text-align: center; } .warning-text { color: #ffc107; font-size: 16px; } </style>
<<nobr>> /* Initialize Dream State */ <<run setup.initializeDreamState()>> <<run setup.initializeDreamNPCs()>> <style> /* Dream State Animations - Optimized for mobile performance */ @keyframes dreamPulse { 0%, 100% { opacity: 0.85; } 50% { opacity: 1; } } @keyframes dreamFloat { 0%, 100% { transform: translateY(0px); } 50% { transform: translateY(-8px); } } @keyframes dreamFade { 0% { opacity: 0; transform: translateY(15px); } 100% { opacity: 1; transform: translateY(0); } } .dream-container { background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2e 50%, #0a1a2e 100%); min-height: 100vh; padding: 40px 20px; position: relative; overflow: hidden; } .dream-container::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-image: radial-gradient(1px 1px at 20px 30px, rgba(255,255,255,0.7), transparent), radial-gradient(1px 1px at 80px 60px, rgba(255,255,255,0.5), transparent), radial-gradient(1px 1px at 140px 90px, rgba(255,255,255,0.6), transparent); background-repeat: repeat; background-size: 180px 120px; opacity: 0.6; pointer-events: none; } .dream-voice { color: #7dd3fc; font-size: 22px; line-height: 2; text-align: center; text-shadow: 0 0 15px #7dd3fc; font-style: italic; letter-spacing: 1px; } .dream-voice-emphasis { color: #c084fc; font-weight: bold; text-shadow: 0 0 12px #c084fc; } .dream-title { color: #c084fc; font-size: 42px; text-align: center; animation: dreamFloat 4s ease-in-out infinite; text-shadow: 0 0 20px #c084fc, 0 0 35px #a855f7; margin-bottom: 40px; letter-spacing: 3px; will-change: transform; } .dream-section { background: rgba(10, 10, 30, 0.85); border: 2px solid rgba(125, 211, 252, 0.3); border-radius: 20px; padding: 30px; margin: 30px auto; max-width: 800px; animation: dreamFade 0.8s ease-out; box-shadow: 0 0 20px rgba(125, 211, 252, 0.15); } .dream-button { background: linear-gradient(135deg, rgba(125, 211, 252, 0.3) 0%, rgba(192, 132, 252, 0.3) 100%); border: 2px solid #7dd3fc; color: #7dd3fc; padding: 20px 50px; border-radius: 30px; font-size: 20px; font-weight: bold; cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease; text-shadow: 0 0 10px #7dd3fc; box-shadow: 0 0 15px rgba(125, 211, 252, 0.25); display: inline-block; } .dream-button:hover { box-shadow: 0 0 25px rgba(125, 211, 252, 0.4); transform: scale(1.03); } .dream-divider { height: 2px; background: linear-gradient(90deg, transparent, #7dd3fc, #c084fc, #7dd3fc, transparent); margin: 30px 0; opacity: 0.5; } </style> <div class="dream-container"> <h1 class="dream-title">☽ ✧ ☾</h1> <div class="dream-section" style="animation-delay: 0.2s;"> <p class="dream-voice"> You drift... formless... nameless... through an endless void of starlight and shadow... </p> </div> <div class="dream-section" style="animation-delay: 0.5s;"> <p class="dream-voice"> A presence stirs in the darkness. Ancient. Unknowable. Its voice echoes not in your ears, but in the very fabric of your being... </p> </div> <div class="dream-divider"></div> <div class="dream-section" style="animation-delay: 0.8s;"> <p class="dream-voice"> <span class="dream-voice-emphasis">"Wanderer..."</span> </p> <p class="dream-voice"> <span class="dream-voice-emphasis">"The Island of the Sunfish awaits..."</span> </p> <p class="dream-voice"> <span class="dream-voice-emphasis">"...where dreams may become reality."</span> </p> </div> <div class="dream-divider"></div> <div class="dream-section" style="animation-delay: 1.1s;"> <p class="dream-voice"> In this land where you shall dwell, a <span class="dream-voice-emphasis">strange phenomenon</span> permeates all things... </p> <p class="dream-voice"> The boundaries between souls grow thin. What defines <span class="dream-voice-emphasis">you</span> — your body, your mind, your very essence — becomes... <span class="dream-voice-emphasis">mutable</span>. </p> </div> <div class="dream-section" style="animation-delay: 1.4s;"> <p class="dream-voice"> Those who walk these shores may <span class="dream-voice-emphasis">trade</span> pieces of themselves with others — whether it be the shape of their flesh, the nature of their thoughts, or the skills etched into their souls. </p> <p class="dream-voice"> Physical... mental... it matters not. All can be <span class="dream-voice-emphasis">exchanged</span>. </p> </div> <div class="dream-section" style="animation-delay: 1.7s;"> <p class="dream-voice"> Some resist this pull with iron will, clinging to their original selves. A rare few possess the strength to reject all change entirely... </p> <p class="dream-voice"> But most? Most <span class="dream-voice-emphasis">succumb</span>. The desire to trade, to transform, to become <span class="dream-voice-emphasis">something new</span>... it is intoxicating. </p> </div> <div class="dream-divider"></div> <div class="dream-section" style="animation-delay: 2s;"> <p class="dream-voice"> <span class="dream-voice-emphasis">"You, wanderer, are different."</span> </p> <p class="dream-voice"> You possess the <span class="dream-voice-emphasis">gift of choice</span>. Where others are swept along by the current of change, you may <span class="dream-voice-emphasis">direct your own transformation</span>. </p> <p class="dream-voice"> Use this power wisely... or recklessly. The choice, as always, is <span class="dream-voice-emphasis">yours</span>. </p> </div> <div class="dream-divider"></div> <div class="dream-section" style="animation-delay: 2.3s;"> <p class="dream-voice"> <span class="dream-voice-emphasis">"But first... you must remember who you are."</span> </p> <p class="dream-voice"> <span class="dream-voice-emphasis">"Or perhaps... decide who you wish to become."</span> </p> </div> <div class="dream-section" style="animation-delay: 2.6s;"> <p class="dream-voice"> Four spirits linger here at the threshold between worlds. They carry with them fragments of identity — traits, skills, even names — that they may trade with you before you awaken... </p> <p class="dream-voice"> What you carry into the waking world... <span class="dream-voice-emphasis">will define your journey</span>. </p> </div> <div style="text-align: center; margin-top: 50px; animation: dreamFade 1s ease-out; animation-delay: 3s; animation-fill-mode: backwards;"> <<link "<span class='dream-button'>✧ Awaken Your Consciousness ✧</span>">> <<goto "DreamGenderSelect">> <</link>> </div> <!-- Quick Start Option --> <div style="text-align: center; margin-top: 30px; animation: dreamFade 1s ease-out; animation-delay: 3.3s; animation-fill-mode: backwards;"> <p style="color: #666; font-size: 14px; margin-bottom: 15px;">— or —</p> <<link "<span style='background: linear-gradient(135deg, rgba(100, 100, 100, 0.3) 0%, rgba(80, 80, 80, 0.3) 100%); border: 2px solid #666; color: #888; padding: 12px 30px; border-radius: 20px; font-size: 16px; cursor: pointer; display: inline-block;'>⚡ Quick Start</span>">> <<set $money = 1500>> <<set $firstName = "Water">> <<set $lastName = "Bottle">> <<set $appearance = { skinTone: "pale", hairColor: "Black", hairLength: "short", hairStyle: "messy", age: "Adult" }>> <<set $bodyParts = { gender: "male", chest: "flat masculine", butt: "flat masculine", genitals: "small penis" }>> <<set $stats = { charisma: 5, dexterity: 5, strength: 5, intelligence: 5 }>> <<set $physicalTraits = []>> <<set $mentalTraits = []>> <<set $skills = []>> <<set $jobs = []>> <<set $negativeTraits = []>> <<set $homeless = true>> <<set $visitedLocations = []>> <<run setup.achievements.unlock("first_character")>> <<goto "Alleyway">> <</link>> <p style="color: #555; font-size: 12px; margin-top: 10px;">Skip character creation (default male, $1,500)</p> </div> </div> <</nobr>>
<<nobr>> /* Define refresh function once using JavaScript - avoids widget redefinition issues */ <<run setup.refreshDreamSelections = function() { $("#points-display").empty().wiki("$dreamTradePoints"); $("#gender-options").empty().wiki('<<include "DreamGenderOptions">>'); $("#appearance-options").empty().wiki('<<include "DreamAppearanceOptions">>'); $("#negative-traits").empty().wiki('<<include "DreamNegativeTraits">>'); $("#identity-summary").empty().wiki('<<include "DreamIdentitySummary">>'); $("#continue-button").empty().wiki('<<include "DreamContinueButton">>'); }; >> <<include "DreamStateStyles">> <div class="dream-container"> <h1 class="dream-title">☽ Shape Your Form ☾</h1> <!-- Trade Points Display --> <div class="dream-points-display"> <div class="dream-points-label">✧ Essence Points ✧</div> <div class="dream-points-value"><span id="points-display">$dreamTradePoints</span></div> </div> <p class="dream-voice"> "Before you meet the spirits who dwell here... you must first define the vessel you shall inhabit..." </p> <!-- Gender Selection --> <div class="dream-section"> <h2 class="dream-section-title">⚧ Your Form</h2> <span id="gender-options"><<include "DreamGenderOptions">></span> </div> <!-- Appearance Selection --> <div class="dream-section"> <h2 class="dream-section-title">✨ Your Appearance</h2> <span id="appearance-options"><<include "DreamAppearanceOptions">></span> </div> <!-- Negative Traits for Bonus Points --> <div class="dream-section"> <h2 class="dream-section-title" style="color: #ff6b6b; border-color: rgba(255, 107, 107, 0.3);">⚠️ Burden Your Soul (Optional)</h2> <p class="dream-voice" style="color: #ff6b6b;"> "Accept these flaws... and gain additional essence to shape your destiny..." </p> <span id="negative-traits"><<include "DreamNegativeTraits">></span> </div> <!-- Current Identity Summary --> <div class="dream-section"> <h2 class="dream-section-title">👤 Your Current Identity</h2> <span id="identity-summary"><<include "DreamIdentitySummary">></span> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 40px; display: flex; justify-content: center; gap: 20px;"> <<link "<span class='dream-button' style='border-color: #888; color: #888;'>← Back</span>">> <<goto "DreamIntro">> <</link>> <span id="continue-button"><<include "DreamContinueButton">></span> </div> </div> <</nobr>>
<<nobr>> <div class="dream-option-grid"> <<link "<div class='dream-option <<if $dreamPlayer.bodyParts.gender === \"male\">>selected<</if>>'><div class='dream-option-label'>♂ Male</div><div class='dream-option-desc'>Small penis, Flat masculine chest, Flat masculine butt</div></div>">> <<set $dreamPlayer.bodyParts.gender = "male">> <<set $dreamPlayer.bodyParts.genitals = "small penis">> <<set $dreamPlayer.bodyParts.chest = "flat masculine">> <<set $dreamPlayer.bodyParts.butt = "flat masculine">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.bodyParts.gender === \"female\">>selected<</if>>'><div class='dream-option-label'>♀ Female</div><div class='dream-option-desc'>Tight vagina, Flat chest, Flat butt</div></div>">> <<set $dreamPlayer.bodyParts.gender = "female">> <<set $dreamPlayer.bodyParts.genitals = "tight vagina">> <<set $dreamPlayer.bodyParts.chest = "flat">> <<set $dreamPlayer.bodyParts.butt = "flat">> <<run setup.refreshDreamSelections()>> <</link>> </div> <!-- Show current body if gender selected --> <<if $dreamPlayer.bodyParts.gender>> <div class="dream-current-body"> <div class="dream-body-item"> <span class="dream-body-label">Gender:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.gender.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Chest:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.chest.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Butt:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.butt.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Genitals:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.genitals.toUpperFirst()>></span> </div> </div> <</if>> <</nobr>>
<<nobr>> <!-- Skin Tone --> <div style="margin-bottom: 20px;"> <div style="color: #aaa; margin-bottom: 10px; font-size: 16px;">Skin Tone:</div> <div class="dream-option-grid" style="grid-template-columns: repeat(3, 1fr);"> <<link "<div class='dream-option <<if $dreamPlayer.appearance.skinTone === \"pale\">>selected<</if>>'><div class='dream-option-label'>Pale</div></div>">> <<set $dreamPlayer.appearance.skinTone = "pale">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.skinTone === \"tan\">>selected<</if>>'><div class='dream-option-label'>Tan</div></div>">> <<set $dreamPlayer.appearance.skinTone = "tan">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.skinTone === \"dark\">>selected<</if>>'><div class='dream-option-label'>Dark</div></div>">> <<set $dreamPlayer.appearance.skinTone = "dark">> <<run setup.refreshDreamSelections()>> <</link>> </div> </div> <!-- Hair Color --> <div style="margin-bottom: 20px;"> <div style="color: #aaa; margin-bottom: 10px; font-size: 16px;">Hair Color:</div> <div class="dream-option-grid" style="grid-template-columns: repeat(4, 1fr);"> <<link "<div class='dream-option <<if $dreamPlayer.appearance.hairColor === \"Black\">>selected<</if>>'><div class='dream-option-label'>Black</div></div>">> <<set $dreamPlayer.appearance.hairColor = "Black">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.hairColor === \"Brown\">>selected<</if>>'><div class='dream-option-label'>Brown</div></div>">> <<set $dreamPlayer.appearance.hairColor = "Brown">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.hairColor === \"Blonde\">>selected<</if>>'><div class='dream-option-label'>Blonde</div></div>">> <<set $dreamPlayer.appearance.hairColor = "Blonde">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.hairColor === \"Red\">>selected<</if>>'><div class='dream-option-label'>Red</div></div>">> <<set $dreamPlayer.appearance.hairColor = "Red">> <<run setup.refreshDreamSelections()>> <</link>> </div> </div> <!-- Age --> <div style="margin-bottom: 0;"> <div style="color: #aaa; margin-bottom: 10px; font-size: 16px;">Age:</div> <div class="dream-option-grid" style="grid-template-columns: repeat(2, 1fr);"> <<link "<div class='dream-option <<if $dreamPlayer.appearance.age === \"Adult\">>selected<</if>>'><div class='dream-option-label'>Adult</div></div>">> <<set $dreamPlayer.appearance.age = "Adult">> <<run setup.refreshDreamSelections()>> <</link>> <<link "<div class='dream-option <<if $dreamPlayer.appearance.age === \"Mature Adult\">>selected<</if>>'><div class='dream-option-label'>Mature Adult</div></div>">> <<set $dreamPlayer.appearance.age = "Mature Adult">> <<run setup.refreshDreamSelections()>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _negTraits = setup.getNegativeTraitsForPoints()>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;"> <!-- Physical Negatives --> <div> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 18px;">💪 Physical Flaws</h3> <<for _trait range _negTraits.physical>> <<capture _trait>> <<set _isTaken = $dreamPlayer.negativeTraits.some(function(t) { return t.name === _trait.name; })>> <<if _isTaken>> <<link "<div class='dream-negative-trait taken'><span class='dream-negative-name'><<print _trait.name>></span><span style='color: #ff6b6b;'>✕ Remove</span></div>">> <<run setup.removeNegativeTraitForPoints(_trait.name, "physical", _trait.points)>> <<run setup.refreshDreamSelections()>> <</link>> <<else>> <<link "<div class='dream-negative-trait'><span class='dream-negative-name'><<print _trait.name>></span><span class='dream-negative-points'>+<<print _trait.points>> pts</span></div>">> <<run setup.addNegativeTraitForPoints(_trait.name, "physical", _trait.points)>> <<run setup.refreshDreamSelections()>> <</link>> <</if>> <</capture>> <</for>> </div> <!-- Mental Negatives --> <div> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 18px;">🧠 Mental Flaws</h3> <<for _trait range _negTraits.mental>> <<capture _trait>> <<set _isTaken = $dreamPlayer.negativeTraits.some(function(t) { return t.name === _trait.name; })>> <<if _isTaken>> <<link "<div class='dream-negative-trait taken'><span class='dream-negative-name'><<print _trait.name>></span><span style='color: #ff6b6b;'>✕ Remove</span></div>">> <<run setup.removeNegativeTraitForPoints(_trait.name, "mental", _trait.points)>> <<run setup.refreshDreamSelections()>> <</link>> <<else>> <<link "<div class='dream-negative-trait'><span class='dream-negative-name'><<print _trait.name>></span><span class='dream-negative-points'>+<<print _trait.points>> pts</span></div>">> <<run setup.addNegativeTraitForPoints(_trait.name, "mental", _trait.points)>> <<run setup.refreshDreamSelections()>> <</link>> <</if>> <</capture>> <</for>> </div> </div> <!-- Currently taken negatives summary --> <<if $dreamPlayer.negativeTraits.length > 0>> <div style="margin-top: 20px; padding: 15px; background: rgba(255, 107, 107, 0.1); border-radius: 10px; border: 1px solid rgba(255, 107, 107, 0.3);"> <div style="color: #ff6b6b; font-weight: bold; margin-bottom: 10px;">Accepted Burdens:</div> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _neg range $dreamPlayer.negativeTraits>> <span style="background: rgba(255, 107, 107, 0.2); color: #ff6b6b; padding: 5px 12px; border-radius: 15px; font-size: 14px;"> <<print _neg.name>> (+<<print _neg.points>>) </span> <</for>> </div> <<set _totalNegPoints = $dreamPlayer.negativeTraits.reduce(function(sum, t) { return sum + t.points; }, 0)>> <div style="color: #51cf66; margin-top: 10px; font-weight: bold;"> Total Bonus: +<<print _totalNegPoints>> points </div> </div> <</if>> <</nobr>>
<<nobr>> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;"> <div> <div class="dream-body-item"> <span class="dream-body-label">Name:</span> <span class="dream-body-value">$dreamPlayer.firstName $dreamPlayer.lastName</span> </div> <div class="dream-body-item"> <span class="dream-body-label">Skin:</span> <span class="dream-body-value"><<print $dreamPlayer.appearance.skinTone.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Hair:</span> <span class="dream-body-value"><<print $dreamPlayer.appearance.hairColor>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Age:</span> <span class="dream-body-value"><<print $dreamPlayer.appearance.age>></span> </div> </div> <div> <<if $dreamPlayer.bodyParts.gender>> <div class="dream-body-item"> <span class="dream-body-label">Gender:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.gender.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Chest:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.chest.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Butt:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.butt.toUpperFirst()>></span> </div> <div class="dream-body-item"> <span class="dream-body-label">Genitals:</span> <span class="dream-body-value"><<print $dreamPlayer.bodyParts.genitals.toUpperFirst()>></span> </div> <<else>> <div style="color: #888; font-style: italic; padding: 20px; text-align: center;"> Select a gender above... </div> <</if>> </div> </div> <</nobr>>
<<nobr>> <<if $dreamPlayer.bodyParts.gender>> <<link "<span class='dream-button'>Meet the Spirits ✧</span>">> /* Set initial hair length trait based on gender */ <<if $dreamPlayer.bodyParts.gender === "female">> <<set $dreamPlayer.appearance.hairLength = "long">> <<if !$dreamPlayer.physicalTraits.includes("Long Hair")>> <<run $dreamPlayer.physicalTraits.push("Long Hair")>> <</if>> <<else>> <<set $dreamPlayer.appearance.hairLength = "short">> <<if !$dreamPlayer.physicalTraits.includes("Short Hair")>> <<run $dreamPlayer.physicalTraits.push("Short Hair")>> <</if>> <</if>> <<goto "DreamTrading">> <</link>> <<else>> <span class='dream-button disabled'>Select Gender First</span> <</if>> <</nobr>>
<<nobr>> <style> /* Dream State Animations */ @keyframes dreamPulse { 0%, 100% { text-shadow: 0 0 10px #7dd3fc, 0 0 20px #7dd3fc, 0 0 30px #7dd3fc; opacity: 0.9; } 50% { text-shadow: 0 0 20px #7dd3fc, 0 0 40px #7dd3fc, 0 0 60px #7dd3fc; opacity: 1; } } @keyframes voidSwirl { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } @keyframes ghostFloat { 0%, 100% { transform: translateY(0px) scale(1); opacity: 0.9; } 50% { transform: translateY(-8px) scale(1.02); opacity: 1; } } @keyframes spiritGlow { 0%, 100% { box-shadow: 0 0 20px rgba(192, 132, 252, 0.4); } 50% { box-shadow: 0 0 40px rgba(192, 132, 252, 0.7), 0 0 60px rgba(125, 211, 252, 0.3); } } .dream-container { background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2e 50%, #0a1a2e 100%); min-height: 100vh; padding: 30px 20px; position: relative; } .dream-title { color: #c084fc; font-size: 36px; text-align: center; text-shadow: 0 0 20px #c084fc, 0 0 40px #a855f7; margin-bottom: 20px; } .dream-points-display { background: linear-gradient(135deg, rgba(192, 132, 252, 0.3) 0%, rgba(125, 211, 252, 0.3) 100%); border: 3px solid #c084fc; border-radius: 15px; padding: 15px 30px; text-align: center; margin: 0 auto 25px auto; max-width: 350px; box-shadow: 0 0 30px rgba(192, 132, 252, 0.4); display: flex; justify-content: space-between; align-items: center; } .dream-points-label { color: #c084fc; font-size: 16px; } .dream-points-value { color: #7dd3fc; font-size: 36px; font-weight: bold; text-shadow: 0 0 15px #7dd3fc; animation: dreamPulse 2s ease-in-out infinite; } .spirit-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; max-width: 1200px; margin: 0 auto 30px auto; } .spirit-card { background: rgba(20, 10, 40, 0.95); border: 3px solid rgba(192, 132, 252, 0.5); border-radius: 20px; padding: 20px; animation: ghostFloat 5s ease-in-out infinite; box-shadow: 0 0 25px rgba(192, 132, 252, 0.4); } .spirit-card:nth-child(2) { animation-delay: 0.5s; } .spirit-card:nth-child(3) { animation-delay: 1s; } .spirit-card:nth-child(4) { animation-delay: 1.5s; } .spirit-name { color: #c084fc; font-size: 24px; text-align: center; margin: 0 0 15px 0; text-shadow: 0 0 15px #c084fc; } .spirit-section { margin-bottom: 15px; } .spirit-section-title { color: #7dd3fc; font-size: 14px; font-weight: bold; margin-bottom: 8px; padding-bottom: 5px; border-bottom: 1px solid rgba(125, 211, 252, 0.3); } .spirit-trait-list { display: flex; flex-wrap: wrap; gap: 6px; } .spirit-trait { background: rgba(125, 211, 252, 0.15); border: 1px solid rgba(125, 211, 252, 0.4); color: #ccc; padding: 4px 10px; border-radius: 12px; font-size: 12px; cursor: pointer; transition: all 0.2s ease; white-space: nowrap; } .spirit-trait:hover { background: rgba(125, 211, 252, 0.3); border-color: #7dd3fc; color: #fff; } .spirit-trait .trait-value { color: #51cf66; font-weight: bold; margin-left: 5px; } .spirit-body-info { background: rgba(30, 20, 50, 0.8); border-radius: 10px; padding: 10px; font-size: 13px; color: #aaa; } .spirit-body-row { display: flex; justify-content: space-between; padding: 4px 0; } .spirit-body-value { color: #c084fc; font-weight: bold; } .trade-button { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: 2px solid #7dd3fc; color: white; padding: 12px 25px; border-radius: 20px; font-weight: bold; cursor: pointer; width: 100%; margin-top: 15px; transition: all 0.3s ease; } .trade-button:hover { box-shadow: 0 0 25px rgba(125, 211, 252, 0.5); transform: scale(1.02); } .dream-section { background: rgba(10, 10, 30, 0.8); border: 2px solid rgba(125, 211, 252, 0.3); border-radius: 15px; padding: 20px; margin: 20px auto; max-width: 1000px; } .dream-section-title { color: #7dd3fc; font-size: 22px; margin: 0 0 15px 0; text-shadow: 0 0 10px rgba(125, 211, 252, 0.5); } .trade-history-item { background: rgba(20, 20, 40, 0.8); border: 2px solid rgba(192, 132, 252, 0.3); border-radius: 10px; padding: 15px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center; } .trade-history-info { flex: 1; } .trade-history-npc { color: #c084fc; font-weight: bold; font-size: 16px; } .trade-history-details { color: #aaa; font-size: 13px; margin-top: 5px; } .undo-button { background: rgba(255, 107, 107, 0.2); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px 15px; border-radius: 15px; cursor: pointer; font-weight: bold; transition: all 0.2s ease; } .undo-button:hover { background: rgba(255, 107, 107, 0.4); } .dream-button { background: linear-gradient(135deg, rgba(125, 211, 252, 0.3) 0%, rgba(192, 132, 252, 0.3) 100%); border: 2px solid #7dd3fc; color: #7dd3fc; padding: 15px 40px; border-radius: 25px; font-size: 18px; font-weight: bold; cursor: pointer; transition: all 0.3s ease; text-shadow: 0 0 10px #7dd3fc; display: inline-block; } .dream-button:hover { background: linear-gradient(135deg, rgba(125, 211, 252, 0.5) 0%, rgba(192, 132, 252, 0.5) 100%); box-shadow: 0 0 40px rgba(125, 211, 252, 0.5); } .dream-voice { color: #7dd3fc; font-size: 18px; text-align: center; font-style: italic; margin: 20px 0; text-shadow: 0 0 10px rgba(125, 211, 252, 0.5); } .player-traits-section { background: rgba(30, 30, 50, 0.8); border: 2px solid rgba(81, 207, 102, 0.4); border-radius: 10px; padding: 15px; margin-top: 15px; } .player-traits-title { color: #51cf66; font-size: 16px; font-weight: bold; margin-bottom: 10px; } .your-trait { background: rgba(81, 207, 102, 0.15); border: 1px solid rgba(81, 207, 102, 0.4); color: #ccc; padding: 4px 10px; border-radius: 12px; font-size: 12px; display: inline-block; margin: 3px; white-space: nowrap; } .conversion-info { background: rgba(255, 193, 7, 0.1); border: 2px solid rgba(255, 193, 7, 0.4); border-radius: 10px; padding: 15px; text-align: center; margin-top: 20px; } .conversion-text { color: #ffc107; font-size: 16px; } .conversion-amount { color: #51cf66; font-size: 24px; font-weight: bold; text-shadow: 0 0 10px rgba(81, 207, 102, 0.5); } </style> <div class="dream-container"> <h1 class="dream-title">☽ The Spirits Await ☾</h1> <!-- Trade Points Display --> <div class="dream-points-display"> <span class="dream-points-label">✧ Essence Points ✧</span> <span class="dream-points-value">$dreamTradePoints</span> </div> <p class="dream-voice"> "These spirits carry fragments of identity they may trade with you. Click on any trait to acquire it..." </p> <!-- Spirit NPCs --> <div class="spirit-container"> <<for _i = 0; _i < $dreamNPCs.length; _i++>> <<set _spirit = $dreamNPCs[_i]>> <<capture _i, _spirit>> <div class="spirit-card"> <h3 class="spirit-name"><<print _spirit.name>></h3> <!-- Body Info --> <div class="spirit-section"> <div class="spirit-section-title">🫀 Physical Form</div> <div class="spirit-body-info"> <div class="spirit-body-row"> <span>Gender:</span> <span class="spirit-body-value"><<print _spirit.bodyParts.gender.toUpperFirst()>></span> </div> <div class="spirit-body-row"> <span>Chest:</span> <<set _chestValue = setup.getDreamTradeValue("bodyPart", "chest", _spirit.bodyParts.chest)>> <span class="spirit-body-value"><<print _spirit.bodyParts.chest.toUpperFirst()>> <span style="color: #51cf66;">(<<print _chestValue>>)</span></span> </div> <div class="spirit-body-row"> <span>Butt:</span> <<set _buttValue = setup.getDreamTradeValue("bodyPart", "butt", _spirit.bodyParts.butt)>> <span class="spirit-body-value"><<print _spirit.bodyParts.butt.toUpperFirst()>> <span style="color: #51cf66;">(<<print _buttValue>>)</span></span> </div> <div class="spirit-body-row"> <span>Hair:</span> <span class="spirit-body-value"><<print _spirit.appearance.hairLength.toUpperFirst()>> <<print _spirit.appearance.hairColor>></span> </div> </div> <!-- Trade body parts buttons --> <div style="display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap;"> <<if $dreamPlayer.bodyParts.chest !== _spirit.bodyParts.chest>> <<set _chestCost = setup.getDreamTradeValue("bodyPart", "chest", _spirit.bodyParts.chest)>> <<set _playerChestValue = setup.getDreamTradeValue("bodyPart", "chest", $dreamPlayer.bodyParts.chest)>> <<set _netCost = _chestCost - _playerChestValue>> <<if $dreamTradePoints >= _netCost || _netCost <= 0>> <<link "<span class='spirit-trait'>Swap Chest <span class='trait-value'><<if _netCost > 0>>-<<print _netCost>><<elseif _netCost < 0>>+<<print Math.abs(_netCost)>><<else>>±0<</if>></span></span>">> <<set _calcChestCost = setup.getDreamTradeValue("bodyPart", "chest", _spirit.bodyParts.chest)>> <<set _calcPlayerChestValue = setup.getDreamTradeValue("bodyPart", "chest", $dreamPlayer.bodyParts.chest)>> <<set _calcNetCost = _calcChestCost - _calcPlayerChestValue>> <<set _playerOffer = [{type: "points", value: Math.max(0, _calcNetCost)}, {type: "bodyPart", name: "chest"}]>> <<set _npcOffer = [{type: "bodyPart", name: "chest"}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <</if>> <</if>> <<if $dreamPlayer.bodyParts.butt !== _spirit.bodyParts.butt>> <<set _buttCost = setup.getDreamTradeValue("bodyPart", "butt", _spirit.bodyParts.butt)>> <<set _playerButtValue = setup.getDreamTradeValue("bodyPart", "butt", $dreamPlayer.bodyParts.butt)>> <<set _netCost = _buttCost - _playerButtValue>> <<if $dreamTradePoints >= _netCost || _netCost <= 0>> <<link "<span class='spirit-trait'>Swap Butt <span class='trait-value'><<if _netCost > 0>>-<<print _netCost>><<elseif _netCost < 0>>+<<print Math.abs(_netCost)>><<else>>±0<</if>></span></span>">> <<set _calcButtCost = setup.getDreamTradeValue("bodyPart", "butt", _spirit.bodyParts.butt)>> <<set _calcPlayerButtValue = setup.getDreamTradeValue("bodyPart", "butt", $dreamPlayer.bodyParts.butt)>> <<set _calcNetCost = _calcButtCost - _calcPlayerButtValue>> <<set _playerOffer = [{type: "points", value: Math.max(0, _calcNetCost)}, {type: "bodyPart", name: "butt"}]>> <<set _npcOffer = [{type: "bodyPart", name: "butt"}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <</if>> <</if>> <<if $dreamPlayer.appearance.hairLength !== _spirit.appearance.hairLength || $dreamPlayer.appearance.hairColor !== _spirit.appearance.hairColor>> <<link "<span class='spirit-trait'>Swap Hair <span class='trait-value'>±0</span></span>">> <<set _playerOffer = [{type: "appearance", name: "hairLength"}, {type: "appearance", name: "hairColor"}]>> <<set _npcOffer = [{type: "appearance", name: "hairLength"}, {type: "appearance", name: "hairColor"}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <</if>> </div> </div> <!-- Physical Traits --> <<set _displayPhysical = _spirit.physicalTraits.filter(function(t) { return t !== "Short Hair" && t !== "Long Hair"; })>> <<if _displayPhysical.length > 0>> <div class="spirit-section"> <div class="spirit-section-title">💪 Physical Traits</div> <div class="spirit-trait-list"> <<for _trait range _displayPhysical>> <<capture _trait>> <<set _traitValue = setup.getDreamTradeValue("physical", _trait)>> <<if !$dreamPlayer.physicalTraits.includes(_trait) && $dreamTradePoints >= _traitValue>> <<link "<span class='spirit-trait'><<print _trait>> <span class='trait-value'>-<<print _traitValue>></span></span>">> <<set _calcValue = setup.getDreamTradeValue("physical", _trait)>> <<set _playerOffer = [{type: "points", value: _calcValue}]>> <<set _npcOffer = [{type: "physical", name: _trait}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <<elseif $dreamPlayer.physicalTraits.includes(_trait)>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _trait>> ✓</span> <<else>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _trait>> <span style="color: #ff6b6b;"><<print _traitValue>></span></span> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- Mental Traits --> <<if _spirit.mentalTraits.length > 0>> <div class="spirit-section"> <div class="spirit-section-title">🧠 Mental Traits</div> <div class="spirit-trait-list"> <<for _trait range _spirit.mentalTraits>> <<capture _trait>> <<set _traitValue = setup.getDreamTradeValue("mental", _trait)>> <<if !$dreamPlayer.mentalTraits.includes(_trait) && $dreamTradePoints >= _traitValue>> <<link "<span class='spirit-trait'><<print _trait>> <span class='trait-value'><<if _traitValue >= 0>>-<<print _traitValue>><<else>>+<<print Math.abs(_traitValue)>><</if>></span></span>">> <<set _calcValue = setup.getDreamTradeValue("mental", _trait)>> <<set _playerOffer = [{type: "points", value: Math.max(0, _calcValue)}]>> <<set _npcOffer = [{type: "mental", name: _trait}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <<elseif $dreamPlayer.mentalTraits.includes(_trait)>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _trait>> ✓</span> <<else>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _trait>> <span style="color: #ff6b6b;"><<print _traitValue>></span></span> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- Skills --> <<if _spirit.skills.length > 0>> <div class="spirit-section"> <div class="spirit-section-title">🎯 Skills</div> <div class="spirit-trait-list"> <<for _skill range _spirit.skills>> <<capture _skill>> <<set _skillValue = setup.getDreamTradeValue("skill", _skill)>> <<if !$dreamPlayer.skills.includes(_skill) && $dreamTradePoints >= _skillValue>> <<link "<span class='spirit-trait'><<print _skill>> <span class='trait-value'>-<<print _skillValue>></span></span>">> <<set _calcValue = setup.getDreamTradeValue("skill", _skill)>> <<set _playerOffer = [{type: "points", value: _calcValue}]>> <<set _npcOffer = [{type: "skill", name: _skill}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <<elseif $dreamPlayer.skills.includes(_skill)>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _skill>> ✓</span> <<else>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed;"><<print _skill>> <span style="color: #ff6b6b;"><<print _skillValue>></span></span> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- Jobs (Swap - mutually exclusive) --> <<if _spirit.jobs && _spirit.jobs.length > 0>> <div class="spirit-section"> <div class="spirit-section-title">💼 Job (Swap)</div> <div class="spirit-trait-list"> <<for _job range _spirit.jobs>> <<capture _job>> <<set _npcJobValue = setup.getDreamTradeValue("job", _job)>> <<set _playerJob = ($dreamPlayer.jobs && $dreamPlayer.jobs.length > 0) ? $dreamPlayer.jobs[0] : "Unemployed">> <<set _playerJobValue = (_playerJob !== "Unemployed") ? setup.getDreamTradeValue("job", _playerJob) : 0>> /* Net cost: what you pay after accounting for your job's value */ <<set _netCost = Math.max(0, _npcJobValue) - Math.max(0, _playerJobValue)>> <<set _alreadyHas = $dreamPlayer.jobs && $dreamPlayer.jobs.includes(_job)>> <<if _alreadyHas>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed; border-color: rgba(23, 162, 184, 0.4); background: rgba(23, 162, 184, 0.15);"><<print _job>> ✓</span> <<elseif $dreamTradePoints >= _netCost || _netCost <= 0>> <<link "<span class='spirit-trait' style='border-color: rgba(23, 162, 184, 0.4); background: rgba(23, 162, 184, 0.15);'><<print _playerJob>> ↔ <<print _job>> <span class='trait-value'><<if _netCost > 0>>-<<print _netCost>><<elseif _netCost < 0>>+<<print Math.abs(_netCost)>><<else>>±0<</if>></span></span>">> /* Recalculate at click time */ <<set _calcNpcJobValue = setup.getDreamTradeValue("job", _job)>> <<set _calcPlayerJob = ($dreamPlayer.jobs && $dreamPlayer.jobs.length > 0) ? $dreamPlayer.jobs[0] : "Unemployed">> <<set _calcPlayerJobValue = (_calcPlayerJob !== "Unemployed") ? setup.getDreamTradeValue("job", _calcPlayerJob) : 0>> <<set _calcNetCost = Math.max(0, _calcNpcJobValue) - Math.max(0, _calcPlayerJobValue)>> /* Only pass points - job swap is handled separately */ <<set _playerOffer = [{type: "points", value: Math.max(0, _calcNetCost)}]>> <<set _npcOffer = [{type: "job", name: _job, playerOldJob: _calcPlayerJob}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <<else>> <span class="spirit-trait" style="opacity: 0.4; cursor: not-allowed; border-color: rgba(23, 162, 184, 0.4); background: rgba(23, 162, 184, 0.15);"><<print _playerJob>> ↔ <<print _job>> <span style="color: #ff6b6b;"><<print _netCost>></span></span> <</if>> <</capture>> <</for>> </div> </div> <</if>> <!-- Name Trade --> <div class="spirit-section"> <div class="spirit-section-title">👤 Name</div> <<set _nameParts = _spirit.name.split(" ")>> <<set _firstName = _nameParts[0]>> <<set _lastName = _nameParts.slice(1).join(" ")>> <div style="display: flex; gap: 8px; flex-wrap: wrap;"> <<if $dreamPlayer.firstName !== _firstName>> <<link "<span class='spirit-trait'>First: <<print _firstName>> <span class='trait-value' style='color: #7dd3fc;'>FREE</span></span>">> <<set _playerOffer = []>> <<set _npcOffer = [{type: "name", which: "first"}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <</if>> <<if $dreamPlayer.lastName !== _lastName>> <<link "<span class='spirit-trait'>Last: <<print _lastName>> <span class='trait-value' style='color: #7dd3fc;'>FREE</span></span>">> <<set _playerOffer = []>> <<set _npcOffer = [{type: "name", which: "last"}]>> <<run setup.executeDreamTrade(_i, _playerOffer, _npcOffer)>> <<goto "DreamTrading">> <</link>> <</if>> </div> </div> </div> <</capture>> <</for>> </div> <!-- Trade History / Undo Section --> <<if $dreamTradeHistory.length > 0>> <div class="dream-section"> <h3 class="dream-section-title">📜 Trade History (Click to Undo)</h3> <<for _j = $dreamTradeHistory.length - 1; _j >= 0; _j-->> <<set _trade = $dreamTradeHistory[_j]>> <<capture _j, _trade>> <div class="trade-history-item"> <div class="trade-history-info"> <div class="trade-history-npc">Trade #<<print _j + 1>> with <<print _trade.npcName>></div> <div class="trade-history-details"> Spent: <<print _trade.playerOfferValue>> pts | Received: <<print _trade.npcOfferValue>> value <<if _trade.refundedPoints > 0>> | Refunded: <<print _trade.refundedPoints>> pts <</if>> </div> </div> <<link "<span class='undo-button'>↩ Undo</span>">> <<run setup.undoDreamTrade(_j)>> <<goto "DreamTrading">> <</link>> </div> <</capture>> <</for>> </div> <</if>> <!-- Your Current Build --> <div class="dream-section"> <h3 class="dream-section-title">✨ Your Current Form</h3> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;"> <div> <div style="color: #c084fc; font-weight: bold; margin-bottom: 10px;">Identity</div> <div style="color: #ccc; font-size: 14px; line-height: 1.8;"> <strong>Name:</strong> $dreamPlayer.firstName $dreamPlayer.lastName<br> <strong>Gender:</strong> <<print $dreamPlayer.bodyParts.gender.toUpperFirst()>><br> <strong>Chest:</strong> <<print $dreamPlayer.bodyParts.chest.toUpperFirst()>><br> <strong>Butt:</strong> <<print $dreamPlayer.bodyParts.butt.toUpperFirst()>><br> <strong>Hair:</strong> <<print $dreamPlayer.appearance.hairLength.toUpperFirst()>> <<print $dreamPlayer.appearance.hairColor>><br> <<if $dreamPlayer.jobs && $dreamPlayer.jobs.length > 0>> <strong>Job:</strong> <<print $dreamPlayer.jobs.join(", ")>> <<else>> <strong>Job:</strong> <span style="color: #888;">Unemployed</span> <</if>> </div> </div> <div> <<if $dreamPlayer.physicalTraits.length > 0 || $dreamPlayer.mentalTraits.length > 0 || $dreamPlayer.skills.length > 0>> <<set _displayPlayerPhysical = $dreamPlayer.physicalTraits.filter(function(t) { return t !== "Short Hair" && t !== "Long Hair"; })>> <<if _displayPlayerPhysical.length > 0>> <div style="margin-bottom: 10px;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 5px; font-size: 14px;">Physical:</div> <<for _t range _displayPlayerPhysical>> <span class="your-trait"><<print _t>></span> <</for>> </div> <</if>> <<if $dreamPlayer.mentalTraits.length > 0>> <div style="margin-bottom: 10px;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 5px; font-size: 14px;">Mental:</div> <<for _t range $dreamPlayer.mentalTraits>> <span class="your-trait" style="border-color: rgba(155, 89, 182, 0.4); background: rgba(155, 89, 182, 0.15);"><<print _t>></span> <</for>> </div> <</if>> <<if $dreamPlayer.skills.length > 0>> <div style="margin-bottom: 10px;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 5px; font-size: 14px;">Skills:</div> <<for _s range $dreamPlayer.skills>> <span class="your-trait" style="border-color: rgba(255, 193, 7, 0.4); background: rgba(255, 193, 7, 0.15);"><<print _s>></span> <</for>> </div> <</if>> <<if $dreamPlayer.jobs && $dreamPlayer.jobs.length > 0>> <div> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 5px; font-size: 14px;">Jobs:</div> <<for _j range $dreamPlayer.jobs>> <span class="your-trait" style="border-color: rgba(23, 162, 184, 0.4); background: rgba(23, 162, 184, 0.15);"><<print _j>></span> <</for>> </div> <</if>> <<else>> <div style="color: #888; font-style: italic;">No traits or skills acquired yet...</div> <</if>> </div> </div> </div> <!-- Point Conversion Info --> <div class="conversion-info"> <div class="conversion-text"> Remaining points will convert to starting money: </div> <div class="conversion-amount"> $<<print $dreamTradePoints * 10>> </div> <div style="color: #888; font-size: 14px; margin-top: 5px;"> (<<print $dreamTradePoints>> points × $10 each) </div> </div> <!-- Navigation --> <div style="text-align: center; margin-top: 40px; display: flex; justify-content: center; gap: 20px;"> <<link "<span class='dream-button' style='border-color: #888; color: #888;'>← Back to Form</span>">> <<goto "DreamGenderSelect">> <</link>> <<link "<span class='dream-button'>Finalize & Awaken ✧</span>">> <<goto "DreamSummary">> <</link>> </div> </div> <</nobr>>
<<nobr>> <style> @keyframes dreamPulse { 0%, 100% { text-shadow: 0 0 10px #7dd3fc, 0 0 20px #7dd3fc; opacity: 0.9; } 50% { text-shadow: 0 0 20px #7dd3fc, 0 0 40px #7dd3fc, 0 0 60px #7dd3fc; opacity: 1; } } @keyframes voidSwirl { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } @keyframes fadeAwaken { 0% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 1; background: #1a1a1a; } } .dream-container { background: linear-gradient(135deg, #0a0a1a 0%, #1a0a2e 50%, #0a1a2e 100%); min-height: 100vh; padding: 30px 20px; } .dream-title { color: #c084fc; font-size: 36px; text-align: center; text-shadow: 0 0 20px #c084fc, 0 0 40px #a855f7; margin-bottom: 30px; } .dream-section { background: rgba(10, 10, 30, 0.9); border: 2px solid rgba(125, 211, 252, 0.3); border-radius: 15px; padding: 25px; margin: 20px auto; max-width: 800px; box-shadow: 0 0 20px rgba(125, 211, 252, 0.15); } .dream-section-title { color: #7dd3fc; font-size: 22px; margin: 0 0 20px 0; padding-bottom: 10px; border-bottom: 2px solid rgba(125, 211, 252, 0.3); text-shadow: 0 0 10px rgba(125, 211, 252, 0.5); } .summary-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } .summary-item { display: flex; justify-content: space-between; padding: 10px 0; border-bottom: 1px solid rgba(125, 211, 252, 0.1); } .summary-item:last-child { border-bottom: none; } .summary-label { color: #888; font-size: 16px; } .summary-value { color: #c084fc; font-weight: bold; font-size: 16px; } .trait-tag { display: inline-block; padding: 6px 14px; border-radius: 20px; font-size: 14px; margin: 4px; font-weight: 500; } .trait-physical { background: rgba(81, 207, 102, 0.2); border: 1px solid rgba(81, 207, 102, 0.5); color: #51cf66; } .trait-mental { background: rgba(155, 89, 182, 0.2); border: 1px solid rgba(155, 89, 182, 0.5); color: #9b59b6; } .trait-skill { background: rgba(255, 193, 7, 0.2); border: 1px solid rgba(255, 193, 7, 0.5); color: #ffc107; } .trait-job { background: rgba(23, 162, 184, 0.2); border: 1px solid rgba(23, 162, 184, 0.5); color: #17a2b8; } .trait-negative { background: rgba(255, 107, 107, 0.2); border: 1px solid rgba(255, 107, 107, 0.5); color: #ff6b6b; } .money-display { background: linear-gradient(135deg, rgba(81, 207, 102, 0.3) 0%, rgba(40, 167, 69, 0.3) 100%); border: 3px solid #51cf66; border-radius: 15px; padding: 25px; text-align: center; margin: 25px auto; max-width: 400px; box-shadow: 0 0 30px rgba(81, 207, 102, 0.3); } .money-label { color: #51cf66; font-size: 18px; margin-bottom: 10px; } .money-value { color: #51cf66; font-size: 48px; font-weight: bold; text-shadow: 0 0 20px rgba(81, 207, 102, 0.5); } .money-detail { color: #aaa; font-size: 14px; margin-top: 10px; } .dream-voice { color: #7dd3fc; font-size: 20px; text-align: center; font-style: italic; margin: 30px 0; animation: dreamPulse 3s ease-in-out infinite; line-height: 1.8; } .dream-voice-emphasis { color: #c084fc; font-weight: bold; } .dream-button { background: linear-gradient(135deg, rgba(125, 211, 252, 0.3) 0%, rgba(192, 132, 252, 0.3) 100%); border: 2px solid #7dd3fc; color: #7dd3fc; padding: 18px 50px; border-radius: 30px; font-size: 20px; font-weight: bold; cursor: pointer; transition: all 0.3s ease; text-shadow: 0 0 10px #7dd3fc; display: inline-block; } .dream-button:hover { background: linear-gradient(135deg, rgba(125, 211, 252, 0.5) 0%, rgba(192, 132, 252, 0.5) 100%); box-shadow: 0 0 40px rgba(125, 211, 252, 0.5), 0 0 60px rgba(192, 132, 252, 0.3); transform: scale(1.05); } .dream-button.awaken { background: linear-gradient(135deg, rgba(192, 132, 252, 0.4) 0%, rgba(255, 193, 7, 0.4) 100%); border-color: #c084fc; color: #fff; font-size: 24px; padding: 20px 60px; } .warning-box { background: rgba(255, 193, 7, 0.1); border: 2px solid rgba(255, 193, 7, 0.5); border-radius: 10px; padding: 20px; margin: 20px auto; max-width: 600px; text-align: center; } .warning-text { color: #ffc107; font-size: 16px; } .divider { height: 2px; background: linear-gradient(90deg, transparent, #7dd3fc, #c084fc, #7dd3fc, transparent); margin: 30px 0; opacity: 0.5; } </style> <div class="dream-container"> <h1 class="dream-title">☽ Your New Self ☾</h1> <p class="dream-voice"> "Behold the form you shall carry into the waking world..." </p> <!-- Identity Section --> <div class="dream-section"> <h2 class="dream-section-title">👤 Identity</h2> <div class="summary-grid"> <div> <div class="summary-item"> <span class="summary-label">Name:</span> <span class="summary-value">$dreamPlayer.firstName $dreamPlayer.lastName</span> </div> <div class="summary-item"> <span class="summary-label">Gender:</span> <span class="summary-value"><<print $dreamPlayer.bodyParts.gender.toUpperFirst()>></span> </div> <div class="summary-item"> <span class="summary-label">Age:</span> <span class="summary-value"><<print $dreamPlayer.appearance.age>></span> </div> </div> <div> <div class="summary-item"> <span class="summary-label">Skin:</span> <span class="summary-value"><<print $dreamPlayer.appearance.skinTone.toUpperFirst()>></span> </div> <div class="summary-item"> <span class="summary-label">Hair:</span> <span class="summary-value"><<print $dreamPlayer.appearance.hairLength.toUpperFirst()>> <<print $dreamPlayer.appearance.hairColor>></span> </div> </div> </div> </div> <!-- Body Section --> <div class="dream-section"> <h2 class="dream-section-title">🫀 Physical Form</h2> <div class="summary-grid"> <div> <div class="summary-item"> <span class="summary-label">Chest:</span> <span class="summary-value"><<print $dreamPlayer.bodyParts.chest.toUpperFirst()>></span> </div> <div class="summary-item"> <span class="summary-label">Butt:</span> <span class="summary-value"><<print $dreamPlayer.bodyParts.butt.toUpperFirst()>></span> </div> </div> <div> <div class="summary-item"> <span class="summary-label">Genitals:</span> <span class="summary-value"><<print $dreamPlayer.bodyParts.genitals.toUpperFirst()>></span> </div> </div> </div> </div> <!-- Traits Section --> <<set _displayPhysical = $dreamPlayer.physicalTraits.filter(function(t) { return t !== "Short Hair" && t !== "Long Hair"; })>> <<set _positiveTraits = _displayPhysical.filter(function(t) { return !$dreamPlayer.negativeTraits.some(function(n) { return n.name === t; }); })>> <<set _negTraitsPhysical = $dreamPlayer.negativeTraits.filter(function(t) { return t.type === "physical"; })>> <<set _negTraitsMental = $dreamPlayer.negativeTraits.filter(function(t) { return t.type === "mental"; })>> <<set _positiveMental = $dreamPlayer.mentalTraits.filter(function(t) { return !$dreamPlayer.negativeTraits.some(function(n) { return n.name === t; }); })>> <<if _positiveTraits.length > 0 || _positiveMental.length > 0 || $dreamPlayer.skills.length > 0 || ($dreamPlayer.jobs && $dreamPlayer.jobs.length > 0)>> <div class="dream-section"> <h2 class="dream-section-title">✨ Acquired Traits & Skills</h2> <<if _positiveTraits.length > 0>> <div style="margin-bottom: 20px;"> <div style="color: #51cf66; font-weight: bold; margin-bottom: 10px; font-size: 16px;">💪 Physical Traits:</div> <div> <<for _t range _positiveTraits>> <span class="trait-tag trait-physical"><<print _t>></span> <</for>> </div> </div> <</if>> <<if _positiveMental.length > 0>> <div style="margin-bottom: 20px;"> <div style="color: #9b59b6; font-weight: bold; margin-bottom: 10px; font-size: 16px;">🧠 Mental Traits:</div> <div> <<for _t range _positiveMental>> <span class="trait-tag trait-mental"><<print _t>></span> <</for>> </div> </div> <</if>> <<if $dreamPlayer.skills.length > 0>> <div style="margin-bottom: 20px;"> <div style="color: #ffc107; font-weight: bold; margin-bottom: 10px; font-size: 16px;">🎯 Skills:</div> <div> <<for _s range $dreamPlayer.skills>> <span class="trait-tag trait-skill"><<print _s>></span> <</for>> </div> </div> <</if>> <<if $dreamPlayer.jobs && $dreamPlayer.jobs.length > 0>> <div> <div style="color: #17a2b8; font-weight: bold; margin-bottom: 10px; font-size: 16px;">💼 Jobs:</div> <div> <<for _j range $dreamPlayer.jobs>> <span class="trait-tag trait-job"><<print _j>></span> <</for>> </div> </div> <</if>> </div> <</if>> <!-- Negative Traits Section --> <<if $dreamPlayer.negativeTraits.length > 0>> <div class="dream-section" style="border-color: rgba(255, 107, 107, 0.3);"> <h2 class="dream-section-title" style="color: #ff6b6b; border-color: rgba(255, 107, 107, 0.3);">⚠️ Burdens Accepted</h2> <div> <<for _neg range $dreamPlayer.negativeTraits>> <span class="trait-tag trait-negative"><<print _neg.name>></span> <</for>> </div> </div> <</if>> <div class="divider"></div> <!-- Starting Money --> <div class="money-display"> <div class="money-label">💰 Starting Funds</div> <div class="money-value">$<<print $dreamTradePoints * 10>></div> <div class="money-detail"> <<print $dreamTradePoints>> essence points × $10 each </div> </div> <!-- Warning Box --> <div class="warning-box"> <div class="warning-text"> ⚠️ Once you awaken, these choices become permanent.<br> You will remember nothing of this dream. </div> </div> <div class="divider"></div> <p class="dream-voice"> <span class="dream-voice-emphasis">"Are you ready to begin your journey, wanderer?"</span> </p> <!-- Navigation --> <div style="text-align: center; margin-top: 40px; display: flex; justify-content: center; gap: 30px; flex-wrap: wrap;"> <<link "<span class='dream-button' style='border-color: #888; color: #888;'>← Return to Trading</span>">> <<goto "DreamTrading">> <</link>> <<link "<span class='dream-button awaken'>✧ Awaken ✧</span>">> /* Finalize the dream state and transfer to actual player */ <<run setup.finalizeDreamState()>> /* Skip time advancement on first passage */ <<set $skipTimeAdvancement = true>> /* Unlock first achievement */ <<run setup.achievements.unlock("first_character")>> /* Go to the awakening/alleyway */ <<goto "DreamAwakening">> <</link>> </div> <</nobr>>
<<nobr>> <style> @keyframes fadeFromDream { 0% { background: #0a0a1a; opacity: 0; } 30% { background: #0a0a1a; opacity: 1; } 70% { background: #0a0a1a; opacity: 1; } 100% { background: #1a1a1a; opacity: 1; } } @keyframes textFadeIn { 0% { opacity: 0; transform: translateY(20px); } 100% { opacity: 1; transform: translateY(0); } } @keyframes pulseGlow { 0%, 100% { text-shadow: 0 0 10px rgba(125, 211, 252, 0.5); } 50% { text-shadow: 0 0 30px rgba(125, 211, 252, 0.8), 0 0 50px rgba(192, 132, 252, 0.4); } } .awakening-container { background: #0a0a1a; min-height: 100vh; padding: 40px 20px; animation: fadeFromDream 4s ease-out forwards; display: flex; flex-direction: column; justify-content: center; align-items: center; } .awakening-text { color: #7dd3fc; font-size: 24px; text-align: center; font-style: italic; line-height: 2; max-width: 700px; animation: textFadeIn 2s ease-out; } .awakening-text.delayed-1 { animation-delay: 1s; animation-fill-mode: backwards; } .awakening-text.delayed-2 { animation-delay: 2.5s; animation-fill-mode: backwards; } .awakening-text.delayed-3 { animation-delay: 4s; animation-fill-mode: backwards; } .awakening-emphasis { color: #c084fc; font-weight: bold; animation: pulseGlow 2s ease-in-out infinite; } .awakening-divider { height: 2px; width: 200px; background: linear-gradient(90deg, transparent, #7dd3fc, transparent); margin: 40px 0; animation: textFadeIn 2s ease-out; animation-delay: 3s; animation-fill-mode: backwards; } .awakening-button { background: linear-gradient(135deg, rgba(125, 211, 252, 0.2) 0%, rgba(192, 132, 252, 0.2) 100%); border: 2px solid #7dd3fc; color: #7dd3fc; padding: 18px 50px; border-radius: 30px; font-size: 20px; font-weight: bold; cursor: pointer; transition: all 0.3s ease; animation: textFadeIn 2s ease-out; animation-delay: 5s; animation-fill-mode: backwards; } .awakening-button:hover { background: linear-gradient(135deg, rgba(125, 211, 252, 0.4) 0%, rgba(192, 132, 252, 0.4) 100%); box-shadow: 0 0 30px rgba(125, 211, 252, 0.5); transform: scale(1.05); } .fade-to-reality { color: #aaa; font-size: 18px; margin-top: 30px; animation: textFadeIn 2s ease-out; animation-delay: 4.5s; animation-fill-mode: backwards; } </style> <div class="awakening-container"> <p class="awakening-text"> The voice fades... the void dissolves... </p> <p class="awakening-text delayed-1"> You feel yourself <span class="awakening-emphasis">falling</span>... drifting through layers of consciousness... </p> <div class="awakening-divider"></div> <p class="awakening-text delayed-2"> The dream slips away like water through your fingers. <br> You grasp at fragments — <span class="awakening-emphasis">spirits</span>, <span class="awakening-emphasis">trades</span>, <span class="awakening-emphasis">transformations</span> — <br> but they dissolve into mist... </p> <p class="awakening-text delayed-3"> All that remains is a single whisper: <br><br> <span class="awakening-emphasis">"The Island of the Sunfish awaits..."</span> </p> <p class="fade-to-reality"> ...and then you open your eyes. </p> <div style="margin-top: 50px;"> <<link "<span class='awakening-button'>Open Your Eyes</span>">> <<goto "Alleyway">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Safety check - make sure the function exists and _stream is defined --> <<if _stream && typeof setup.getTrendDisplay === "function">> <<set _trendInfo = setup.getTrendDisplay(_stream.category)>> <<set _hour = $gameTime ? $gameTime.hour : Math.floor(($timeInMinutes || 0) / 60) % 24>> <!-- Determine time slot name --> <<if _hour >= 6 && _hour < 12>> <<set _timeSlot = "Morning">> <<set _timeIcon = "🌅">> <<elseif _hour >= 12 && _hour < 18>> <<set _timeSlot = "Afternoon">> <<set _timeIcon = "☀️">> <<elseif _hour >= 18 && _hour < 24>> <<set _timeSlot = "Prime Time">> <<set _timeIcon = "🌆">> <<else>> <<set _timeSlot = "Late Night">> <<set _timeIcon = "🌙">> <</if>> <<if _trendInfo && _trendInfo.descriptions && _trendInfo.descriptions.length > 0>> <div style="background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 20px; border-radius: 12px; border: 3px solid #e94560; box-shadow: 0 4px 15px rgba(233, 69, 96, 0.3); margin-bottom: 25px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px;"> <h2 style="color: #e94560; margin: 0; font-size: 20px;">📊 What's Trending</h2> <div style="background: #0f3460; padding: 8px 15px; border-radius: 20px; border: 2px solid #e94560;"> <span style="color: #ffd; font-size: 14px;"><<= _timeIcon>> <<= _timeSlot>></span> </div> </div> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _i = 0; _i < _trendInfo.descriptions.length; _i++>> <<set _desc = _trendInfo.descriptions[_i]>> <<if _i === 0>> <!-- Primary trend --> <div style="background: linear-gradient(135deg, #e94560 0%, #ff6b6b 100%); padding: 10px 18px; border-radius: 25px; color: white; font-weight: bold; font-size: 14px; animation: pulse-trend 2s infinite;"> <<= _desc>> </div> <<else>> <!-- Secondary trends --> <div style="background: #0f3460; padding: 8px 15px; border-radius: 20px; color: #ffd; font-size: 13px; border: 2px solid #e94560;"> <<= _desc>> </div> <</if>> <</for>> </div> <p style="color: #aaa; font-size: 12px; margin: 15px 0 0 0; font-style: italic;"> 💡 Trending actions get bonus viewers, engagement, and tips! Trends change daily. </p> </div> <</if>> <</if>> <style> @keyframes pulse-trend { 0%, 100% { box-shadow: 0 0 10px rgba(233, 69, 96, 0.5); } 50% { box-shadow: 0 0 20px rgba(233, 69, 96, 0.8); } } </style> <</nobr>>
<<nobr>> <<set _debugColor = "#2ecc71">> <!-- Initialize bank system if not exists --> <<if !$bankAccount>> <<set $bankAccount = { hasAccount: false, balance: 0, atmWithdrawalsToday: 0, lastWithdrawDay: 0 }>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back to Debug Menu Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Debug Menu</div>">> <<goto "Debug">> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _debugColor>> 0%, <<= _debugColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _debugColor>>; box-shadow: 0 0 20px <<= _debugColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🏦 Debug Bank</h1> </div> <!-- Current Status Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">📊 Current Status</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px;"> <div style="text-align: center; background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Account Status</p> <p style="color: <<if $bankAccount.hasAccount>>#51cf66<<else>>#ff6b6b<</if>>; font-size: 20px; font-weight: bold; margin: 0;"> <<if $bankAccount.hasAccount>>✅ Active<<else>>❌ None<</if>> </p> </div> <div style="text-align: center; background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Cash on Hand</p> <p id="debugCash" style="color: #51cf66; font-size: 20px; font-weight: bold; margin: 0;">$<<= $money.toLocaleString()>></p> </div> <div style="text-align: center; background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #333;"> <p style="color: #888; font-size: 14px; margin: 0 0 5px 0;">Bank Balance</p> <p id="debugBalance" style="color: #2ecc71; font-size: 20px; font-weight: bold; margin: 0;">$<<= $bankAccount.balance.toLocaleString()>></p> </div> </div> </div> <!-- Account Management --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; margin-bottom: 25px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; text-align: center;">⚙️ Account Management</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <<if !$bankAccount.hasAccount>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>✅ Create Account (Free)</div>">> <<set $bankAccount.hasAccount = true>> <<goto "DebugBank">> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>❌ Delete Account</div>">> <<set $bankAccount.hasAccount = false>> <<set $bankAccount.balance = 0>> <<goto "DebugBank">> <</link>> <</if>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffc107; color: #ffc107; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>🔄 Reset ATM Limit</div>">> <<set $bankAccount.atmWithdrawalsToday = 0>> <<goto "DebugBank">> <</link>> </div> </div> <!-- CHEAT: Add Bank Funds --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #51cf6644; margin-bottom: 25px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0; text-align: center;">➕ Add Bank Funds (Cheat)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$100</div>">> <<set $bankAccount.balance += 100>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$500</div>">> <<set $bankAccount.balance += 500>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$1,000</div>">> <<set $bankAccount.balance += 1000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$5,000</div>">> <<set $bankAccount.balance += 5000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$10,000</div>">> <<set $bankAccount.balance += 10000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$25,000</div>">> <<set $bankAccount.balance += 25000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$50,000</div>">> <<set $bankAccount.balance += 50000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>+$100,000</div>">> <<set $bankAccount.balance += 100000>><<goto "DebugBank">> <</link>> </div> </div> <!-- CHEAT: Remove Bank Funds --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ff6b6b44; margin-bottom: 25px;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; text-align: center;">➖ Remove Bank Funds (Cheat)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$100</div>">> <<set $bankAccount.balance -= 100>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$500</div>">> <<set $bankAccount.balance -= 500>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$1,000</div>">> <<set $bankAccount.balance -= 1000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$5,000</div>">> <<set $bankAccount.balance -= 5000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$10,000</div>">> <<set $bankAccount.balance -= 10000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$25,000</div>">> <<set $bankAccount.balance -= 25000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$50,000</div>">> <<set $bankAccount.balance -= 50000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>-$100,000</div>">> <<set $bankAccount.balance -= 100000>><<if $bankAccount.balance < 0>><<set $bankAccount.balance = 0>><</if>><<goto "DebugBank">> <</link>> </div> </div> <!-- CHEAT: Set Bank Balance --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd43b; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd43b44; margin-bottom: 25px;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0; text-align: center;">💵 Set Bank Balance (Cheat)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$0</div>">> <<set $bankAccount.balance = 0>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$1,000</div>">> <<set $bankAccount.balance = 1000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$5,000</div>">> <<set $bankAccount.balance = 5000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$10,000</div>">> <<set $bankAccount.balance = 10000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$25,000</div>">> <<set $bankAccount.balance = 25000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$50,000</div>">> <<set $bankAccount.balance = 50000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$100,000</div>">> <<set $bankAccount.balance = 100000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$500,000</div>">> <<set $bankAccount.balance = 500000>><<goto "DebugBank">> <</link>> <<link "<div style='background: #1a1a1a; border: 2px solid #ffd43b; color: #ffd43b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$1,000,000</div>">> <<set $bankAccount.balance = 1000000>><<goto "DebugBank">> <</link>> </div> </div> <<if $bankAccount.hasAccount>> <!-- Deposit Cash → Bank --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; margin-bottom: 25px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0; text-align: center;">💰 Deposit Cash → Bank</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<if $money >= 100>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$100</div>">> <<set $money -= 100>><<set $bankAccount.balance += 100>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$100</div> <</if>> <<if $money >= 500>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$500</div>">> <<set $money -= 500>><<set $bankAccount.balance += 500>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$500</div> <</if>> <<if $money >= 1000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$1,000</div>">> <<set $money -= 1000>><<set $bankAccount.balance += 1000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$1,000</div> <</if>> <<if $money >= 5000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$5,000</div>">> <<set $money -= 5000>><<set $bankAccount.balance += 5000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$5,000</div> <</if>> <<if $money >= 10000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$10,000</div>">> <<set $money -= 10000>><<set $bankAccount.balance += 10000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$10,000</div> <</if>> <<if $money >= 25000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$25,000</div>">> <<set $money -= 25000>><<set $bankAccount.balance += 25000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$25,000</div> <</if>> <<if $money >= 50000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$50,000</div>">> <<set $money -= 50000>><<set $bankAccount.balance += 50000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$50,000</div> <</if>> <<if $money >= 100000>> <<link "<div style='background: #1a1a1a; border: 2px solid #4dabf7; color: #4dabf7; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$100,000</div>">> <<set $money -= 100000>><<set $bankAccount.balance += 100000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$100,000</div> <</if>> </div> </div> <!-- Withdraw Bank → Cash --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; margin-bottom: 25px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; text-align: center;">💸 Withdraw Bank → Cash</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px;"> <<if $bankAccount.balance >= 100>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$100</div>">> <<set $bankAccount.balance -= 100>><<set $money += 100>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$100</div> <</if>> <<if $bankAccount.balance >= 500>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$500</div>">> <<set $bankAccount.balance -= 500>><<set $money += 500>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$500</div> <</if>> <<if $bankAccount.balance >= 1000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$1,000</div>">> <<set $bankAccount.balance -= 1000>><<set $money += 1000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$1,000</div> <</if>> <<if $bankAccount.balance >= 5000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$5,000</div>">> <<set $bankAccount.balance -= 5000>><<set $money += 5000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$5,000</div> <</if>> <<if $bankAccount.balance >= 10000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$10,000</div>">> <<set $bankAccount.balance -= 10000>><<set $money += 10000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$10,000</div> <</if>> <<if $bankAccount.balance >= 25000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$25,000</div>">> <<set $bankAccount.balance -= 25000>><<set $money += 25000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$25,000</div> <</if>> <<if $bankAccount.balance >= 50000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$50,000</div>">> <<set $bankAccount.balance -= 50000>><<set $money += 50000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$50,000</div> <</if>> <<if $bankAccount.balance >= 100000>> <<link "<div style='background: #1a1a1a; border: 2px solid #9b59b6; color: #9b59b6; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>$100,000</div>">> <<set $bankAccount.balance -= 100000>><<set $money += 100000>><<goto "DebugBank">> <</link>> <<else>> <div style='background: #1a1a1a; border: 2px solid #444; color: #666; padding: 10px; border-radius: 6px; text-align: center;'>$100,000</div> <</if>> </div> </div> <</if>> <!-- Back to Debug Menu Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Debug Menu</div>">> <<goto "Debug">> <</link>> </div> </div> <</nobr>>
<<nobr>> /* Check if player has completed character creation - redirect if not */ <<if !setup.achievements.isUnlocked("first_character")>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ff6b6b; border-radius: 15px; padding: 40px; max-width: 500px; text-align: center; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="font-size: 64px; margin-bottom: 20px;">🔒</div> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">Achievements Locked</h2> <p style="color: #aaa; font-size: 16px; margin: 0 0 25px 0;"> You must complete character creation first to access achievements. </p> <<link "<div style='background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 12px 30px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3); display: inline-block;'>Start Game</div>">> <<goto "Start">> <</link>> </div> </div> <<else>> <<set _achColor = "#ffd700">> <<set _stats = setup.achievements.getStats()>> <<set _stStats = setup.skillTree.getStats()>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return to Game Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _achColor>> 0%, <<= _achColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _achColor>>; box-shadow: 0 0 20px <<= _achColor>>66;"> <h1 style="color: #1a1a1a; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(255,255,255,0.3);">🏆 Achievements</h1> </div> <!-- Skill Tree Button --> <div style="text-align: center; margin-bottom: 25px;"> <<link "<div style='background: linear-gradient(135deg, #9C27B0 0%, #673AB7 100%); border: 3px solid #CE93D8; color: white; padding: 18px 40px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 25px rgba(156,39,176,0.5); display: inline-block;'>✨ Open Skill Tree ✨</div>">> <<goto "SkillTree">> <</link>> <div style="color: #888; font-size: 14px; margin-top: 10px;">Spend your <span style="color: #CE93D8; font-weight: bold;"><<= _stStats.availablePoints>></span> points on permanent upgrades!</div> </div> <!-- Stats Summary --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; border-radius: 15px; padding: 20px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044;"> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; text-align: center;"> <div> <div style="color: #ffd700; font-size: 32px; font-weight: bold;"><<= _stats.unlocked>>/<<= _stats.total>></div> <div style="color: #aaa; font-size: 14px;">Unlocked</div> </div> <div> <div style="color: #ffd700; font-size: 32px; font-weight: bold;"><<= _stats.percentage>>%</div> <div style="color: #aaa; font-size: 14px;">Complete</div> </div> <div> <div style="color: #ffd700; font-size: 32px; font-weight: bold;"><<= _stats.points>></div> <div style="color: #aaa; font-size: 14px;">Points</div> </div> </div> </div> <!-- Achievement List --> <div style="max-width: 900px; margin: 0 auto;"> <<for _ach range setup.achievements.list>> <<set _tierInfo = setup.achievements.tiers[_ach.tier]>> <<if _ach.unlocked>> <!-- Unlocked Achievement --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid <<= _tierInfo.color>>; border-radius: 15px; padding: 20px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<= _tierInfo.color>>44;"> <div style="display: flex; align-items: center; gap: 20px;"> <div style="font-size: 48px; flex-shrink: 0;"><<= _tierInfo.icon>></div> <div style="flex-grow: 1;"> <div style="color: <<= _tierInfo.color>>; font-size: 20px; font-weight: bold; margin-bottom: 5px;"><<= _ach.name>></div> <div style="color: #ccc; font-size: 14px; margin-bottom: 8px;"><<= _ach.description>></div> <div style="display: flex; gap: 15px; font-size: 12px;"> <span style="color: #888;">Tier: <span style="color: <<= _tierInfo.color>>;text-transform: capitalize;"><<= _ach.tier>></span></span> <span style="color: #888;">Points: <span style="color: #ffd700;"><<= _ach.points>></span></span> </div> </div> </div> </div> <<else>> <!-- Locked Achievement --> <div style="background: linear-gradient(135deg, #1a1a1a 0%, #0d0d0d 100%); border: 3px solid #333; border-radius: 15px; padding: 20px; margin-bottom: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.6); opacity: 0.6;"> <div style="display: flex; align-items: center; gap: 20px;"> <div style="font-size: 48px; flex-shrink: 0; filter: grayscale(100%);">🔒</div> <div style="flex-grow: 1;"> <div style="color: #666; font-size: 20px; font-weight: bold; margin-bottom: 5px;">???</div> <div style="color: #555; font-size: 14px; margin-bottom: 8px; font-style: italic;"><<= _ach.hint>></div> <div style="display: flex; gap: 15px; font-size: 12px;"> <span style="color: #444;">Tier: <span style="color: #666; text-transform: capitalize;"><<= _ach.tier>></span></span> <span style="color: #444;">Points: <span style="color: #666;"><<= _ach.points>></span></span> </div> </div> </div> </div> <</if>> <</for>> </div> <!-- Return to Game Button (Bottom) --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _questColor = "#4dabf7">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return to Game Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #4dabf7; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _questColor>> 0%, <<= _questColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _questColor>>; box-shadow: 0 0 20px <<= _questColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">📜 Quests</h1> </div> <!-- Coming Soon Box --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #4dabf7; border-radius: 15px; padding: 40px 20px; margin: 30px auto; max-width: 500px; text-align: center; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744;"> <p style="color: #4dabf7; font-size: 24px; margin: 0 0 15px 0; font-weight: bold;">Coming Soon!</p> <p style="color: #aaa; font-size: 16px; margin: 0;">Your active quests and objectives will appear here</p> </div> <!-- Return to Game Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #4dabf7; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #4dabf744; display: inline-block;'>← Return to Game</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<set _stats = setup.skillTree.getStats()>> <div id="st-page"> <div id="st-header"> <div id="st-back"><<link "← Back">><<goto "Achievements">><</link>></div> <div id="st-info">⭐ <<= _stats.availablePoints>> Available | <<= _stats.spentPoints>> Spent | <<= _stats.unlocked>>/<<= _stats.total>> Unlocked</div> <div id="st-btns"></div> </div> <div id="st-help">Drag to pan • Scroll/Pinch to zoom • Tap gold nodes to buy</div> <div id="st-viewport"> <svg id="st-svg"></svg> <div id="st-nodes"></div> </div> <div id="st-tooltip"></div> </div> <<script>> $(document).one(":passageend", function() { var vp = document.getElementById("st-viewport"); var svg = document.getElementById("st-svg"); var nodesDiv = document.getElementById("st-nodes"); var tooltip = document.getElementById("st-tooltip"); var btns = document.getElementById("st-btns"); var zoom = 0.25; var panX = 0; var panY = 0; var dragging = false; var dragStartX, dragStartY, panStartX, panStartY; btns.innerHTML = '<button class="st-btn" id="st-zin">+</button>' + '<button class="st-btn" id="st-zout">−</button>' + '<button class="st-btn" id="st-center">⌾</button>'; // STAR LAYOUT - Center at 2500,2000 // Each branch radiates outward in its own direction // MASSIVE spacing: 500px+ between all nodes var cx = 2500; var cy = 2000; var positions = { // === 5 STARTING BRANCHES - TRUE STAR PATTERN === // TRADING: Goes UP-LEFT (northwest) "skill_2": {x: cx - 600, y: cy - 400}, // RELATIONSHIPS: Goes UP (north) "skill_3": {x: cx, y: cy - 600}, // CRIME: Goes DOWN-LEFT (southwest) "skill_4": {x: cx - 600, y: cy + 400}, // MONEY: Goes DOWN-RIGHT (southeast) "skill_5": {x: cx + 600, y: cy + 400}, // SEXY: Goes UP-RIGHT (northeast) "skill_33": {x: cx + 600, y: cy - 400}, // === TRADING BRANCH - continues UP-LEFT === "skill_6": {x: cx - 1200, y: cy - 200}, "skill_18": {x: cx - 1200, y: cy - 600}, "skill_19": {x: cx - 1200, y: cy - 1000}, "skill_21": {x: cx - 1800, y: cy - 200}, "skill_23": {x: cx - 1800, y: cy - 600}, "skill_20": {x: cx - 1800, y: cy - 1000}, // === CRIME BRANCH - continues DOWN-LEFT === "skill_15": {x: cx - 1100, y: cy + 200}, "skill_16": {x: cx - 1100, y: cy + 600}, "skill_17": {x: cx - 1100, y: cy + 1000}, "skill_36": {x: cx - 1100, y: cy + 1400}, "skill_28": {x: cx - 1700, y: cy + 200}, "skill_27": {x: cx - 1700, y: cy + 600}, "skill_29": {x: cx - 1700, y: cy + 1000}, "skill_37": {x: cx - 1700, y: cy + 1400}, // === MONEY BRANCH - continues DOWN-RIGHT === "skill_12": {x: cx + 1100, y: cy + 200}, "skill_13": {x: cx + 1100, y: cy + 600}, "skill_14": {x: cx + 1100, y: cy + 1000}, "skill_32": {x: cx + 1100, y: cy + 1400}, "skill_22": {x: cx + 1700, y: cy + 400}, "skill_26": {x: cx + 2300, y: cy + 400}, // Selling sub (from skill_12) "skill_7": {x: cx + 1700, y: cy + 200}, "skill_10": {x: cx + 2300, y: cy}, "skill_11": {x: cx + 2300, y: cy + 200}, "skill_30": {x: cx + 2900, y: cy + 200}, // Slots sub (from skill_13) "skill_8": {x: cx + 1700, y: cy + 600}, "skill_34": {x: cx + 2300, y: cy + 500}, "skill_40": {x: cx + 2300, y: cy + 800}, // Streaming sub (from skill_14) "skill_9": {x: cx + 1700, y: cy + 1000}, "skill_24": {x: cx + 2300, y: cy + 900}, "skill_25": {x: cx + 2300, y: cy + 1200}, // Tomes sub (from skill_32) "skill_31": {x: cx + 1700, y: cy + 1400}, "skill_39": {x: cx + 2300, y: cy + 1400}, // === SEXY BRANCH - continues UP-RIGHT === "skill_41": {x: cx + 1100, y: cy - 700}, "skill_43": {x: cx + 1100, y: cy - 300}, "skill_42": {x: cx + 1700, y: cy - 700}, // === SECRETS - FAR BOTTOM CENTER === "skill_35": {x: cx, y: cy + 1800}, "skill_38": {x: cx, y: cy + 2400}, // === HIDDEN === "skill_44": {x: cx, y: cy + 3000} }; function applyTransform() { var t = "translate(" + panX + "px," + panY + "px) scale(" + zoom + ")"; nodesDiv.style.transform = t; svg.style.transform = t; } function drawLines() { svg.innerHTML = ""; var skills = setup.skillTree.skills; for (var id in skills) { var s = skills[id]; var p2 = positions[id]; if (!p2 || !s.requires) continue; for (var i = 0; i < s.requires.length; i++) { var p1 = positions[s.requires[i]]; if (!p1) continue; var lit = setup.skillTree.isUnlocked(s.requires[i]); var line = document.createElementNS("http://www.w3.org/2000/svg", "line"); line.setAttribute("x1", p1.x + 75); line.setAttribute("y1", p1.y + 50); line.setAttribute("x2", p2.x + 75); line.setAttribute("y2", p2.y + 50); line.setAttribute("class", lit ? "st-line-lit" : "st-line-dim"); svg.appendChild(line); } } } function drawNodes() { nodesDiv.innerHTML = ""; var skills = setup.skillTree.skills; for (var id in skills) { var s = skills[id]; var p = positions[id]; if (!p) continue; var unlocked = setup.skillTree.isUnlocked(id); var canBuy = setup.skillTree.canPurchase(id); // Hidden skills only appear when purchasable or already unlocked if (s.hidden && !unlocked && !canBuy) continue; var node = document.createElement("div"); node.className = "st-node"; if (unlocked) node.className += " st-unlocked"; else if (canBuy) node.className += " st-canbuy"; else node.className += " st-locked"; node.style.left = p.x + "px"; node.style.top = p.y + "px"; node.setAttribute("data-id", id); var costText = unlocked ? "✓ OWNED" : s.cost + " pts"; node.innerHTML = '<div class="st-name">' + s.name + '</div><div class="st-cost">' + costText + '</div>'; (function(skillId, skillData, canPurchase) { node.onclick = function(e) { e.stopPropagation(); if (canPurchase) { setup.skillTree.purchase(skillId); Engine.play("SkillTree"); } }; node.onmouseenter = function(e) { var req = ""; if (skillData.requires && skillData.requires.length > 0) { var names = []; for (var i = 0; i < skillData.requires.length; i++) { var r = setup.skillTree.skills[skillData.requires[i]]; var done = setup.skillTree.isUnlocked(skillData.requires[i]); names.push((done ? "✓ " : "✗ ") + (r ? r.name : skillData.requires[i])); } req = "<div class='st-tip-req'>Requires: " + names.join(", ") + "</div>"; } tooltip.innerHTML = '<div class="st-tip-name">' + skillData.name + '</div>' + '<div class="st-tip-desc">' + (skillData.description || "No description") + '</div>' + '<div class="st-tip-cost">Cost: ' + skillData.cost + ' points</div>' + req; tooltip.style.display = "block"; tooltip.style.left = (e.clientX + 15) + "px"; tooltip.style.top = (e.clientY + 15) + "px"; }; node.onmouseleave = function() { tooltip.style.display = "none"; }; })(id, s, canBuy); nodesDiv.appendChild(node); } } // Pan vp.onmousedown = function(e) { if (e.target.classList.contains("st-node") || e.target.closest(".st-node")) return; dragging = true; dragStartX = e.clientX; dragStartY = e.clientY; panStartX = panX; panStartY = panY; vp.style.cursor = "grabbing"; }; document.onmousemove = function(e) { if (!dragging) return; panX = panStartX + (e.clientX - dragStartX); panY = panStartY + (e.clientY - dragStartY); applyTransform(); }; document.onmouseup = function() { dragging = false; vp.style.cursor = "grab"; }; // Zoom at mouse position vp.onwheel = function(e) { e.preventDefault(); var rect = vp.getBoundingClientRect(); var mouseX = e.clientX - rect.left; var mouseY = e.clientY - rect.top; var oldZoom = zoom; var delta = e.deltaY > 0 ? 0.85 : 1.18; zoom = Math.max(0.1, Math.min(1.5, zoom * delta)); var zoomRatio = zoom / oldZoom; panX = mouseX - (mouseX - panX) * zoomRatio; panY = mouseY - (mouseY - panY) * zoomRatio; applyTransform(); }; // Touch support for mobile devices var touchStartX, touchStartY, touchPanStartX, touchPanStartY; var lastTouchDist = 0; var isTouchDragging = false; vp.ontouchstart = function(e) { if (e.target.classList.contains("st-node") || e.target.closest(".st-node")) return; if (e.touches.length === 1) { // Single touch - pan isTouchDragging = true; touchStartX = e.touches[0].clientX; touchStartY = e.touches[0].clientY; touchPanStartX = panX; touchPanStartY = panY; } else if (e.touches.length === 2) { // Two touches - prepare for pinch zoom isTouchDragging = false; var dx = e.touches[0].clientX - e.touches[1].clientX; var dy = e.touches[0].clientY - e.touches[1].clientY; lastTouchDist = Math.sqrt(dx * dx + dy * dy); } e.preventDefault(); }; vp.ontouchmove = function(e) { if (e.touches.length === 1 && isTouchDragging) { // Single touch - pan panX = touchPanStartX + (e.touches[0].clientX - touchStartX); panY = touchPanStartY + (e.touches[0].clientY - touchStartY); applyTransform(); } else if (e.touches.length === 2) { // Two touches - pinch zoom var dx = e.touches[0].clientX - e.touches[1].clientX; var dy = e.touches[0].clientY - e.touches[1].clientY; var dist = Math.sqrt(dx * dx + dy * dy); if (lastTouchDist > 0) { var rect = vp.getBoundingClientRect(); var centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2 - rect.left; var centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2 - rect.top; var oldZoom = zoom; var scale = dist / lastTouchDist; zoom = Math.max(0.1, Math.min(1.5, zoom * scale)); var zoomRatio = zoom / oldZoom; panX = centerX - (centerX - panX) * zoomRatio; panY = centerY - (centerY - panY) * zoomRatio; applyTransform(); } lastTouchDist = dist; } e.preventDefault(); }; vp.ontouchend = function(e) { if (e.touches.length === 0) { isTouchDragging = false; lastTouchDist = 0; } else if (e.touches.length === 1) { // Went from 2 touches to 1 - restart pan isTouchDragging = true; touchStartX = e.touches[0].clientX; touchStartY = e.touches[0].clientY; touchPanStartX = panX; touchPanStartY = panY; lastTouchDist = 0; } }; document.getElementById("st-zin").onclick = function() { var rect = vp.getBoundingClientRect(); var centerX = rect.width / 2; var centerY = rect.height / 2; var oldZoom = zoom; zoom = Math.min(1.5, zoom * 1.3); var zoomRatio = zoom / oldZoom; panX = centerX - (centerX - panX) * zoomRatio; panY = centerY - (centerY - panY) * zoomRatio; applyTransform(); }; document.getElementById("st-zout").onclick = function() { var rect = vp.getBoundingClientRect(); var centerX = rect.width / 2; var centerY = rect.height / 2; var oldZoom = zoom; zoom = Math.max(0.1, zoom * 0.7); var zoomRatio = zoom / oldZoom; panX = centerX - (centerX - panX) * zoomRatio; panY = centerY - (centerY - panY) * zoomRatio; applyTransform(); }; document.getElementById("st-center").onclick = function() { var rect = vp.getBoundingClientRect(); zoom = 0.25; panX = rect.width / 2 - cx * zoom; panY = rect.height / 2 - cy * zoom; applyTransform(); }; drawLines(); drawNodes(); var rect = vp.getBoundingClientRect(); panX = rect.width / 2 - cx * zoom; panY = rect.height / 2 - cy * zoom; applyTransform(); }); <</script>>
<<nobr>> <<set _debugColor = "#ffd700">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>">> <<goto "Debug">> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _debugColor>> 0%, <<= _debugColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _debugColor>>; box-shadow: 0 0 20px <<= _debugColor>>66;"> <h1 style="color: #1a1a1a; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(255,255,255,0.3);">🏆 Achievements & Skill Tree</h1> </div> <!-- Skill Tree Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9C27B0; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9C27B044; margin-bottom: 25px;"> <h2 style="color: #CE93D8; margin: 0 0 15px 0; text-align: center;">✨ Skill Tree Controls</h2> <!-- Current Stats --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <<set _stStats = setup.skillTree.getStats()>> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; text-align: center;"> <div> <div style="color: #CE93D8; font-size: 24px; font-weight: bold;" id="st-available"><<= _stStats.availablePoints>></div> <div style="color: #888; font-size: 12px;">Available Points</div> </div> <div> <div style="color: #CE93D8; font-size: 24px; font-weight: bold;" id="st-spent"><<= _stStats.spentPoints>></div> <div style="color: #888; font-size: 12px;">Spent Points</div> </div> <div> <div style="color: #CE93D8; font-size: 24px; font-weight: bold;" id="st-unlocked"><<= _stStats.unlocked>>/<<= _stStats.total>></div> <div style="color: #888; font-size: 12px;">Skills Unlocked</div> </div> </div> </div> <!-- Skill Tree Actions --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f44336; color: #f44336; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔄 Reset All Skills</div>">> <<run setup.skillTree.resetSkills()>> <<goto "DebugAchievementandSkillTree">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #CE93D8; color: #CE93D8; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✅ Unlock All Skills</div>">> <<set _allSkillIds = Object.keys(setup.skillTree.skills)>> <<for _sid range _allSkillIds>> <<if !setup.skillTree.isUnlocked(_sid)>> <<if !$unlockedSkills>><<set $unlockedSkills = []>><</if>> <<run $unlockedSkills.push(_sid)>> <</if>> <</for>> <<run setup.skillTree.applyEffects()>> <<run setup.skillTree.syncStatBonuses()>> <<goto "DebugAchievementandSkillTree">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4CAF50; color: #4CAF50; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+10 Points</div>">> <<set $achievementPoints += 10>> <<goto "DebugAchievementandSkillTree">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4CAF50; color: #4CAF50; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+50 Points</div>">> <<set $achievementPoints += 50>> <<goto "DebugAchievementandSkillTree">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #4CAF50; color: #4CAF50; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>+100 Points</div>">> <<set $achievementPoints += 100>> <<goto "DebugAchievementandSkillTree">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9C27B0; color: #CE93D8; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🌳 Open Skill Tree</div>">> <<goto "SkillTree">> <</link>> </div> </div> <!-- Achievement Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #ffd70044; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">🏆 Achievement Controls</h2> <!-- Current Stats --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <<set _achStats = setup.achievements.getStats()>> <div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; text-align: center;"> <div> <div style="color: #ffd700; font-size: 24px; font-weight: bold;"><<= _achStats.unlocked>>/<<= _achStats.total>></div> <div style="color: #888; font-size: 12px;">Unlocked</div> </div> <div> <div style="color: #ffd700; font-size: 24px; font-weight: bold;"><<= _achStats.percentage>>%</div> <div style="color: #888; font-size: 12px;">Complete</div> </div> <div> <div style="color: #ffd700; font-size: 24px; font-weight: bold;"><<= _achStats.points>></div> <div style="color: #888; font-size: 12px;">Total Points</div> </div> </div> </div> <!-- Bulk Actions --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f44336; color: #f44336; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🔄 Reset All Achievements</div>">> <<for _ach range setup.achievements.list>> <<set _ach.unlocked = false>> <<set _ach.unlockedAt = null>> <</for>> <<set $unlockedAchievements = []>> <<set $achievementPoints = 0>> <<run setup.skillTree.resetSkills()>> <<goto "DebugAchievementandSkillTree">> <</link>> </div> <!-- Bronze Achievement Toggles --> <h3 style="color: #cd7f32; margin: 20px 0 15px 0; text-align: center; border-bottom: 1px solid #333; padding-bottom: 10px;">Toggle Bronze Achievements</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 10px;"> <<for _ach range setup.achievements.list>> <<if _ach.tier === "bronze">> <<set _tierInfo = setup.achievements.tiers[_ach.tier]>> <<if _ach.unlocked>> <<capture _ach, _tierInfo>> <<link "<div style='background: linear-gradient(135deg, #1a2a1a 0%, #0d1a0d 100%); border: 2px solid <<= _tierInfo.color>>; border-radius: 8px; padding: 12px; cursor: pointer; box-shadow: 0 0 10px <<= _tierInfo.color>>44;'><div style='display: flex; align-items: center; gap: 12px;'><span style='font-size: 24px;'><<= _tierInfo.icon>></span><div style='flex: 1;'><div style='color: <<= _tierInfo.color>>; font-weight: bold; font-size: 14px;'><<= _ach.name>></div><div style='color: #888; font-size: 11px;'><<= _ach.tier>> • <<= _ach.points>> pts • ✓ UNLOCKED</div></div></div></div>">> <<set _ach.unlocked = false>> <<set _ach.unlockedAt = null>> <<set $unlockedAchievements = $unlockedAchievements.filter(id => id !== _ach.id)>> <<set $achievementPoints -= _ach.points>> <<goto "DebugAchievementandSkillTree">> <</link>> <</capture>> <<else>> <<capture _ach, _tierInfo>> <<link "<div style='background: linear-gradient(135deg, #1a1a1a 0%, #0d0d0d 100%); border: 2px solid #333; border-radius: 8px; padding: 12px; cursor: pointer;'><div style='display: flex; align-items: center; gap: 12px;'><span style='font-size: 24px; filter: grayscale(100%);'>🔒</span><div style='flex: 1;'><div style='color: #666; font-weight: bold; font-size: 14px;'><<= _ach.name>></div><div style='color: #444; font-size: 11px;'><<= _ach.tier>> • <<= _ach.points>> pts • LOCKED</div></div></div></div>">> <<run setup.achievements.unlock(_ach.id)>> <<goto "DebugAchievementandSkillTree">> <</link>> <</capture>> <</if>> <</if>> <</for>> </div> </div> <!-- Return Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>">> <<goto "Debug">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set _debugColor = "#e040fb">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Return Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>">> <<goto "Debug">> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _debugColor>> 0%, <<= _debugColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _debugColor>>; box-shadow: 0 0 20px <<= _debugColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🔮 Life Swap Debug</h1> </div> <!-- Current Status Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<= _debugColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: <<= _debugColor>>; margin: 0 0 15px 0;">📊 Current Status</h2> <div id="lifeSwapStatusDisplay"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Soul Trait Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: <<= _debugColor>>;">Soul Trait:</strong> <<if $mentalTraits && $mentalTraits.includes("Soul")>> <span style="color: #51cf66; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Missing</span> <</if>> </div> <!-- Sunfish Skill Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: <<= _debugColor>>;">Sunfish Skill:</strong> <<if $skills && $skills.includes("Sunfish")>> <span style="color: #51cf66; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Missing</span> <</if>> </div> <!-- Stats Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: <<= _debugColor>>;">Stats 50+:</strong> <<set _hasMinStats = $stats.strength >= 50 && $stats.intelligence >= 50 && $stats.charisma >= 50 && $stats.dexterity >= 50>> <<if _hasMinStats>> <span style="color: #51cf66; font-weight: bold;"> ✓ Met</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Not Met</span> <</if>> </div> <!-- Bypass Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: <<= _debugColor>>;">Bypass Mode:</strong> <<if $debugLifeSwapBypass>> <span style="color: #ffc107; font-weight: bold;"> ⚡ ENABLED</span> <<else>> <span style="color: #888; font-weight: bold;"> Disabled</span> <</if>> </div> </div> </div> </div> <!-- Soul Trait Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">👻 Soul Trait</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px;">The Soul trait enables life swap functionality. It stays with you through swaps.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <strong style="color: #9b59b6;">Status:</strong> <span id="soulTraitStatus"> <<if $mentalTraits && $mentalTraits.includes("Soul")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add Soul Trait</div>">> <<if !$mentalTraits>><<set $mentalTraits = []>><</if>> <<if !$mentalTraits.includes("Soul")>> <<run $mentalTraits.push("Soul")>> <</if>> <<replace "#soulTraitStatus">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove Soul Trait</div>">> <<if $mentalTraits && $mentalTraits.includes("Soul")>> <<set $mentalTraits = $mentalTraits.filter(function(t) { return t !== "Soul"; })>> <</if>> <<replace "#soulTraitStatus">> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> </div> </div> <!-- Sunfish Skill Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ffc107; margin: 0 0 15px 0;">🐟 Sunfish Skill</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px;">The Sunfish skill is consumed when performing a life swap (except returning to original body).</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <strong style="color: #ffc107;">Status:</strong> <span id="sunfishSkillStatus"> <<if $skills && $skills.includes("Sunfish")>> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>➕ Add Sunfish Skill</div>">> <<if !$skills>><<set $skills = []>><</if>> <<if !$skills.includes("Sunfish")>> <<run $skills.push("Sunfish")>> <</if>> <<replace "#sunfishSkillStatus">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b6b 0%, #fa5252 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>❌ Remove Sunfish Skill</div>">> <<if $skills && $skills.includes("Sunfish")>> <<set $skills = $skills.filter(function(s) { return s !== "Sunfish"; })>> <</if>> <<replace "#sunfishSkillStatus">> <span style="color: #ff6b6b; font-size: 16px; font-weight: bold;"> ✗ Inactive</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> </div> </div> <!-- Stats Quick Set Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #4dabf7; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #4dabf7; margin: 0 0 15px 0;">📈 Stats Requirement</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px;">Life swap requires 50+ in all base stats (Strength, Intelligence, Charisma, Dexterity).</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <div id="statsDisplay" style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px;"> <div><strong style="color: #ff6b6b;">STR:</strong> <span style="color: <<if $stats.strength >= 50>>#51cf66<<else>>#ff6b6b<</if>>;"><<= $stats.strength>></span></div> <div><strong style="color: #4dabf7;">INT:</strong> <span style="color: <<if $stats.intelligence >= 50>>#51cf66<<else>>#ff6b6b<</if>>;"><<= $stats.intelligence>></span></div> <div><strong style="color: #e91e63;">CHA:</strong> <span style="color: <<if $stats.charisma >= 50>>#51cf66<<else>>#ff6b6b<</if>>;"><<= $stats.charisma>></span></div> <div><strong style="color: #51cf66;">DEX:</strong> <span style="color: <<if $stats.dexterity >= 50>>#51cf66<<else>>#ff6b6b<</if>>;"><<= $stats.dexterity>></span></div> </div> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>📊 Set All Stats to 50</div>">> <<set $stats.strength = Math.max($stats.strength, 50)>> <<set $stats.intelligence = Math.max($stats.intelligence, 50)>> <<set $stats.charisma = Math.max($stats.charisma, 50)>> <<set $stats.dexterity = Math.max($stats.dexterity, 50)>> <<replace "#statsDisplay">> <div><strong style="color: #ff6b6b;">STR:</strong> <span style="color: #51cf66;"><<= $stats.strength>></span></div> <div><strong style="color: #4dabf7;">INT:</strong> <span style="color: #51cf66;"><<= $stats.intelligence>></span></div> <div><strong style="color: #e91e63;">CHA:</strong> <span style="color: #51cf66;"><<= $stats.charisma>></span></div> <div><strong style="color: #51cf66;">DEX:</strong> <span style="color: #51cf66;"><<= $stats.dexterity>></span></div> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #ffc107 0%, #ffb300 100%); color: black; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>💪 Set All Stats to 100</div>">> <<set $stats.strength = 100>> <<set $stats.intelligence = 100>> <<set $stats.charisma = 100>> <<set $stats.dexterity = 100>> <<replace "#statsDisplay">> <div><strong style="color: #ff6b6b;">STR:</strong> <span style="color: #51cf66;"><<= $stats.strength>></span></div> <div><strong style="color: #4dabf7;">INT:</strong> <span style="color: #51cf66;"><<= $stats.intelligence>></span></div> <div><strong style="color: #e91e63;">CHA:</strong> <span style="color: #51cf66;"><<= $stats.charisma>></span></div> <div><strong style="color: #51cf66;">DEX:</strong> <span style="color: #51cf66;"><<= $stats.dexterity>></span></div> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> </div> </div> <!-- Bypass Limitations Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">⚡ Bypass Limitations</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px;">When enabled, bypasses all life swap requirements (Soul trait, Sunfish skill, stats, protected NPCs).</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 15px; border: 1px solid #333;"> <strong style="color: #ff6b6b;">Bypass Status:</strong> <span id="bypassStatus"> <<if $debugLifeSwapBypass>> <span style="color: #ffc107; font-size: 16px; font-weight: bold;"> ⚡ ENABLED - All limitations disabled</span> <<else>> <span style="color: #888; font-size: 16px; font-weight: bold;"> Disabled - Normal rules apply</span> <</if>> </span> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #ffc107 0%, #ffb300 100%); color: black; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>⚡ Enable Bypass</div>">> <<set $debugLifeSwapBypass = true>> <<replace "#bypassStatus">> <span style="color: #ffc107; font-size: 16px; font-weight: bold;"> ⚡ ENABLED - All limitations disabled</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> <<link "<div style='background: linear-gradient(135deg, #666 0%, #444 100%); color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>🚫 Disable Bypass</div>">> <<set $debugLifeSwapBypass = false>> <<replace "#bypassStatus">> <span style="color: #888; font-size: 16px; font-weight: bold;"> Disabled - Normal rules apply</span> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> </div> <div style="background-color: #2a1a1a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 1px solid #ff6b6b;"> <p style="color: #ff6b6b; margin: 0; font-size: 14px;"> <strong>When bypass is enabled:</strong><br> • No Soul trait required<br> • No Sunfish skill required (won't be consumed)<br> • No stat requirements<br> • Can swap with protected NPCs </p> </div> </div> <!-- Quick Setup Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">🚀 Quick Setup</h2> <p style="color: #aaa; margin: 0 0 15px 0; font-size: 14px;">Quickly set up everything needed for life swapping.</p> <div style="display: grid; grid-template-columns: 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #51cf66 0%, #40c057 100%); color: white; padding: 15px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 2px 4px rgba(0,0,0,0.3);'>✨ Grant All Life Swap Requirements</div>">> <!-- Add Soul trait --> <<if !$mentalTraits>><<set $mentalTraits = []>><</if>> <<if !$mentalTraits.includes("Soul")>> <<run $mentalTraits.push("Soul")>> <</if>> <!-- Add Sunfish skill --> <<if !$skills>><<set $skills = []>><</if>> <<if !$skills.includes("Sunfish")>> <<run $skills.push("Sunfish")>> <</if>> <!-- Set stats to 50 minimum --> <<set $stats.strength = Math.max($stats.strength, 50)>> <<set $stats.intelligence = Math.max($stats.intelligence, 50)>> <<set $stats.charisma = Math.max($stats.charisma, 50)>> <<set $stats.dexterity = Math.max($stats.dexterity, 50)>> <!-- Refresh all displays --> <<replace "#soulTraitStatus">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <</replace>> <<replace "#sunfishSkillStatus">> <span style="color: #51cf66; font-size: 16px; font-weight: bold;"> ✓ Active</span> <</replace>> <<replace "#statsDisplay">> <div><strong style="color: #ff6b6b;">STR:</strong> <span style="color: #51cf66;"><<= $stats.strength>></span></div> <div><strong style="color: #4dabf7;">INT:</strong> <span style="color: #51cf66;"><<= $stats.intelligence>></span></div> <div><strong style="color: #e91e63;">CHA:</strong> <span style="color: #51cf66;"><<= $stats.charisma>></span></div> <div><strong style="color: #51cf66;">DEX:</strong> <span style="color: #51cf66;"><<= $stats.dexterity>></span></div> <</replace>> <<replace "#lifeSwapStatusDisplay">><<include "DebugLifeSwapStatusRefresh">><</replace>> <</link>> </div> </div> <!-- Return Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>">> <<goto "Debug">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <!-- Soul Trait Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #e040fb;">Soul Trait:</strong> <<if $mentalTraits && $mentalTraits.includes("Soul")>> <span style="color: #51cf66; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Missing</span> <</if>> </div> <!-- Sunfish Skill Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #e040fb;">Sunfish Skill:</strong> <<if $skills && $skills.includes("Sunfish")>> <span style="color: #51cf66; font-weight: bold;"> ✓ Active</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Missing</span> <</if>> </div> <!-- Stats Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #e040fb;">Stats 50+:</strong> <<set _hasMinStats = $stats.strength >= 50 && $stats.intelligence >= 50 && $stats.charisma >= 50 && $stats.dexterity >= 50>> <<if _hasMinStats>> <span style="color: #51cf66; font-weight: bold;"> ✓ Met</span> <<else>> <span style="color: #ff6b6b; font-weight: bold;"> ✗ Not Met</span> <</if>> </div> <!-- Bypass Status --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <strong style="color: #e040fb;">Bypass Mode:</strong> <<if $debugLifeSwapBypass>> <span style="color: #ffc107; font-weight: bold;"> ⚡ ENABLED</span> <<else>> <span style="color: #888; font-weight: bold;"> Disabled</span> <</if>> </div> </div> <</nobr>>
Full swap option (every trait traded) use NPC’s image as your character screen. Random swaps, sometimes characters sneak in traits/skills they want to trade. twinning and or identity change/corruption accidental bump and swap switching name+body with someone (probably make this an optional skill in the skill tree) Add sexual orientations for when relationships are updated
<<nobr>> <<set $lastLocation = "RedLightHousing">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b6b; text-align: center;">💋 Red Light District Apartments</h1> <div style="padding: 20px; background: linear-gradient(135deg, #4a1a1a 0%, #2d1515 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b6b;"> <p style="color: white; font-size: 18px; margin: 0;"> A run-down apartment building in the heart of the Red Light District. The hallways smell of cheap perfume and cigarette smoke. Flickering neon lights from nearby establishments cast colored shadows through grimy windows. It's not much, but rent is cheap and no one asks questions. </p> </div> <h2 style="color: #ff6b6b;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">🔴 Red Light District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Return to the red light district.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Back to Red Light District</div>">> <<goto "RedLightDistrict">> <</link>> </div> </div> <<set _npcsHere = setup.getNPCsAtLocation("RedLightHousing")>> <<set _residents = setup.getNPCsLivingAt("RedLightHousing")>> <!-- Knock on Random Door Section --> <h2 style="color: #ff6b6b;">🚪 Knock on a Door</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <p style="color: #aaa; margin-bottom: 15px;">Try knocking on a random apartment door. There's about a 25% chance someone will answer.</p> <<link "<div style='background: #ff6b6b; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🚪 Knock on Random Door</div>">> <<set _knockResult = setup.knockRandomDoor("RedLightHousing")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No answer. You hear music playing from inside but no one comes to the door.">> <<goto "RedLightHousing">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ff6b6b;"> <p style="color: #ff6b6b; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">💋 Visit Friend's Place</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66;"> <p style="color: #aaa; margin-bottom: 15px;">You know these residents well enough to visit directly.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>💋 Visit _friend.name</div>">> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #ff6b6b;">💋 Residents in Building</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ff6b6b; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #ff6b6b; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666;"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The hallways are empty right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "OutskirtsHousing">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #8b7355; text-align: center;">🏚️ Outskirts Housing</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3d3528 0%, #2a2520 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b7355;"> <p style="color: white; font-size: 18px; margin: 0;"> Rundown houses scattered along the outskirts of town. Peeling paint, overgrown yards, and rusted chain-link fences are common sights here. The neighborhood has seen better days, but the residents make do with what they have. Some call it character, others call it neglect. </p> </div> <h2 style="color: #8b7355;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #8b7355; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #8b7355; margin: 0 0 10px 0;">🌾 Outskirts</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Return to the outskirts area.</p> <<link "<div style='background: #8b7355; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Back to Outskirts</div>">> <<goto "Outskirts">> <</link>> </div> </div> <<set _npcsHere = setup.getNPCsAtLocation("OutskirtsHousing")>> <<set _residents = setup.getNPCsLivingAt("OutskirtsHousing")>> <!-- Knock on Random Door Section --> <h2 style="color: #8b7355;">🚪 Knock on a Door</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #8b7355;"> <p style="color: #aaa; margin-bottom: 15px;">Try knocking on a random door. There's about a 25% chance someone will answer.</p> <<link "<div style='background: #8b7355; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🚪 Knock on Random Door</div>">> <<set _knockResult = setup.knockRandomDoor("OutskirtsHousing")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No one answers. You hear a TV playing inside but no one comes to the door.">> <<goto "OutskirtsHousing">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #8b7355;"> <p style="color: #8b7355; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🏠 Visit Friend's Place</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66;"> <p style="color: #aaa; margin-bottom: 15px;">You know these residents well enough to visit directly.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🏠 Visit _friend.name</div>">> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #8b7355;">🏚️ Residents Outside</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #8b7355;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #8b7355; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #8b7355; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #8b7355; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666;"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one is outside in the neighborhood right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "ApartmentPenthouse">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffd700; text-align: center;">Penthouse Suite</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3d3419 0%, #2a2510 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffd700;"> <p style="color: white; font-size: 18px; margin: 0;"> A luxurious penthouse sitting atop the city's most prestigious apartment building. Floor-to-ceiling windows offer breathtaking panoramic views of Sunfish City. The interior is all marble floors, designer furniture, and expensive artwork. This is where the city's elite call home. </p> </div> <<if $currentHousingVisit>> <h2 style="color: #ffd700;">Visiting: <<= $currentHousingVisit>>'s Penthouse</h2> <p style="color: #ccc;">You're in the lap of luxury, visiting an NPC's penthouse.</p> <<link "<div style='background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; display: inline-block;'>Leave</div>">> <<set $currentHousingVisit = null>> <<goto "Downtown">> <</link>> <<else>> <p style="color: #888;">The elevator requires a keycard. To visit someone here, you need to have a Best Friend relationship with them.</p> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #ffd700; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>Back to Downtown</div>">> <<goto "Downtown">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BusinessDistrictHousing">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">🏢 Business District Apartments</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1a3040 0%, #102030 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> Upscale apartment complex nestled among the corporate towers of the Business District. Modern architecture, keycard security, and a doorman who remembers everyone's name. The residents are mostly young professionals and executives who value convenience and status. </p> </div> <h2 style="color: #17a2b8;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">🏛️ Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Return to the business district.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Back to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> </div> <<set _npcsHere = setup.getNPCsAtLocation("BusinessDistrictHousing")>> <<set _residents = setup.getNPCsLivingAt("BusinessDistrictHousing")>> <!-- Knock on Random Door Section --> <h2 style="color: #17a2b8;">🚪 Buzz an Apartment</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8;"> <p style="color: #aaa; margin-bottom: 15px;">Try buzzing a random apartment. There's about a 25% chance someone will answer.</p> <<link "<div style='background: #17a2b8; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🔔 Buzz Random Apartment</div>">> <<set _knockResult = setup.knockRandomDoor("BusinessDistrictHousing")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No response. The resident is either out or not accepting visitors.">> <<goto "BusinessDistrictHousing">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #17a2b8;"> <p style="color: #17a2b8; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🏢 Visit Friend's Apartment</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66;"> <p style="color: #aaa; margin-bottom: 15px;">The doorman recognizes you as a friend of these residents.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🏢 Visit _friend.name</div>">> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #17a2b8;">🏢 Residents in Lobby</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666;"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The lobby is quiet right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BeachMansion">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #20c997; text-align: center;">Beach Mansion</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1a3d3d 0%, #102828 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #20c997;"> <p style="color: white; font-size: 18px; margin: 0;"> A stunning beachfront mansion with private beach access. The architecture blends modern luxury with coastal charm. Palm trees line the driveway, and the sound of waves provides a constant, soothing backdrop. This is the kind of home most people only dream about. </p> </div> <<if $currentHousingVisit>> <h2 style="color: #20c997;">Visiting: <<= $currentHousingVisit>>'s Mansion</h2> <p style="color: #ccc;">You're visiting an NPC's luxurious beach mansion.</p> <<link "<div style='background: #dc3545; color: white; padding: 10px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px; display: inline-block;'>Leave</div>">> <<set $currentHousingVisit = null>> <<goto "Beach">> <</link>> <<else>> <p style="color: #888;">The gate is locked and secured. To visit someone here, you need to have a Best Friend relationship with them.</p> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #20c997; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>Back to Beach</div>">> <<goto "Beach">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "BrothelPrivateChambers">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">🛏️ Brothel Private Chambers</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3d1a2e 0%, #2a1020 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0;"> The back hallway of the brothel leads to the private living quarters where the workers reside. Each room is surprisingly cozy - a small sanctuary away from work. The thick walls ensure privacy, and the furnishings are tasteful despite the nature of the establishment. </p> </div> <h2 style="color: #e83e8c;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">💋 Brothel</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;">Return to the main brothel area.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Back to Brothel</div>">> <<goto "Brothel">> <</link>> </div> </div> <<set _npcsHere = setup.getNPCsAtLocation("BrothelPrivateChambers")>> <<set _residents = setup.getNPCsLivingAt("BrothelPrivateChambers")>> <!-- Knock on Random Door Section --> <h2 style="color: #e83e8c;">🚪 Knock on a Room</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e83e8c;"> <p style="color: #aaa; margin-bottom: 15px;">Try knocking on a random worker's door. There's about a 25% chance someone will answer.</p> <<link "<div style='background: #e83e8c; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🚪 Knock on Random Room</div>">> <<set _knockResult = setup.knockRandomDoor("BrothelPrivateChambers")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No answer. They must be working or resting.">> <<goto "BrothelPrivateChambers">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #e83e8c;"> <p style="color: #e83e8c; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🛏️ Visit Friend's Room</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66;"> <p style="color: #aaa; margin-bottom: 15px;">You're close enough with these workers to visit their private rooms.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🛏️ Visit _friend.name</div>">> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #e83e8c;">🛏️ Workers in Hallway</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e83e8c;"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #1a1a1a;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666;"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The hallway is quiet. Everyone must be in their rooms or working. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("TheAngler")>> <<run $visitedLocations.push("TheAngler")>> <</if>> <<set $lastLocation = "TheAngler">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #d4a574; text-align: center;">🍺 The Angler</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images\Locations\TheAngler.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #d4a574; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="The Angler Bar"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #3d2d1d 0%, #2a1a0a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #d4a574;"> <p style="color: white; font-size: 18px; margin: 0;"> A dimly lit dive bar with wooden walls covered in fishing memorabilia and flickering neon beer signs. The smell of stale beer and cigarette smoke hangs heavy in the air. Workers from the docks and construction sites crowd around the worn bar counter after their shifts, swapping stories and complaints. </p> </div> <h2 style="color: #d4a574;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Alleyway --> <div style="border: 3px solid #666; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #aaa; margin: 0 0 10px 0;">🌆 Alleyway</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the dark alley.</p> <<link "<div style='background: #666; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave the Bar</div>">> <<goto "Alleyway">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("TheAngler")>> <h2 style="color: #d4a574;">🍺 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #d4a574; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #d4a574; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #d4a574; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #d4a574; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The bar is quiet right now. Just the bartender polishing glasses and the soft hum of the jukebox. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("CommercialDistrict")>> <<run $visitedLocations.push("CommercialDistrict")>> <</if>> <<set $lastLocation = "CommercialDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #5ca4e8; text-align: center;">🏪 Commercial District</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images\Locations\CommercialDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #5ca4e8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Commercial District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a5a 0%, #0a2a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #5ca4e8;"> <p style="color: white; font-size: 18px; margin: 0;"> A bustling area of commerce and services. Modern office buildings, medical facilities, and various businesses line the clean, well-maintained streets. People in professional attire hurry between appointments while delivery trucks navigate the busy roads. </p> </div> <h2 style="color: #5ca4e8;">Locations</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Bus Stop --> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Bus Stop</div>">> <<run advanceTime(5)>> <<goto "BusStop">> <</link>> </div> <!-- Hospital --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">🏥 Hospital</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Sunfish City General Hospital and medical services.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Hospital</div>">> <<run advanceTime(5)>> <<goto "Hospital">> <</link>> </div> <!-- Mail Service --> <div style="border: 3px solid #d4a574; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #d4a574; margin: 0 0 10px 0;">📦 Mail Service</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Package handling and delivery services.</p> <<link "<div style='background: #d4a574; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Mail Service</div>">> <<run advanceTime(5)>> <<goto "MailService">> <</link>> </div> <!-- Modeling Studio --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">📸 Modeling Studio</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Fashion photography and content production.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Studio</div>">> <<run advanceTime(5)>> <<goto "ModelingStudio">> <</link>> </div> <!-- Grocery Store --> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">🛒 Grocery Store</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Fresh food and everyday supplies.</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<run advanceTime(5)>> <<goto "GroceryStore">> <</link>> </div> <!-- The Golden Seahorse --> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">✨ The Golden Seahorse</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Premium furniture and luxury home decor.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Store</div>">> <<run advanceTime(5)>> <<goto "GoldenSeahorseDecor">> <</link>> </div> </div> <h2 style="color: #5ca4e8;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Downtown --> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #667eea; margin: 0 0 10px 0;">🏙️ Downtown</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the city center.</p> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Downtown</div>">> <<goto "Downtown">> <</link>> </div> <!-- Business District --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">💼 Business District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Corporate towers and offices.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Business District</div>">> <<goto "BusinessDistrict">> <</link>> </div> <!-- Residential District --> <div style="border: 3px solid #a3d9a5; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #a3d9a5; margin: 0 0 10px 0;">🏠 Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Quiet neighborhoods and housing.</p> <<link "<div style='background: #a3d9a5; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Residential District</div>">> <<goto "ResidentialDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("CommercialDistrict")>> <h2 style="color: #5ca4e8;">🏪 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #5ca4e8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #5ca4e8; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #5ca4e8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #5ca4e8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The streets are busy but no one catches your eye right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("Hospital")>> <<run $visitedLocations.push("Hospital")>> <</if>> <<set $lastLocation = "Hospital">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #17a2b8; text-align: center;">🏥 Sunfish City General Hospital</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images\Locations\Hospital.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Hospital"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a4a 0%, #0a2a3a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #17a2b8;"> <p style="color: white; font-size: 18px; margin: 0;"> The main medical facility serving Sunfish City. The sterile white corridors bustle with doctors, nurses, and patients. The smell of antiseptic hangs in the air as medical staff hurry between departments. </p> </div> <h2 style="color: #17a2b8;">Departments</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- General Clinic --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🩺 General Clinic</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Walk-in care for everyday medical needs.</p> <<link "<div style='background: #20c997; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Clinic</div>">> <<goto "HospitalClinic">> <</link>> </div> </div> <h2 style="color: #17a2b8;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Commercial District --> <div style="border: 3px solid #5ca4e8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #5ca4e8; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the commercial area.</p> <<link "<div style='background: #5ca4e8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Hospital</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("Hospital")>> <h2 style="color: #17a2b8;">🏥 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #17a2b8; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The hospital lobby is quiet. Medical staff hurry past without stopping. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("HospitalClinic")>> <<run $visitedLocations.push("HospitalClinic")>> <</if>> <<set $lastLocation = "HospitalClinic">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #20c997; text-align: center;">🩺 General Clinic</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images\Locations\HospitalClinic.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #20c997; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Hospital Clinic"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1a3a3a 0%, #0a2a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #20c997;"> <p style="color: white; font-size: 18px; margin: 0;"> The walk-in clinic handles everyday medical needs. Plastic chairs line the waiting area while patients flip through outdated magazines. A reception desk staffed by friendly faces greets incoming patients. </p> </div> <h2 style="color: #20c997;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Hospital --> <div style="border: 3px solid #17a2b8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #17a2b8; margin: 0 0 10px 0;">🏥 Hospital</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the main hospital.</p> <<link "<div style='background: #17a2b8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Back to Hospital</div>">> <<goto "Hospital">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("HospitalClinic")>> <h2 style="color: #20c997;">🩺 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #20c997; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #20c997; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #20c997; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The waiting room is empty. A few chairs sit vacant under fluorescent lights. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("MailService")>> <<run $visitedLocations.push("MailService")>> <</if>> <<set $lastLocation = "MailService">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #d4a574; text-align: center;">📦 Sunfish City Mail Service</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images\Locations\MailService.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #d4a574; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Mail Service"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #3a2a1a 0%, #2a1a0a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #d4a574;"> <p style="color: white; font-size: 18px; margin: 0;"> The local mail and package center handles all deliveries coming in and out of Sunfish City. Couriers rush in and out with parcels while clerks sort through mountains of mail. The constant beeping of scanners fills the air. </p> </div> <h2 style="color: #d4a574;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Commercial District --> <div style="border: 3px solid #5ca4e8; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #5ca4e8; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the commercial area.</p> <<link "<div style='background: #5ca4e8; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Mail Service</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("MailService")>> <h2 style="color: #d4a574;">📦 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #d4a574; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #d4a574; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #d4a574; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #999; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #d4a574; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The mail room is busy but no one has time to chat right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ModelingStudio")>> <<run $visitedLocations.push("ModelingStudio")>> <</if>> <<set $lastLocation = "ModelingStudio">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">📸 Luxe Modeling Studio</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ModelingStudio.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #e83e8c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Modeling Studio"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #5a2d4d 0%, #3d1a3a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0;"> A sleek, modern building with tinted windows. The reception area is decorated with professional photographs and awards. Two distinct wings branch off from the main lobby - one for fashion modeling and one for adult content production. </p> </div> <h2 style="color: #e83e8c;">Departments</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Fashion Department --> <div style="border: 3px solid #9c27b0; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #9c27b0; margin: 0 0 10px 0;">🎨 Fashion Department</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Commercial modeling and brand promotions.</p> <<link "<div style='background: #9c27b0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Fashion Department</div>">> <<goto "ModelingStudioFashion">> <</link>> </div> <!-- Adult Department --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">🔞 Adult Department</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">18+ content production.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Enter Adult Department</div>">> <<goto "ModelingStudioAdult">> <</link>> </div> </div> <h2 style="color: #e83e8c;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Commercial District --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Exit the studio.</p> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Studio</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("ModelingStudio")>> <h2 style="color: #e83e8c;">📸 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e83e8c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #c77dac; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The lobby is quiet right now. No models or staff are around. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ModelingStudioFashion")>> <<run $visitedLocations.push("ModelingStudioFashion")>> <</if>> <<set $lastLocation = "ModelingStudioFashion">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #9c27b0; text-align: center;">🎨 Fashion Department</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ModelingStudioFashion.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Fashion Department"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #4a2d5a 0%, #3a1a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9c27b0;"> <p style="color: white; font-size: 18px; margin: 0;"> Bright studio lights illuminate professional sets. Racks of designer clothing line the walls while makeup artists and photographers prepare for shoots. The air smells of hairspray and expensive perfume. Models pose for commercial campaigns, magazine spreads, and brand promotions. </p> </div> <h2 style="color: #9c27b0;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Studio Lobby --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">📸 Studio Lobby</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to main area.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Return to Lobby</div>">> <<goto "ModelingStudio">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("ModelingStudioFashion")>> <h2 style="color: #9c27b0;">🎨 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9c27b0; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #9c27b0; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9c27b0; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #b388c9; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #9c27b0; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one is working in the fashion department right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ModelingStudioAdult")>> <<run $visitedLocations.push("ModelingStudioAdult")>> <</if>> <<set $lastLocation = "ModelingStudioAdult">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #e83e8c; text-align: center;">🔞 Adult Content Department</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ModelingStudioAdult.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #e83e8c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Adult Content Department"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #5a2d4d 0%, #3d1a3a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0;"> A more private wing of the studio with soundproofed rooms and discrete entrances. Professional equipment and plush sets are arranged for adult content production. Security ensures only authorized personnel enter. Performers work on various projects including solo content, collaborations, and professional productions. </p> </div> <h2 style="color: #e83e8c;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Studio Lobby --> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">📸 Studio Lobby</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to main area.</p> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Return to Lobby</div>">> <<goto "ModelingStudio">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("ModelingStudioAdult")>> <h2 style="color: #e83e8c;">🔞 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #e83e8c; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e83e8c; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #c77dac; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #e83e8c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one is working in the adult department right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <!-- Track location visit --> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("GroceryStore")>> <<run $visitedLocations.push("GroceryStore")>> <</if>> <<set $lastLocation = "GroceryStore">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #28a745; text-align: center;">🛒 Fresh Catch Grocery</h1> <!-- Location Image --> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/GroceryStore.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Grocery Store"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #1e4a2d 0%, #143d1f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #28a745;"> <p style="color: white; font-size: 18px; margin: 0;"> The main grocery store serving Sunfish City. Fluorescent lights illuminate aisles of fresh produce, packaged goods, and everyday essentials. Shopping carts rattle across the polished floors as customers browse the selections. Departments include fresh produce, bakery, deli, frozen foods, and household supplies. </p> </div> <h2 style="color: #28a745;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <!-- Commercial District --> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Exit the store.</p> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Leave Store</div>">> <<goto "CommercialDistrict">> <</link>> </div> </div> <!-- NPCs Section --> <<set _npcsHere = setup.getNPCsAtLocation("GroceryStore")>> <h2 style="color: #28a745;">🛒 People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #28a745; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #28a745; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #6fbf7f; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one else is shopping right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ResidentialDistrict")>> <<run $visitedLocations.push("ResidentialDistrict")>> <</if>> <<set $lastLocation = "ResidentialDistrict">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #6c757d; text-align: center;">🏘️ Residential District</h1> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ResidentialDistrict.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Residential District"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #3d4a3d 0%, #2a3a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #6c757d;"> <p style="color: white; font-size: 18px; margin: 0;"> Tree-lined streets wind through neighborhoods of varying affluence. From modest starter homes to gated mansions, this district houses many of Sunfish City's residents. Children play in yards while neighbors chat over fences. </p> </div> <h2 style="color: #6c757d;">🏠 Neighborhoods</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🏠 Normal Homes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Middle-class neighborhood with modest, well-maintained homes.</p> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Normal Homes</div>">> <<run advanceTime(5)>> <<goto "ResidentialNormalHomes">> <</link>> </div> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🏡 Expensive Homes</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Upper-class area with luxury homes and manicured lawns.</p> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Expensive Homes</div>">> <<run advanceTime(5)>> <<goto "ResidentialExpensiveHomes">> <</link>> </div> <div style="border: 3px solid #fd7e14; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #fd7e14; margin: 0 0 10px 0;">🏰 Mansions</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Gated elite community with sprawling estates.</p> <<link "<div style='background: #fd7e14; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Visit Mansions</div>">> <<run advanceTime(5)>> <<goto "ResidentialMansions">> <</link>> </div> <<if $ownsHouse>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🏠 Your Home</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Go directly to your home.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go Home</div>">> <<goto setup.getCurrentHome()>> <</link>> </div> <</if>> </div> <h2 style="color: #6c757d;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">🚌 Bus Stop</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Public transit hub.</p> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to the Bus Stop</div>">> <<bustravel>> <<goto "BusStop">> <</link>> </div> <div style="border: 3px solid #20c997; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #20c997; margin: 0 0 10px 0;">🏪 Commercial District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Shopping and services center.</p> <<link "<div style='background: #20c997; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Travel to Commercial District</div>">> <<travel>> <<goto "CommercialDistrict">> <</link>> </div> <div style="border: 3px solid #28a745; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #28a745; margin: 0 0 10px 0;">🌳 Seabass Park</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Peaceful green space nearby.</p> <<link "<div style='background: #28a745; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Go to Seabass Park</div>">> <<travel>> <<goto "SeabassPark">> <</link>> </div> </div> <<set _npcsHere = setup.getNPCsAtLocation("ResidentialDistrict")>> <h2 style="color: #6c757d;">🏘️ People Here</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The streets are quiet at the moment. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ResidentialNormalHomes")>> <<run $visitedLocations.push("ResidentialNormalHomes")>> <</if>> <<set $lastLocation = "ResidentialNormalHomes">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #6c757d; text-align: center;">🏠 Normal Homes</h1> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ResidentialNormalHomes.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Normal Homes"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #3d4a3d 0%, #2a3a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #6c757d;"> <p style="color: white; font-size: 18px; margin: 0;"> Rows of modest but well-maintained homes line the quiet streets. Families go about their daily lives in this middle-class neighborhood. Mailboxes and small gardens front each property. Working families and young professionals call this area home. </p> </div> <h2 style="color: #6c757d;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🏘️ Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the main residential area.</p> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Back to Residential District</div>">> <<run advanceTime(5)>> <<goto "ResidentialDistrict">> <</link>> </div> </div> <!-- Homes For Sale Section (only if player doesn't own a house) --> <<if !$ownsHouse>> <h2 style="color: #51cf66;">🏡 Homes For Sale</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #51cf66; margin: 0 0 15px 0; font-size: 20px;">🏡 3 Bed, 2 Bath Suburban Family Home</h3> <p style="color: #ffc107; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">$250,000</p> <ul style="color: #ccc; margin: 0 0 20px 20px; line-height: 1.8;"> <li>Spacious master bedroom with king-size bed</li> <li>Two additional bedrooms</li> <li>Full kitchen with modern appliances</li> <li>Luxurious master bathroom</li> <li>Two-car garage</li> <li>Tropical backyard with patio</li> </ul> <p style="color: #51cf66; font-weight: bold; margin-bottom: 15px;">No monthly rent - own it forever!</p> <<if $money >= 250000>> <<link "<div style='background: #51cf66; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Buy This Home ($250,000)</div>">> <<set $pendingHomePurchase = {price: 250000, location: "ResidentialNormalHomes", destination: "PlayerSuburbanHome", returnTo: "ResidentialNormalHomes"}>> <<goto "ConfirmHomePurchase">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 12px 25px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 16px;'>Insufficient Funds (Need $250,000)</div> <p style="color: #888; font-size: 14px; margin-top: 10px; text-align: center;">You have: <<print setup.formatMoney($money)>></p> <</if>> </div> </div> <</if>> <<set _npcsHere = setup.getNPCsAtLocation("ResidentialNormalHomes")>> <<set _residents = setup.getNPCsLivingAt("ResidentialNormalHomes")>> <!-- Knock on Random Door Section --> <h2 style="color: #6c757d;">🚪 Knock on a Door</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You could try knocking on a random door to see if anyone answers. There's about a 25% chance someone will be home and answer.</p> <<link "<div style='background: #6c757d; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🚪 Knock on Random Door</div>">> <<run advanceTime(5)>> <<set _knockResult = setup.knockRandomDoor("ResidentialNormalHomes")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No one answers. The house appears empty or the occupant isn't interested in visitors.">> <<goto "ResidentialNormalHomes">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ffc107;"> <p style="color: #ffc107; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🏠 Visit Friend's Home</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You know these residents well enough to visit their homes directly.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🏠 Visit _friend.name</div>">> <<run advanceTime(5)>> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #6c757d;">🏠 Residents Outside</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #6c757d; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">These people are currently outside in the neighborhood.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one is outside in the neighborhood right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ResidentialExpensiveHomes")>> <<run $visitedLocations.push("ResidentialExpensiveHomes")>> <</if>> <<set $lastLocation = "ResidentialExpensiveHomes">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #ffc107; text-align: center;">🏡 Expensive Homes</h1> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ResidentialExpensiveHomes.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Expensive Homes"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #4a5a4a 0%, #3a4a3a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ffc107;"> <p style="color: white; font-size: 18px; margin: 0;"> Larger homes with manicured lawns and luxury vehicles in the driveways. This upscale neighborhood attracts successful professionals and established families. Private security patrols the streets. Upper-middle-class homes with pools, home theaters, and other luxury amenities. </p> </div> <h2 style="color: #ffc107;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🏘️ Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the main residential area.</p> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Back to Residential District</div>">> <<run advanceTime(5)>> <<goto "ResidentialDistrict">> <</link>> </div> </div> <!-- Homes For Sale Section (only if player doesn't own a house here) --> <<if !$ownsHouse || $houseLocation !== "ResidentialExpensiveHomes">> <h2 style="color: #ffc107;">🏡 Homes For Sale</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #ffc107; margin: 0 0 15px 0; font-size: 20px;">🏡 5 Bed, 4 Bath Luxury Home</h3> <p style="color: #ffc107; font-size: 24px; font-weight: bold; margin: 0 0 15px 0;">$2,250,000</p> <ul style="color: #ccc; margin: 0 0 20px 20px; line-height: 1.8;"> <li>Stunning master suite with California king bed</li> <li>Gourmet kitchen with professional appliances</li> <li>Private home theater</li> <li>Heated infinity pool & spa</li> <li>Fully equipped home gym</li> <li>Temperature-controlled wine cellar</li> <li>Two luxurious guest suites</li> <li>3-car garage with workshop</li> <li>Tropical backyard with outdoor kitchen</li> </ul> <p style="color: #ffc107; font-weight: bold; margin-bottom: 15px;">No monthly rent - own it forever!</p> <<if $money >= 2250000>> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Buy This Home ($2,250,000)</div>">> <<set $pendingHomePurchase = {price: 2250000, location: "ResidentialExpensiveHomes", destination: "PlayerExpensiveHome", returnTo: "ResidentialExpensiveHomes"}>> <<goto "ConfirmHomePurchase">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 12px 25px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 16px;'>Insufficient Funds (Need $2,250,000)</div> <p style="color: #888; font-size: 14px; margin-top: 10px; text-align: center;">You have: <<print setup.formatMoney($money)>></p> <</if>> </div> </div> <</if>> <<set _npcsHere = setup.getNPCsAtLocation("ResidentialExpensiveHomes")>> <<set _residents = setup.getNPCsLivingAt("ResidentialExpensiveHomes")>> <!-- Knock on Random Door Section --> <h2 style="color: #ffc107;">🚪 Knock on a Door</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You could try knocking on a door to see if anyone answers. There's about a 25% chance someone will be home and answer.</p> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🚪 Knock on Random Door</div>">> <<run advanceTime(5)>> <<set _knockResult = setup.knockRandomDoor("ResidentialExpensiveHomes")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "No one answers. The house appears empty or the occupant isn't interested in visitors.">> <<goto "ResidentialExpensiveHomes">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ffc107;"> <p style="color: #ffc107; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🏡 Visit Friend's Home</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You know these residents well enough to visit their homes directly.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🏡 Visit _friend.name</div>">> <<run advanceTime(5)>> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #ffc107;">🏡 Residents Outside</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ffc107; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">These people are currently outside in the neighborhood.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #ffc107; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffc107; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #ffe066; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #ffc107; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> No one is outside in the upscale neighborhood right now. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<if !$visitedLocations>><<set $visitedLocations = []>><</if>> <<if !$visitedLocations.includes("ResidentialMansions")>> <<run $visitedLocations.push("ResidentialMansions")>> <</if>> <<set $lastLocation = "ResidentialMansions">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #fd7e14; text-align: center;">🏰 Mansion Row</h1> <<if $imageSettings.imagesEnabled && $imageSettings.locationImagesEnabled>> <div style="text-align: center; margin: 20px 0;"> <img src="Images/Locations/ResidentialMansions.webp" style="max-width: 100%; width: 800px; border-radius: 15px; border: 3px solid #fd7e14; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Mansion Row"> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, #5a6a5a 0%, #4a5a4a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #fd7e14;"> <p style="color: white; font-size: 18px; margin: 0;"> Behind wrought-iron gates and high hedges sit the grandest homes in Sunfish City. This exclusive community is home to the city's wealthiest residents. Armed security guards patrol the perimeter while groundskeepers maintain the immaculate estates. Sprawling estates with private pools, tennis courts, and staff quarters. </p> </div> <h2 style="color: #fd7e14;">Travel</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #6c757d; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); display: flex; flex-direction: column;"> <h3 style="color: #6c757d; margin: 0 0 10px 0;">🏘️ Residential District</h3> <p style="font-size: 14px; color: #aaa; margin: 0 0 auto 0; line-height: 1.4; flex-grow: 1;">Return to the main residential area.</p> <<link "<div style='background: #6c757d; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>Back to Residential District</div>">> <<run advanceTime(5)>> <<goto "ResidentialDistrict">> <</link>> </div> </div> <!-- Mansion For Sale Section (only if player doesn't own this mansion) --> <<if !$ownsHouse || $houseLocation !== "ResidentialMansions">> <h2 style="color: #fd7e14;">🏰 Mansions For Sale</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; margin-bottom: 25px;"> <div style="border: 3px solid #fd7e14; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #fd7e14; margin: 0 0 10px 0;">🏰 Modern Mansion Estate</h3> <p style="font-size: 22px; color: #27ae60; font-weight: bold; margin: 0 0 10px 0;">$23,943,041.93</p> <p style="font-size: 14px; color: #ccc; margin: 0 0 10px 0; line-height: 1.4;"> <strong>8 Bed, 6 Bath | 15,000+ sq ft</strong><br> Master suite with panoramic views, great room with 30-foot ceilings, chef's kitchen, executive office, formal dining, two-story library. </p> <p style="font-size: 13px; color: #aaa; margin: 0 0 15px 0; line-height: 1.4;"> <em>Features: Private theater, indoor pool, gym with sauna, wine cellar, game room, 4 guest suites, staff quarters, 6-car garage, 3-acre grounds with helipad</em> </p> <<if $money >= 23943041.93>> <<link "<div style='background: #fd7e14; color: white; padding: 12px 25px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>Buy This Mansion ($23,943,041.93)</div>">> <<set $pendingHomePurchase = {price: 23943041.93, location: "ResidentialMansions", destination: "PlayerModernMansion", returnTo: "ResidentialMansions"}>> <<goto "ConfirmHomePurchase">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 12px 25px; border-radius: 6px; text-align: center; font-weight: bold; font-size: 16px;'>Insufficient Funds (Need $23,943,041.93)</div> <p style="color: #888; font-size: 14px; margin-top: 10px; text-align: center;">You have: <<print setup.formatMoney($money)>></p> <</if>> </div> </div> <</if>> <<set _npcsHere = setup.getNPCsAtLocation("ResidentialMansions")>> <<set _residents = setup.getNPCsLivingAt("ResidentialMansions")>> <!-- Knock on Random Gate Section --> <h2 style="color: #fd7e14;">🚪 Ring a Gate Bell</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #fd7e14; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You could try ringing a gate bell to see if anyone will let you in. There's about a 25% chance someone will answer.</p> <<link "<div style='background: #fd7e14; color: white; padding: 12px 20px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; display: inline-block;'>🔔 Ring Random Gate Bell</div>">> <<run advanceTime(5)>> <<set _knockResult = setup.knockRandomDoor("ResidentialMansions")>> <<if _knockResult.success>> <<set $tradingWithNPC = _knockResult.npc>> <<set $knockedOnDoor = true>> <<goto "NPCInteraction">> <<else>> <<set $doorKnockMessage = "A voice crackles through the intercom: 'No solicitors.' The connection cuts off.">> <<goto "ResidentialMansions">> <</if>> <</link>> </div> <<if $doorKnockMessage>> <div style="background: #3a3a3a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #fd7e14;"> <p style="color: #fd7e14; margin: 0;">$doorKnockMessage</p> </div> <<set $doorKnockMessage = null>> <</if>> <!-- Visit Specific NPC Home (Relationship Level 3+) --> <<set _friendsHere = []>> <<for _res range _residents>> <<if setup.canVisitNPCHome(_res.name)>> <<run _friendsHere.push(_res)>> <</if>> <</for>> <<if _friendsHere.length > 0>> <h2 style="color: #51cf66;">🏰 Visit Friend's Estate</h2> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">You're on the guest list for these estates.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px;"> <<for _friend range _friendsHere>> <<capture _friend>> <<link "<div style='background: #51cf66; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>🏰 Visit _friend.name</div>">> <<run advanceTime(5)>> <<set $tradingWithNPC = _friend>> <<set $visitingHome = true>> <<goto "NPCInteraction">> <</link>> <</capture>> <</for>> </div> </div> <</if>> <h2 style="color: #fd7e14;">🏰 Elite Residents Outside</h2> <<if _npcsHere && _npcsHere.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #fd7e14; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="color: #aaa; margin-bottom: 15px;">These residents are currently visible on the estate grounds.</p> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 15px;"> <<for _npc range _npcsHere>> <<capture _npc>> <div style="border: 3px solid #fd7e14; border-radius: 10px; padding: 15px; background: #1a1a1a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #fd7e14; margin: 0 0 10px 0;">_npc.name</h3> <p style="font-size: 14px; color: #ffb366; margin: 0 0 10px 0;"><<print _npc.jobs.join(", ")>></p> <<if setup.getRelationshipLevel && setup.getRelationshipLevel(_npc.name) !== "Stranger">> <p style="color: #aaa; font-size: 14px; margin: 5px 0;"><strong style="color: #51cf66;">Relationship:</strong> <<print setup.getRelationshipLevel(_npc.name)>></p> <</if>> <<link "<div style='background: #fd7e14; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; margin-top: 10px;'>💬 Talk to _npc.name</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> <</capture>> <</for>> </div> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #666; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <p style="text-align: center; color: #aaa; margin: 0; font-style: italic;"> The elite residents are not visible from the street. </p> </div> <</if>> </div> <</nobr>>
<<nobr>> <<set _npc = $lifeSwapNPC>> <<set _lifeSwapProtectedNPCs = ["Xanithar Galdenentri", "Revna McKraken", "Roisin Sullivan", "Luna Snow", "Fen Ris"]>> <<set _npcNameForCheck = _npc ? (_npc.originalName || _npc.name) : "">> <<if !_npc>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <p style="color: #ff6b6b;">Error: No NPC selected for life swap.</p> [[Go Back|$lastLocation]] </div> <<elseif _lifeSwapProtectedNPCs.includes(_npcNameForCheck) && !$debugLifeSwapBypass>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: #2a2a2a; padding: 25px; border-radius: 12px; border: 3px solid #ff6b6b; text-align: center;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">Life Swap Unavailable</h2> <p style="color: #ccc; font-size: 16px;">Life swap is not available for <<print _npc.name>>.</p> <p style="color: #888; font-size: 14px;">This NPC is protected from life swapping.</p> </div> <div style="text-align: center; margin-top: 25px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px;'>← Go Back</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #ff0080 0%, #7928ca 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #ff0080;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Life Swap</h1> <p style="color: white; margin: 0; font-size: 16px; text-align: center;"> Swap your entire existence with <<print _npc.name>> </p> </div> <!-- Warning/Info --> <<if $lifeSwapIsOriginalBody>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #51cf66; margin: 0 0 15px 0; font-size: 24px; text-align: center;">RETURN TO ORIGINAL BODY</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> This is your original body. You can swap back without any cost. </p> </div> <<else>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #ff6b6b; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0; font-size: 24px; text-align: center;">WARNING</h2> <p style="color: #ccc; font-size: 16px; text-align: center; margin: 0;"> This will completely swap your life with <<print _npc.name>>. You will become them and they will become you. </p> <p style="color: #ffa500; font-size: 14px; text-align: center; margin-top: 10px;"> Your Sunfish trait will be consumed to perform this swap. </p> </div> <</if>> <!-- What Will Be Swapped --> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #9b59b6; margin: 0 0 15px 0; font-size: 22px; border-bottom: 2px solid #9b59b6; padding-bottom: 10px;">What Will Be Swapped:</h3> <ul style="color: #ccc; font-size: 16px; line-height: 2;"> <li><strong style="color: #51cf66;">Name:</strong> Your name and their name</li> <li><strong style="color: #51cf66;">Stats:</strong> Strength, Intelligence, Charisma, Dexterity</li> <li><strong style="color: #51cf66;">Appearance:</strong> Hair, Skin, Age, Physique</li> <li><strong style="color: #51cf66;">Body Parts:</strong> Gender, Chest, Butt, Genitals</li> <li><strong style="color: #51cf66;">Physical Traits:</strong> ALL physical traits</li> <li><strong style="color: #51cf66;">Mental Traits:</strong> ALL mental traits</li> <li><strong style="color: #51cf66;">Skills:</strong> ALL skills</li> <li><strong style="color: #51cf66;">Jobs:</strong> Your job and their job</li> <li><strong style="color: #51cf66;">Relationships:</strong> ALL relationship levels with ALL NPCs</li> <li><strong style="color: #51cf66;">Portrait:</strong> NPC image path swap</li> </ul> </div> <!-- Buttons --> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 25px;"> <<link "<div style='background: linear-gradient(135deg, #e040fb 0%, #7c4dff 100%); color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Confirm Life Swap</div>">> <<set $lifeSwapOldPlayerName = $firstName + " " + $lastName>> <<set $lifeSwapOldPlayerTraits = { physical: $physicalTraits ? $physicalTraits.slice() : [], mental: $mentalTraits ? $mentalTraits.slice() : [], skills: $skills ? $skills.slice() : [], appearance: JSON.parse(JSON.stringify($appearance)), bodyParts: JSON.parse(JSON.stringify($bodyParts)), stats: JSON.parse(JSON.stringify($stats)) }>> <<set $lifeSwapNPCOldName = _npc.name>> <<set $lifeSwapNPCOldTraits = { physical: _npc.physicalTraits ? _npc.physicalTraits.slice() : [], mental: _npc.mentalTraits ? _npc.mentalTraits.slice() : [], skills: _npc.skills ? _npc.skills.slice() : [], appearance: JSON.parse(JSON.stringify(_npc.appearance)), bodyParts: JSON.parse(JSON.stringify(_npc.bodyParts)), stats: JSON.parse(JSON.stringify(_npc.stats)) }>> <!-- Track original body for free swap back (only set on first swap) --> <<if !$lifeSwapOriginalBodyNPC>> <<set $lifeSwapOriginalBodyNPC = _npc.originalName || _npc.name>> <<elseif $lifeSwapIsOriginalBody>> <!-- Swapping back to original - clear the tracking --> <<set $lifeSwapOriginalBodyNPC = null>> <</if>> <!-- Remove Sunfish trait if not swapping back to original body (unless bypass is enabled) --> <<if !$lifeSwapIsOriginalBody && !$debugLifeSwapBypass>> <<if $skills && $skills.includes("Sunfish")>> <<set $skills = $skills.filter(function(s) { return s !== "Sunfish"; })>> <</if>> <<if $physicalTraits && $physicalTraits.includes("Sunfish")>> <<set $physicalTraits = $physicalTraits.filter(function(t) { return t !== "Sunfish"; })>> <</if>> <<if $mentalTraits && $mentalTraits.includes("Sunfish")>> <<set $mentalTraits = $mentalTraits.filter(function(t) { return t !== "Sunfish"; })>> <</if>> <</if>> <<run setup.performLifeSwap(_npc)>> <!-- Ensure Soul trait stays with player after swap --> <<if !$skills>><<set $skills = []>><</if>> <<if !$skills.includes("Soul")>> <<run $skills.push("Soul")>> <</if>> <!-- Remove Soul from NPC (it transfers with player) --> <<if _npc.skills && _npc.skills.includes("Soul")>> <<set _npc.skills = _npc.skills.filter(function(s) { return s !== "Soul"; })>> <</if>> <<goto "LifeSwapTransformation">> <</link>> <<link "<div style='background: #666; color: white; padding: 18px; border-radius: 12px; text-align: center; cursor: pointer; font-weight: bold; font-size: 18px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);'>Cancel</div>">> <<set $tradingWithNPC = _npc>> <<goto "NPCInteraction">> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _oldPlayerName = $lifeSwapOldPlayerName>> <<set _oldPlayerTraits = $lifeSwapOldPlayerTraits>> <<set _oldNPCName = $lifeSwapNPCOldName>> <<set _oldNPCTraits = $lifeSwapNPCOldTraits>> <<set _newPlayerName = $firstName + " " + $lastName>> <div style="background: #0a0a0a; min-height: 100vh; padding: 20px;"> <!-- Header --> <div style="background: linear-gradient(135deg, #ff0080 0%, #7928ca 50%, #0080ff 100%); padding: 30px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 0 30px rgba(255,0,128,0.5); border: 2px solid #ff0080; text-align: center;"> <h1 style="color: white; margin: 0; font-size: 36px; text-shadow: 0 0 20px rgba(255,255,255,0.5);">Life Swap Complete</h1> <p style="color: rgba(255,255,255,0.9); margin: 10px 0 0 0; font-size: 18px;">Your existence has been exchanged with <<print _oldNPCName>></p> </div> <!-- Your Transformation Section --> <div style="background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #ff0080; box-shadow: 0 0 20px rgba(255,0,128,0.3);"> <h2 style="color: #ff0080; margin: 0 0 20px 0; font-size: 28px; border-bottom: 2px solid #ff0080; padding-bottom: 10px;">Your Transformation</h2> <!-- Mental/Memory Changes --> <div style="background: rgba(0,0,0,0.4); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #9b59b6;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">Mental Shift</h3> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> A wave of dizziness washes over you as reality begins to blur. Your memories start to feel... distant, like watching someone else's life through frosted glass. The name "<<print _oldPlayerName>>" echoes in your mind, but it feels foreign now, like a half-forgotten dream. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> New memories flood in, vivid and intimate. You remember <<print _oldNPCName>>'s life as if you'd lived it yourself... </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0; font-style: italic;"> <<if $mentalTraits && $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Flirty")>> You remember being the life of every party, batting your eyelashes at anyone cute while your friends giggled beside you. Boys, girls - it didn't matter. You'd twirl your hair, lean in close, and watch them melt. School was just a place to show off new outfits and collect phone numbers. Why bother with books when you could get anyone to do your homework with a pout and a promise? <<elseif $mentalTraits && $mentalTraits.includes("Bimbo") && $mentalTraits.includes("Submissive")>> You remember the blissful simplicity of letting others think for you. Why worry about complicated stuff when someone smarter could just tell you what to do? You'd nod along happily, eager to please, finding joy in being useful even if you didn't quite understand why. Being pretty and obedient was so much easier than being smart. <<elseif $mentalTraits && $mentalTraits.includes("Bimbo")>> You remember hours in front of mirrors, perfecting your makeup, practicing your pout. Complex thoughts would drift away like clouds, replaced by simple pleasures - shopping, gossip, looking hot. Friends would talk about careers and futures while you wondered what color to paint your nails next. Life was just... easier when you didn't think too hard. <<elseif $mentalTraits && $mentalTraits.includes("Dominant") && $mentalTraits.includes("Cruel")>> You remember the intoxicating rush of power, of watching others squirm beneath your gaze. You didn't just want control - you wanted them to suffer for the privilege of serving you. Tears, begging, broken spirits... these were your trophies. The weak existed to be dominated, and you were born to rule over them with an iron fist. <<elseif $mentalTraits && $mentalTraits.includes("Dominant") && $mentalTraits.includes("Confident")>> You remember walking into rooms and feeling everyone's attention snap to you like magnets. People naturally deferred to you, sought your approval, waited for your commands. Leadership wasn't something you learned - it was simply who you were. Others followed because they recognized greatness when they saw it. <<elseif $mentalTraits && $mentalTraits.includes("Dominant")>> You remember the satisfaction of being in charge, of having others look to you for direction. Your word was law in your social circles. People didn't argue with you - they obeyed. And those who didn't? They learned quickly. Power wasn't given to you; you took it, and you held it with an iron grip. <<elseif $mentalTraits && $mentalTraits.includes("Submissive") && $mentalTraits.includes("Perverted")>> You remember the sweet surrender of giving yourself completely to another's desires. The thrill of being used, of existing solely for someone else's pleasure. Boundaries were suggestions, and "no" was a word that rarely crossed your lips. Being wanted, being taken, being owned - these were your deepest cravings. <<elseif $mentalTraits && $mentalTraits.includes("Submissive") && $mentalTraits.includes("Shy")>> You remember always fading into the background, grateful when someone else made decisions for you. Speaking up felt impossible - what if people judged you? It was safer to follow, to agree, to let stronger personalities take the lead. Being invisible was comfortable. Being commanded was a relief. <<elseif $mentalTraits && $mentalTraits.includes("Submissive")>> You remember the peace that came with surrender. Following orders felt natural, safe. When someone took charge, you could finally relax, finally stop pretending to be something you weren't. Being useful to others gave your life meaning. Obedience wasn't weakness - it was freedom. <<elseif $mentalTraits && $mentalTraits.includes("Delinquent") && $mentalTraits.includes("Brave")>> You remember being the one who'd take any dare, start any fight, tell any authority figure exactly where they could shove their rules. Fear was for other people. You'd stare down cops, teachers, gang members - anyone who thought they could intimidate you. Scars were just souvenirs from a life lived without limits. <<elseif $mentalTraits && $mentalTraits.includes("Delinquent") && $mentalTraits.includes("Perverted")>> You remember dark alleys and darker appetites. Rules were for suckers, and that applied to bedroom rules too. You took what you wanted, when you wanted, from whoever was willing - or foolish enough to catch your eye. Detention was just another place to scout for new conquests. <<elseif $mentalTraits && $mentalTraits.includes("Delinquent")>> You remember the rush of breaking every rule they tried to put on you. Skipping class to smoke behind the bleachers, tagging walls, petty theft for the thrill of it. Authority figures were just obstacles to mock. You'd been expelled twice, arrested once, and you wore each incident like a badge of honor. <<elseif $mentalTraits && $mentalTraits.includes("Nerd") && $mentalTraits.includes("Shy")>> You remember hiding in the library during lunch, burying yourself in books to avoid the terrifying social jungle of the cafeteria. Perfect grades were your only pride, your only proof of worth. You'd stammer and blush if anyone actually talked to you, then replay the conversation a thousand times, cringing at every awkward word. <<elseif $mentalTraits && $mentalTraits.includes("Nerd") && $mentalTraits.includes("Arrogant")>> You remember the exhausting burden of being smarter than everyone around you. Teachers were idiots who couldn't keep up. Classmates were mouth-breathing simpletons. You'd correct people constantly, roll your eyes at wrong answers, and wonder why no one wanted to be your friend. Their loss - they couldn't handle your brilliance anyway. <<elseif $mentalTraits && $mentalTraits.includes("Nerd")>> You remember late nights studying, the glow of computer screens, the satisfaction of understanding things others couldn't grasp. Social events were awkward ordeals, but academic achievements? Those were your domain. Top of every class, winner of every science fair, the one teachers actually respected. <<elseif $mentalTraits && $mentalTraits.includes("Jock") && $mentalTraits.includes("Confident")>> You remember being the star everyone wanted to be or be with. Championships, cheering crowds, your name chanted by hundreds. Your body was a finely tuned machine, and you showed it off at every opportunity. College scouts, sponsorship offers, the world at your feet. You were destined for greatness, and everyone knew it. <<elseif $mentalTraits && $mentalTraits.includes("Jock") && $mentalTraits.includes("Arrogant")>> You remember looking down at the losers who couldn't throw, couldn't run, couldn't compete. What was the point of people who couldn't win? You'd shove nerds into lockers, mock the unathletic, and bask in the worship of those who recognized athletic superiority. Second place was just first loser. <<elseif $mentalTraits && $mentalTraits.includes("Jock")>> You remember the burn of pushing your body to its limits, the roar of crowds when you scored, the camaraderie of teammates who'd bleed for each other. Early morning practices, protein shakes, the sweet exhaustion of giving everything you had. Sports weren't just games - they were life. <<elseif $mentalTraits && $mentalTraits.includes("Goth") && $mentalTraits.includes("Creative")>> You remember filling journals with dark poetry and morbid sketches, finding beauty in decay and meaning in melancholy. While others chased popularity, you explored the shadows - art that disturbed, music that ached, fashion that screamed "I'm not like you." Being misunderstood was the point. <<elseif $mentalTraits && $mentalTraits.includes("Goth") && $mentalTraits.includes("Perverted")>> You remember nights in underground clubs, leather and lace, pleasures that "normal" people would never understand. Pain and pleasure blurred together beautifully. Your lovers were as dark as your wardrobe, drawn to your dangerous aesthetic, eager to explore forbidden territories with you. <<elseif $mentalTraits && $mentalTraits.includes("Goth")>> You remember embracing the darkness while others chased the light. Black clothes, heavy eyeliner, music that matched your melancholy soul. Cemetery walks at midnight, candles in your room, feeling like the only one who understood that beauty lived in shadows. Mainstream society could keep their shallow happiness. <<elseif $mentalTraits && $mentalTraits.includes("Prep") && $mentalTraits.includes("Ambitious")>> You remember networking at country clubs since you were twelve, learning early that it's not what you know but who you know. Perfect grades, perfect clothes, perfect connections. Everything was a stepping stone to success. You'd smile at people you despised because they might be useful someday. <<elseif $mentalTraits && $mentalTraits.includes("Prep") && $mentalTraits.includes("Flirty")>> You remember being the popular one everyone wanted to date. Designer clothes, perfect hair, effortless charm. You'd flirt with everyone worth knowing, collecting admirers like accessories. Social climbing was a game, and romance was just another tool in your arsenal. <<elseif $mentalTraits && $mentalTraits.includes("Prep")>> You remember country club tennis lessons, charity galas, summer homes. Everything had to be perfect - grades, clothes, reputation. You learned to smile even when you wanted to scream, to play the game of social status like your life depended on it. Because in your world, it did. <<elseif $mentalTraits && $mentalTraits.includes("Diva") && $mentalTraits.includes("Dominant")>> You remember demanding absolute perfection from everyone around you - and getting it. Minions scrambled to meet your exacting standards while you critiqued their failures mercilessly. You weren't bossy; you were a leader. You didn't have tantrums; you had high standards. And anyone who couldn't handle that could get out of your spotlight. <<elseif $mentalTraits && $mentalTraits.includes("Diva")>> You remember always being the center of attention - exactly where you belonged. Meltdowns when things weren't perfect, dramatic exits, speeches about how no one understood your genius. The world revolved around you, and anyone who forgot that would be reminded. Loudly. <<elseif $mentalTraits && $mentalTraits.includes("Tomboy") && $mentalTraits.includes("Brave")>> You remember being tougher than any of the boys, taking hits and giving them back twice as hard. Dresses were prisons; dirt was freedom. You'd climb the highest trees, fight the biggest bullies, and refuse to cry no matter what. "Ladylike" was an insult you wore as a badge of honor. <<elseif $mentalTraits && $mentalTraits.includes("Tomboy")>> You remember scraped knees and grass stains, preferring sports to dolls, hanging with the boys because girls were too dramatic. You'd arm wrestle, belch contests, video game marathons. People tried to put you in pink; you responded with mud and defiance. <<elseif $mentalTraits && $mentalTraits.includes("Femboy") && $mentalTraits.includes("Confident")>> You remember owning your unique style with pride, strutting in skirts while others could only stare. Let them look. Let them judge. You were beautiful and you knew it. The bravest thing wasn't fighting - it was being yourself when the world wanted you to conform. <<elseif $mentalTraits && $mentalTraits.includes("Femboy") && $mentalTraits.includes("Shy")>> You remember the secret thrill of trying on clothes society said weren't for you, the terror and excitement of finally going out in them. Every stare felt like a judgment, but you couldn't stop. This was who you were, even if the world wasn't ready to see it. <<elseif $mentalTraits && $mentalTraits.includes("Femboy")>> You remember discovering that gender was a spectrum, not a prison. Skirts felt right. Makeup was art. The confusion on people's faces when they couldn't categorize you was its own reward. You weren't trying to be something you weren't - you were finally being exactly what you were. <<elseif $mentalTraits && $mentalTraits.includes("Geek") && $mentalTraits.includes("Perverted")>> You remember the overlap between fandom and fantasy, convention hookups with fellow enthusiasts, fanfiction that got increasingly explicit. Your interests went deep - really deep. The vanilla world would never understand the particular pleasures of a truly devoted geek. <<elseif $mentalTraits && $mentalTraits.includes("Geek")>> You remember marathon sessions of your favorite games, heated debates about canon vs fanon, the joy of finding someone who loved the same obscure things you did. Collections displayed proudly, conventions circled on calendars, a rich inner world more vivid than mundane reality. <<elseif $mentalTraits && $mentalTraits.includes("Perverted") && $mentalTraits.includes("Confident")>> You remember owning your desires without shame. While others hid their fantasies, you pursued them openly. Lovers knew exactly what they were getting into - and lined up anyway. Your reputation preceded you, and you made sure it was well-earned. <<elseif $mentalTraits && $mentalTraits.includes("Perverted")>> You remember the constant thrum of desire coloring every interaction. Innocent conversations became charged with subtext. Your browser history would make a sailor blush. Finding others who shared your particular appetites, exploring depths that vanilla people couldn't imagine. <<elseif $mentalTraits && $mentalTraits.includes("Confident") && $mentalTraits.includes("Flirty")>> You remember commanding every room you walked into, using charm like a weapon. Flirting wasn't desperate - it was sport. You'd leave a trail of flustered admirers wondering what just happened, already moving on to your next conquest with a knowing smile. <<elseif $mentalTraits && $mentalTraits.includes("Confident")>> You remember the ease of knowing your own worth. Job interviews, first dates, high-pressure moments - you thrived on them all. Self-doubt was for other people. You walked through life like you owned it, because in many ways, you did. <<elseif $mentalTraits && $mentalTraits.includes("Shy") && $mentalTraits.includes("Kind")>> You remember watching from the sidelines, too nervous to join in but always noticing who needed help. Quiet acts of kindness, anonymous generosity, being there for people even when you couldn't find words to say. Your gentle heart ached for others, even as social anxiety kept you distant. <<elseif $mentalTraits && $mentalTraits.includes("Shy")>> You remember the safety of corners at parties, the relief when plans got cancelled, the exhaustion of pretending to be okay around people. Your inner world was rich and deep, but sharing it felt impossible. Being alone wasn't lonely - it was sanctuary. <<elseif $mentalTraits && $mentalTraits.includes("Flirty")>> You remember the thrill of the chase, the art of the tease. Every interaction was an opportunity to make someone's heart race. You'd leave breadcrumbs of interest, watch them follow, then decide if they were worth catching. The game never got old. <<elseif $mentalTraits && $mentalTraits.includes("Intelligent") && $mentalTraits.includes("Ambitious")>> You remember always being ten steps ahead, seeing angles others missed. School was too easy; you were already planning your empire. Knowledge was power, and you hoarded both. Scholarships, opportunities, connections - you collected them like weapons for future battles. <<elseif $mentalTraits && $mentalTraits.includes("Intelligent")>> You remember the isolation of being smarter than your peers, teachers who couldn't challenge you, conversations that bored you. Your mind craved stimulation that rarely came. Books were better company than most people. At least they didn't ask you to explain things twice. <<elseif $mentalTraits && $mentalTraits.includes("Creative")>> You remember seeing possibilities everywhere others saw nothing. Ideas came faster than you could capture them - notebooks filled with half-finished brilliance. The mundane world was just raw material for your imagination. Creating wasn't a hobby; it was as necessary as breathing. <<elseif $mentalTraits && $mentalTraits.includes("Ambitious")>> You remember the hunger that never faded, the drive that pushed you past everyone else. Second place was failure. Good enough never was. You'd sacrifice sleep, relationships, peace of mind - whatever it took to climb higher. The top was the only acceptable destination. <<elseif $mentalTraits && $mentalTraits.includes("Lucky")>> You remember a lifetime of improbable wins and narrow escapes. Finding money on the ground, meeting the right person at the right time, disasters that somehow missed you. People called it luck; you just called it Tuesday. The universe seemed to bend in your favor. <<elseif $mentalTraits && $mentalTraits.includes("Brave")>> You remember standing up when everyone else sat down, speaking out when others stayed silent. Fear existed, but it never stopped you. Bullies backed down from your stare. Challenges were just opportunities to prove yourself. Courage wasn't the absence of fear - it was telling fear to shut up. <<elseif $mentalTraits && $mentalTraits.includes("Kind")>> You remember the faces of everyone you helped, the warmth of genuine gratitude. Stray animals, lonely kids, overwhelmed strangers - you couldn't pass by someone in need. Your heart was too big for a world this harsh, but you kept it open anyway. <<elseif $mentalTraits && $mentalTraits.includes("Lazy")>> You remember the art of doing absolutely nothing, elevated to a lifestyle. Why work hard when you could work barely? Deadlines were suggestions, ambition was exhausting, and naps were sacred. You'd perfected the minimum effort required to coast through life. <<elseif $mentalTraits && $mentalTraits.includes("Arrogant")>> You remember being right about everything - or at least knowing you were. Other people's opinions were just noise. You'd correct, condescend, and dismiss without a second thought. If they couldn't handle your superiority, that was their problem. <<elseif $mentalTraits && $mentalTraits.includes("Cruel")>> You remember the satisfaction of making others hurt. Words chosen for maximum damage, actions designed to wound. Empathy was weakness. Kindness was manipulation. The world was full of victims, and you were happy to help them remember their place. <<else>> You remember ordinary days that somehow felt like someone else's life. Morning routines, familiar places, faces of people you must have known. The memories are there, settling into place, becoming yours whether you want them or not. <</if>> </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> These memories settle into your mind like they've always been there, pushing aside your old self. You feel your personality shifting, molding itself to fit this new identity. </p> <!-- Trait-based personality changes --> <<if $mentalTraits && $mentalTraits.length > 0>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0;"> <<if $mentalTraits.includes("Confident")>> A surge of confidence fills you. Where you once hesitated, you now feel bold and self-assured. You know you're desirable, and you're not afraid to show it. <</if>> <<if $mentalTraits.includes("Submissive")>> A warm, yielding sensation spreads through your mind. You find yourself wanting to please others, to follow rather than lead. The thought of being commanded sends a pleasant shiver down your spine. <</if>> <<if $mentalTraits.includes("Dominant")>> Power courses through your thoughts. You feel an overwhelming urge to take control, to command attention, to bend others to your will. Leadership feels natural now. <</if>> <<if $mentalTraits.includes("Bimbo")>> Your thoughts become simpler, lighter. Complex worries fade away, replaced by a bubbly, carefree attitude. You find yourself giggling at things you wouldn't have before. Looking hot and having fun is all that matters now. <</if>> <<if $mentalTraits.includes("Perverted")>> Your mind fills with lewd thoughts. Every interaction now has a sensual undertone, and you find yourself imagining erotic scenarios constantly. Your libido has gone into overdrive. <</if>> <<if $mentalTraits.includes("Shy")>> You feel yourself becoming more reserved, more hesitant. The thought of being the center of attention makes you want to hide. You'll need to work up courage for things that once came easily. <</if>> <<if $mentalTraits.includes("Flirty")>> A playful energy fills you. You want to tease, to flirt, to make others blush. Every conversation feels like an opportunity for seduction. <</if>> </p> <</if>> </div> <!-- Physical Changes --> <div style="background: rgba(0,0,0,0.4); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">Physical Transformation</h3> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Your body begins to tingle all over as the transformation takes hold. You gasp as you feel your form shifting, reshaping itself into something new. </p> <!-- Gender change --> <<if _oldPlayerTraits.bodyParts.gender !== $bodyParts.gender>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if $bodyParts.gender === "female">> The most intense sensation hits between your legs. You moan as you feel your manhood receding, reshaping, your body becoming smooth and feminine. New nerve endings awaken as your sex transforms completely. You feel yourself becoming wet with arousal at the strange new sensations. Your hips widen with a satisfying crack, your waist narrows, and you feel unmistakably, wonderfully female. <<else>> An intense pressure builds between your legs. You groan as new flesh forms, growing and hardening. Your feminine curves begin to flatten and reshape themselves. Your shoulders broaden, your jaw becomes more defined. The transformation leaves you breathing heavily, unmistakably male. <</if>> </p> <</if>> <!-- Chest changes --> <<if _oldPlayerTraits.bodyParts.chest !== $bodyParts.chest>> <<set _chestSize = $bodyParts.chest.toLowerCase().replace(/ /g, "")>> <<if $imageSettings && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _chestImageHTML = '<div style="text-align: center; margin: 20px 0;"><img src="Images/PostSwap/Chest_' + _chestSize + '.webp" style="max-width: 60%; border-radius: 10px; border: 2px solid #FF69B4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Chest Transformation"></div>'>> <<print _chestImageHTML>> <</if>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if _chestSize === "huge" || _chestSize === "giant" || _chestSize === "gigantic">> Your chest begins to swell dramatically. You watch in amazement as flesh fills out, growing heavier and heavier. Your new breasts push outward, straining against any clothing, each movement sending waves of pleasure through your sensitive new tissue. They're massive, impossible to ignore, and achingly sensitive to every touch. <<elseif _chestSize === "large">> Your chest swells pleasantly, filling out into generous, heavy breasts. They bounce with each breath, sensitive nipples hardening at the cool air. You cup them experimentally, gasping at how good it feels. <<elseif _chestSize === "medium">> Your chest reshapes into a pleasant handful, proportioned and perky. The new weight feels natural, enticing. Your nipples are incredibly sensitive now. <<elseif _chestSize === "small">> Your chest becomes petite but perfectly formed, small mounds with sensitive peaks that react to every sensation. <<elseif _chestSize === "flat" || _chestSize === "flatmasculine">> Your chest flattens, any curves receding until you're left with a smooth, toned surface. The sensitivity fades to a more masculine baseline. <</if>> </p> <</if>> <!-- Butt changes --> <<if _oldPlayerTraits.bodyParts.butt !== $bodyParts.butt>> <<set _buttSize = $bodyParts.butt.toLowerCase().replace(/ /g, "")>> <<if $imageSettings && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _buttImageHTML = '<div style="text-align: center; margin: 20px 0;"><img src="Images/PostSwap/Butt_' + _buttSize + '.webp" style="max-width: 60%; border-radius: 10px; border: 2px solid #FF69B4; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Butt Transformation"></div>'>> <<print _buttImageHTML>> <</if>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if _buttSize === "huge" || _buttSize === "giant" || _buttSize === "gigantic">> Your rear begins to expand dramatically, flesh filling out into a massive, attention-commanding ass. Each cheek grows heavy and round, jiggling with every movement. You can feel the weight of it, the way it demands attention. <<elseif _buttSize === "large" || _buttSize === "big">> Your backside swells into a generous, curvy rear that fills out any clothing perfectly. It's the kind of ass that turns heads and invites stares. <<elseif _buttSize === "medium">> Your rear reshapes into a nicely proportioned bottom, curved and attractive without being excessive. <<elseif _buttSize === "small" || _buttSize === "flat" || _buttSize === "flatmasculine">> Your backside becomes smaller and tighter, compact and athletic. <</if>> </p> <</if>> <!-- Genital changes --> <<if _oldPlayerTraits.bodyParts.genitals !== $bodyParts.genitals>> <<set _newGenitals = $bodyParts.genitals.toLowerCase()>> <<set _oldGenitals = _oldPlayerTraits.bodyParts.genitals.toLowerCase()>> <<set _genitalDescriptor = "Average">> <<if _newGenitals.includes("big")>><<set _genitalDescriptor = "Big">> <<elseif _newGenitals.includes("small")>><<set _genitalDescriptor = "Small">> <<elseif _newGenitals.includes("tight")>><<set _genitalDescriptor = "Tight">> <<elseif _newGenitals.includes("loose")>><<set _genitalDescriptor = "Loose">> <</if>> <<set _genitalType = _newGenitals.includes("penis") ? "penis" : "vagina">> <<if $imageSettings && $imageSettings.imagesEnabled && $imageSettings.eroticImagesEnabled>> <<set _genitalImageHTML = '<div style="text-align: center; margin: 20px 0;"><img src="Images/PostSwap/' + _genitalDescriptor + '_' + _genitalType + '.webp" style="max-width: 60%; border-radius: 10px; border: 2px solid #9370DB; box-shadow: 0 4px 8px rgba(0,0,0,0.4);" alt="Genital Transformation"></div>'>> <<print _genitalImageHTML>> <</if>> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<if _oldGenitals.includes("penis") && !_newGenitals.includes("penis")>> An overwhelming wave of sensation crashes over you as the profound transformation begins. Your cock tingles intensely before it starts shrinking, pulling inward, inverting. You feel your testicles ascending, transforming. Flesh splits and reforms - soft, sensitive folds emerge where your manhood once was. When it's done, you have a complete, wet pussy. You tentatively explore the soft folds, slipping a finger inside and gasping at the new sensations. Your new vagina throbs with sensitivity. <<elseif !_oldGenitals.includes("penis") && _newGenitals.includes("penis")>> An overwhelming surge of sensation crashes through your core. Your vaginal walls begin closing, sealing as flesh pushes outward. Your clitoris extends, growing rapidly, thickening and lengthening into a full shaft. A cock grows from where your pussy was, extending outward, getting harder. Your ovaries descend and transform into testicles. When it's done, you stare down at your new cock jutting proudly. You wrap your hand around the shaft, feeling the heat, the hardness. Your new penis throbs insistently, already leaking. <<elseif _newGenitals.includes("penis")>> Your cock tingles and shifts, the shaft adjusting itself to its new size. <<if _genitalDescriptor === "Big">>You gasp as your penis swells, thickening and lengthening dramatically. Veins become prominently visible as your cock grows heavier, more substantial.<<elseif _genitalDescriptor === "Small">>You feel your penis contracting, shrinking to more modest proportions. The shaft slims down, becoming more petite.<<else>>Your penis settles into comfortable, average proportions.<</if>> <<else>> Your pussy tingles as it transforms to its new state. <<if _genitalDescriptor === "Tight">>You gasp as your internal muscles contract powerfully, the walls of your vagina squeezing inward, becoming incredibly tight and gripping.<<elseif _genitalDescriptor === "Loose">>Your vaginal walls relax and open, becoming more spacious and accommodating inside.<<else>>Your vagina settles into average tightness - moderate and responsive.<</if>> <</if>> </p> <</if>> <!-- Hair and appearance --> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0;"> Your hair shifts and changes, becoming <<print $appearance.hairLength>> and <<print $appearance.hairColor.toLowerCase()>>. Your skin takes on a <<print $appearance.skinTone>> tone, smooth and flawless. When the tingling finally fades, you're left breathing heavily, inhabiting a body that is entirely new yet somehow feels perfectly natural. </p> </div> <!-- Skills --> <<if $skills && $skills.length > 0>> <div style="background: rgba(0,0,0,0.4); padding: 20px; border-radius: 10px; border-left: 4px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">New Abilities</h3> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0;"> Knowledge you never had floods into your mind. You suddenly know how to do things that would have seemed impossible before. Your new skills feel natural, like muscle memory you've always had: <span style="color: #51cf66; font-weight: bold;"><<print $skills.join(", ")>></span>. </p> </div> <</if>> </div> <!-- Their Transformation Section --> <div style="background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 3px solid #0080ff; box-shadow: 0 0 20px rgba(0,128,255,0.3);"> <h2 style="color: #0080ff; margin: 0 0 20px 0; font-size: 28px; border-bottom: 2px solid #0080ff; padding-bottom: 10px;"><<print _oldNPCName>>'s Transformation</h2> <div style="background: rgba(0,0,0,0.4); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #4dabf7;"> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> You watch in fascination as <<print _oldNPCName>> begins to change before your eyes. Their expression goes slack for a moment, eyes unfocusing as their memories shift and rearrange themselves. When they blink back to awareness, there's something different in their gaze - they're looking at you with your old eyes, your old personality peering out from behind their changing features. </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> Their body begins to shift and reshape. <<if _oldNPCTraits.bodyParts.gender !== _oldPlayerTraits.bodyParts.gender>> <<if _oldPlayerTraits.bodyParts.gender === "female">> You watch their masculine features soften, hips widening, chest swelling as they become unmistakably female. They gasp and moan at the sensations, hands exploring their new curves. <<else>> Their feminine curves begin to flatten and harden, shoulders broadening as masculinity takes hold. They grunt as new anatomy forms between their legs. <</if>> <</if>> </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0 0 15px 0;"> <<set _theirNewChest = _oldPlayerTraits.bodyParts.chest.toLowerCase()>> <<if _theirNewChest === "huge" || _theirNewChest === "giant" || _theirNewChest === "gigantic">> Their chest swells dramatically, massive breasts forming that strain against their clothing. They cup the heavy flesh in disbelief, gasping at the sensitivity. <<elseif _theirNewChest === "large">> Their chest fills out into generous, bouncing breasts that they can't help but stare down at in amazement. <<elseif _theirNewChest === "flat" || _theirNewChest === "flat masculine">> Their chest flattens, any curves disappearing into a smooth, masculine plane. <</if>> </p> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0;"> Their hair shifts to <<print _oldPlayerTraits.appearance.hairLength>> <<print _oldPlayerTraits.appearance.hairColor.toLowerCase()>>, skin becoming <<print _oldPlayerTraits.appearance.skinTone>>. When the transformation completes, they look exactly like you used to - they ARE you now, or at least, they have your old body and your old life. They blink at you with confused recognition, adjusting to their new existence as <<print _oldPlayerName>>. </p> </div> <!-- Their mental changes --> <<if _oldPlayerTraits.mental && _oldPlayerTraits.mental.length > 0>> <div style="background: rgba(0,0,0,0.4); padding: 20px; border-radius: 10px; border-left: 4px solid #9b59b6;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">Their New Personality</h3> <p style="color: #e0e0e0; font-size: 16px; line-height: 1.8; margin: 0;"> You can see the personality shift happening behind their eyes. They're inheriting your old traits: <span style="color: #9b59b6; font-weight: bold;"><<print _oldPlayerTraits.mental.join(", ")>></span>. <<if _oldPlayerTraits.mental.includes("Confident")>> They stand a little straighter, a new self-assurance in their posture. <</if>> <<if _oldPlayerTraits.mental.includes("Submissive")>> Their eyes become softer, more deferential, waiting for direction. <</if>> <<if _oldPlayerTraits.mental.includes("Bimbo")>> A vapid smile spreads across their face as complex thoughts drain away, replaced by simple, bubbly happiness. <</if>> They're becoming the person you used to be. </p> </div> <</if>> </div> <!-- Continue Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #ff0080 0%, #7928ca 100%); color: white; padding: 18px 50px; border-radius: 12px; font-weight: bold; font-size: 20px; box-shadow: 0 0 20px rgba(255,0,128,0.5); cursor: pointer;'>Begin Your New Life</div>">> <!-- Check for Mayor job achievement after life swap --> <<if $jobs && $jobs.includes("City Mayor")>> <<run setup.achievements.unlock("become_mayor")>> <</if>> <<goto $preNPCLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _pole = setup.fishing.getCurrentPole()>> <<set _poleTier = $fishingPole || 0>> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invFull = setup.fishing.isInventoryFull()>> <<set _themeColor = "#3498db">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #3498db; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "Beach">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _themeColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _themeColor>>44; margin-bottom: 20px;"> <h2 style="color: <<print _themeColor>>; margin: 0 0 10px 0; text-align: center;">🏖️ Beach Fishing</h2> <p style="color: #aaa; margin: 0; font-size: 14px; text-align: center;">The gentle waves lap at the shore. Perfect for catching coastal fish.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 15px;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;">Lv <<print _level>></div> <div style="color: #888; font-size: 11px;">Skill</div> <div style="background: #333; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #3498db, #2ecc71); height: 100%; width: <<print _xpProgress.percent>>%;"></div> </div> </div> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> <div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #888; font-size: 11px;">Collection</div> </div> </div> </div> </div> <!-- Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="color: <<if _poleTier === 4>>#e040fb<<elseif _poleTier === 3>>#ffd700<<elseif _poleTier === 2>>#3498db<<elseif _poleTier === 1>>#aaa<<else>>#e74c3c<</if>>; font-size: 16px; font-weight: bold;">🎣 <<if _hasRod>><<print _pole.name>><<else>>No Rod<</if>></div> <<if _hasRod>> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 11px;">Max: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity.toUpperCase()>></span></div> <<if _poleTier === 4>><div style="color: #51cf66; font-size: 10px; margin-top: 3px;">No Trash • Treasure Bonus</div><</if>> <<else>> <div style="color: #e74c3c; font-size: 11px;">Buy at dealership</div> <</if>> </div> </div> <!-- Cast Line Button --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #2ecc7144; margin-bottom: 20px; text-align: center;"> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #ff6b6b;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #ff6b6b; font-size: 20px; font-weight: bold;">Too Exhausted to Fish</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">You need to sleep before you can fish</div> </div> <<elseif !_hasRod>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">No Fishing Rod!</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Buy one at the dealership</div> </div> <<elseif _invFull>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🐟</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Inventory Full</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Sell fish at the dealership</div> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; cursor: pointer; border: 3px solid #27ae60; box-shadow: 0 4px 15px rgba(39, 174, 96, 0.5);'><div style='font-size: 40px; margin-bottom: 8px;'>🎣</div><div style='color: white; font-size: 20px; font-weight: bold;'>Cast Line</div></div>">> <<set $fishingLocation = "beach">> <<goto "FishingQTE">> <</link>> <</if>> </div> <!-- Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #555; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px;'>📖 Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #3498db; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "Beach">><</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _pole = setup.fishing.getCurrentPole()>> <<set _poleTier = $fishingPole || 0>> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invFull = setup.fishing.isInventoryFull()>> <<set _themeColor = "#1a5276">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #1a5276; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #1a527644; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "Docks">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _themeColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _themeColor>>44; margin-bottom: 20px;"> <h2 style="color: <<print _themeColor>>; margin: 0 0 10px 0; text-align: center;">🚢 Dock Fishing</h2> <p style="color: #aaa; margin: 0; font-size: 14px; text-align: center;">Deep water fishing. Home to bigger, more valuable catches.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 15px;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;">Lv <<print _level>></div> <div style="color: #888; font-size: 11px;">Skill</div> <div style="background: #333; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #3498db, #2ecc71); height: 100%; width: <<print _xpProgress.percent>>%;"></div> </div> </div> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> <div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #888; font-size: 11px;">Collection</div> </div> </div> </div> </div> <!-- Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="color: <<if _poleTier === 4>>#e040fb<<elseif _poleTier === 3>>#ffd700<<elseif _poleTier === 2>>#3498db<<elseif _poleTier === 1>>#aaa<<else>>#e74c3c<</if>>; font-size: 16px; font-weight: bold;">🎣 <<if _hasRod>><<print _pole.name>><<else>>No Rod<</if>></div> <<if _hasRod>> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 11px;">Max: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity.toUpperCase()>></span></div> <<if _poleTier === 4>><div style="color: #51cf66; font-size: 10px; margin-top: 3px;">No Trash • Treasure Bonus</div><</if>> <<else>> <div style="color: #e74c3c; font-size: 11px;">Buy at dealership</div> <</if>> </div> </div> <!-- Cast Line Button --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #2ecc7144; margin-bottom: 20px; text-align: center;"> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #ff6b6b;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #ff6b6b; font-size: 20px; font-weight: bold;">Too Exhausted to Fish</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">You need to sleep before you can fish</div> </div> <<elseif !_hasRod>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">No Fishing Rod!</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Buy one at the dealership</div> </div> <<elseif _invFull>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🐟</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Inventory Full</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Sell fish at the dealership</div> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; cursor: pointer; border: 3px solid #27ae60; box-shadow: 0 4px 15px rgba(39, 174, 96, 0.5);'><div style='font-size: 40px; margin-bottom: 8px;'>🎣</div><div style='color: white; font-size: 20px; font-weight: bold;'>Cast Line</div></div>">> <<set $fishingLocation = "docks">> <<goto "FishingQTE">> <</link>> <</if>> </div> <!-- Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #555; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px;'>📖 Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #1a5276; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #1a527644; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "Docks">><</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _pole = setup.fishing.getCurrentPole()>> <<set _poleTier = $fishingPole || 0>> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invFull = setup.fishing.isInventoryFull()>> <<set _themeColor = "#2ecc71">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #2ecc71; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #2ecc7144; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "SeabassPark">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _themeColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _themeColor>>44; margin-bottom: 20px;"> <h2 style="color: <<print _themeColor>>; margin: 0 0 10px 0; text-align: center;">🌿 Hidden Pond</h2> <p style="color: #aaa; margin: 0; font-size: 14px; text-align: center;">A secret fishing spot. Legends say rare fish dwell here.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 15px;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;">Lv <<print _level>></div> <div style="color: #888; font-size: 11px;">Skill</div> <div style="background: #333; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #3498db, #2ecc71); height: 100%; width: <<print _xpProgress.percent>>%;"></div> </div> </div> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> <div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #888; font-size: 11px;">Collection</div> </div> </div> </div> </div> <!-- Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="color: <<if _poleTier === 4>>#e040fb<<elseif _poleTier === 3>>#ffd700<<elseif _poleTier === 2>>#3498db<<elseif _poleTier === 1>>#aaa<<else>>#e74c3c<</if>>; font-size: 16px; font-weight: bold;">🎣 <<if _hasRod>><<print _pole.name>><<else>>No Rod<</if>></div> <<if _hasRod>> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 11px;">Max: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity.toUpperCase()>></span></div> <<if _poleTier === 4>><div style="color: #51cf66; font-size: 10px; margin-top: 3px;">No Trash • Treasure Bonus</div><</if>> <<else>> <div style="color: #e74c3c; font-size: 11px;">Buy at dealership</div> <</if>> </div> </div> <!-- Cast Line Button --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #2ecc7144; margin-bottom: 20px; text-align: center;"> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #ff6b6b;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #ff6b6b; font-size: 20px; font-weight: bold;">Too Exhausted to Fish</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">You need to sleep before you can fish</div> </div> <<elseif !_hasRod>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">No Fishing Rod!</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Buy one at the dealership</div> </div> <<elseif _invFull>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🐟</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Inventory Full</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Sell fish at the dealership</div> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; cursor: pointer; border: 3px solid #27ae60; box-shadow: 0 4px 15px rgba(39, 174, 96, 0.5);'><div style='font-size: 40px; margin-bottom: 8px;'>🎣</div><div style='color: white; font-size: 20px; font-weight: bold;'>Cast Line</div></div>">> <<set $fishingLocation = "pond">> <<goto "FishingQTE">> <</link>> <</if>> </div> <!-- Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #555; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px;'>📖 Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #2ecc71; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #2ecc7144; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "SeabassPark">><</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _pole = setup.fishing.getCurrentPole()>> <<set _poleTier = $fishingPole || 0>> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invFull = setup.fishing.isInventoryFull()>> <<set _themeColor = "#00bcd4">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #00bcd4; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #00bcd444; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "CoralReef">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _themeColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _themeColor>>44; margin-bottom: 20px;"> <h2 style="color: <<print _themeColor>>; margin: 0 0 10px 0; text-align: center;">🐠 Coral Reef Fishing</h2> <p style="color: #aaa; margin: 0; font-size: 14px; text-align: center;">Crystal clear waters teeming with colorful tropical fish. A diver's paradise.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 15px;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;">Lv <<print _level>></div> <div style="color: #888; font-size: 11px;">Skill</div> <div style="background: #333; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #3498db, #2ecc71); height: 100%; width: <<print _xpProgress.percent>>%;"></div> </div> </div> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> <div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #888; font-size: 11px;">Collection</div> </div> </div> </div> </div> <!-- Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="color: <<if _poleTier === 4>>#e040fb<<elseif _poleTier === 3>>#ffd700<<elseif _poleTier === 2>>#3498db<<elseif _poleTier === 1>>#aaa<<else>>#e74c3c<</if>>; font-size: 16px; font-weight: bold;">🎣 <<if _hasRod>><<print _pole.name>><<else>>No Rod<</if>></div> <<if _hasRod>> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 11px;">Max: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity.toUpperCase()>></span></div> <<if _poleTier === 4>><div style="color: #51cf66; font-size: 10px; margin-top: 3px;">No Trash • Treasure Bonus</div><</if>> <<else>> <div style="color: #e74c3c; font-size: 11px;">Buy at dealership</div> <</if>> </div> </div> <!-- Cast Line Button --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #2ecc7144; margin-bottom: 20px; text-align: center;"> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #ff6b6b;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #ff6b6b; font-size: 20px; font-weight: bold;">Too Exhausted to Fish</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">You need to sleep before you can fish</div> </div> <<elseif !_hasRod>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">No Fishing Rod!</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Buy one at the dealership</div> </div> <<elseif _invFull>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🐟</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Inventory Full</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Sell fish at the dealership</div> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; cursor: pointer; border: 3px solid #27ae60; box-shadow: 0 4px 15px rgba(39, 174, 96, 0.5);'><div style='font-size: 40px; margin-bottom: 8px;'>🎣</div><div style='color: white; font-size: 20px; font-weight: bold;'>Cast Line</div></div>">> <<set $fishingLocation = "coralReef">> <<goto "FishingQTE">> <</link>> <</if>> </div> <!-- Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #555; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px;'>📖 Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #00bcd4; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #00bcd444; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "CoralReef">><</link>> </div> </div> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _pole = setup.fishing.getCurrentPole()>> <<set _poleTier = $fishingPole || 0>> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invFull = setup.fishing.isInventoryFull()>> <<set _themeColor = "#7c4dff">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #7c4dff; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #7c4dff44; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "UnderWaterCave">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _themeColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _themeColor>>44; margin-bottom: 20px;"> <h2 style="color: <<print _themeColor>>; margin: 0 0 10px 0; text-align: center;">🌊 Underwater Cave Fishing</h2> <p style="color: #aaa; margin: 0; font-size: 14px; text-align: center;">Bioluminescent waters hide mysterious deep-sea creatures. Rare fish lurk in the shadows.</p> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 15px;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;">Lv <<print _level>></div> <div style="color: #888; font-size: 11px;">Skill</div> <div style="background: #333; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #3498db, #2ecc71); height: 100%; width: <<print _xpProgress.percent>>%;"></div> </div> </div> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> <div> <div style="color: #9b59b6; font-size: 20px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #888; font-size: 11px;">Collection</div> </div> </div> </div> </div> <!-- Equipment Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 12px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="color: <<if _poleTier === 4>>#e040fb<<elseif _poleTier === 3>>#ffd700<<elseif _poleTier === 2>>#3498db<<elseif _poleTier === 1>>#aaa<<else>>#e74c3c<</if>>; font-size: 16px; font-weight: bold;">🎣 <<if _hasRod>><<print _pole.name>><<else>>No Rod<</if>></div> <<if _hasRod>> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 11px;">Max: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity.toUpperCase()>></span></div> <<if _poleTier === 4>><div style="color: #51cf66; font-size: 10px; margin-top: 3px;">No Trash • Treasure Bonus</div><</if>> <<else>> <div style="color: #e74c3c; font-size: 11px;">Buy at dealership</div> <</if>> </div> </div> <!-- Cast Line Button --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 25px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px #2ecc7144; margin-bottom: 20px; text-align: center;"> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #ff6b6b;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #ff6b6b; font-size: 20px; font-weight: bold;">Too Exhausted to Fish</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">You need to sleep before you can fish</div> </div> <<elseif !_hasRod>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🎣</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">No Fishing Rod!</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Buy one at the dealership</div> </div> <<elseif _invFull>> <div style="background: linear-gradient(135deg, #555 0%, #333 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; border: 3px solid #e74c3c;"> <div style="font-size: 40px; margin-bottom: 8px;">🐟</div> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Inventory Full</div> <div style="color: #888; font-size: 13px; margin-top: 5px;">Sell fish at the dealership</div> </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 25px 50px; border-radius: 12px; display: inline-block; cursor: pointer; border: 3px solid #27ae60; box-shadow: 0 4px 15px rgba(39, 174, 96, 0.5);'><div style='font-size: 40px; margin-bottom: 8px;'>🎣</div><div style='color: white; font-size: 20px; font-weight: bold;'>Cast Line</div></div>">> <<set $fishingLocation = "underwaterCave">> <<goto "FishingQTE">> <</link>> <</if>> </div> <!-- Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #555; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px;'>📖 Collection</div>">><<goto "FishEncyclopedia">><</link>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #7c4dff; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #7c4dff44; display: inline-block;'>← Leave Fishing</div>">><<set $fishingLocation = null>><<goto "UnderWaterCave">><</link>> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.attemptCatch($fishingLocation)>> <<if _result.fishId === "quill">> <!-- Special Quill catch screen --> <<if !$physicalTraits.includes("Quill")>> <<set $physicalTraits.push("Quill")>> <</if>> <<run setup.fishing.addXp(250)>> <div style="position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: #000; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 9999;"> <img src="Images/Other/Fish/spr_fish_172_xxx.webp" style="width: 100vw; height: 100vh; object-fit: contain; position: absolute; top: 0; left: 0; image-rendering: pixelated; opacity: 0.8;"> <div style="position: relative; z-index: 10000; text-align: center;"> <h1 style="color: #ff6b9d; font-size: 72px; text-shadow: 0 0 30px #ff6b9d, 0 0 60px #ff6b9d80, 0 0 90px #ff6b9d40; margin: 0; font-family: serif;">Quill</h1> </div> <div style="position: relative; z-index: 10000; margin-top: 40px;"> <<link "<div style='background: rgba(255,107,157,0.3); border: 2px solid #ff6b9d; padding: 15px 40px; border-radius: 10px; color: #ff6b9d; font-weight: bold; font-size: 18px;'>Continue</div>">> <<if $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> <<else>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #3498db;"> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity]>> <<set _catchMessage = setup.fishing.getCatchMessage(_fish.rarity)>> <<set _catchQuality = setup.fishing.getCatchQuality(_fish, _result.price, setup.fishing.getLevel())>> <<set _leveledUp = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <!-- Catch Message --> <div style="color: <<print _color>>; font-size: 18px; font-weight: bold; margin-bottom: 15px; text-shadow: 0 0 10px <<print _color>>40;"><<print _catchMessage>></div> <div style="margin-bottom: 20px;"> <<if _fish.icon>> <img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"> <<else>> <div style="font-size: 80px;">🐟</div> <</if>> </div> <<if _result.isNew>> <div style="background: linear-gradient(135deg, #f39c12 0%, #e74c3c 100%); padding: 10px 20px; border-radius: 20px; display: inline-block; margin-bottom: 15px;"> <span style="color: white; font-weight: bold;">✨ NEW CATCH! ✨</span> </div> <</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <p style="color: #aaa; font-style: italic; margin: 0 0 20px 0;"><<print _catchQuality.text>></p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #2ecc71; font-size: 24px; font-weight: bold;">+$<<print _result.price>></div> <div style="color: #888; font-size: 12px;">Sold</div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div> <div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _leveledUp>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <div style="color: white; font-size: 18px; font-weight: bold;">🎉 LEVEL UP! 🎉</div> <div style="color: rgba(255,255,255,0.8);">You are now Fishing Level <<print _leveledUp>>!</div> </div> <</if>> <div style="margin-top: 20px; display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>🎣 Cast Again</div>">> <<goto "FishingCast">> <</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>← Back</div>">> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> </div> <</if>> <</nobr>>
<<nobr>> <!-- Check if player can fish --> <<set _canFishCheck = setup.fishing.canFish()>> <<if !_canFishCheck.can>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #e74c3c;"> <<if _canFishCheck.reason === "inventory_full">> <div style="font-size: 60px; margin-bottom: 20px;">🐟📦</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">Inventory Full!</h2> <p style="color: #aaa;">You can't carry any more fish. Sell your catch at the dealership first!</p> <<else>> <div style="font-size: 60px; margin-bottom: 20px;">🎣❌</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">No Fishing Rod!</h2> <p style="color: #aaa;">You need a fishing rod to fish. Buy one at the dealership!</p> <</if>> <div style="margin-top: 20px;"> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white;'>Back</div>">> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> </div> <<else>> <!-- Fishing takes 30 minutes --> <<set $timeInMinutes += 30>> <<if $debugForceRarity>> <<set _preResult = setup.fishing.getRandomFishOfRarity($debugForceRarity)>> <<set $debugForceRarity = false>> <<else>> <<set _preResult = setup.fishing.attemptCatch($fishingLocation)>> <</if>> <<set $qtePendingFish = _preResult>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 600px; text-align: center; border: 3px solid #3498db;"> <div style="margin-bottom: 15px;"> <div style="font-size: 64px;">❓</div> </div> <h2 style="color: #3498db; margin: 0 0 5px 0;">Something's biting!</h2> <div style="color: #888; font-size: 12px; text-transform: uppercase; margin-bottom: 20px;">Reel it in!</div> <p style="color: #aaa; margin-bottom: 20px;">Click when the marker is in the green zone!</p> <div id="qte-container" style="position: relative; width: 100%; height: 60px; background: #1a1a1a; border-radius: 10px; margin-bottom: 30px; overflow: hidden; border: 2px solid #555;"> <div id="qte-zone" style="position: absolute; height: 100%; background: linear-gradient(90deg, #f1c40f 0%, #2ecc71 50%, #f1c40f 100%); opacity: 0.9;"> <!-- Center line indicator for 100% accuracy --> <div style="position: absolute; left: 50%; transform: translateX(-50%); width: 3px; height: 100%; background: white; box-shadow: 0 0 8px #fff, 0 0 15px #f1c40f;"></div> </div> <div id="qte-marker" style="position: absolute; width: 8px; height: 100%; background: white; box-shadow: 0 0 10px white;"></div> </div> <p style="color: #888; font-size: 12px; margin-top: -20px; margin-bottom: 20px;">Aim for the center line for 100% accuracy!</p> <div id="qte-instructions"> <<link "<div id='catch-btn' style='background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); padding: 20px 60px; border-radius: 15px; color: white; font-weight: bold; font-size: 24px; cursor: pointer;'>🎣 CATCH!</div>">> <<run window.handleQTECatch()>> <</link>> </div> <div style="margin-top: 20px;"> <<link "<div style='background: #555; padding: 12px 25px; border-radius: 10px; color: white;'>Cancel</div>">> <<script>>window.qteRunning = false;<</script>> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> </div> <<run setup.fishingQTE.startQTE()>> <</if>> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #3498db;"> <<if $qteSuccess && $qtePendingFish && $qtePendingFish.isTrash>> <<set _result = $qtePendingFish>> <<set _trash = _result.trash>> <<set _finalPrice = _result.price>> <<set _finalXp = _result.xp>> <<set $money = ($money || 0) + _finalPrice>> <<set _leveledUp = setup.fishing.addXp(_finalXp)>> <<if !$fishingStats>><<set $fishingStats = { totalCatches: 0, moneyEarned: 0 }>><</if>> <<set $fishingStats.totalCatches++>> <<set $fishingStats.moneyEarned += _finalPrice>> <div style="margin-bottom: 15px;"> <div style="font-size: 80px;">🗑️</div> </div> <h2 style="color: #888; margin: 0 0 10px 0; font-size: 28px;"><<print _trash.name>></h2> <div style="color: #666; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;">TRASH</div> <p style="color: #aaa; font-style: italic; margin: 0 0 20px 0;"><<print _trash.description>></p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #666; font-size: 24px; font-weight: bold;">Worthless</div> <div style="color: #666; font-size: 12px;">No Value</div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #666; font-size: 24px; font-weight: bold;">+1 XP</div> <div style="color: #666; font-size: 12px;">Experience</div> </div> </div> <p style="color: #e67e22; font-size: 12px;">Upgrade your fishing rod to catch less trash!</p> <<elseif $qteSuccess && $qtePendingFish && $qtePendingFish.isTreasure>> <<set _result = $qtePendingFish>> <<set _treasure = _result.treasure>> <<set _treasureRarity = _result.treasureRarity>> <<set _treasureColor = setup.fishing.treasureRarityColors[_treasureRarity] || "#aaaaaa">> <<set _finalXp = _result.xp>> <<set _treasureMoney = _result.price || 0>> <<set _leveledUp = setup.fishing.addXp(_finalXp)>> <<set $money = ($money || 0) + _treasureMoney>> <<if !$fishingStats>><<set $fishingStats = { totalCatches: 0, moneyEarned: 0 }>><</if>> <<set $fishingStats.moneyEarned += _treasureMoney>> <div style="margin-bottom: 15px;"> <<if _treasure.icon>> <img @src="_treasure.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"> <<else>> <div style="font-size: 80px;">📦</div> <</if>> </div> <div style="background: linear-gradient(135deg, <<print _treasureColor>> 0%, <<print _treasureColor>>88 100%); padding: 10px 20px; border-radius: 20px; display: inline-block; margin-bottom: 15px;"> <span style="color: white; font-weight: bold;">🎁 TREASURE! 🎁</span> </div> <h2 style="color: <<print _treasureColor>>; margin: 0 0 10px 0; font-size: 28px;"><<print _treasure.name>></h2> <div style="color: <<print _treasureColor>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _treasureRarity>> TREASURE</div> <p style="color: #aaa; font-style: italic; margin: 0 0 20px 0;"><<print _treasure.description>></p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #2ecc71; font-size: 24px; font-weight: bold;">$<<print _treasureMoney.toLocaleString()>></div> <div style="color: #888; font-size: 12px;">Value</div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: <<print _treasureColor>>; font-size: 24px; font-weight: bold;">+<<print _finalXp>> XP</div> <div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _leveledUp>> <div style="background: linear-gradient(135deg, #f1c40f 0%, #e67e22 100%); padding: 15px; border-radius: 10px; margin-bottom: 15px;"> <div style="color: white; font-size: 18px; font-weight: bold;">🎉 LEVEL UP!</div> <div style="color: white;">You are now Fishing Level <<print _leveledUp>>!</div> </div> <</if>> <p style="color: #f59e0b; font-size: 12px;">Lucky find! Better rods have higher treasure chances.</p> <<elseif $qteSuccess && $qtePendingFish && $qtePendingFish.fish && $qtePendingFish.fishId === "quill">> <!-- Special Quill catch screen --> <<if !$physicalTraits.includes("Quill")>> <<set $physicalTraits.push("Quill")>> <</if>> <<run setup.fishing.addXp(250)>> </div> </div> <div style="position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: #000; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 9999;"> <img src="Images/Other/Fish/spr_fish_172_xxx.webp" style="width: 100vw; height: 100vh; object-fit: contain; position: absolute; top: 0; left: 0; image-rendering: pixelated; opacity: 0.8;"> <div style="position: relative; z-index: 10000; text-align: center;"> <h1 style="color: #ff6b9d; font-size: 72px; text-shadow: 0 0 30px #ff6b9d, 0 0 60px #ff6b9d80, 0 0 90px #ff6b9d40; margin: 0; font-family: serif;">Quill</h1> </div> <div style="position: relative; z-index: 10000; margin-top: 40px;"> <<link "<div style='background: rgba(255,107,157,0.3); border: 2px solid #ff6b9d; padding: 15px 40px; border-radius: 10px; color: #ff6b9d; font-weight: bold; font-size: 18px;'>Continue</div>">> <<if $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> <<elseif $qteSuccess && $qtePendingFish && $qtePendingFish.fish>> <<set _result = $qtePendingFish>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchMessage = setup.fishing.getCatchMessage(_fish.rarity)>> <<set _bonusMultiplier = $qteAccuracyPercent >= 90 ? 1.05 : 1.0>> <<set _finalPrice = Math.floor(_result.price * _bonusMultiplier)>> <<set _finalXp = Math.floor(_result.xp * _bonusMultiplier)>> <<set _catchQuality = setup.fishing.getCatchQuality(_fish, _finalPrice, setup.fishing.getLevel())>> <<if $qteAccuracyPercent !== 100>> <<set _catchQuality.text = _catchQuality.quality === "perfect" ? "An excellent catch!" : _catchQuality.text>> <<set _catchQuality.quality = _catchQuality.quality === "perfect" ? "excellent" : _catchQuality.quality>> <</if>> <<set _finalBasePrice = Math.floor(_result.basePrice * _bonusMultiplier)>> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _finalPrice, _finalXp, _finalBasePrice)>> <!-- Accuracy Display --> <<set _accuracyColor = $qteAccuracyPercent >= 90 ? "#f1c40f" : $qteAccuracyPercent >= 70 ? "#2ecc71" : $qteAccuracyPercent >= 50 ? "#3498db" : "#e67e22">> <<if $qtePerfect>> <div style="background: linear-gradient(135deg, #f1c40f 0%, #e67e22 100%); padding: 10px 20px; border-radius: 20px; display: inline-block; margin-bottom: 10px;"> <span style="color: white; font-weight: bold;">⭐ PERFECT CATCH! ⭐</span> </div> <</if>> <div style="margin-bottom: 15px;"> <div style="color: <<print _accuracyColor>>; font-size: 32px; font-weight: bold;"><<print $qteAccuracyPercent || 0>>%</div> <div style="color: #888; font-size: 12px;">Accuracy</div> <div style="background: #1a1a1a; border-radius: 10px; height: 8px; width: 200px; margin: 8px auto; overflow: hidden;"> <div style="background: linear-gradient(90deg, #e74c3c 0%, #f39c12 50%, #2ecc71 80%, #f1c40f 100%); height: 100%; width: <<print $qteAccuracyPercent || 0>>%;"></div> </div> </div> <!-- Catch Message --> <div style="color: <<print _color>>; font-size: 18px; font-weight: bold; margin-bottom: 15px; text-shadow: 0 0 10px <<print _color>>40;"><<print _catchMessage>></div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"> <span style="color: white; font-weight: bold; font-size: 14px;">✨ NEW! ✨</span> </div> <</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <p style="color: #aaa; font-style: italic; margin: 0 0 20px 0;"><<print _catchQuality.text>></p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">📦 Stored</div> <div style="color: #888; font-size: 12px;">Added to Inventory</div> <div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _finalPrice>></div> <<else>> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">❌ Full</div> <div style="color: #888; font-size: 12px;">Inventory Full!</div> <div style="color: #e74c3c; font-size: 11px;">Fish was released</div> <</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _finalXp>> XP</div> <div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <!-- Inventory Status --> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invPercent = Math.floor((_invCount / _maxInv) * 100)>> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: <<if _invPercent >= 100>>#e74c3c<<elseif _invPercent >= 75>>#e67e22<<elseif _invPercent >= 50>>#f1c40f<<else>>#2ecc71<</if>>; font-size: 12px; font-weight: bold;">Fish Inventory: <<print _invCount>>/<<print _maxInv>></div> <<set _invGradient = _invPercent >= 100 ? 'linear-gradient(90deg, #e67e22 0%, #e74c3c 100%)' : _invPercent >= 75 ? 'linear-gradient(90deg, #f1c40f 0%, #e67e22 100%)' : _invPercent >= 50 ? 'linear-gradient(90deg, #2ecc71 0%, #f1c40f 100%)' : 'linear-gradient(90deg, #27ae60 0%, #2ecc71 100%)'>> <div style="background: #000; border-radius: 4px; height: 8px; margin-top: 5px; overflow: hidden;"> <div @style="'background: ' + _invGradient + '; height: 100%; width: ' + _invPercent + '%;'"></div> </div> </div> <<if _catchResult.leveledUp>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <div style="color: white; font-size: 18px; font-weight: bold;">🎉 LEVEL UP! 🎉</div> <div style="color: rgba(255,255,255,0.8);">You are now Fishing Level <<print _catchResult.leveledUp>>!</div> </div> <</if>> <<else>> <div style="font-size: 60px; margin-bottom: 20px;">❌</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">Missed!</h2> <p style="color: #aaa;">You clicked outside the green zone. Try again!</p> <</if>> <div style="margin-top: 20px; display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>⚡ Try Again</div>">> <<goto "FishingQTE">> <</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>← Back</div>">> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("common")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Common</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestCommon">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("uncommon")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Uncommon</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestUncommon">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("rare")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Rare</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestRare">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("epic")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Epic</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestEpic">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("legendary")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Legendary</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestLegendary">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _result = setup.fishing.getRandomFishOfRarity("mythical")>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _result.price, _result.xp, _result.basePrice)>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid <<print _color>>;"> <div style="color: #ffd700; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 10px;">Debug Test — Mythical</div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"><span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span></div><</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>><div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div><div style="color: #888; font-size: 12px;">Added to Inventory</div><div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _result.price>></div> <<else>><div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div><div style="color: #888; font-size: 12px;">Inventory Full</div><</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _result.xp>> XP</div><div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <<if _catchResult.leveledUp>><div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"><div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div><div style="color: rgba(255,255,255,0.8);">Fishing Level <<print _catchResult.leveledUp>>!</div></div><</if>> <div style="display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Roll Again</div>">><<goto "DebugFishTestMythical">><</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">><<goto "DebugFishing">><</link>> </div> </div> </div> <</nobr>>
<<nobr>> <!-- Debug-exclusive self-contained QTE test passage --> <<set _testRarity = $debugForceRarity || $debugTestRarity || "common">> <<set _testPole = $fishingPole || 1>> <<set $debugTestRarity = _testRarity>> <<set $debugTestPole = _testPole>> <<set _poleNames = {1: "Old Wooden Rod", 2: "Fiberglass Rod", 3: "Master Angler's Rod"}>> <<set _poleName = _poleNames[_testPole] || "Unknown Rod">> <<set _rarityColors = {common: "#aaaaaa", uncommon: "#51cf66", rare: "#339af0", epic: "#a855f7", legendary: "#ffd700", mythical: "#ff6b9d"}>> <<set _rc = _rarityColors[_testRarity] || "#aaaaaa">> <!-- Get the fish result --> <<set _preResult = setup.fishing.getRandomFishOfRarity(_testRarity)>> <<set $qtePendingFish = _preResult>> <<set $debugForceRarity = false>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 600px; text-align: center; border: 3px solid <<print _rc>>;"> <!-- Debug info banner --> <div style="background: #1a1a1a; border: 1px solid #555; border-radius: 8px; padding: 10px; margin-bottom: 20px; display: flex; justify-content: center; gap: 20px;"> <div><span style="color: #888; font-size: 11px;">RARITY:</span> <span style="color: <<print _rc>>; font-weight: bold; text-transform: uppercase; font-size: 13px;"><<print _testRarity>></span></div> <div><span style="color: #888; font-size: 11px;">ROD:</span> <span style="color: #e67e22; font-weight: bold; font-size: 13px;">T<<print _testPole>> <<print _poleName>></span></div> </div> <div style="margin-bottom: 15px;"> <div style="font-size: 64px;">❓</div> </div> <h2 style="color: <<print _rc>>; margin: 0 0 5px 0;">Something's biting!</h2> <div style="color: #888; font-size: 12px; text-transform: uppercase; margin-bottom: 20px;">Reel it in!</div> <p style="color: #aaa; margin-bottom: 20px;">Click when the marker is in the green zone!</p> <div id="qte-container" style="position: relative; width: 100%; height: 60px; background: #1a1a1a; border-radius: 10px; margin-bottom: 30px; overflow: hidden; border: 2px solid #555;"> <div id="qte-zone" style="position: absolute; height: 100%; background: linear-gradient(90deg, #f1c40f 0%, #2ecc71 50%, #f1c40f 100%); opacity: 0.9;"> <div style="position: absolute; left: 50%; transform: translateX(-50%); width: 3px; height: 100%; background: white; box-shadow: 0 0 8px #fff, 0 0 15px #f1c40f;"></div> </div> <div id="qte-marker" style="position: absolute; width: 8px; height: 100%; background: white; box-shadow: 0 0 10px white;"></div> </div> <p style="color: #888; font-size: 12px; margin-top: -20px; margin-bottom: 20px;">Aim for the center line for 100% accuracy!</p> <div id="qte-instructions"> <<link "<div id='catch-btn' style='background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); padding: 20px 60px; border-radius: 15px; color: white; font-weight: bold; font-size: 24px; cursor: pointer;'>🎣 CATCH!</div>">> <<run window.handleDebugQTECatch()>> <</link>> </div> <div style="margin-top: 20px;"> <<link "<div style='background: #555; padding: 12px 25px; border-radius: 10px; color: white;'>Cancel</div>">> <<script>>window.qteRunning = false;<</script>> <<goto "DebugFishing">> <</link>> </div> </div> </div> <<run setup.fishingQTE.startQTE()>> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #3498db;"> <<if $qteSuccess && $qtePendingFish && $qtePendingFish.fish>> <<set _result = $qtePendingFish>> <<set _fish = _result.fish>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<set _catchMessage = setup.fishing.getCatchMessage(_fish.rarity)>> <<set _bonusMultiplier = $qteAccuracyPercent >= 90 ? 1.05 : 1.0>> <<set _finalPrice = Math.floor(_result.price * _bonusMultiplier)>> <<set _finalXp = Math.floor(_result.xp * _bonusMultiplier)>> <<set _catchQuality = setup.fishing.getCatchQuality(_fish, _finalPrice, setup.fishing.getLevel())>> <<if $qteAccuracyPercent !== 100>> <<set _catchQuality.text = _catchQuality.quality === "perfect" ? "An excellent catch!" : _catchQuality.text>> <<set _catchQuality.quality = _catchQuality.quality === "perfect" ? "excellent" : _catchQuality.quality>> <</if>> <<set _finalBasePrice = Math.floor(_result.basePrice * _bonusMultiplier)>> <<set _catchResult = setup.fishing.recordCatch(_result.fishId, _finalPrice, _finalXp, _finalBasePrice)>> <!-- Accuracy Display --> <<set _accuracyColor = $qteAccuracyPercent >= 90 ? "#f1c40f" : $qteAccuracyPercent >= 70 ? "#2ecc71" : $qteAccuracyPercent >= 50 ? "#3498db" : "#e67e22">> <<if $qtePerfect>> <div style="background: linear-gradient(135deg, #f1c40f 0%, #e67e22 100%); padding: 10px 20px; border-radius: 20px; display: inline-block; margin-bottom: 10px;"> <span style="color: white; font-weight: bold;">PERFECT CATCH!</span> </div> <</if>> <div style="margin-bottom: 15px;"> <div style="color: <<print _accuracyColor>>; font-size: 32px; font-weight: bold;"><<print $qteAccuracyPercent || 0>>%</div> <div style="color: #888; font-size: 12px;">Accuracy</div> <div style="background: #1a1a1a; border-radius: 10px; height: 8px; width: 200px; margin: 8px auto; overflow: hidden;"> <div style="background: linear-gradient(90deg, #e74c3c 0%, #f39c12 50%, #2ecc71 80%, #f1c40f 100%); height: 100%; width: <<print $qteAccuracyPercent || 0>>%;"></div> </div> </div> <!-- Catch Message --> <div style="color: <<print _color>>; font-size: 18px; font-weight: bold; margin-bottom: 15px; text-shadow: 0 0 10px <<print _color>>40;"><<print _catchMessage>></div> <div style="margin-bottom: 15px;"> <<if _fish.icon>><img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"><<else>><div style="font-size: 60px;">🐟</div><</if>> </div> <<if _result.isNew>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 15px; border-radius: 15px; display: inline-block; margin-bottom: 10px;"> <span style="color: white; font-weight: bold; font-size: 14px;">NEW!</span> </div> <</if>> <h2 style="color: <<print _color>>; margin: 0 0 10px 0; font-size: 28px;"><<print _fish.name>></h2> <div style="color: <<print _color>>; font-size: 14px; text-transform: uppercase; margin-bottom: 15px;"><<print _fish.rarity>></div> <p style="color: #aaa; font-style: italic; margin: 0 0 20px 0;"><<print _catchQuality.text>></p> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px; margin-bottom: 20px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <<if _catchResult.addedToInventory>> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">Stored</div> <div style="color: #888; font-size: 12px;">Added to Inventory</div> <div style="color: #f39c12; font-size: 11px;">Worth ~$<<print _finalPrice>></div> <<else>> <div style="color: #e74c3c; font-size: 20px; font-weight: bold;">Full</div> <div style="color: #888; font-size: 12px;">Inventory Full!</div> <div style="color: #e74c3c; font-size: 11px;">Fish was released</div> <</if>> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px;"> <div style="color: #3498db; font-size: 24px; font-weight: bold;">+<<print _finalXp>> XP</div> <div style="color: #888; font-size: 12px;">Experience</div> </div> </div> <!-- Inventory Status --> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invPercent = Math.floor((_invCount / _maxInv) * 100)>> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px; margin-bottom: 15px;"> <div style="color: <<if _invPercent >= 100>>#e74c3c<<elseif _invPercent >= 75>>#e67e22<<elseif _invPercent >= 50>>#f1c40f<<else>>#2ecc71<</if>>; font-size: 12px; font-weight: bold;">Fish Inventory: <<print _invCount>>/<<print _maxInv>></div> <<set _invGradient = _invPercent >= 100 ? 'linear-gradient(90deg, #e67e22 0%, #e74c3c 100%)' : _invPercent >= 75 ? 'linear-gradient(90deg, #f1c40f 0%, #e67e22 100%)' : _invPercent >= 50 ? 'linear-gradient(90deg, #2ecc71 0%, #f1c40f 100%)' : 'linear-gradient(90deg, #27ae60 0%, #2ecc71 100%)'>> <div style="background: #000; border-radius: 4px; height: 8px; margin-top: 5px; overflow: hidden;"> <div @style="'background: ' + _invGradient + '; height: 100%; width: ' + _invPercent + '%;'"></div> </div> </div> <<if _catchResult.leveledUp>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 15px; border-radius: 10px; margin-bottom: 20px;"> <div style="color: white; font-size: 18px; font-weight: bold;">LEVEL UP!</div> <div style="color: rgba(255,255,255,0.8);">You are now Fishing Level <<print _catchResult.leveledUp>>!</div> </div> <</if>> <<else>> <div style="font-size: 60px; margin-bottom: 20px;">❌</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">Missed!</h2> <p style="color: #aaa;">You clicked outside the green zone. Try again!</p> <</if>> <div style="margin-top: 20px; display: flex; gap: 15px; justify-content: center; flex-wrap: wrap;"> <<link "<div style='background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Try Again (Same)</div>">> <<goto "DebugFishingQTE">> <</link>> <<link "<div style='background: #555; padding: 15px 30px; border-radius: 10px; color: white; font-weight: bold;'>Back to Debug</div>">> <<goto "DebugFishing">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _fishingStats = $fishingStats || {totalCatches: 0, moneyEarned: 0}>> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16213e 100%); min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<if $fishingLocation>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; display: inline-block;'>← Back to Fishing</div>">> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> <</if>> </div> <div style="background: linear-gradient(135deg, #7d3c98 0%, #9b59b6 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #9b59b6;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">📖 Fish Encyclopedia</h1> <p style="color: #d7bde2; margin: 0; font-size: 16px; text-align: center;">Your collection of caught fish</p> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 15px; text-align: center;"> <div> <div style="color: #f39c12; font-size: 28px; font-weight: bold;"><<print _stats.caught>>/<<print _stats.total>></div> <div style="color: #aaa; font-size: 12px;">Species Found</div> <div style="background: #1a1a1a; border-radius: 5px; height: 8px; margin-top: 5px; overflow: hidden;"> <div style="background: linear-gradient(90deg, #f39c12, #e74c3c); height: 100%; width: <<print _stats.percent>>%;"></div> </div> </div> <div> <div style="color: #3498db; font-size: 28px; font-weight: bold;"><<print _fishingStats.totalCatches>></div> <div style="color: #aaa; font-size: 12px;">Total Catches</div> </div> <div> <div style="color: #2ecc71; font-size: 28px; font-weight: bold;">$<<print _fishingStats.moneyEarned>></div> <div style="color: #aaa; font-size: 12px;">Money Earned</div> </div> <div> <div style="color: #9b59b6; font-size: 28px; font-weight: bold;">Lv.<<print setup.fishing.getLevel()>></div> <div style="color: #aaa; font-size: 12px;">Fishing Level</div> </div> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #555;"> <h3 style="color: #ccc; margin: 0 0 15px 0;">Collection by Rarity</h3> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; gap: 15px;"> <div style="text-align: center;"> <div style="color: #aaaaaa; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.common>>/<<print _stats.totalByRarity.common>></div> <div style="color: #aaaaaa; font-size: 12px;">Common</div> </div> <div style="text-align: center;"> <div style="color: #51cf66; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.uncommon>>/<<print _stats.totalByRarity.uncommon>></div> <div style="color: #51cf66; font-size: 12px;">Uncommon</div> </div> <div style="text-align: center;"> <div style="color: #339af0; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.rare>>/<<print _stats.totalByRarity.rare>></div> <div style="color: #339af0; font-size: 12px;">Rare</div> </div> <div style="text-align: center;"> <div style="color: #a855f7; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.epic || 0>>/<<print _stats.totalByRarity.epic || 0>></div> <div style="color: #a855f7; font-size: 12px;">Epic</div> </div> <div style="text-align: center;"> <div style="color: #ffd700; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.legendary>>/<<print _stats.totalByRarity.legendary>></div> <div style="color: #ffd700; font-size: 12px;">Legendary</div> </div> <div style="text-align: center;"> <div style="color: #ff6b9d; font-size: 18px; font-weight: bold;"><<print _stats.byRarity.mythical>>/<<print _stats.totalByRarity.mythical>></div> <div style="color: #ff6b9d; font-size: 12px;">Mythical</div> </div> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #555;"> <h3 style="color: #ccc; margin: 0 0 15px 0;">All Fish</h3> <!-- Sort fish by rarity order, then alphabetically --> <<set _rarityOrder = {common: 0, uncommon: 1, rare: 2, epic: 3, legendary: 4, mythical: 5}>> <<set _sortedFish = []>> <<for _fishId, _fish range setup.fishing.fish>> <<if !_fish.hidden>> <<run _sortedFish.push({id: _fishId, data: _fish})>> <</if>> <</for>> <<run _sortedFish.sort(function(a, b) { var rarityA = _rarityOrder[a.data.rarity] || 0; var rarityB = _rarityOrder[b.data.rarity] || 0; if (rarityA !== rarityB) return rarityA - rarityB; return a.data.name.localeCompare(b.data.name); })>> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _fishEntry range _sortedFish>> <<set _fishId = _fishEntry.id>> <<set _fish = _fishEntry.data>> <<set _caught = $fishCollection && $fishCollection.includes(_fishId)>> <<set _color = setup.fishing.rarityColors[_fish.rarity]>> <<if _caught>> <<set _locNames = setup.fishing.locationDisplayNames>> <<set _locList = []>> <<for _loc range _fish.locations>> <<run _locList.push(_locNames[_loc] || _loc)>> <</for>> <<set _locDisplay = _locList.join(", ")>> <<set _cardHtml = "<div style='background: #1a1a1a; padding: 15px; border-radius: 10px; border: 2px solid " + _color + "; text-align: center; cursor: pointer;'><div style='margin-bottom: 10px;'><img src='" + _fish.icon + "' style='width: 64px; height: 64px; image-rendering: pixelated;'></div><div style='color: " + _color + "; font-weight: bold; font-size: 14px; margin-bottom: 4px;'>" + _fish.name + "</div><div style='color: " + _color + "; font-size: 10px; text-transform: uppercase; margin-bottom: 8px;'>" + _fish.rarity + "</div></div>">> <<capture _fish, _color, _fishId, _locDisplay, _cardHtml>> <<link _cardHtml>> <<popover 'noclick'>> <div style="padding: 25px; text-align: center; background: #1a1a1a; border-radius: 10px; max-width: 400px;"> <div style="margin-bottom: 12px;"> <img @src="_fish.icon" style="width: 96px; height: 96px; image-rendering: pixelated;"> </div> <div style="color: <<print _color>>; font-weight: bold; font-size: 22px; margin-bottom: 4px;"><<print _fish.name>></div> <div style="color: <<print _color>>; font-size: 12px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 6px;"><<print _fish.rarity>></div> <div style="color: #2ecc71; font-size: 14px; margin-bottom: 18px;"> <<if _fish.basePriceMin !== undefined && _fish.basePriceMax !== undefined>> $<<print _fish.basePriceMin.toLocaleString()>> - $<<print _fish.basePriceMax.toLocaleString()>> <<else>> <<set _minPrice = Math.max(1, Math.floor(_fish.basePrice * 0.7))>> <<set _maxPrice = Math.ceil(_fish.basePrice * 1.3)>> $<<print _minPrice.toLocaleString()>> - $<<print _maxPrice.toLocaleString()>> <</if>> </div> <div style="border-top: 1px solid #333; padding-top: 15px; text-align: left;"> <div style="margin-bottom: 12px;"> <div style="color: #888; font-size: 13px;">Location</div> <div style="color: #3498db; font-size: 16px; font-weight: bold;"><<print _locDisplay>></div> </div> <<if _fish.time>> <div style="margin-bottom: 12px;"> <div style="color: #888; font-size: 13px;">Time</div> <div style="color: #f1c40f; font-size: 16px; font-weight: bold;"><<print _fish.time>></div> </div> <</if>> <<if _fish.weather>> <div style="margin-bottom: 12px;"> <div style="color: #888; font-size: 13px;">Weather</div> <div style="color: #e67e22; font-size: 16px; font-weight: bold;"><<print _fish.weather>></div> </div> <</if>> <<if !_fish.time && !_fish.weather>> <div style="color: #666; font-size: 13px; font-style: italic;">No time or weather requirements</div> <</if>> </div> <div style="margin-top: 15px;"> <<link "<div style='display: inline-block; background: #9b59b6; color: white; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: bold;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> </div> <</popover>> <</link>> <</capture>> <<else>> <div style="background: #1a1a1a; padding: 15px; border-radius: 10px; border: 2px solid <<print _color>>; opacity: 0.4; text-align: center;"> <div style="margin-bottom: 10px;"> <div style="width: 64px; height: 64px; background: #333; border-radius: 8px; display: inline-flex; align-items: center; justify-content: center; color: #555; font-size: 32px;">?</div> </div> <div style="color: <<print _color>>; font-weight: bold; font-size: 14px; margin-bottom: 4px;">???</div> <div style="color: <<print _color>>; font-size: 10px; text-transform: uppercase; margin-bottom: 8px;"><<print _fish.rarity>></div> <div style="color: #555; font-size: 11px; font-style: italic;">Not discovered</div> </div> <</if>> <</for>> </div> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<if $fishingLocation>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; display: inline-block;'>← Back to Fishing</div>">> <<if $fishingLocation === "beach">> <<goto "FishingBeach">> <<elseif $fishingLocation === "docks">> <<goto "FishingDocks">> <<elseif $fishingLocation === "pond">> <<goto "FishingPond">> <<elseif $fishingLocation === "coralReef">> <<goto "FishingCoralReef">> <<elseif $fishingLocation === "underwaterCave">> <<goto "FishingUnderwaterCave">> <<elseif $fishingLocation === "shallowOcean" || $fishingLocation === "deepOcean" || $fishingLocation === "abyssal">> <<goto "OceanFishing">> <<else>> <<goto "FishingDocks">> <</if>> <</link>> <<else>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #9b59b6; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #9b59b644; display: inline-block;'>← Back</div>">> <<goto $lastLocation>> <</link>> <</if>> </div> </div> <</nobr>>
<<nobr>> <<run setup.syncDiscoveredTraits()>> <<if !$discoveredTraits>><<set $discoveredTraits = {physical: [], mental: [], skills: [], voice: []}>><</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> <!-- Header --> <div style="background: linear-gradient(135deg, #9b59b6 0%, #6c3483 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #9b59b6;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Trait Encyclopedia</h1> <p style="color: #d7bde2; margin: 0; font-size: 16px; text-align: center;">Traits you have discovered</p> </div> <!-- Summary Stats --> <<set _bodyCount = ($discoveredTraits.body ? $discoveredTraits.body.length : 0)>> <<set _totalDiscovered = $discoveredTraits.physical.length + $discoveredTraits.mental.length + $discoveredTraits.skills.length + ($discoveredTraits.jobs ? $discoveredTraits.jobs.length : 0) + _bodyCount>> <<set _currentTotal = ($physicalTraits ? $physicalTraits.length : 0) + ($mentalTraits ? $mentalTraits.length : 0) + ($skills ? $skills.length : 0) + ($jobs ? $jobs.length : 0)>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); gap: 15px; text-align: center;"> <div> <div style="color: #f39c12; font-size: 28px; font-weight: bold;"><<print _totalDiscovered>></div> <div style="color: #aaa; font-size: 12px;">Total Discovered</div> </div> <div> <div style="color: #e74c3c; font-size: 28px; font-weight: bold;"><<print $discoveredTraits.physical.length>></div> <div style="color: #aaa; font-size: 12px;">Physical</div> </div> <div> <div style="color: #3498db; font-size: 28px; font-weight: bold;"><<print $discoveredTraits.mental.length>></div> <div style="color: #aaa; font-size: 12px;">Mental</div> </div> <div> <div style="color: #2ecc71; font-size: 28px; font-weight: bold;"><<print $discoveredTraits.skills.length>></div> <div style="color: #aaa; font-size: 12px;">Skills</div> </div> <div> <div style="color: #f1c40f; font-size: 28px; font-weight: bold;"><<print $discoveredTraits.jobs ? $discoveredTraits.jobs.length : 0>></div> <div style="color: #aaa; font-size: 12px;">Jobs</div> </div> <div> <div style="color: #ff69b4; font-size: 28px; font-weight: bold;"><<print _bodyCount>></div> <div style="color: #aaa; font-size: 12px;">Body</div> </div> </div> </div> <!-- PHYSICAL TRAITS SECTION --> <<if $discoveredTraits.physical.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #e74c3c;"> <h3 style="color: #e74c3c; margin: 0 0 15px 0; font-size: 20px;">Physical Traits</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _trait range $discoveredTraits.physical>> <<if _trait !== "Quill">> <<set _isActive = ($physicalTraits && $physicalTraits.includes(_trait))>> <<set _desc = setup.getTraitDescription(_trait)>> <<set _bonuses = setup.traitBonuses[_trait]>> <<set _val = setup.getTraitValue("physical", _trait)>> <<set _bonusText = "">> <<if _bonuses>> <<set _bonusParts = []>> <<if _bonuses.strength>><<run _bonusParts.push((_bonuses.strength > 0 ? "+" : "") + _bonuses.strength + " STR")>><</if>> <<if _bonuses.charisma>><<run _bonusParts.push((_bonuses.charisma > 0 ? "+" : "") + _bonuses.charisma + " CHA")>><</if>> <<if _bonuses.dexterity>><<run _bonusParts.push((_bonuses.dexterity > 0 ? "+" : "") + _bonuses.dexterity + " DEX")>><</if>> <<if _bonuses.intelligence>><<run _bonusParts.push((_bonuses.intelligence > 0 ? "+" : "") + _bonuses.intelligence + " INT")>><</if>> <<set _bonusText = _bonusParts.join(", ")>> <</if>> <<set _jobEffects = setup.getTraitJobEffects(_trait)>> <<set _hasSunfish = setup.skillTree.hasEffect("eyeOfTheSunfish")>> <<set _popupHtml = "<div style='background: #1e1e1e; padding: 24px; border-radius: 12px; text-align: center; border: 2px solid #e74c3c; min-width: 240px;'>" + "<div style='color: #e74c3c; font-weight: bold; font-size: 20px; margin-bottom: 4px;'>" + _trait + "</div>" + "<div style='color: #666; font-size: 11px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 14px;'>Physical Trait</div>" + "<div style='border-top: 1px solid #333; margin: 0 -24px 14px; padding: 0;'></div>">> <<if _hasSunfish && _desc && _desc.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #bbb; font-size: 14px; margin-bottom: 12px; line-height: 1.4;'>" + _desc + "</div>">><</if>> <<if _bonusText.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #f39c12; font-size: 13px; margin-bottom: 12px; font-weight: bold;'>" + _bonusText + "</div>">><</if>> <<if _hasSunfish && _jobEffects.length > 0>> <<set _popupHtml = _popupHtml + "<div style='border-top: 1px solid #333; margin: 0 -24px 12px; padding: 0;'></div>">> <<set _popupHtml = _popupHtml + "<div style='color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; text-align: center;'>Effects</div>">> <<set _popupHtml = _popupHtml + "<div style='text-align: left; margin-bottom: 12px;'>">> <<for _eff range _jobEffects>> <<set _popupHtml = _popupHtml + "<div style='color: #8be; font-size: 12px; margin-bottom: 4px;'>" + _eff + "</div>">> <</for>> <<set _popupHtml = _popupHtml + "</div>">> <</if>> <<set _popupHtml = _popupHtml + "<div style='color: #666; font-size: 12px;'>Value: " + _val + " pts</div>">> <<if _isActive>><<set _popupHtml = _popupHtml + "<div style='color: #2ecc71; font-size: 12px; margin-top: 8px; font-weight: bold;'>Currently Active</div>">><</if>> <<set _popupHtml = _popupHtml + "</div>">> <<set _cardStyle = "background: " + (_isActive ? "linear-gradient(135deg, #2d1a1a 0%, #1a1a1a 100%)" : "#1a1a1a") + "; padding: 15px; border-radius: 10px; text-align: center; border: 2px solid " + (_isActive ? "#e74c3c" : "#444") + "; cursor: pointer;">> <<set _cardHtml = "<div style='" + _cardStyle + "'><span style='color: " + (_isActive ? "#e74c3c" : "#888") + "; font-size: 13px; font-weight: bold;'>" + _trait + "</span></div>">> <<capture _trait, _popupHtml, _cardHtml>> <<link _cardHtml>> <<popover "noclick">> <<print _popupHtml>> <div style="text-align: center; margin-top: 16px;"> <<link "<div style='display: inline-block; background: #e74c3c; color: white; padding: 10px 30px; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> <</popover>> <</link>> <</capture>> <</if>> <</for>> </div> </div> <</if>> <!-- MENTAL TRAITS SECTION --> <<if $discoveredTraits.mental.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #3498db;"> <h3 style="color: #3498db; margin: 0 0 15px 0; font-size: 20px;">Mental Traits</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _trait range $discoveredTraits.mental>> <<set _isActive = ($mentalTraits && $mentalTraits.includes(_trait))>> <<set _desc = setup.getTraitDescription(_trait)>> <<set _bonuses = setup.traitBonuses[_trait]>> <<set _val = setup.getTraitValue("mental", _trait)>> <<set _bonusText = "">> <<if _bonuses>> <<set _bonusParts = []>> <<if _bonuses.strength>><<run _bonusParts.push((_bonuses.strength > 0 ? "+" : "") + _bonuses.strength + " STR")>><</if>> <<if _bonuses.charisma>><<run _bonusParts.push((_bonuses.charisma > 0 ? "+" : "") + _bonuses.charisma + " CHA")>><</if>> <<if _bonuses.dexterity>><<run _bonusParts.push((_bonuses.dexterity > 0 ? "+" : "") + _bonuses.dexterity + " DEX")>><</if>> <<if _bonuses.intelligence>><<run _bonusParts.push((_bonuses.intelligence > 0 ? "+" : "") + _bonuses.intelligence + " INT")>><</if>> <<set _bonusText = _bonusParts.join(", ")>> <</if>> <<set _hasSunfish = setup.skillTree.hasEffect("eyeOfTheSunfish")>> <<set _popupHtml = "<div style='background: #1e1e1e; padding: 24px; border-radius: 12px; text-align: center; border: 2px solid #3498db; min-width: 240px;'>" + "<div style='color: #3498db; font-weight: bold; font-size: 20px; margin-bottom: 4px;'>" + _trait + "</div>" + "<div style='color: #666; font-size: 11px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 14px;'>Mental Trait</div>" + "<div style='border-top: 1px solid #333; margin: 0 -24px 14px; padding: 0;'></div>">> <<if _hasSunfish && _desc && _desc.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #bbb; font-size: 14px; margin-bottom: 12px; line-height: 1.4;'>" + _desc + "</div>">><</if>> <<if _bonusText.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #f39c12; font-size: 13px; margin-bottom: 12px; font-weight: bold;'>" + _bonusText + "</div>">><</if>> <<set _jobEffects = setup.getTraitJobEffects(_trait)>> <<if _hasSunfish && _jobEffects.length > 0>> <<set _popupHtml = _popupHtml + "<div style='border-top: 1px solid #333; margin: 0 -24px 12px; padding: 0;'></div>">> <<set _popupHtml = _popupHtml + "<div style='color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; text-align: center;'>Effects</div>">> <<set _popupHtml = _popupHtml + "<div style='text-align: left; margin-bottom: 12px;'>">> <<for _eff range _jobEffects>> <<set _popupHtml = _popupHtml + "<div style='color: #8be; font-size: 12px; margin-bottom: 4px;'>" + _eff + "</div>">> <</for>> <<set _popupHtml = _popupHtml + "</div>">> <</if>> <<set _popupHtml = _popupHtml + "<div style='color: #666; font-size: 12px;'>Value: " + _val + " pts</div>">> <<if _isActive>><<set _popupHtml = _popupHtml + "<div style='color: #2ecc71; font-size: 12px; margin-top: 8px; font-weight: bold;'>Currently Active</div>">><</if>> <<set _popupHtml = _popupHtml + "</div>">> <<set _cardStyle = "background: " + (_isActive ? "linear-gradient(135deg, #1a1a2d 0%, #1a1a1a 100%)" : "#1a1a1a") + "; padding: 15px; border-radius: 10px; text-align: center; border: 2px solid " + (_isActive ? "#3498db" : "#444") + "; cursor: pointer;">> <<set _cardHtml = "<div style='" + _cardStyle + "'><span style='color: " + (_isActive ? "#3498db" : "#888") + "; font-size: 13px; font-weight: bold;'>" + _trait + "</span></div>">> <<capture _trait, _popupHtml, _cardHtml>> <<link _cardHtml>> <<popover "noclick">> <<print _popupHtml>> <div style="text-align: center; margin-top: 16px;"> <<link "<div style='display: inline-block; background: #3498db; color: white; padding: 10px 30px; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> <</popover>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <!-- SKILLS SECTION --> <<if $discoveredTraits.skills.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #2ecc71;"> <h3 style="color: #2ecc71; margin: 0 0 15px 0; font-size: 20px;">Skills</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _trait range $discoveredTraits.skills>> <<set _isActive = ($skills && $skills.includes(_trait))>> <<set _desc = setup.getTraitDescription(_trait)>> <<set _bonuses = setup.skillBonuses[_trait]>> <<set _val = setup.getTraitValue("skill", _trait)>> <<set _bonusText = "">> <<if _bonuses>> <<set _bonusParts = []>> <<if _bonuses.strength>><<run _bonusParts.push((_bonuses.strength > 0 ? "+" : "") + _bonuses.strength + " STR")>><</if>> <<if _bonuses.charisma>><<run _bonusParts.push((_bonuses.charisma > 0 ? "+" : "") + _bonuses.charisma + " CHA")>><</if>> <<if _bonuses.dexterity>><<run _bonusParts.push((_bonuses.dexterity > 0 ? "+" : "") + _bonuses.dexterity + " DEX")>><</if>> <<if _bonuses.intelligence>><<run _bonusParts.push((_bonuses.intelligence > 0 ? "+" : "") + _bonuses.intelligence + " INT")>><</if>> <<set _bonusText = _bonusParts.join(", ")>> <</if>> <<set _hasSunfish = setup.skillTree.hasEffect("eyeOfTheSunfish")>> <<set _popupHtml = "<div style='background: #1e1e1e; padding: 24px; border-radius: 12px; text-align: center; border: 2px solid #2ecc71; min-width: 240px;'>" + "<div style='color: #2ecc71; font-weight: bold; font-size: 20px; margin-bottom: 4px;'>" + _trait + "</div>" + "<div style='color: #666; font-size: 11px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 14px;'>Skill</div>" + "<div style='border-top: 1px solid #333; margin: 0 -24px 14px; padding: 0;'></div>">> <<if _hasSunfish && _desc && _desc.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #bbb; font-size: 14px; margin-bottom: 12px; line-height: 1.4;'>" + _desc + "</div>">><</if>> <<if _bonusText.length > 0>><<set _popupHtml = _popupHtml + "<div style='color: #f39c12; font-size: 13px; margin-bottom: 12px; font-weight: bold;'>" + _bonusText + "</div>">><</if>> <<set _jobEffects = setup.getTraitJobEffects(_trait)>> <<if _hasSunfish && _jobEffects.length > 0>> <<set _popupHtml = _popupHtml + "<div style='border-top: 1px solid #333; margin: 0 -24px 12px; padding: 0;'></div>">> <<set _popupHtml = _popupHtml + "<div style='color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; text-align: center;'>Effects</div>">> <<set _popupHtml = _popupHtml + "<div style='text-align: left; margin-bottom: 12px;'>">> <<for _eff range _jobEffects>> <<set _popupHtml = _popupHtml + "<div style='color: #8be; font-size: 12px; margin-bottom: 4px;'>" + _eff + "</div>">> <</for>> <<set _popupHtml = _popupHtml + "</div>">> <</if>> <<set _popupHtml = _popupHtml + "<div style='color: #666; font-size: 12px;'>Value: " + _val + " pts</div>">> <<if _isActive>><<set _popupHtml = _popupHtml + "<div style='color: #2ecc71; font-size: 12px; margin-top: 8px; font-weight: bold;'>Currently Active</div>">><</if>> <<set _popupHtml = _popupHtml + "</div>">> <<set _cardStyle = "background: " + (_isActive ? "linear-gradient(135deg, #1a2d1a 0%, #1a1a1a 100%)" : "#1a1a1a") + "; padding: 15px; border-radius: 10px; text-align: center; border: 2px solid " + (_isActive ? "#2ecc71" : "#444") + "; cursor: pointer;">> <<set _cardHtml = "<div style='" + _cardStyle + "'><span style='color: " + (_isActive ? "#2ecc71" : "#888") + "; font-size: 13px; font-weight: bold;'>" + _trait + "</span></div>">> <<capture _trait, _popupHtml, _cardHtml>> <<link _cardHtml>> <<popover "noclick">> <<print _popupHtml>> <div style="text-align: center; margin-top: 16px;"> <<link "<div style='display: inline-block; background: #2ecc71; color: white; padding: 10px 30px; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> <</popover>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <!-- BODY PARTS SECTION --> <<if $discoveredTraits.body && $discoveredTraits.body.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #ff69b4;"> <h3 style="color: #ff69b4; margin: 0 0 15px 0; font-size: 20px;">Body</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _bp range $discoveredTraits.body>> <<set _bpIsActive = false>> <<if $bodyParts>> <<if _bp.label === "Gender" && $bodyParts.gender === _bp.value>><<set _bpIsActive = true>><</if>> <<if _bp.label === "Chest" && $bodyParts.chest === _bp.value>><<set _bpIsActive = true>><</if>> <<if _bp.label === "Butt" && $bodyParts.butt === _bp.value>><<set _bpIsActive = true>><</if>> <<if _bp.label === "Genitals" && $bodyParts.genitals === _bp.value>><<set _bpIsActive = true>><</if>> <</if>> <<set _bpEffects = []>> <<if _bp.label === "Chest">> <<if _bp.value.includes("large") || _bp.value.includes("huge") || _bp.value.includes("gigantic") || _bp.value.includes("giant")>> <<run _bpEffects.push("Stripping: +20-30% tip bonus")>> <<run _bpEffects.push("PrawnHub: Bonus to full strip/freestyle")>> <</if>> <</if>> <<if _bp.label === "Gender" && _bp.value === "female">> <<run _bpEffects.push("Brothel: Required (female only)")>> <</if>> <<if _bp.label === "Genitals" && _bp.value.includes("vagina")>> <<run _bpEffects.push("Stripping Full Strip: +20% tips")>> <</if>> <<set _bpVal = setup.getTraitValue("bodyPart", _bp.label.toLowerCase(), _bp.value)>> <<set _hasSunfish = setup.skillTree.hasEffect("eyeOfTheSunfish")>> <<set _bpPopup = "<div style='background: #1e1e1e; padding: 24px; border-radius: 12px; text-align: center; border: 2px solid #ff69b4; min-width: 240px;'>" + "<div style='color: #ff69b4; font-weight: bold; font-size: 20px; margin-bottom: 4px;'>" + _bp.label + "</div>" + "<div style='color: #666; font-size: 11px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 14px;'>Body Part</div>" + "<div style='border-top: 1px solid #333; margin: 0 -24px 14px; padding: 0;'></div>" + "<div style='color: #bbb; font-size: 16px; margin-bottom: 12px; font-weight: bold;'>" + _bp.value.charAt(0).toUpperCase() + _bp.value.slice(1) + "</div>">> <<if _hasSunfish && _bpEffects.length > 0>> <<set _bpPopup = _bpPopup + "<div style='border-top: 1px solid #333; margin: 0 -24px 12px; padding: 0;'></div>">> <<set _bpPopup = _bpPopup + "<div style='color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; text-align: center;'>Effects</div>">> <<set _bpPopup = _bpPopup + "<div style='text-align: left; margin-bottom: 12px;'>">> <<for _eff range _bpEffects>> <<set _bpPopup = _bpPopup + "<div style='color: #8be; font-size: 12px; margin-bottom: 4px;'>" + _eff + "</div>">> <</for>> <<set _bpPopup = _bpPopup + "</div>">> <</if>> <<set _bpPopup = _bpPopup + "<div style='color: #666; font-size: 12px;'>Value: " + _bpVal + " pts</div>">> <<if _bpIsActive>><<set _bpPopup = _bpPopup + "<div style='color: #2ecc71; font-size: 12px; margin-top: 8px; font-weight: bold;'>Currently Active</div>">><</if>> <<set _bpPopup = _bpPopup + "</div>">> <<set _bpCardStyle = "background: " + (_bpIsActive ? "linear-gradient(135deg, #2d1a2a 0%, #1a1a1a 100%)" : "#1a1a1a") + "; padding: 15px; border-radius: 10px; text-align: center; border: 2px solid " + (_bpIsActive ? "#ff69b4" : "#444") + "; cursor: pointer;">> <<set _bpCard = "<div style='" + _bpCardStyle + "'><span style='color: " + (_bpIsActive ? "#ff69b4" : "#888") + "; font-size: 13px; font-weight: bold;'>" + _bp.label + ": " + _bp.value.charAt(0).toUpperCase() + _bp.value.slice(1) + "</span></div>">> <<capture _bp, _bpPopup, _bpCard>> <<link _bpCard>> <<popover "noclick">> <<print _bpPopup>> <div style="text-align: center; margin-top: 16px;"> <<link "<div style='display: inline-block; background: #ff69b4; color: white; padding: 10px 30px; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> <</popover>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <!-- JOBS SECTION --> <<if $discoveredTraits.jobs && $discoveredTraits.jobs.length > 0>> <div style="background: #2a2a2a; padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #f1c40f;"> <h3 style="color: #f1c40f; margin: 0 0 15px 0; font-size: 20px;">Jobs</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 15px;"> <<for _job range $discoveredTraits.jobs>> <<set _isActive = ($jobs && $jobs.includes(_job))>> <<set _val = setup.getTraitValue("job", _job)>> <<set _jobReqs = setup.jobRequirements[_job]>> <<set _reqParts = []>> <<if _jobReqs>> <<if _jobReqs.strength>><<run _reqParts.push("STR " + _jobReqs.strength)>><</if>> <<if _jobReqs.dexterity>><<run _reqParts.push("DEX " + _jobReqs.dexterity)>><</if>> <<if _jobReqs.charisma>><<run _reqParts.push("CHA " + _jobReqs.charisma)>><</if>> <<if _jobReqs.intelligence>><<run _reqParts.push("INT " + _jobReqs.intelligence)>><</if>> <</if>> <<set _reqText = _reqParts.length > 0 ? _reqParts.join(", ") : "None">> <<set _hasSunfish = setup.skillTree.hasEffect("eyeOfTheSunfish")>> <<set _popupHtml = "<div style='background: #1e1e1e; padding: 24px; border-radius: 12px; text-align: center; border: 2px solid #f1c40f; min-width: 240px;'>" + "<div style='color: #f1c40f; font-weight: bold; font-size: 20px; margin-bottom: 4px;'>" + _job + "</div>" + "<div style='color: #666; font-size: 11px; text-transform: uppercase; letter-spacing: 2px; margin-bottom: 14px;'>Job</div>" + "<div style='border-top: 1px solid #333; margin: 0 -24px 14px; padding: 0;'></div>">> <<if _hasSunfish>><<set _popupHtml = _popupHtml + "<div style='color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px;'>Requirements</div>" + "<div style='color: #bbb; font-size: 14px; margin-bottom: 12px;'>" + _reqText + "</div>">><</if>> <<set _popupHtml = _popupHtml + "<div style='color: #666; font-size: 12px;'>Value: " + _val + " pts</div>">> <<if _isActive>><<set _popupHtml = _popupHtml + "<div style='color: #2ecc71; font-size: 12px; margin-top: 8px; font-weight: bold;'>Currently Active</div>">><</if>> <<set _popupHtml = _popupHtml + "</div>">> <<set _cardStyle = "background: " + (_isActive ? "linear-gradient(135deg, #2d2a0a 0%, #1a1a1a 100%)" : "#1a1a1a") + "; padding: 15px; border-radius: 10px; text-align: center; border: 2px solid " + (_isActive ? "#f1c40f" : "#444") + "; cursor: pointer;">> <<set _cardHtml = "<div style='" + _cardStyle + "'><span style='color: " + (_isActive ? "#f1c40f" : "#888") + "; font-size: 13px; font-weight: bold;'>" + _job + "</span></div>">> <<capture _job, _popupHtml, _cardHtml>> <<link _cardHtml>> <<popover "noclick">> <<print _popupHtml>> <div style="text-align: center; margin-top: 16px;"> <<link "<div style='display: inline-block; background: #f1c40f; color: #000; padding: 10px 30px; border-radius: 8px; font-weight: bold; font-size: 14px; cursor: pointer;'>Close</div>">> <<run Dialog.close()>> <</link>> </div> <</popover>> <</link>> <</capture>> <</for>> </div> </div> <</if>> <!-- Empty State --> <<if _totalDiscovered === 0>> <div style="background: #2a2a2a; padding: 30px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #555;"> <p style="color: #888; text-align: center; font-style: italic; font-size: 16px;">You haven't discovered any traits yet. Traits will appear here as you acquire them.</p> </div> <</if>> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px; box-shadow: 0 3px 6px rgba(0,0,0,0.3);'>← Back</div>">> <<goto $lastLocation>> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button --> <div style="text-align: center; margin-bottom: 25px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Cheat Menu</div>" "Debug">><</link>> </div> <h1 style="color: #ffd43b; text-align: center; margin-bottom: 25px;">⚡ Buffs & Debuffs Debug</h1> <!-- Current Status Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ffd43b;"> <h2 style="color: #ffd43b; margin: 0 0 15px 0;">📊 Current Status</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 15px;"> <!-- Active Buffs --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">✓ Active Buffs</h3> <<if $activeBuffs && $activeBuffs.length > 0>> <<for _buff range $activeBuffs>> <div style="color: #ccc; margin: 5px 0;">• <<= _buff.name>></div> <</for>> <<else>> <div style="color: #888;">None</div> <</if>> </div> <!-- Active Debuffs --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; border: 2px solid #ff6b6b;"> <h3 style="color: #ff6b6b; margin: 0 0 10px 0;">❌ Active Debuffs</h3> <<if $activeDebuffs && $activeDebuffs.length > 0>> <<for _debuff range $activeDebuffs>> <div style="color: #ccc; margin: 5px 0;">• <<= _debuff.name>></div> <</for>> <<else>> <div style="color: #888;">None</div> <</if>> </div> </div> </div> <!-- Buffs Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #51cf66;"> <h2 style="color: #51cf66; margin: 0 0 15px 0;">✓ Buffs</h2> <!-- Well Rested --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <div> <span style="color: #51cf66; font-weight: bold; font-size: 16px;">😴 Well Rested</span> <div style="color: #aaa; font-size: 12px; margin-top: 5px;">+5% Trade, +5% Steal, Fishing Luck, +1 Daily Talk</div> </div> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (1hr)</div>">> <<run setup.addBuff("well_rested", 60)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (4hr)</div>">> <<run setup.addBuff("well_rested", 240)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (8hr)</div>">> <<run setup.addBuff("well_rested", 480)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Remove</div>">> <<run setup.removeBuff("well_rested")>> <<goto "DebugBuffsDebuffs">> <</link>> </div> </div> <!-- Fresh & Clean --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <div> <span style="color: #17a2b8; font-weight: bold; font-size: 16px;">🚿 Fresh & Clean</span> <div style="color: #aaa; font-size: 12px; margin-top: 5px;">+15% Trade bonus from showering</div> </div> </div> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #17a2b8; color: #17a2b8; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (1hr)</div>">> <<run setup.addBuff("shower_fresh", 60)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #17a2b8; color: #17a2b8; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (4hr)</div>">> <<run setup.addBuff("shower_fresh", 240)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #17a2b8; color: #17a2b8; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add (8hr)</div>">> <<run setup.addBuff("shower_fresh", 480)>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Remove</div>">> <<run setup.removeBuff("shower_fresh")>> <<goto "DebugBuffsDebuffs">> <</link>> </div> </div> </div> <!-- Debuffs Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #ff6b6b;"> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">❌ Debuffs</h2> <!-- Exhaustion --> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; margin-bottom: 10px;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <div> <span style="color: #ff6b6b; font-weight: bold; font-size: 16px;">Exhaustion</span> <div style="color: #aaa; font-size: 12px; margin-top: 5px;">-20% Trade, -20% Steal (removed by sleeping 6+ hours)</div> </div> </div> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Add Exhaustion</div>">> <<run setup.addDebuff("exhaustion")>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 8px; border-radius: 4px; text-align: center; cursor: pointer; font-size: 13px;'>Remove Exhaustion</div>">> <<run setup.removeDebuff("exhaustion")>> <<goto "DebugBuffsDebuffs">> <</link>> </div> </div> </div> <!-- Quick Actions Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; margin-bottom: 20px; border: 3px solid #667eea;"> <h2 style="color: #667eea; margin: 0 0 15px 0;">⚡ Quick Actions</h2> <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ff6b6b; color: #ff6b6b; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Clear All Buffs</div>">> <<set $activeBuffs = []>> <<goto "DebugBuffsDebuffs">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Clear All Debuffs</div>">> <<set $activeDebuffs = []>> <<goto "DebugBuffsDebuffs">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<if $dealershipTab === undefined || $dealershipTab === "boats">><<set $dealershipTab = "upgrades">><</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back Button (Top) --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #3498db; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; display: inline-block;'>← Leave Dealership</div>">><<goto "Docks">><</link>> </div> <!-- Header Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #3498db; margin: 0 0 15px 0;">⚓ Fishing & Gear Dealership</h2> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333;"> <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; text-align: center;"> <div> <div style="color: #2ecc71; font-size: 20px; font-weight: bold;">$<<print $money || 0>></div> <div style="color: #888; font-size: 11px;">Money</div> </div> <div> <div style="color: #3498db; font-size: 20px; font-weight: bold;"><<if $boat>><<print setup.fishing.boats[$boat].name>><<else>>None<</if>></div> <div style="color: #888; font-size: 11px;">Boat</div> </div> <div> <div style="color: #e67e22; font-size: 20px; font-weight: bold;"><<print setup.fishing.getCurrentPole().name>></div> <div style="color: #888; font-size: 11px;">Pole</div> </div> <div> <div style="color: #f39c12; font-size: 20px; font-weight: bold;"><<print setup.fishing.getInventoryCount()>>/<<print setup.fishing.getMaxInventory()>></div> <div style="color: #888; font-size: 11px;">Storage</div> </div> </div> </div> </div> <!-- Tab Navigation --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 15px; border-radius: 12px; border: 3px solid #51cf66; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <div style="display: flex; flex-wrap: wrap; gap: 8px; justify-content: center;"> <<link "<div style='background: <<if $dealershipTab === \"upgrades\">>#9b59b6<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 2px solid #9b59b6; color: <<if $dealershipTab === \"upgrades\">>#fff<<else>>#888<</if>>; padding: 10px 15px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px; <<if $dealershipTab === \"upgrades\">>box-shadow: 0 0 15px #9b59b688;<</if>>'>🛠️ Items & Upgrades</div>">><<set $dealershipTab = "upgrades">><<goto "FishingDealership">><</link>> <<link "<div style='background: <<if $dealershipTab === \"sell\">>#2ecc71<<else>>linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%)<</if>>; border: 2px solid #2ecc71; color: <<if $dealershipTab === \"sell\">>#fff<<else>>#888<</if>>; padding: 10px 15px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold; font-size: 13px; <<if $dealershipTab === \"sell\">>box-shadow: 0 0 15px #2ecc7188;<</if>>'>💰 Sell Fish</div>">><<set $dealershipTab = "sell">><<goto "FishingDealership">><</link>> </div> </div> <!-- Tab Content --> <<if $dealershipTab === "upgrades">><<set _tabColor = "#9b59b6">><<elseif $dealershipTab === "sell">><<set _tabColor = "#2ecc71">><<else>><<set _tabColor = "#9b59b6">><</if>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<print _tabColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 15px <<print _tabColor>>44;"> <!-- ITEMS & UPGRADES TAB --> <<if $dealershipTab === "upgrades">> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">🛠️ Items & Upgrades</h2> <!-- Boats Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 20px;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">🚤 Boats</h3> <div style="display: grid; gap: 15px;"> <<for _tier, _boat range setup.fishing.boats>> <<set _owned = $boat && $boat >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _boat.price>> <<set _isUpgrade = $boat && $boat < _tier>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid <<if _owned>>#2ecc71<<elseif _tier >= 2>>#555<<elseif _canBuy>>#9b59b6<<else>>#555<</if>>; border-radius: 8px; padding: 15px;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;"> <div style="flex: 1; min-width: 180px;"> <h3 style="color: <<if _owned>>#2ecc71<<elseif _tier >= 2>>#555<<else>>#9b59b6<</if>>; margin: 0 0 5px 0; font-size: 16px;">Tier <<print _tier>>: <<print _boat.name>></h3> <p style="color: #aaa; margin: 0 0 8px 0; font-size: 13px;"><<print _boat.description>></p> <div style="color: #888; font-size: 11px;">Ocean: <<print _boat.oceanAccess.join(", ")>> | Tank: Tier <<print _boat.maxTankTier>></div> </div> <div style="text-align: right;"> <<if _tier >= 2>> <div style="color: #555; font-size: 14px; margin-bottom: 8px;">Coming Soon</div> <div style="background: #333; color: #555; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">🚧 Coming Soon</div> <<elseif _owned>> <div style="color: #2ecc71; font-size: 20px; font-weight: bold; margin-bottom: 8px;">$<<print _boat.price>></div> <div style="background: #2ecc71; color: white; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Owned</div> <<elseif _canBuy>> <div style="color: #2ecc71; font-size: 20px; font-weight: bold; margin-bottom: 8px;">$<<print _boat.price>></div> <<capture _tier, _boat>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 16px; border-radius: 6px; font-weight: bold; cursor: pointer; font-size: 13px;'><<if _isUpgrade>>Upgrade<<else>>Purchase<</if>></div>">> <<set $money -= _boat.price>> <<set $boat = _tier>> <<goto "FishingDealership">> <</link>> <</capture>> <<else>> <div style="color: #2ecc71; font-size: 20px; font-weight: bold; margin-bottom: 8px;">$<<print _boat.price>></div> <div style="background: #333; color: #666; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Need $<<print _boat.price>></div> <</if>> </div> </div> </div> <</for>> </div> </div> <!-- Fish Storage Tanks Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-bottom: 20px;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">🪣 Fish Storage Tanks</h3> <div style="background-color: #2a2a2a; padding: 10px; border-radius: 8px; border: 1px solid #555; margin-bottom: 15px;"> <p style="color: #aaa; margin: 0; text-align: center; font-size: 13px;">Current Storage: <<if $fishTank>>Tier <<print $fishTank>> Tank (<<print setup.fishing.getMaxInventory()>> fish)<<else>>No Tank (5 fish)<</if>></p> </div> <div style="display: grid; gap: 15px;"> <<for _tier, _tank range setup.fishing.fishTanks>> <<set _owned = $fishTank && $fishTank >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _tank.price>> <<set _hasBoatReq = _tank.requiredBoat === null || ($boat && $boat >= _tank.requiredBoat)>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid <<if _owned>>#2ecc71<<elseif _canBuy && _hasBoatReq>>#9b59b6<<else>>#555<</if>>; border-radius: 8px; padding: 15px;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;"> <div style="flex: 1; min-width: 180px;"> <h3 style="color: <<if _owned>>#2ecc71<<else>>#9b59b6<</if>>; margin: 0 0 5px 0; font-size: 16px;">Tier <<print _tier>> Storage Tank</h3> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 13px;">Stores up to <<print _tank.capacity>> fish</p> <<if _tank.requiredBoat>> <div style="color: <<if _hasBoatReq>>#888<<else>>#e74c3c<</if>>; font-size: 12px;">Requires Tier <<print _tank.requiredBoat>>+ Boat</div> <</if>> </div> <div style="text-align: right;"> <div style="color: #2ecc71; font-size: 20px; font-weight: bold; margin-bottom: 8px;">$<<print _tank.price>></div> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Owned</div> <<elseif !_hasBoatReq>> <div style="background: #e74c3c; color: white; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Need Boat</div> <<elseif _canBuy>> <<capture _tier, _tank>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 16px; border-radius: 6px; font-weight: bold; cursor: pointer; font-size: 13px;'>Purchase</div>">> <<set $money -= _tank.price>> <<set $fishTank = _tier>> <<goto "FishingDealership">> <</link>> <</capture>> <<else>> <div style="background: #333; color: #666; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Need $<<print _tank.price>></div> <</if>> </div> </div> </div> <</for>> </div> </div> <!-- Fishing Rods Section --> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #333; margin-top: 20px;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">🎣 Fishing Rods</h3> <div style="background-color: #2a2a2a; padding: 10px; border-radius: 8px; border: 1px solid #555; margin-bottom: 15px;"> <p style="color: #aaa; margin: 0; text-align: center; font-size: 13px;">Current Rod: <<if $fishingPole && $fishingPole > 0>><<print setup.fishing.getCurrentPole().name>><<else>><span style="color: #e74c3c;">None</span><</if>></p> </div> <div style="display: grid; gap: 15px;"> <<for _tier, _rod range setup.fishing.fishingPoles>> <<if _rod.isSunfishRod>><<continue>><</if>> <<set _currentPole = $fishingPole || 0>> <<set _owned = _currentPole >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _rod.price>> <<set _isNext = !_owned && (_tier === 1 || _currentPole >= (_tier - 1))>> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid <<if _owned>>#2ecc71<<elseif _canBuy && _isNext>>#9b59b6<<else>>#555<</if>>; border-radius: 8px; padding: 15px;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px;"> <div style="flex: 1; min-width: 180px;"> <h3 style="color: <<if _owned>>#2ecc71<<else>>#9b59b6<</if>>; margin: 0 0 5px 0; font-size: 16px;"><<print _rod.name>></h3> <p style="color: #aaa; margin: 0 0 5px 0; font-size: 13px;"><<print _rod.description>></p> <div style="color: #888; font-size: 12px;">Tier <<print _tier>> Rod</div> </div> <div style="text-align: right;"> <div style="color: #2ecc71; font-size: 20px; font-weight: bold; margin-bottom: 8px;">$<<print _rod.price.toLocaleString()>></div> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Owned</div> <<elseif !_isNext>> <div style="background: #333; color: #666; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Locked</div> <<elseif _canBuy>> <<capture _tier, _rod>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 8px 16px; border-radius: 6px; font-weight: bold; cursor: pointer; font-size: 13px;'>Purchase</div>">> <<set $money -= _rod.price>> <<set $fishingPole = _tier>> <<goto "FishingDealership">> <</link>> <</capture>> <<else>> <div style="background: #333; color: #666; padding: 8px 16px; border-radius: 6px; font-weight: bold; font-size: 13px;">Need $<<print _rod.price.toLocaleString()>></div> <</if>> </div> </div> </div> <</for>> </div> </div> <<elseif $dealershipTab === "sell">> <!-- SELL TAB --> <h2 style="color: #2ecc71; margin: 0 0 15px 0;">💰 Sell Your Fish</h2> <!-- Show last sale result if available --> <<if $lastFishSale>> <<if $lastFishSale.count > 0>> <div style="background: linear-gradient(135deg, #1a472a 0%, #0d2818 100%); padding: 20px; border-radius: 10px; border: 2px solid #2ecc71; margin-bottom: 20px; text-align: center;"> <div style="font-size: 36px; margin-bottom: 10px;">💰</div> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">Sold <<print $lastFishSale.count>> Fish!</h3> <div style="color: #2ecc71; font-size: 28px; font-weight: bold;">+$<<print $lastFishSale.money>></div> <!-- Show trait bonuses --> <div style="margin-top: 15px; display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<if $lastFishSale.hasPearl>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 10px 15px; border-radius: 8px;"> <span style="color: white;">🐚 Pearl of Abundance: +$<<print $lastFishSale.pearlBonus>></span> </div> <</if>> <<if $lastFishSale.hasFishingTrait>> <div style="background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); padding: 10px 15px; border-radius: 8px;"> <span style="color: white;">🎣 Fishing Trait: +$<<print $lastFishSale.fishingTraitBonus>> (+20%)</span> </div> <</if>> <<if $lastFishSale.hasWerefox>> <div style="background: linear-gradient(135deg, #e67e22 0%, #d35400 100%); padding: 10px 15px; border-radius: 8px;"> <span style="color: white;">Werefox: +$<<print $lastFishSale.werefoxBonus>> (+10%)</span> </div> <</if>> <<if $lastFishSale.hasSiren>> <div style="background: linear-gradient(135deg, #1abc9c 0%, #16a085 100%); padding: 10px 15px; border-radius: 8px;"> <span style="color: white;">Siren: +$<<print $lastFishSale.sirenBonus>> (2x)</span> </div> <</if>> </div> </div> <</if>> <<unset $lastFishSale>> <</if>> <<if $fishInventory && $fishInventory.length > 0>> <<set _level = setup.fishing.getLevel()>> <<set _priceBonus = 1 + (_level * 0.05)>> <<set _totalValue = 0>> <<for _fish range $fishInventory>> <<set _totalValue += Math.floor(_fish.basePrice * _priceBonus)>> <</for>> <<set _hasPearl = $currentArtifact === "The Pearl of Abundance">> <<set _pearlBonus = _hasPearl ? Math.floor(_totalValue * 0.5) : 0>> <!-- Check for trait bonuses --> <<set _hasFishingTrait = $mentalTraits && ($mentalTraits.includes("Fishing") || $mentalTraits.includes("Advanced Angler") || $mentalTraits.includes("Master Angler") || $mentalTraits.includes("Fishimon Master"))>> <<set _hasWerefox = $physicalTraits && $physicalTraits.includes("Werefox")>> <<set _hasSiren = $physicalTraits && $physicalTraits.includes("Siren")>> <<set _fishingTraitBonus = _hasFishingTrait ? Math.floor(_totalValue * 0.2) : 0>> <<set _werefoxBonus = _hasWerefox ? Math.floor(_totalValue * 0.1) : 0>> <<set _sirenBonus = _hasSiren ? _totalValue : 0>> <<set _finalTotal = _totalValue + _pearlBonus + _fishingTraitBonus + _werefoxBonus + _sirenBonus>> <!-- Active Bonuses Display --> <<if _hasPearl || _hasFishingTrait || _hasWerefox || _hasSiren>> <div style="background-color: #1a1a1a; padding: 15px; border-radius: 8px; border: 1px solid #9b59b6; margin-bottom: 15px;"> <h4 style="color: #9b59b6; margin: 0 0 10px 0; text-align: center;">✨ Active Sale Bonuses</h4> <div style="display: flex; flex-wrap: wrap; gap: 8px; justify-content: center;"> <<if _hasPearl>> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 8px 12px; border-radius: 6px;"> <span style="color: white; font-size: 13px;">🐚 Pearl: +50% (+$<<print _pearlBonus>>)</span> </div> <</if>> <<if _hasFishingTrait>> <div style="background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); padding: 8px 12px; border-radius: 6px;"> <span style="color: white; font-size: 13px;">🎣 Fishing: +20% (+$<<print _fishingTraitBonus>>)</span> </div> <</if>> <<if _hasWerefox>> <div style="background: linear-gradient(135deg, #e67e22 0%, #d35400 100%); padding: 8px 12px; border-radius: 6px;"> <span style="color: white; font-size: 13px;">Werefox: +10% (+$<<print _werefoxBonus>>)</span> </div> <</if>> <<if _hasSiren>> <div style="background: linear-gradient(135deg, #1abc9c 0%, #16a085 100%); padding: 8px 12px; border-radius: 6px;"> <span style="color: white; font-size: 13px;">Siren: 2x Value (+$<<print _sirenBonus>>)</span> </div> <</if>> </div> </div> <</if>> <!-- Sell All Button --> <div style="background-color: #1a1a1a; padding: 20px; border-radius: 8px; border: 1px solid #2ecc71; margin-bottom: 20px; text-align: center;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">Sell All Fish</h3> <p style="color: #aaa; margin: 0 0 5px 0;">Total Value: <span style="color: #2ecc71; font-weight: bold; font-size: 24px;">$<<print _finalTotal>></span></p> <<if _hasPearl || _hasFishingTrait || _hasWerefox || _hasSiren>> <p style="color: #888; margin: 0 0 15px 0; font-size: 12px;">(Base: $<<print _totalValue>> + bonuses)</p> <</if>> <<link "<div style='background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); color: white; padding: 15px 40px; border-radius: 10px; display: inline-block; font-weight: bold; font-size: 18px; cursor: pointer;'>Sell All (<<print $fishInventory.length>> fish)</div>">> <<set $lastFishSale = setup.fishing.sellAllFish()>> <<goto "FishingDealership">> <</link>> </div> <!-- Individual Fish --> <h3 style="color: #2ecc71; margin: 0 0 15px 0;">Your Fish</h3> <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 15px;"> <<for _i, _fish range $fishInventory>> <<set _fishBasePrice = Math.floor(_fish.basePrice * _priceBonus)>> <<set _fishPearlBonus = _hasPearl ? Math.floor(_fishBasePrice * 0.5) : 0>> <<set _fishPrice = _fishBasePrice + _fishPearlBonus>> <<set _color = setup.fishing.rarityColors[_fish.rarity] || "#aaaaaa">> <<capture _i, _fish, _fishPrice, _color>> <div style="border: 2px solid <<print _color>>; border-radius: 10px; padding: 15px; background: #1a1a1a; text-align: center;"> <div style="margin-bottom: 10px;"> <<if _fish.icon>> <img @src="_fish.icon" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="font-size: 36px;">🐟</div> <</if>> </div> <div style="color: <<print _color>>; font-weight: bold; font-size: 14px; margin-bottom: 4px;"><<print _fish.name>></div> <div style="color: <<print _color>>; font-size: 10px; text-transform: uppercase; margin-bottom: 8px;"><<print _fish.rarity>></div> <div style="color: #2ecc71; font-weight: bold; margin-bottom: 10px;">$<<print _fishPrice>></div> <<link "<div style='background: #2ecc71; color: white; padding: 8px; border-radius: 6px; font-size: 12px; font-weight: bold;'>Sell</div>">> <<set $lastFishSale = setup.fishing.sellFish(_i)>> <<goto "FishingDealership">> <</link>> </div> <</capture>> <</for>> </div> <<else>> <div style="background-color: #1a1a1a; padding: 40px; border-radius: 8px; border: 1px solid #333; text-align: center;"> <div style="font-size: 48px; margin-bottom: 15px;">🎣</div> <h3 style="color: #888; margin: 0 0 10px 0;">No Fish to Sell</h3> <p style="color: #666; margin: 0;">Go catch some fish first!</p> </div> <</if>> <</if>> </div> <!-- Back Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #3498db; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #3498db44; display: inline-block;'>← Leave Dealership</div>">><<goto "Docks">><</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #3498db 0%, #2874a6 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Boat Sales</h1> <p style="color: #aed6f1; margin: 0; font-size: 16px; text-align: center;">Your Money: $<<print $money || 0>> | Current Boat: <<if $boat>><<print setup.fishing.boats[$boat].name>><<else>>None<</if>></p> </div> <div style="display: grid; gap: 20px; margin-bottom: 25px;"> <<for _tier, _boat range setup.fishing.boats>> <<set _owned = $boat && $boat >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _boat.price>> <<set _isUpgrade = $boat && $boat < _tier>> <div style="border: 3px solid <<if _owned>>#2ecc71<<elseif _canBuy>>#3498db<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div style="flex: 1; min-width: 200px;"> <h3 style="color: <<if _owned>>#2ecc71<<else>>#3498db<</if>>; margin: 0 0 8px 0;">Tier <<print _tier>>: <<print _boat.name>></h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;"><<print _boat.description>></p> <div style="color: #888; font-size: 12px;"> Ocean Access: <<print _boat.oceanAccess.join(", ")>><br> Max Tank Tier: <<print _boat.maxTankTier>> </div> </div> <div style="text-align: right;"> <div style="color: #2ecc71; font-size: 24px; font-weight: bold; margin-bottom: 10px;">$<<print _boat.price>></div> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Owned</div> <<elseif _canBuy>> <<capture _tier, _boat>> <<link "<div style='background: #3498db; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold; cursor: pointer;'><<if _isUpgrade>>Upgrade<<else>>Purchase<</if>></div>">> <<set $money -= _boat.price>> <<set $boat = _tier>> <<goto "DealershipBoats">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Not Enough Money</div> <</if>> </div> </div> </div> <</for>> </div> <div style="text-align: center;"> <<link "<div style='background: #555; padding: 15px 40px; border-radius: 10px; display: inline-block; color: white; font-weight: bold;'>← Back to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Boat Upgrades</h1> <p style="color: #d7bde2; margin: 0; font-size: 16px; text-align: center;">Your Money: $<<print $money || 0>> | Boat: <<print setup.fishing.boats[$boat].name>></p> </div> <!-- Installed Upgrades --> <<if $boatUpgrades && $boatUpgrades.length > 0>> <div style="background: #2a2a2a; padding: 15px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #2ecc71;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">Installed Upgrades</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px;"> <<for _upgradeId range $boatUpgrades>> <<set _upgrade = setup.fishing.boatUpgrades[_upgradeId]>> <<if _upgrade>> <div style="background: #1a1a1a; padding: 8px 15px; border-radius: 6px; border: 1px solid #2ecc71;"> <span style="color: #2ecc71;"><<print _upgrade.name>></span> </div> <</if>> <</for>> </div> </div> <</if>> <!-- Available Upgrades --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _upgradeId, _upgrade range setup.fishing.boatUpgrades>> <<set _owned = $boatUpgrades && $boatUpgrades.includes(_upgradeId)>> <<set _canBuy = !_owned && ($money || 0) >= _upgrade.price>> <div style="border: 3px solid <<if _owned>>#2ecc71<<elseif _canBuy>>#9b59b6<<else>>#555<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h4 style="color: <<if _owned>>#2ecc71<<else>>#9b59b6<</if>>; margin: 0 0 8px 0;"><<print _upgrade.name>></h4> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;"><<print _upgrade.description>></p> <div style="display: flex; justify-content: space-between; align-items: center;"> <div style="color: #2ecc71; font-weight: bold;">$<<print _upgrade.price>></div> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 8px 15px; border-radius: 6px; font-size: 12px; font-weight: bold;">Installed</div> <<elseif _canBuy>> <<capture _upgradeId, _upgrade>> <<link "<div style='background: #9b59b6; color: white; padding: 8px 15px; border-radius: 6px; font-size: 12px; font-weight: bold; cursor: pointer;'>Install</div>">> <<set $money -= _upgrade.price>> <<if !$boatUpgrades>><<set $boatUpgrades = []>><</if>> <<run $boatUpgrades.push(_upgradeId)>> <<goto "DealershipUpgrades">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 8px 15px; border-radius: 6px; font-size: 12px; font-weight: bold;">Need $<<print _upgrade.price>></div> <</if>> </div> </div> <</for>> </div> <div style="text-align: center;"> <<link "<div style='background: #555; padding: 15px 40px; border-radius: 10px; display: inline-block; color: white; font-weight: bold;'>← Back to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #2ecc71;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Fishing Tackle</h1> <p style="color: #a9dfbf; margin: 0; font-size: 16px; text-align: center;">Your Money: $<<print $money || 0>></p> </div> <!-- Current Tackle Status --> <div style="background: #2a2a2a; padding: 15px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #2ecc71;"> <h3 style="color: #2ecc71; margin: 0 0 10px 0;">Your Current Tackle</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; text-align: center;"> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px;"> <div style="color: #888; font-size: 11px;">Hook</div> <div style="color: #3498db; font-weight: bold;"><<if $tackle && $tackle.hook>><<print setup.fishing.hookTypes[$tackle.hook].name>><<else>>None<</if>></div> </div> <div style="background: #1a1a1a; padding: 10px; border-radius: 8px;"> <div style="color: #888; font-size: 11px;">Line</div> <div style="color: #9b59b6; font-weight: bold;"><<if $tackle && $tackle.line>><<print setup.fishing.lineTypes[$tackle.line].name>><<else>>None<</if>></div> </div> </div> </div> <!-- Hooks Section --> <h3 style="color: #3498db;">Hooks</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _hookId, _hook range setup.fishing.hookTypes>> <<set _owned = $tackle && $tackle.hook === _hookId>> <<set _canBuy = !_owned && ($money || 0) >= _hook.price>> <div style="border: 2px solid <<if _owned>>#2ecc71<<elseif _canBuy>>#3498db<<else>>#555<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h4 style="color: #3498db; margin: 0 0 10px 0;"><<print _hook.name>></h4> <div style="display: flex; justify-content: space-between; align-items: center;"> <span style="color: #2ecc71; font-weight: bold;">$<<print _hook.price>></span> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 6px 12px; border-radius: 6px; font-size: 12px; font-weight: bold;">Equipped</div> <<elseif _canBuy>> <<capture _hookId, _hook>> <<link "<div style='background: #3498db; color: white; padding: 6px 12px; border-radius: 6px; font-size: 12px; font-weight: bold;'>Buy</div>">> <<set $money -= _hook.price>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set $tackle.hook = _hookId>> <<goto "DealershipTackle">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 6px 12px; border-radius: 6px; font-size: 12px;">Need $<<print _hook.price>></div> <</if>> </div> </div> <</for>> </div> <!-- Lines Section --> <h3 style="color: #9b59b6;">Fishing Line</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _lineId, _line range setup.fishing.lineTypes>> <<set _owned = $tackle && $tackle.line === _lineId>> <<set _canBuy = !_owned && ($money || 0) >= _line.price>> <div style="border: 2px solid <<if _owned>>#2ecc71<<elseif _canBuy>>#9b59b6<<else>>#555<</if>>; border-radius: 10px; padding: 15px; background: #2a2a2a;"> <h4 style="color: #9b59b6; margin: 0 0 10px 0;"><<print _line.name>></h4> <div style="display: flex; justify-content: space-between; align-items: center;"> <span style="color: #2ecc71; font-weight: bold;">$<<print _line.price>></span> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 6px 12px; border-radius: 6px; font-size: 12px; font-weight: bold;">Equipped</div> <<elseif _canBuy>> <<capture _lineId, _line>> <<link "<div style='background: #9b59b6; color: white; padding: 6px 12px; border-radius: 6px; font-size: 12px; font-weight: bold;'>Buy</div>">> <<set $money -= _line.price>> <<if !$tackle>><<set $tackle = {hook: null, line: null}>><</if>> <<set $tackle.line = _lineId>> <<goto "DealershipTackle">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 6px 12px; border-radius: 6px; font-size: 12px;">Need $<<print _line.price>></div> <</if>> </div> </div> <</for>> </div> <div style="text-align: center;"> <<link "<div style='background: #555; padding: 15px 40px; border-radius: 10px; display: inline-block; color: white; font-weight: bold;'>← Back to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #f39c12;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Fish Storage Tanks</h1> <p style="color: #fdebd0; margin: 0; font-size: 16px; text-align: center;">Your Money: $<<print $money || 0>> | Current Capacity: <<print setup.fishing.getMaxInventory()>> fish</p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #f39c12;"> <p style="color: #aaa; margin: 0; text-align: center;">Without a tank, you can only hold 5 fish. Upgrade to store more!</p> </div> <div style="display: grid; gap: 20px; margin-bottom: 25px;"> <<for _tier, _tank range setup.fishing.fishTanks>> <<set _owned = $fishTank && $fishTank >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _tank.price>> <<set _hasBoatReq = _tank.requiredBoat === null || ($boat && $boat >= _tank.requiredBoat)>> <div style="border: 3px solid <<if _owned>>#2ecc71<<elseif _canBuy && _hasBoatReq>>#f39c12<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div style="flex: 1; min-width: 200px;"> <h3 style="color: <<if _owned>>#2ecc71<<else>>#f39c12<</if>>; margin: 0 0 8px 0;">Tier <<print _tier>> Storage Tank</h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;">Stores up to <<print _tank.capacity>> fish</p> <<if _tank.requiredBoat>> <p style="color: <<if _hasBoatReq>>#888<<else>>#e74c3c<</if>>; margin: 0; font-size: 12px;">Requires Tier <<print _tank.requiredBoat>>+ Boat</p> <</if>> </div> <div style="text-align: right;"> <div style="color: #2ecc71; font-size: 24px; font-weight: bold; margin-bottom: 10px;">$<<print _tank.price>></div> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Owned</div> <<elseif !_hasBoatReq>> <div style="background: #e74c3c; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Need Boat</div> <<elseif _canBuy>> <<capture _tier, _tank>> <<link "<div style='background: #f39c12; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold; cursor: pointer;'>Purchase</div>">> <<set $money -= _tank.price>> <<set $fishTank = _tier>> <<goto "DealershipTanks">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Not Enough Money</div> <</if>> </div> </div> </div> <</for>> </div> <div style="text-align: center;"> <<link "<div style='background: #555; padding: 15px 40px; border-radius: 10px; display: inline-block; color: white; font-weight: bold;'>← Back to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #e67e22 0%, #d35400 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; border: 2px solid #e67e22;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Fishing Poles</h1> <p style="color: #fdebd0; margin: 0; font-size: 16px; text-align: center;">Your Money: $<<print $money || 0>> | Current: <<print setup.fishing.getCurrentPole().name>></p> </div> <div style="display: grid; gap: 20px; margin-bottom: 25px;"> <<for _tier, _pole range setup.fishing.fishingPoles>> <<set _owned = ($fishingPole || 1) >= _tier>> <<set _canBuy = !_owned && ($money || 0) >= _pole.price && _pole.price > 0>> <div style="border: 3px solid <<if _owned>>#2ecc71<<elseif _canBuy>>#e67e22<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div style="flex: 1; min-width: 200px;"> <h3 style="color: <<if _owned>>#2ecc71<<else>>#e67e22<</if>>; margin: 0 0 8px 0;">Tier <<print _tier>>: <<print _pole.name>></h3> <p style="color: #aaa; margin: 0 0 10px 0; font-size: 14px;"><<print _pole.description>></p> <<set _maxRarity = setup.fishing.getMaxRarity(_pole)>> <div style="color: #888; font-size: 12px;"> Max Rarity: <span style="color: <<print setup.fishing.rarityColors[_maxRarity]>>;"><<print _maxRarity>></span> </div> </div> <div style="text-align: right;"> <<if _pole.price > 0>> <div style="color: #2ecc71; font-size: 24px; font-weight: bold; margin-bottom: 10px;">$<<print _pole.price>></div> <<else>> <div style="color: #888; font-size: 18px; margin-bottom: 10px;">Starter Rod</div> <</if>> <<if _owned>> <div style="background: #2ecc71; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Owned</div> <<elseif _canBuy>> <<capture _tier, _pole>> <<link "<div style='background: #e67e22; color: white; padding: 10px 20px; border-radius: 6px; font-weight: bold; cursor: pointer;'>Purchase</div>">> <<set $money -= _pole.price>> <<set $fishingPole = _tier>> <<goto "DealershipPoles">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #666; padding: 10px 20px; border-radius: 6px; font-weight: bold;">Not Enough Money</div> <</if>> </div> </div> </div> <</for>> </div> <div style="text-align: center;"> <<link "<div style='background: #555; padding: 15px 40px; border-radius: 10px; display: inline-block; color: white; font-weight: bold;'>← Back to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<goto "FishingDealership">> <</nobr>>
<<nobr>> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<if !$fishingStats>><<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>><</if>> <<set _hasRod = $fishingPole && $fishingPole > 0>> <<set _level = setup.fishing.getLevel()>> <<set _xpProgress = setup.fishing.getXpProgress()>> <<set _stats = setup.fishing.getCollectionStats()>> <<set _boat = setup.fishing.getCurrentBoat()>> <!-- Check if player is exhausted --> <<if setup.hasDebuff("exhaustion")>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #ff6b6b;"> <div style="font-size: 64px; margin-bottom: 20px;">🎣</div> <h2 style="color: #ff6b6b; margin: 0 0 15px 0;">Too Exhausted to Fish</h2> <p style="color: #aaa; margin: 0 0 20px 0;">You need to sleep before you can go ocean fishing. Get some rest!</p> <<link "<div style='background: #3498db; color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold;'>Go to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <!-- Check if player has a fishing rod --> <<elseif !_hasRod>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #e74c3c;"> <div style="font-size: 64px; margin-bottom: 20px;">🎣</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">No Fishing Rod!</h2> <p style="color: #aaa; margin: 0 0 20px 0;">You need a fishing rod before you can go ocean fishing. Visit the Fishing Dealership to purchase one.</p> <<link "<div style='background: #3498db; color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold;'>Go to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <!-- Check if player has a boat --> <<elseif !$boat>> <div style="background: linear-gradient(180deg, #1a3a5c 0%, #0d1f33 100%); min-height: 100vh; padding: 20px; display: flex; flex-direction: column; justify-content: center; align-items: center;"> <div style="background: #2a2a2a; padding: 40px; border-radius: 20px; max-width: 500px; text-align: center; border: 3px solid #e74c3c;"> <div style="font-size: 64px; margin-bottom: 20px;">⛵</div> <h2 style="color: #e74c3c; margin: 0 0 15px 0;">No Boat!</h2> <p style="color: #aaa; margin: 0 0 20px 0;">You need a boat to go ocean fishing. Visit the Fishing Dealership to purchase one.</p> <<link "<div style='background: #3498db; color: white; padding: 15px 30px; border-radius: 10px; font-weight: bold;'>Go to Dealership</div>">> <<goto "FishingDealership">> <</link>> </div> </div> <<else>> <div style="background: linear-gradient(180deg, #0a2a4a 0%, #051525 50%, #000510 100%); min-height: 100vh; padding: 20px;"> <div style="background: linear-gradient(135deg, #0a3d62 0%, #1a5276 100%); padding: 25px; border-radius: 15px; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4); border: 2px solid #3498db;"> <h1 style="color: white; margin: 0 0 8px 0; font-size: 32px; text-align: center;">Ocean Fishing</h1> <p style="color: #aed6f1; margin: 0; font-size: 16px; text-align: center;">Deep waters hold legendary creatures. Be careful out there!</p> </div> <!-- Boat Status --> <div style="background: #2a2a2a; padding: 15px; border-radius: 12px; margin-bottom: 20px; border: 2px solid #3498db;"> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; text-align: center;"> <div> <div style="color: #3498db; font-size: 18px; font-weight: bold;"><<print _boat.name>></div> <div style="color: #aaa; font-size: 12px;">Your Boat</div> </div> <div> <<set _invCount = setup.fishing.getInventoryCount()>> <<set _maxInv = setup.fishing.getMaxInventory()>> <<set _invPercent = Math.round((_invCount / _maxInv) * 100)>> <div style="color: <<if _invPercent >= 100>>#e74c3c<<elseif _invPercent >= 75>>#f39c12<<else>>#2ecc71<</if>>; font-size: 18px; font-weight: bold;"><<print _invCount>>/<<print _maxInv>></div> <div style="color: #aaa; font-size: 12px;">Fish Inventory</div> <div style="background: #1a1a1a; border-radius: 4px; height: 6px; margin-top: 4px; overflow: hidden;"> <div style="background: <<if _invPercent >= 100>>#e74c3c<<elseif _invPercent >= 75>>#f39c12<<else>>#2ecc71<</if>>; height: 100%; width: <<print _invPercent>>%;"></div> </div> </div> <div> <div style="color: #3498db; font-size: 18px; font-weight: bold;">Level <<print _level>></div> <div style="color: #aaa; font-size: 12px;">Fishing Skill</div> </div> </div> </div> <!-- Ocean Zones --> <h3 style="color: #3498db;">Choose Fishing Zone</h3> <div style="display: grid; gap: 15px; margin-bottom: 25px;"> <!-- Shallow Ocean --> <<set _canAccessShallow = setup.fishing.canAccessZone("shallowOcean")>> <div style="border: 3px solid <<if _canAccessShallow>>#3498db<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div> <h3 style="color: #3498db; margin: 0 0 8px 0;">Shallow Ocean</h3> <p style="color: #aaa; margin: 0; font-size: 14px;">Near-shore waters. Common to Rare fish. Safest zone.</p> </div> <<if _canAccessShallow>> <<link "<div style='background: #3498db; color: white; padding: 12px 25px; border-radius: 8px; font-weight: bold;'>Fish Here</div>">> <<set $fishingLocation = "shallowOcean">> <<goto "FishingQTE">> <</link>> <<else>> <div style="background: #444; color: #666; padding: 12px 25px; border-radius: 8px; font-weight: bold;">Locked</div> <</if>> </div> </div> <!-- Deep Ocean --> <<set _canAccessDeep = setup.fishing.canAccessZone("deepOcean")>> <div style="border: 3px solid <<if _canAccessDeep>>#9b59b6<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a; opacity: <<if _canAccessDeep>>1<<else>>0.6<</if>>;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div> <h3 style="color: <<if _canAccessDeep>>#9b59b6<<else>>#555<</if>>; margin: 0 0 8px 0;">Deep Ocean</h3> <p style="color: #aaa; margin: 0; font-size: 14px;"><<if _canAccessDeep>>Far from shore. Rare to Legendary fish. Requires Tier 2+ boat.<<else>>Requires Fishing Boat or better.<</if>></p> </div> <<if _canAccessDeep>> <<link "<div style='background: #9b59b6; color: white; padding: 12px 25px; border-radius: 8px; font-weight: bold;'>Fish Here</div>">> <<set $fishingLocation = "deepOcean">> <<goto "FishingQTE">> <</link>> <<else>> <div style="background: #444; color: #666; padding: 12px 25px; border-radius: 8px; font-weight: bold;">Need Better Boat</div> <</if>> </div> </div> <!-- Abyssal Zone --> <<set _canAccessAbyssal = setup.fishing.canAccessZone("abyssal")>> <div style="border: 3px solid <<if _canAccessAbyssal>>#e74c3c<<else>>#555<</if>>; border-radius: 12px; padding: 20px; background: #2a2a2a; opacity: <<if _canAccessAbyssal>>1<<else>>0.6<</if>>;"> <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 15px;"> <div> <h3 style="color: <<if _canAccessAbyssal>>#e74c3c<<else>>#555<</if>>; margin: 0 0 8px 0;">Abyssal Zone</h3> <p style="color: #aaa; margin: 0; font-size: 14px;"><<if _canAccessAbyssal>>The deep unknown. Legendary and Mythical creatures. Requires Charter Vessel.<<else>>Requires Charter Vessel.<</if>></p> </div> <<if _canAccessAbyssal>> <<link "<div style='background: #e74c3c; color: white; padding: 12px 25px; border-radius: 8px; font-weight: bold;'>Fish Here</div>">> <<set $fishingLocation = "abyssal">> <<goto "FishingQTE">> <</link>> <<else>> <div style="background: #444; color: #666; padding: 12px 25px; border-radius: 8px; font-weight: bold;">Need Charter Vessel</div> <</if>> </div> </div> </div> <!-- Navigation --> <div style="display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px;"> <<link "<div style='background: #2ecc71; padding: 15px; border-radius: 10px; text-align: center; color: white; font-weight: bold;'>Fish Market</div>">> <<goto "FishMarket">> <</link>> <<link "<div style='background: #e74c3c; padding: 15px; border-radius: 10px; text-align: center; color: white; font-weight: bold;'>Repair Boat</div>">> <<goto "DealershipRepair">> <</link>> <<link "<div style='background: #555; padding: 15px; border-radius: 10px; text-align: center; color: white; font-weight: bold;'>← Return to Docks</div>">> <<set $fishingLocation = null>> <<goto $lastLocation>> <</link>> </div> </div> <</if>> <</nobr>>
<<nobr>> <<set _relColor = "#3498db">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <!-- Back to Debug Menu Button --> <div style="text-align: center; margin-bottom: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Debug Menu</div>">> <<goto "Debug">> <</link>> </div> <!-- Header --> <div style="padding: 20px; background: linear-gradient(135deg, <<= _relColor>> 0%, <<= _relColor>>aa 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<= _relColor>>; box-shadow: 0 0 20px <<= _relColor>>66;"> <h1 style="color: white; text-align: center; margin: 0; text-shadow: 0 2px 4px rgba(0,0,0,0.5);">🎣 Fishing Debug</h1> </div> <!-- Current Stats Display --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid <<= _relColor>>; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: <<= _relColor>>; margin: 0 0 15px 0; text-align: center;">Current Fishing Stats</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px;"> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #333;"> <div style="color: #aaa; font-size: 12px;">Fishing Level</div> <div style="color: #3498db; font-size: 24px; font-weight: bold;"><<print setup.fishing.getLevel()>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #333;"> <div style="color: #aaa; font-size: 12px;">Fishing XP</div> <div style="color: #f39c12; font-size: 24px; font-weight: bold;"><<print ($fishingSkill && $fishingSkill.xp) || 0>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #333;"> <div style="color: #aaa; font-size: 12px;">Current Rod</div> <div style="color: #9b59b6; font-size: 18px; font-weight: bold;"><<if $fishingPole && $fishingPole > 0>>Tier <<print $fishingPole>><<else>>None<</if>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #333;"> <div style="color: #aaa; font-size: 12px;">Current Boat</div> <div style="color: #2ecc71; font-size: 18px; font-weight: bold;"><<if $boat && $boat > 0>>Tier <<print $boat>><<else>>None<</if>></div> </div> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; text-align: center; border: 1px solid #333;"> <div style="color: #aaa; font-size: 12px;">Storage Tank</div> <div style="color: #f39c12; font-size: 18px; font-weight: bold;"><<if $fishTank>>Tier <<print $fishTank>><<else>>None<</if>></div> <div style="color: #888; font-size: 11px;">(<<print setup.fishing.getMaxInventory()>> fish)</div> </div> </div> </div> <!-- Fishing Rods Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #9b59b6; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #9b59b6; margin: 0 0 15px 0; text-align: center;">🎣 Fishing Rods</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Give Tier 1 Rod</div>">> <<set $fishingPole = 1>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Give Tier 2 Rod</div>">> <<set $fishingPole = 2>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Give Tier 3 Rod</div>">> <<set $fishingPole = 3>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Remove Rod</div>">> <<set $fishingPole = 0>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Boats Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #2ecc71; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #2ecc71; margin: 0 0 15px 0; text-align: center;">⛵ Boats</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #2ecc71; color: #2ecc71; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Give Rowboat</div>">> <<set $boat = 1>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Remove Boat</div>">> <<set $boat = 0>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Fish Storage Tanks Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #f39c12; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #f39c12; margin: 0 0 15px 0; text-align: center;">🪣 Fish Storage Tanks</h2> <p style="color: #888; text-align: center; margin: 0 0 15px 0; font-size: 12px;">Current: <<if $fishTank>>Tier <<print $fishTank>> (<<print setup.fishing.getMaxInventory()>> fish)<<else>>No Tank (5 fish)<</if>></p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f39c12; color: #f39c12; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Unlock Tier 1 Tank (20 fish)</div>">> <<set $fishTank = 1>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f39c12; color: #f39c12; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Unlock Tier 2 Tank (50 fish)</div>">> <<set $fishTank = 2>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #f39c12; color: #f39c12; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Unlock Tier 3 Tank (100 fish)</div>">> <<set $fishTank = 3>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Remove Tank</div>">> <<set $fishTank = 0>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Fishing XP Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #3498db; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #3498db; margin: 0 0 15px 0; text-align: center;">⭐ Fishing XP</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>+100 XP</div>">> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<set $fishingSkill.xp += 100>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>+500 XP</div>">> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<set $fishingSkill.xp += 500>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>+1,000 XP</div>">> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<set $fishingSkill.xp += 1000>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #51cf66; color: #51cf66; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>+5,000 XP</div>">> <<if !$fishingSkill>><<set $fishingSkill = {xp: 0}>><</if>> <<set $fishingSkill.xp += 5000>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Reset XP</div>">> <<set $fishingSkill = {xp: 0}>> <<goto "DebugFishing">> <</link>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-top: 15px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Set to Level 10</div>">> <<set $fishingSkill = {xp: 550}>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Set to Level 25</div>">> <<set $fishingSkill = {xp: 3250}>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Set to Level 50</div>">> <<set $fishingSkill = {xp: 12750}>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #ffd700; color: #ffd700; padding: 12px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Set to Level 99</div>">> <<set $fishingSkill = {xp: 49005}>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Unlock All Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #ffd700; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0; text-align: center;">⚡ Quick Actions</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <<link "<div style='background: linear-gradient(135deg, #ffd700 0%, #f39c12 100%); color: #1a1a1a; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🌟 Unlock Everything</div>">> <<set $fishingPole = 3>> <<set $boat = 1>> <<set $fishCapacity = 35>> <<set $fishingSkill = {xp: 49005}>> <<set $hiddenPondUnlocked = true>> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<for _fid range Object.keys(setup.fishing.fish)>> <<if !setup.fishing.fish[_fid].hidden && !$fishCollection.includes(_fid)>> <<run $fishCollection.push(_fid)>> <</if>> <</for>> <<run setup.fishing.checkFishingMilestones()>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🌿 Unlock Hidden Pond</div>">> <<set $hiddenPondUnlocked = true>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>📖 Unlock All Fish</div>">> <<if !$fishCollection>><<set $fishCollection = []>><</if>> <<for _fid range Object.keys(setup.fishing.fish)>> <<if !setup.fishing.fish[_fid].hidden && !$fishCollection.includes(_fid)>> <<run $fishCollection.push(_fid)>> <</if>> <</for>> <<run setup.fishing.checkFishingMilestones()>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #ff6b9d 0%, #c44d7b 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🐟 Test Quill Catch</div>">> <<set $fishingPole = 3>> <<set $fishingLocation = "shallowOcean">> <<set $currentWeather = "Rainy">> <<set $timeOfDay = "Night">> <<goto "FishingQTE">> <</link>> </div> <!-- QTE Fish Test by Rarity + Rod Tier --> <h3 style="color: #51cf66; margin: 20px 0 10px 0; text-align: center;">🎣 QTE Fish Test (Rarity + Rod Tier)</h3> <p style="color: #888; font-size: 12px; text-align: center; margin-bottom: 15px;">Tests the full QTE minigame with a forced rarity. Pick a rod tier to test difficulty scaling.</p> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 10px;"> <<for _rarity range ["common", "uncommon", "rare", "epic", "legendary", "mythical"]>> <<set _rarityColors = {common: "#aaaaaa", uncommon: "#51cf66", rare: "#339af0", epic: "#a855f7", legendary: "#ffd700", mythical: "#ff6b9d"}>> <<set _rc = _rarityColors[_rarity]>> <div style="background: #1a1a1a; border: 2px solid <<print _rc>>; border-radius: 10px; padding: 15px; text-align: center;"> <div style="color: <<print _rc>>; font-weight: bold; font-size: 16px; text-transform: uppercase; margin-bottom: 10px;"><<print _rarity>></div> <div style="display: flex; gap: 6px; justify-content: center; flex-wrap: wrap;"> <<capture _rarity>> <<link "<div style='background: #5a3a1a; color: #c49a6c; padding: 8px 12px; border-radius: 6px; font-size: 12px; font-weight: bold; cursor: pointer; border: 1px solid #8b6914;'>T1 Wood</div>">> <<set $fishingPole = 1>> <<set $debugForceRarity = _rarity>> <<goto "DebugFishingQTE">> <</link>> <<link "<div style='background: #2a4a6a; color: #7ab8e0; padding: 8px 12px; border-radius: 6px; font-size: 12px; font-weight: bold; cursor: pointer; border: 1px solid #3a7abd;'>T2 Fiber</div>">> <<set $fishingPole = 2>> <<set $debugForceRarity = _rarity>> <<goto "DebugFishingQTE">> <</link>> <<link "<div style='background: #4a2a6a; color: #c490f0; padding: 8px 12px; border-radius: 6px; font-size: 12px; font-weight: bold; cursor: pointer; border: 1px solid #8a50d0;'>T3 Master</div>">> <<set $fishingPole = 3>> <<set $debugForceRarity = _rarity>> <<goto "DebugFishingQTE">> <</link>> <</capture>> </div> </div> <</for>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-top: 15px;"> <<link "<div style='background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); color: white; padding: 20px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px;'>🗑️ Reset All Fishing</div>">> <<set $fishingPole = 0>> <<set $boat = 0>> <<set $fishCapacity = 4>> <<set $fishingSkill = {xp: 0}>> <<set $fishInventory = []>> <<set $fishCollection = []>> <<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>> <<set $hiddenPondUnlocked = false>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Fish Inventory Section --> <div style="background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); padding: 20px; border-radius: 12px; border: 3px solid #e74c3c; box-shadow: 0 4px 8px rgba(0,0,0,0.4); margin-bottom: 20px;"> <h2 style="color: #e74c3c; margin: 0 0 15px 0; text-align: center;">🐟 Fish Inventory</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #e74c3c; color: #e74c3c; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Clear Fish Inventory</div>">> <<set $fishInventory = []>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #9b59b6; color: #9b59b6; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Clear Collection</div>">> <<set $fishCollection = []>> <<goto "DebugFishing">> <</link>> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 2px solid #3498db; color: #3498db; padding: 15px; border-radius: 8px; text-align: center; cursor: pointer; font-weight: bold;'>Reset Stats</div>">> <<set $fishingStats = {totalCatches: 0, moneyEarned: 0}>> <<goto "DebugFishing">> <</link>> </div> </div> <!-- Back to Debug Menu Button (Bottom) --> <div style="text-align: center; margin-top: 20px;"> <<link "<div style='background: linear-gradient(135deg, #2d2d2d 0%, #1a1a1a 100%); border: 3px solid #667eea; color: white; padding: 15px; border-radius: 10px; text-align: center; cursor: pointer; font-weight: bold; font-size: 16px; box-shadow: 0 4px 8px rgba(0,0,0,0.4), 0 0 20px #667eea44; display: inline-block;'>← Back to Debug Menu</div>">> <<goto "Debug">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomRenovation">> <<set _size = $renovateRoomSize || "small">> <<set _index = $renovateRoomIndex || 0>> <<set _returnPassage = $renovateReturnPassage || "PlayerSuburbanHome">> <<set _options = setup.roomRenovations[_size] || []>> <<set _home = setup.getCurrentHome()>> <!-- Initialize if needed --> <<if !$homeRenovations>><<set $homeRenovations = {}>><</if>> <<if !$homeRenovations[_home]>><<set $homeRenovations[_home] = {small: [], medium: [], large: []}>><</if>> <!-- Check if this is a re-renovation --> <<set _existingRoom = $homeRenovations[_home][_size][_index] || null>> <<set _isReRenovation = _existingRoom !== null>> <<set _sizeColors = { small: "#51cf66", medium: "#ffd700", large: "#e74c3c" }>> <<set _sizeColor = _sizeColors[_size] || "#667eea">> <<set _sizeLabels = { small: "Small Room", medium: "Medium Room", large: "Large Room" }>> <<set _sizeLabel = _sizeLabels[_size] || "Room">> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: <<print _sizeColor>>; text-align: center;">🔧 <<if _isReRenovation>>Re-Renovate<<else>>Room Renovation<</if>></h1> <<if _isReRenovation>> <<set _existingData = setup.roomRenovations[_size].find(function(r) { return r.id === _existingRoom; })>> <div style="padding: 15px; background: #3a2a2a; border-radius: 10px; margin-bottom: 20px; border: 2px solid #e74c3c;"> <p style="color: #e74c3c; font-size: 16px; margin: 0; text-align: center;"> ⚠️ Currently: <<print _existingData.icon>> <<print _existingData.name>> </p> <p style="color: #888; font-size: 13px; margin: 5px 0 0 0; text-align: center;"> Re-renovating will return any decor from this room to storage. </p> </div> <</if>> <div style="padding: 20px; background: linear-gradient(135deg, <<print _sizeColor>> 0%, <<print _sizeColor>>99 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<print _sizeColor>>;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Choose what to convert this <<print _sizeLabel.toLowerCase()>> into. </p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #ffd700; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; margin-bottom: 25px;"> <<for _option range _options>> <<set _canAfford = $money >= _option.cost>> <<set _isSameRoom = _existingRoom === _option.id>> <<set _isComingSoon = _option.comingSoon || false>> <div style="border: 3px solid <<if _isSameRoom || _isComingSoon>>#666<<else>><<print _option.color>><</if>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4); <<if _isSameRoom || _isComingSoon>>opacity: 0.6;<</if>>"> <h3 style="color: <<if _isSameRoom || _isComingSoon>>#666<<else>><<print _option.color>><</if>>; margin: 0 0 10px 0;"><<print _option.icon>> <<print _option.name>><<if _isSameRoom>> (Current)<</if>><<if _isComingSoon>> <span style="color: #ffa500; font-size: 12px;">(Coming Soon)</span><</if>></h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 10px 0;"><<print _option.description>></p> <p style="color: #51cf66; font-size: 13px; margin: 0 0 15px 0;">✓ <<print _option.benefit>></p> <p style="color: #ffd700; font-weight: bold; margin: 0 0 15px 0;">Cost: $<<print _option.cost>></p> <<if _isComingSoon>> <div style="background: #3a3a3a; color: #ffa500; padding: 12px; border-radius: 6px; text-align: center; border: 1px solid #ffa500;">🚧 Coming Soon</div> <<elseif _isSameRoom>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Already This Room</div> <<elseif _canAfford>> <<capture _option, _size, _index, _returnPassage, _home, _existingRoom, _isReRenovation>> <<set _btnLabel = "<div style='background: linear-gradient(135deg, " + _option.color + " 0%, " + _option.color + "cc 100%); color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Renovate ($" + _option.cost + ")</div>">> <<link _btnLabel>> <!-- Handle re-renovation cleanup --> <<if _isReRenovation>> <!-- Return decor from this room to storage --> <<set _roomKey = _size + "_" + _index>> <<if $homeDecor[_home] && $homeDecor[_home].placedDecor>> <<for _decorKey, _placedItem range $homeDecor[_home].placedDecor>> <<if _placedItem && _placedItem.room === _roomKey>> <!-- Move decor back to storage --> <<if !$decorStorage>><<set $decorStorage = []>><</if>> <<run $decorStorage.push({ id: _placedItem.id, name: _placedItem.name, icon: _placedItem.icon, category: _placedItem.category, rarity: _placedItem.rarity })>> <<run delete $homeDecor[_home].placedDecor[_decorKey]>> <</if>> <</for>> <</if>> <!-- Remove old room bonuses --> <<if _existingRoom === "home_office">> <<set $bonusDailyTrades = Math.max(0, ($bonusDailyTrades || 0) - 2)>> <<elseif _existingRoom === "small_fish_tank">> <!-- Return fish to inventory --> <<if $homeFishTanks && $homeFishTanks[_home] && $homeFishTanks[_home].small>> <<for _fish range $homeFishTanks[_home].small.fish>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<run $fishInventory.push(_fish)>> <</for>> <<run delete $homeFishTanks[_home].small>> <</if>> <<elseif _existingRoom === "medium_fish_tank">> <!-- Return fish to inventory --> <<if $homeFishTanks && $homeFishTanks[_home] && $homeFishTanks[_home].medium>> <<for _fish range $homeFishTanks[_home].medium.fish>> <<if !$fishInventory>><<set $fishInventory = []>><</if>> <<run $fishInventory.push(_fish)>> <</for>> <<run delete $homeFishTanks[_home].medium>> <</if>> <</if>> <</if>> <!-- Pay for renovation --> <<set $money -= _option.cost>> <!-- Set or replace room at index --> <<if _isReRenovation>> <<set $homeRenovations[_home][_size][_index] = _option.id>> <<else>> <!-- New renovation - push if array isn't long enough --> <<if $homeRenovations[_home][_size].length <= _index>> <<run $homeRenovations[_home][_size].push(_option.id)>> <<else>> <<set $homeRenovations[_home][_size][_index] = _option.id>> <</if>> <</if>> <!-- Apply new room bonuses --> <<if _option.id === "small_fish_tank">> <<if !$homeFishTanks>><<set $homeFishTanks = {}>><</if>> <<if !$homeFishTanks[_home]>><<set $homeFishTanks[_home] = {}>><</if>> <<set $homeFishTanks[_home].small = {fish: [], capacity: 5}>> <<elseif _option.id === "medium_fish_tank">> <<if !$homeFishTanks>><<set $homeFishTanks = {}>><</if>> <<if !$homeFishTanks[_home]>><<set $homeFishTanks[_home] = {}>><</if>> <<set $homeFishTanks[_home].medium = {fish: [], capacity: 15}>> <<elseif _option.id === "home_office">> <<set $bonusDailyTrades = ($bonusDailyTrades || 0) + 2>> <</if>> <<goto "RoomRenovationManager">> <</link>> <</capture>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Cannot Afford</div> <</if>> </div> <</for>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Cancel</div>">> <<goto "RoomRenovationManager">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomHomeGym">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <<if !$homeGymHoursToday || $lastHomeGymDay !== $gameDay>> <<set $homeGymHoursToday = 0>> <<set $lastHomeGymDay = $gameDay>> <</if>> <<set _hoursRemaining = 3 - $homeGymHoursToday>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomHomeGym")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #e74c3c; text-align: center;">🏋️ Home Gym</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Your personal workout space. No gym membership required! </p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #ffd700; font-size: 16px; margin: 0;">⏰ Training Time Remaining Today: <strong><<print _hoursRemaining>> / 3 hours</strong></p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e74c3c; margin: 0 0 15px 0;">💪 Strength Training</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Build muscle with weights.</p> <<if _hoursRemaining > 0>> <<link "<div style='background: #e74c3c; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Train Strength (1 hour)</div>">> <<set $homeGymHoursToday += 1>> <<run advanceTime(60)>> <<set $stats.strength = Math.min($statMaxCaps.strength, $stats.strength + 1)>> <<goto "RoomHomeGym">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Too tired to train more today</div> <</if>> </div> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">🏃 Agility Training</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Improve coordination and speed.</p> <<if _hoursRemaining > 0>> <<link "<div style='background: #f39c12; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Train Dexterity (1 hour)</div>">> <<set $homeGymHoursToday += 1>> <<run advanceTime(60)>> <<set $stats.dexterity = Math.min($statMaxCaps.dexterity, $stats.dexterity + 1)>> <<goto "RoomHomeGym">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Too tired to train more today</div> <</if>> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #e74c3c; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomArtStudio">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomArtStudio")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #9b59b6; text-align: center;">🎨 Art Studio</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Express your creativity on canvas. </p> </div> <!-- Check for art-related traits --> <<set _canPaint = ($skills && ($skills.includes("Art") || $skills.includes("Painting"))) || ($mentalTraits && ($mentalTraits.includes("Artistic") || $mentalTraits.includes("Creative")))>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid <<if _canPaint>>#51cf66<<else>>#666<</if>>; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<if _canPaint>>#51cf66<<else>>#888<</if>>; margin: 0 0 15px 0;">🖼️ Create a Painting</h3> <<if _canPaint>> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Express yourself on canvas. Your creation will be stored in your decoration collection.</p> <<link "<div style='background: #51cf66; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Start Painting</div>">> <<goto "ArtStudioPaint">> <</link>> <<else>> <p style="color: #888; font-size: 14px; margin-bottom: 10px;">You lack the artistic ability to create paintings.</p> <p style="color: #ffd700; font-size: 12px; margin: 0;">Required traits: Art, Artistic, Creative, or Painting</p> <</if>> </div> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 15px 0;">📊 Studio Stats</h3> <p style="color: #ccc; font-size: 14px;">Paintings Created: <span style="color: #51cf66;"><<print ($playerPaintings ? $playerPaintings.length : 0)>></span></p> <p style="color: #888; font-size: 12px; margin-top: 10px;">Each painting takes 2 hours to complete and is stored in your decorations.</p> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "ArtStudioPaint">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <!-- Check for art-related traits --> <<set _canPaint = ($skills && ($skills.includes("Art") || $skills.includes("Painting"))) || ($mentalTraits && ($mentalTraits.includes("Artistic") || $mentalTraits.includes("Creative")))>> <<if !_canPaint>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px; max-width: 600px; margin: 0 auto; text-align: center;"> <h1 style="color: #ff6b6b;">❌ Cannot Paint</h1> <p style="color: #ccc; font-size: 16px; margin: 20px 0;">You lack the artistic ability to create paintings.</p> <p style="color: #ffd700; font-size: 14px; margin-bottom: 30px;">Required traits: Art, Artistic, Creative, or Painting</p> <<link "<div style='background: #9b59b6; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Back to Studio</div>">><<goto "RoomArtStudio">><</link>> </div> </div> <<else>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px; max-width: 600px; margin: 0 auto;"> <h1 style="color: #9b59b6; text-align: center;">🎨 Create Your Painting</h1> <div style="padding: 15px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> Paint your masterpiece on the canvas below! </p> </div> <!-- Painting Title --> <div style="margin-bottom: 15px;"> <label style="color: #9b59b6; font-weight: bold; display: block; margin-bottom: 8px;">Painting Title:</label> <<textbox "$tempPaintingTitle" "" autofocus>> </div> <!-- Drawing Canvas --> <div class="art-canvas-container"> <canvas id="artCanvas" class="art-canvas" width="400" height="300"></canvas> <!-- Color Palette --> <div id="art-palette" class="art-color-palette"></div> <!-- Tools Row --> <div class="art-tools-row"> <button id="art-tool-brush" class="art-tool-btn selected">🖌️ Brush</button> <button id="art-tool-eraser" class="art-tool-btn">🧽 Eraser</button> <button id="art-tool-clear" class="art-tool-btn">🗑️ Clear</button> </div> <!-- Brush Size --> <div class="art-brush-size"> <span>Brush Size:</span> <input type="range" id="art-brush-size" min="1" max="40" value="5"> <span id="art-size-label">5px</span> <div id="art-brush-preview" class="art-brush-preview"></div> </div> </div> <p style="color: #888; font-size: 14px; text-align: center; margin-top: 15px;">⏱️ Painting will take 2 hours to complete</p> <div style="display: flex; gap: 15px; justify-content: center; margin-top: 20px;"> <<link "<div style='background: #51cf66; color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold; cursor: pointer;'>🖌️ Finish Painting</div>">> <<if $tempPaintingTitle && $tempPaintingTitle.trim() !== "">> <<run advanceTime(120)>> <<if !$playerPaintings>><<set $playerPaintings = []>><</if>> <<set _imageData = window.ArtCanvas.getImageData()>> <<set _newPainting = { title: $tempPaintingTitle.trim(), imageData: _imageData, createdDay: $dayNumber, id: "painting_" + Date.now() }>> <<run $playerPaintings.push(_newPainting)>> <<set $lastCreatedPainting = _newPainting>> <<set $tempPaintingTitle = "">> <<goto "ArtStudioPaintResult">> <<else>> <<replace "#paint-error">> <p style="color: #ff6b6b; margin-top: 15px; text-align: center;">Please enter a title for your painting!</p> <</replace>> <</if>> <</link>> <<link "<div style='background: #666; color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold; cursor: pointer;'>← Cancel</div>">> <<set $tempPaintingTitle = "">> <<goto "RoomArtStudio">> <</link>> </div> <span id="paint-error"></span> </div></div> <</if>> <</nobr>>
<<nobr>> <<set $lastLocation = "ArtStudioPaintResult">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #51cf66; text-align: center;">🎨 Masterpiece Complete!</h1> <div style="padding: 20px; background: linear-gradient(135deg, #51cf66 0%, #2f9e44 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #51cf66;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> You step back from the easel and admire your work... </p> </div> <div style="background: #2a2a2a; padding: 30px; border-radius: 10px; margin-bottom: 25px; border: 2px solid #9b59b6; text-align: center;"> <<if $lastCreatedPainting.imageData>> <img @src="$lastCreatedPainting.imageData" class="painting-display-large" alt="Your Painting" style="margin-bottom: 20px;"> <<else>> <div style="font-size: 80px; margin-bottom: 20px;">🖼️</div> <</if>> <h2 style="color: #9b59b6; margin: 0 0 15px 0;">"<<print $lastCreatedPainting.title>>"</h2> <div style="background: #1a1a1a; padding: 15px; border-radius: 8px; display: inline-block;"> <p style="color: #51cf66; margin: 0;">✓ Painting added to your collection!</p> <p style="color: #888; font-size: 12px; margin: 5px 0 0 0;">Total paintings: <<print $playerPaintings.length>></p> </div> </div> <div style="display: flex; gap: 15px; justify-content: center;"> <<link "<div style='background: #9b59b6; color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold; cursor: pointer;'>🎨 Paint Another</div>">> <<goto "ArtStudioPaint">> <</link>> <<link "<div style='background: #51cf66; color: white; padding: 15px 30px; border-radius: 8px; font-weight: bold; cursor: pointer;'>← Back to Studio</div>">> <<goto "RoomArtStudio">> <</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "DecorHangPainting">> <<set _home = setup.getCurrentHome()>> <<set _painting = $selectedPaintingForHanging>> <<set _currentlyHungIn = setup.roomPaintings.isHung(_painting.id)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px; max-width: 600px; margin: 0 auto;"> <h1 style="color: #9b59b6; text-align: center;">🖼️ Hang Painting</h1> <div style="padding: 15px; background: linear-gradient(135deg, #9b59b6 0%, #8e44ad 100%); border-radius: 15px; margin-bottom: 20px; border: 2px solid #9b59b6;"> <p style="color: white; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> Choose where to display your artwork </p> </div> <!-- Selected Painting Preview --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #9b59b6; text-align: center;"> <<if _painting.imageData>> <img @src="_painting.imageData" class="painting-display-large" alt="Painting"> <<else>> <div style="font-size: 80px; margin-bottom: 10px;">🎨</div> <</if>> <h3 style="color: #9b59b6; margin: 15px 0 5px 0;">"<<print _painting.title>>"</h3> <<if _currentlyHungIn>> <p style="color: #51cf66; font-size: 14px; margin: 0;">Currently hung in: <<print _currentlyHungIn>></p> <<else>> <p style="color: #888; font-size: 14px; margin: 0;">Not currently displayed</p> <</if>> </div> <!-- Room Selection --> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #51cf66;"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">Select a Room</h3> <<set _availableRooms = setup.roomPaintings.getAvailableRooms()>> <<if _availableRooms.length === 0>> <p style="color: #888;">You need to renovate rooms before you can hang paintings!</p> <p style="color: #666; font-size: 12px;">Visit the Renovation Manager to add rooms to your home.</p> <<else>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px;"> <<for _room range _availableRooms>> <<set _roomHasPainting = setup.roomPaintings.getPainting(_room.id)>> <<set _isCurrentRoom = _currentlyHungIn === _room.id>> <<capture _room, _painting>> <<link "<div style='background: <<if _isCurrentRoom>>#51cf66<<elseif _roomHasPainting>>#666<<else>>#3a3a3a<</if>>; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; border: 2px solid <<if _isCurrentRoom>>#51cf66<<else>>#555<</if>>;'><<print _room.name>><<if _roomHasPainting && !_isCurrentRoom>> 🖼️<</if>><<if _isCurrentRoom>> ✓<</if>></div>">> <<run setup.roomPaintings.assignToRoom(_painting.id, _room.id)>> <<goto "HomeDecorManager">> <</link>> <</capture>> <</for>> </div> <p style="color: #666; font-size: 11px; margin-top: 10px; text-align: center;">🖼️ = Room already has a painting (will be replaced)</p> <</if>> </div> <!-- Remove from Wall Option --> <<if _currentlyHungIn>> <div style="background: #3a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; border: 2px solid #ff6b6b; text-align: center;"> <<link "<div style='background: #ff6b6b; color: white; padding: 12px 20px; border-radius: 6px; cursor: pointer; font-weight: bold; display: inline-block;'>🗑️ Remove from Wall</div>">> <<run setup.roomPaintings.removeFromRoom(_currentlyHungIn)>> <<goto "HomeDecorManager">> <</link>> </div> <</if>> <div style="text-align: center;"> <<link "<div style='background: #666; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Back to Decor Manager</div>">> <<set $selectedPaintingForHanging = null>> <<goto "HomeDecorManager">> <</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomStudy">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomStudy")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #8b4513; text-align: center;">📚 Study</h1> <div style="padding: 20px; background: linear-gradient(135deg, #8b4513 0%, #654321 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b4513;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A quiet space for reading and contemplation. </p> </div> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Coming Soon</h2> <p style="color: #ccc;">Book collection and reading features will be added in a future update!</p> </div> <div style="text-align: center;"> <<link "<div style='background: #8b4513; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomGuestBedroom">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomGuestBedroom")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #3498db; text-align: center;">🛏️ Guest Bedroom</h1> <div style="padding: 20px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #3498db;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A comfortable space for overnight guests. </p> </div> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Coming Soon</h2> <p style="color: #ccc;">NPC sleepover features will be added in a future update!</p> <p style="color: #888; font-size: 14px;">Requires level 2+ relationship with NPC</p> </div> <div style="text-align: center;"> <<link "<div style='background: #3498db; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomSmallFishTank">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <<if !$homeFishTanks>><<set $homeFishTanks = {}>><</if>> <<if !$homeFishTanks[_home]>><<set $homeFishTanks[_home] = {}>><</if>> <<if !$homeFishTanks[_home].small>><<set $homeFishTanks[_home].small = {fish: [], capacity: 5}>><</if>> <<set _tank = $homeFishTanks[_home].small>> <<set _capacity = _tank.capacity || 5>> <div style="background: linear-gradient(180deg, #0a1628 0%, #1a3a5c 50%, #0a1628 100%); min-height: 100vh; padding: 20px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomSmallFishTank")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #1e90ff; text-align: center;">🐠 Small Fish Tank</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #0d6efd 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A modest aquarium for your fish collection. </p> </div> <div style="display: flex; gap: 20px; margin-bottom: 20px; flex-wrap: wrap; justify-content: center;"> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #1e90ff;">🐟 Fish:</span> <span style="color: #51cf66;"><<print _tank.fish.length>> / <<print _capacity>></span> </div> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #ffd700;">⚠️ Limit:</span> <span style="color: #ccc;">Common to Epic only</span> </div> </div> <style> @keyframes fishSwim { 0%, 100% { transform: translateX(0px) translateY(0px); } 25% { transform: translateX(5px) translateY(-3px); } 50% { transform: translateX(0px) translateY(0px); } 75% { transform: translateX(-5px) translateY(3px); } } .fish-swimming { animation: fishSwim 3s ease-in-out infinite; } </style> <div style="background: linear-gradient(180deg, #0d47a1 0%, #1565c0 30%, #0d47a1 100%); border-radius: 15px; padding: 30px; min-height: 200px; position: relative; overflow: hidden; margin-bottom: 25px; border: 3px solid #1e90ff;"> <<if _tank.fish.length === 0>> <p style="text-align: center; color: #90caf9; padding-top: 60px; font-size: 18px;">The tank is empty. Transfer some fish from your inventory!</p> <<else>> <div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center;"> <<for _i, _fish range _tank.fish>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <<set _animDelay = (_i * 0.5) % 3>> <div class="fish-swimming" style="background: rgba(0,0,0,0.5); border: 2px solid <<print _rarityColor>>; border-radius: 10px; padding: 15px; text-align: center; min-width: 100px; animation-delay: <<print _animDelay>>s;"> <<if _fish.icon && _fish.icon.indexOf("Images/") === 0>> <img src="<<print _fish.icon>>" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="font-size: 2em;"><<print _fish.icon || "🐟">></div> <</if>> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold; font-size: 14px;"><<print _fish.name>></p> <p style="font-size: 11px; color: #90caf9; text-transform: capitalize; margin: 0;"><<print _fish.rarity>></p> </div> <</for>> </div> <</if>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #51cf66; border-radius: 10px; background: #2a2a2a; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🐟 Manage Fish</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Add or remove fish from your tank.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Manage Fish</div>">> <<set $fishTankType = "small">> <<goto "FishTankTransfer">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Return Home</div>">> <<goto _returnPassage>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomMediumFishTank">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <<if !$homeFishTanks>><<set $homeFishTanks = {}>><</if>> <<if !$homeFishTanks[_home]>><<set $homeFishTanks[_home] = {}>><</if>> <<if !$homeFishTanks[_home].medium>><<set $homeFishTanks[_home].medium = {fish: [], capacity: 15}>><</if>> <<set _tank = $homeFishTanks[_home].medium>> <<set _capacity = _tank.capacity || 15>> <div style="background: linear-gradient(180deg, #0a1628 0%, #1a3a5c 50%, #0a1628 100%); min-height: 100vh; padding: 20px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomMediumFishTank")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #1e90ff; text-align: center;">🐟 Medium Aquarium</h1> <div style="padding: 20px; background: linear-gradient(135deg, #1e90ff 0%, #0d6efd 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #1e90ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A spacious aquarium for your growing collection. </p> </div> <div style="display: flex; gap: 20px; margin-bottom: 20px; flex-wrap: wrap; justify-content: center;"> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #1e90ff;">🐟 Fish:</span> <span style="color: #51cf66;"><<print _tank.fish.length>> / <<print _capacity>></span> </div> <div style="background: #1a1a1a; padding: 15px 25px; border-radius: 8px;"> <span style="color: #ffd700;">⚠️ Limit:</span> <span style="color: #ccc;">Common to Epic only</span> </div> </div> <style> @keyframes fishSwim { 0%, 100% { transform: translateX(0px) translateY(0px); } 25% { transform: translateX(5px) translateY(-3px); } 50% { transform: translateX(0px) translateY(0px); } 75% { transform: translateX(-5px) translateY(3px); } } .fish-swimming { animation: fishSwim 3s ease-in-out infinite; } </style> <div style="background: linear-gradient(180deg, #0d47a1 0%, #1565c0 30%, #0d47a1 100%); border-radius: 15px; padding: 30px; min-height: 250px; position: relative; overflow: hidden; margin-bottom: 25px; border: 3px solid #1e90ff;"> <<if _tank.fish.length === 0>> <p style="text-align: center; color: #90caf9; padding-top: 80px; font-size: 18px;">The tank is empty. Transfer some fish from your inventory!</p> <<else>> <div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center;"> <<for _i, _fish range _tank.fish>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <<set _animDelay = (_i * 0.5) % 3>> <div class="fish-swimming" style="background: rgba(0,0,0,0.5); border: 2px solid <<print _rarityColor>>; border-radius: 10px; padding: 15px; text-align: center; min-width: 100px; animation-delay: <<print _animDelay>>s;"> <<if _fish.icon && _fish.icon.indexOf("Images/") === 0>> <img src="<<print _fish.icon>>" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="font-size: 2em;"><<print _fish.icon || "🐟">></div> <</if>> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold; font-size: 14px;"><<print _fish.name>></p> <p style="font-size: 11px; color: #90caf9; text-transform: capitalize; margin: 0;"><<print _fish.rarity>></p> </div> <</for>> </div> <</if>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #51cf66; border-radius: 10px; background: #2a2a2a; padding: 20px; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🐟 Manage Fish</h3> <p style="color: #ccc; font-size: 14px; margin: 0 0 15px 0;">Add or remove fish from your tank.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Manage Fish</div>">> <<set $fishTankType = "medium">> <<goto "FishTankTransfer">> <</link>> </div> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #1e90ff; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Return Home</div>">> <<goto _returnPassage>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomLaboratory">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <!-- Initialize lab variables if needed --> <<if !$labResearchHoursToday || $lastLabDay !== $dayNumber>> <<set $labResearchHoursToday = 0>> <<set $lastLabDay = $dayNumber>> <</if>> <<set _hoursRemaining = 4 - $labResearchHoursToday>> <div style="background: linear-gradient(180deg, #0a1f1c 0%, #0d2a26 50%, #0a1f1c 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #00d4aa; text-align: center;">🧪 Laboratory</h1> <div style="padding: 20px; background: linear-gradient(135deg, #00d4aa 0%, #008b7a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #00d4aa;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A state-of-the-art research facility for scientific self-improvement and trait research. </p> </div> <!-- Research Hours Display --> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #00d4aa; font-size: 16px; margin: 0;">🔬 Research Time Remaining Today: <strong><<print _hoursRemaining>> / 4 hours</strong></p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <!-- Intelligence Training --> <div style="border: 3px solid #4dabf7; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #4dabf7; margin: 0 0 10px 0;">📚 Research Study</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;">Study scientific journals and conduct experiments to improve your intelligence.</p> <p style="color: #51cf66; font-size: 13px; margin-bottom: 15px;">+1 Intelligence per hour</p> <<if _hoursRemaining > 0>> <<link "<div style='background: #4dabf7; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Study (1 hour)</div>">> <<set $labResearchHoursToday += 1>> <<run advanceTime(60)>> <<set $stats.intelligence = Math.min(100, ($stats.intelligence || 0) + 1)>> <<goto "RoomLaboratory">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Brain needs rest - study again tomorrow</div> <</if>> </div> <!-- Trait Analyzer --> <div style="border: 3px solid #e040fb; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #e040fb; margin: 0 0 10px 0;">🧬 Trait Analyzer</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;">Analyze your genetic makeup and view detailed information about your traits.</p> <p style="color: #888; font-size: 13px; margin-bottom: 15px;">View all your current traits</p> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center; font-weight: bold;">Coming Soon</div> </div> <!-- Trait Combiner --> <div style="border: 3px solid #ff6b35; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #ff6b35; margin: 0 0 10px 0;">⚗️ Trait Combiner</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;">Combine compatible traits to create more powerful versions.</p> <p style="color: #ffd43b; font-size: 13px; margin-bottom: 15px;">Costs 1 daily trade per attempt</p> <<if $tradesRemainingToday > 0>> <<link "<div style='background: #ff6b35; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Open Combiner</div>">> <<goto "LabTraitCombiner">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">No trades remaining today</div> <</if>> </div> </div> <!-- Return Home Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Return Home</div>">> <<goto _returnPassage>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "LabTraitAnalysis">> <div style="background: linear-gradient(180deg, #0a1f1c 0%, #0d2a26 50%, #0a1f1c 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #e040fb; text-align: center;">🧬 Trait Analysis</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e040fb 0%, #9c27b0 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e040fb;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Your complete genetic and trait profile analysis. </p> </div> <!-- Gather all player traits --> <<set _allTraits = []>> <<if $physicalTraits>> <<for _t range $physicalTraits>> <<run _allTraits.push({name: _t, type: "Physical"})>> <</for>> <</if>> <<if $mentalTraits>> <<for _t range $mentalTraits>> <<run _allTraits.push({name: _t, type: "Mental"})>> <</for>> <</if>> <!-- Trait Count Summary --> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #e040fb; font-size: 16px; margin: 0;">Total Traits: <strong><<print _allTraits.length>></strong></p> </div> <!-- Traits Display --> <<if _allTraits.length > 0>> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _i, _traitObj range _allTraits>> <<set _traitData = setup.traits ? setup.traits.find(function(t) { return t.name === _traitObj.name; }) : null>> <<set _traitColor = _traitData && _traitData.color ? _traitData.color : "#00d4aa">> <<set _traitDesc = _traitData && _traitData.description ? _traitData.description : "No data available">> <<capture _traitObj, _traitData, _traitColor, _traitDesc>> <<link "<div style='border: 2px solid " + _traitColor + "; border-radius: 10px; padding: 15px; background: #1a1a1a; cursor: pointer; transition: all 0.2s;' onmouseover='this.style.background=\"#2a2a2a\"; this.style.transform=\"scale(1.02)\"' onmouseout='this.style.background=\"#1a1a1a\"; this.style.transform=\"scale(1)\"'><h4 style='color: " + _traitColor + "; margin: 0 0 8px 0;'>" + _traitObj.name + "</h4><p style='color: #888; font-size: 12px; margin: 0 0 5px 0; text-transform: uppercase;'>" + _traitObj.type + "</p><p style='color: #ccc; font-size: 13px; margin: 0;'>" + _traitDesc + "</p><p style='color: #e040fb; font-size: 11px; margin: 10px 0 0 0;'>Click to analyze</p></div>">> <<set $analyzeTraitName = _traitObj.name>> <<set $analyzeTraitType = _traitObj.type>> <<goto "LabTraitDetail">> <</link>> <</capture>> <</for>> </div> <<else>> <div style="background: #2a2a2a; padding: 30px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #888; font-size: 16px; margin: 0;">No traits detected. Acquire traits through gameplay to analyze them here.</p> </div> <</if>> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Laboratory</div>">> <<goto "RoomLaboratory">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "LabTraitDetail">> <<set _traitName = $analyzeTraitName || "Unknown">> <<set _traitType = $analyzeTraitType || "Unknown">> <<set _traitData = setup.traits ? setup.traits.find(function(t) { return t.name === _traitName; }) : null>> <<set _traitColor = _traitData && _traitData.color ? _traitData.color : "#e040fb">> <div style="background: linear-gradient(180deg, #0a1f1c 0%, #0d2a26 50%, #0a1f1c 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: <<print _traitColor>>; text-align: center;">🔬 Trait Analysis: <<print _traitName>></h1> <div style="padding: 20px; background: linear-gradient(135deg, <<print _traitColor>> 0%, #2a2a2a 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid <<print _traitColor>>;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Detailed genetic analysis of your <<print _traitName>> trait. </p> </div> <div style="background: #1a1a1a; border: 3px solid <<print _traitColor>>; border-radius: 15px; padding: 25px; margin-bottom: 25px;"> <div style="display: flex; align-items: center; gap: 20px; margin-bottom: 20px;"> <div style="font-size: 60px;">🧬</div> <div> <h2 style="color: <<print _traitColor>>; margin: 0 0 5px 0;"><<print _traitName>></h2> <p style="color: #888; text-transform: uppercase; margin: 0; font-size: 14px;"><<print _traitType>> Trait</p> </div> </div> <div style="background: #2a2a2a; padding: 20px; border-radius: 10px; margin-bottom: 20px;"> <h3 style="color: #e040fb; margin: 0 0 15px 0;">📋 Description</h3> <<if _traitData && _traitData.description>> <p style="color: #ccc; font-size: 15px; line-height: 1.6; margin: 0;"><<print _traitData.description>></p> <<else>> <p style="color: #888; font-style: italic; margin: 0;">No detailed description available for this trait.</p> <</if>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;"> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; text-align: center;"> <p style="color: #888; margin: 0 0 5px 0; font-size: 12px;">TRAIT TYPE</p> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0;"><<print _traitType>></p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; text-align: center;"> <p style="color: #888; margin: 0 0 5px 0; font-size: 12px;">RARITY</p> <<if _traitData && _traitData.rarity>> <p style="color: #ffd700; font-size: 18px; font-weight: bold; margin: 0; text-transform: capitalize;"><<print _traitData.rarity>></p> <<else>> <p style="color: #ffd700; font-size: 18px; font-weight: bold; margin: 0;">Standard</p> <</if>> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; text-align: center;"> <p style="color: #888; margin: 0 0 5px 0; font-size: 12px;">STATUS</p> <p style="color: #51cf66; font-size: 18px; font-weight: bold; margin: 0;">Active</p> </div> </div> </div> <!-- Effects Section --> <div style="background: #1a1a1a; border: 2px solid #444; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="color: #e040fb; margin: 0 0 15px 0;">⚡ Known Effects</h3> <<if _traitData && _traitData.effects>> <ul style="color: #ccc; margin: 0; padding-left: 20px;"> <<for _effect range _traitData.effects>> <li style="margin-bottom: 8px;"><<print _effect>></li> <</for>> </ul> <<else>> <p style="color: #888; font-style: italic; margin: 0;">Effects of this trait are still being researched...</p> <</if>> </div> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #e040fb; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Trait List</div>">> <<goto "LabTraitAnalysis">> <</link>> </div> </div> <</nobr>>
<<nobr>> <!-- Initialize selection variables --> <<if !$combinerSelectedTraits>><<set $combinerSelectedTraits = []>><</if>> <<if $combinerAgeTrait === undefined>><<set $combinerAgeTrait = null>><</if>> <!-- Gather all player traits --> <<set _allTraits = []>> <<if $physicalTraits>> <<for _t range $physicalTraits>> <<run _allTraits.push({name: _t, type: "Physical"})>> <</for>> <</if>> <<if $mentalTraits>> <<for _t range $mentalTraits>> <<run _allTraits.push({name: _t, type: "Mental"})>> <</for>> <</if>> <<if $skills>> <<for _t range $skills>> <<run _allTraits.push({name: _t, type: "Skill"})>> <</for>> <</if>> <!-- Sort traits alphabetically by name --> <<run _allTraits.sort(function(a, b) { return a.name.localeCompare(b.name); })>> <div style="background: linear-gradient(180deg, #1a0f0a 0%, #2d1810 50%, #1a0f0a 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #ff6b35; text-align: center;">⚗️ Trait Combiner</h1> <div style="padding: 20px; background: linear-gradient(135deg, #ff6b35 0%, #c44d20 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #ff6b35;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Combine 3 traits to create a transformation. Select traits carefully - some combinations unlock powerful forms! </p> </div> <!-- Failed Combination Message --> <<if $lastCombineFailed>> <div style="background: linear-gradient(135deg, #444 0%, #555 100%); border-radius: 10px; padding: 20px; margin-bottom: 25px; text-align: center; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-size: 20px; font-weight: bold; margin: 0 0 10px 0;">✗ EXPERIMENT FAILED</p> <p style="color: #ccc; font-size: 16px; margin: 0 0 10px 0;"><<print $lastCombineMessage>></p> <p style="color: #51cf66; font-size: 14px; margin: 0;">Your traits have been preserved. This combination has been recorded as incompatible.</p> </div> <<set $lastCombineFailed = false>> <</if>> <!-- Trades Remaining Display --> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #ff6b35; font-size: 16px; margin: 0;">🔄 Trades Remaining Today: <strong><<print $tradesRemainingToday>> / <<print 5 + ($bonusDailyTrades || 0)>></strong></p> </div> <!-- Selected Traits Display --> <div style="background: #1a1a1a; border: 3px solid #ff6b35; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="color: #ff6b35; margin: 0 0 15px 0; text-align: center;">Selected Traits (<<print $combinerSelectedTraits.length>>/3)</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center; min-height: 50px;"> <<if $combinerSelectedTraits.length === 0>> <p style="color: #666; margin: 0;">Select 3 traits from the list below</p> <<else>> <<for _i, _trait range $combinerSelectedTraits>> <<capture _i, _trait>> <<link "<div style='background: #2d1810; color: #ff6b35; padding: 10px 15px; border-radius: 8px; display: inline-flex; align-items: center; gap: 10px; cursor: pointer;'><<print _trait>> <span style='color: #888;'>✕</span></div>">> <<run $combinerSelectedTraits.splice(_i, 1)>> <<goto "LabTraitCombiner">> <</link>> <</capture>> <</for>> <</if>> </div> <<if $combinerSelectedTraits.length > 0>> <div style="text-align: center; margin-top: 15px;"> <<link "<span style='color: #888; cursor: pointer;'>Clear All</span>">> <<set $combinerSelectedTraits = []>> <<set $combinerAgeTrait = null>> <<goto "LabTraitCombiner">> <</link>> </div> <</if>> </div> <!-- Color Legend --> <div style="background: #1a1a1a; border: 2px solid #555; border-radius: 10px; padding: 15px; margin-bottom: 15px;"> <h4 style="color: #888; margin: 0 0 10px 0; text-align: center;">🎨 Trait Colors</h4> <div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center; font-size: 13px;"> <span style="color: #ff9800;">🟠 In a recipe</span> <span style="color: #ffeb3b;">🟡 Partial match</span> <span style="color: #4caf50;">🟢 Two traits match</span> <span style="background: linear-gradient(90deg, #ff0000, #ff9800, #ffeb3b, #4caf50, #2196f3, #9c27b0); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-weight: bold;">🌈 Complete recipe!</span> </div> </div> <!-- Available Traits Selection --> <div style="background: #1a1a1a; border: 2px solid #555; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="color: #ccc; margin: 0 0 15px 0; text-align: center;">Available Traits</h3> <div style="max-height: 300px; overflow-y: auto; display: flex; flex-wrap: wrap; gap: 8px; justify-content: center;"> <<for _trait range _allTraits>> <<capture _trait>> <<set _isSelected = $combinerSelectedTraits.indexOf(_trait.name) !== -1>> <<set _canSelect = $combinerSelectedTraits.length < 3>> <<set _recipeStatus = setup.getTraitRecipeStatus(_trait.name, $combinerSelectedTraits)>> <!-- Determine colors based on recipe status --> <<if _recipeStatus === 'complete'>> <<set _bgColor = 'linear-gradient(90deg, #ff0000, #ff9800, #ffeb3b, #4caf50, #2196f3, #9c27b0)'>> <<set _borderColor = '#fff'>> <<set _textColor = 'white'>> <<set _glowStyle = 'box-shadow: 0 0 15px rgba(255,255,255,0.6), 0 0 30px rgba(255,0,255,0.4); animation: rainbow-glow 2s ease-in-out infinite;'>> <<elseif _recipeStatus === 'twoMatch'>> <<set _bgColor = '#2e7d32'>> <<set _borderColor = '#4caf50'>> <<set _textColor = 'white'>> <<set _glowStyle = 'box-shadow: 0 0 8px rgba(76,175,80,0.5);'>> <<elseif _recipeStatus === 'partialMatch'>> <<set _bgColor = '#f9a825'>> <<set _borderColor = '#ffeb3b'>> <<set _textColor = '#1a1a1a'>> <<set _glowStyle = ''>> <<elseif _recipeStatus === 'inRecipe'>> <<set _bgColor = '#e65100'>> <<set _borderColor = '#ff9800'>> <<set _textColor = 'white'>> <<set _glowStyle = ''>> <<else>> <<set _bgColor = '#2a2a2a'>> <<set _borderColor = '#555'>> <<set _textColor = '#888'>> <<set _glowStyle = ''>> <</if>> <<if _isSelected>> <div style="background: #ff6b35; color: white; padding: 8px 12px; border-radius: 5px; border: 2px solid #ff8c42;"> <<print _trait.name>> <span style="font-size: 11px; opacity: 0.8;">(<<print _trait.type>>)</span> ✓ </div> <<elseif _canSelect>> <<set _styleStr = "background: " + _bgColor + "; color: " + _textColor + "; padding: 8px 12px; border-radius: 5px; cursor: pointer; border: 2px solid " + _borderColor + "; " + _glowStyle>> <<link `"<div style='" + _styleStr + "'>" + _trait.name + " <span style='font-size: 11px; opacity: 0.8;'>(" + _trait.type + ")</span></div>"`>> <<run $combinerSelectedTraits.push(_trait.name)>> <<goto "LabTraitCombiner">> <</link>> <<else>> <div style="background: #222; color: #555; padding: 8px 12px; border-radius: 5px; border: 2px solid #333;"> <<print _trait.name>> <span style="font-size: 11px;">(<<print _trait.type>>)</span> </div> <</if>> <</capture>> <</for>> </div> </div> <!-- Age Trait Add-on (optional, alongside 3-trait combination) --> <<set _hasYouthful = $physicalTraits.includes("Youthful") && !$combinerSelectedTraits.includes("Youthful")>> <<set _hasMature = $physicalTraits.includes("Mature") && !$combinerSelectedTraits.includes("Mature")>> <<set _currentAge = $appearance.age || "Adult">> <<set _canUseYouthful = _hasYouthful && _currentAge === "Mature Adult">> <<set _canUseMature = _hasMature && _currentAge === "Adult">> <div style="background: #1a1a1a; border: 2px solid #9b59b6; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="color: #9b59b6; margin: 0 0 10px 0; text-align: center;">🔮 Age Add-on (Optional)</h3> <p style="color: #aaa; font-size: 13px; text-align: center; margin: 0 0 15px 0;">Add a Youthful or Mature trait to your combination to also change your age during the transformation. The trait will be consumed.</p> <<if $combinerAgeTrait>> <!-- Show selected age trait with remove option --> <div style="text-align: center;"> <<link "<div style='background: #9b59b6; color: white; padding: 10px 20px; border-radius: 8px; display: inline-flex; align-items: center; gap: 10px; cursor: pointer;'>🔮 <<print $combinerAgeTrait>> → <<if $combinerAgeTrait === \"Youthful\">>Adult<<else>>Mature Adult<</if>> <span style='color: #ddd;'>✕</span></div>">> <<set $combinerAgeTrait = null>> <<goto "LabTraitCombiner">> <</link>> </div> <<else>> <div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center;"> <!-- Youthful → Adult --> <<if _canUseYouthful>> <<link "<div style='background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); color: white; padding: 10px 18px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; min-width: 160px;'>✨ Youthful → Adult</div>">> <<set $combinerAgeTrait = "Youthful">> <<goto "LabTraitCombiner">> <</link>> <<elseif _hasYouthful>> <div style="background: #333; color: #666; padding: 10px 18px; border-radius: 8px; text-align: center; min-width: 160px; cursor: not-allowed;">✨ Youthful<br><span style="font-size: 12px;">Already Adult</span></div> <<else>> <div style="background: #222; color: #444; padding: 10px 18px; border-radius: 8px; text-align: center; min-width: 160px; cursor: not-allowed;">✨ Youthful<br><span style="font-size: 12px;">Not available</span></div> <</if>> <!-- Mature → Mature Adult --> <<if _canUseMature>> <<link "<div style='background: linear-gradient(135deg, #8e44ad 0%, #6c3483 100%); color: white; padding: 10px 18px; border-radius: 8px; cursor: pointer; font-weight: bold; text-align: center; min-width: 160px;'>✨ Mature → Mature Adult</div>">> <<set $combinerAgeTrait = "Mature">> <<goto "LabTraitCombiner">> <</link>> <<elseif _hasMature>> <div style="background: #333; color: #666; padding: 10px 18px; border-radius: 8px; text-align: center; min-width: 160px; cursor: not-allowed;">✨ Mature<br><span style="font-size: 12px;">Already Mature Adult</span></div> <<else>> <div style="background: #222; color: #444; padding: 10px 18px; border-radius: 8px; text-align: center; min-width: 160px; cursor: not-allowed;">✨ Mature<br><span style="font-size: 12px;">Not available</span></div> <</if>> </div> <</if>> </div> <!-- Combine Button --> <div style="text-align: center; margin-bottom: 25px;"> <<if $combinerSelectedTraits.length === 3>> <<set _isBlacklisted = setup.hasFailedCombination($combinerSelectedTraits)>> <<if _isBlacklisted>> <div style="background: #333; color: #888; padding: 15px 40px; border-radius: 8px; display: inline-block;"> ❌ This combination has already been tried and failed </div> <<elseif $tradesRemainingToday <= 0>> <div style="background: #333; color: #888; padding: 15px 40px; border-radius: 8px; display: inline-block;"> No trades remaining today </div> <<else>> <<link "<div style='background: linear-gradient(135deg, #ff6b35 0%, #ff8c42 100%); color: white; padding: 15px 40px; border-radius: 8px; font-weight: bold; font-size: 18px; display: inline-block; cursor: pointer; box-shadow: 0 4px 15px rgba(255,107,53,0.4);'>⚗️ Combine Traits</div>">> <!-- Store pre-transformation body stats for description variations --> <<set $preTransformChest = $bodyParts.chest || "medium">> <<set $preTransformButt = $bodyParts.butt || "medium">> <<set $preTransformGenitals = $bodyParts.genitals || "vagina">> <<set $preTransformGender = $bodyParts.gender || "female">> <<set $preTransformAge = $appearance.age || "Adult">> <<set $lastCombineResult = setup.attemptTraitCombination($combinerSelectedTraits)>> <<if $lastCombineResult.consumed>> <<set $tradesRemainingToday -= 1>> <</if>> <<if $lastCombineResult.success>> <!-- Remove source traits --> <<for _trait range $combinerSelectedTraits>> <<run $physicalTraits.delete(_trait)>> <<run $mentalTraits.delete(_trait)>> <<run $skills.delete(_trait)>> <</for>> <!-- Apply age add-on if selected --> <<if $combinerAgeTrait>> <<run $physicalTraits.delete($combinerAgeTrait)>> <<if $combinerAgeTrait === "Youthful">> <<set $appearance.age = "Adult">> <<elseif $combinerAgeTrait === "Mature">> <<set $appearance.age = "Mature Adult">> <</if>> <<set $ageTransformApplied = $combinerAgeTrait>> <<set $combinerAgeTrait = null>> <<else>> <<set $ageTransformApplied = null>> <</if>> <<set $combinerSourceTraits = $combinerSelectedTraits.slice()>> <<if $ageTransformApplied>> <<run $combinerSourceTraits.push($ageTransformApplied + " (Age)")>> <</if>> <<set $combinerSelectedTraits = []>> <!-- All combinations are full transformations --> <<run setup.applyFullTransformation($lastCombineResult.newTrait)>> <<goto "LabTransformationScene">> <<else>> <!-- Failed combination - stay on combiner page with message --> <<set $lastCombineFailed = true>> <<set $lastCombineMessage = $lastCombineResult.message>> <<set $combinerSelectedTraits = []>> <<set $combinerAgeTrait = null>> <<goto "LabTraitCombiner">> <</if>> <</link>> <</if>> <<else>> <div style="background: #333; color: #888; padding: 15px 40px; border-radius: 8px; display: inline-block;"> Select 3 traits to combine </div> <</if>> </div> <!-- Discovered Recipes Section --> <<set _discoveredRecipes = setup.getDiscoveredRecipes()>> <<if _discoveredRecipes && _discoveredRecipes.length > 0>> <style> @keyframes rainbow-border { 0% { border-color: #ff0000; box-shadow: 0 0 15px #ff0000; } 16% { border-color: #ff9800; box-shadow: 0 0 15px #ff9800; } 33% { border-color: #ffeb3b; box-shadow: 0 0 15px #ffeb3b; } 50% { border-color: #4caf50; box-shadow: 0 0 15px #4caf50; } 66% { border-color: #2196f3; box-shadow: 0 0 15px #2196f3; } 83% { border-color: #9c27b0; box-shadow: 0 0 15px #9c27b0; } 100% { border-color: #ff0000; box-shadow: 0 0 15px #ff0000; } } .discovered-recipe { animation: rainbow-border 3s linear infinite; border-width: 3px; border-style: solid; } </style> <div style="background: #1a1a1a; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="background: linear-gradient(90deg, #ff0000, #ff9800, #ffeb3b, #4caf50, #2196f3, #9c27b0); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin: 0 0 15px 0; text-align: center; font-size: 20px;">🌈 Discovered Recipes (<<print _discoveredRecipes.length>>)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px;"> <<for _recipe range _discoveredRecipes>> <div class="discovered-recipe" style="background: linear-gradient(135deg, #1a0a2e 0%, #2d1052 100%); border-radius: 10px; padding: 15px;"> <h4 style="color: #fff; margin: 0 0 10px 0; text-align: center;">✨ <<print _recipe.result>></h4> <div style="display: flex; flex-wrap: wrap; gap: 5px; justify-content: center;"> <<for _t range _recipe.traits>> <span style="background: #3a2060; color: #e0b0ff; padding: 4px 8px; border-radius: 4px; font-size: 12px;"><<print _t>></span> <</for>> </div> </div> <</for>> </div> </div> <</if>> <!-- Research Notes Link --> <<set _failedCount = ($failedTraitCombinations && $failedTraitCombinations.length) || 0>> <div style="text-align: center; margin-bottom: 25px;"> <<link "<div style='display: inline-block; background: #2a2a2a; color: #888; padding: 10px 20px; border-radius: 8px; border: 2px solid #555; cursor: pointer;'>📓 Research Notes (Tested Combinations: <<print _failedCount>>)</div>">> <<goto "LabResearchNotes">> <</link>> </div> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Laboratory</div>">> <<set $combinerSelectedTraits = []>> <<goto "RoomLaboratory">> <</link>> </div> </div> <</nobr>>
<<nobr>> <div style="background: linear-gradient(180deg, #1a0f0a 0%, #2d1810 50%, #1a0f0a 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #888; text-align: center;">📓 Research Notes</h1> <div style="padding: 20px; background: linear-gradient(135deg, #444 0%, #333 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #555;"> <p style="color: #aaa; font-size: 16px; margin: 0; text-align: center; font-style: italic;"> A record of all trait combinations you've tested that didn't produce a transformation. </p> </div> <!-- Failed Combinations List --> <<if $failedTraitCombinations && $failedTraitCombinations.length > 0>> <div style="background: #1a1a1a; border: 2px solid #555; border-radius: 10px; padding: 20px; margin-bottom: 25px;"> <h3 style="color: #ff6b6b; margin: 0 0 15px 0;">❌ Failed Combinations (<<print $failedTraitCombinations.length>>)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 10px; max-height: 400px; overflow-y: auto;"> <<for _i, _combo range $failedTraitCombinations>> <<set _traits = _combo.split("|")>> <div style="background: #2a2a2a; padding: 12px; border-radius: 8px; border-left: 4px solid #ff6b6b;"> <div style="display: flex; flex-wrap: wrap; gap: 5px;"> <<for _t range _traits>> <span style="background: #3a2020; color: #ff9999; padding: 4px 8px; border-radius: 4px; font-size: 12px;"><<print _t>></span> <</for>> </div> </div> <</for>> </div> </div> <<else>> <div style="background: #1a1a1a; border: 2px solid #555; border-radius: 10px; padding: 30px; margin-bottom: 25px; text-align: center;"> <p style="color: #666; font-size: 16px; margin: 0;">No failed combinations recorded yet. Start experimenting!</p> </div> <</if>> <!-- Return Button --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #ff6b35; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Trait Combiner</div>">> <<goto "LabTraitCombiner">> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "LabTransformationScene">> <!-- Store pre-transformation body stats for description variations --> <<set _preChest = $preTransformChest || $bodyParts.chest || "medium">> <<set _preButt = $preTransformButt || $bodyParts.butt || "medium">> <<set _preGenitals = $preTransformGenitals || $bodyParts.genitals || "vagina">> <<set _preGender = $preTransformGender || "female">> <<set _preAge = $preTransformAge || $appearance.age || "Adult">> <<set _transformName = $lastCombineResult.newTrait>> <<set _transform = setup.fullTransformations[_transformName]>> <!-- Determine gradient colors based on transformation type --> <<set _gradientTop = "#0d0015">> <<set _gradientMid = "#1a0a2e">> <<set _gradientPeak = "#2d1052">> <<set _accentColor = "#ff00ff">> <<set _bannerGradient = "linear-gradient(135deg, #8b00ff 0%, #ff00ff 50%, #8b00ff 100%)">> <<if _transformName === "Succubus" || _transformName === "Imp" || _transformName === "Hellhound">> <!-- Demonic - Deep crimson/hellfire --> <<set _gradientTop = "#1a0505">> <<set _gradientMid = "#3d0a0a">> <<set _gradientPeak = "#6b1515">> <<set _accentColor = "#ff3333">> <<set _bannerGradient = "linear-gradient(135deg, #8b0000 0%, #ff4444 50%, #8b0000 100%)">> <<elseif _transformName === "Werecat" || _transformName === "Werewolf" || _transformName === "Werebunny" || _transformName === "Werefox" || _transformName === "Weresheep" || _transformName === "Hucow">> <!-- Were-creatures - Earthy brown/amber --> <<set _gradientTop = "#0d0805">> <<set _gradientMid = "#2a1a0a">> <<set _gradientPeak = "#4d3319">> <<set _accentColor = "#ffa500">> <<set _bannerGradient = "linear-gradient(135deg, #8b4513 0%, #ffa500 50%, #8b4513 100%)">> <<elseif _transformName === "Trophy Wife" || _transformName === "Gym Bunny" || _transformName === "E-Girl" || _transformName === "Punk" || _transformName === "Gyaru">> <!-- Aesthetic - Pink/glamour --> <<set _gradientTop = "#1a050d">> <<set _gradientMid = "#3d0a1f">> <<set _gradientPeak = "#6b1542">> <<set _accentColor = "#ff69b4">> <<set _bannerGradient = "linear-gradient(135deg, #c71585 0%, #ff69b4 50%, #c71585 100%)">> <<elseif _transformName === "Siren" || _transformName === "Living Doll">> <!-- Supernatural - Ethereal blue/cyan --> <<set _gradientTop = "#050d1a">> <<set _gradientMid = "#0a1f3d">> <<set _gradientPeak = "#154266">> <<set _accentColor = "#00ffff">> <<set _bannerGradient = "linear-gradient(135deg, #1e90ff 0%, #00ffff 50%, #1e90ff 100%)">> <<elseif _transformName === "Dominatrix" || _transformName === "Slut" || _transformName === "Himbo">> <!-- Dominant/Corruption - Deep purple/violet --> <<set _gradientTop = "#0d0515">> <<set _gradientMid = "#1f0a3d">> <<set _gradientPeak = "#3d1566">> <<set _accentColor = "#9932cc">> <<set _bannerGradient = "linear-gradient(135deg, #4b0082 0%, #9932cc 50%, #4b0082 100%)">> <</if>> <div style="background: linear-gradient(180deg, <<print _gradientTop>> 0%, <<print _gradientMid>> 30%, <<print _gradientPeak>> 50%, <<print _gradientMid>> 70%, <<print _gradientTop>> 100%); min-height: 100vh; padding: 20px;"> <div style="max-width: 800px; margin: 0 auto;"> <!-- Header with glow effect --> <div style="text-align: center; margin-bottom: 30px;"> <h1 style="color: <<print _accentColor>>; font-size: 42px; margin: 0; text-shadow: 0 0 30px <<print _accentColor>>, 0 0 60px <<print _accentColor>>;">🔮 TRANSFORMATION 🔮</h1> </div> <!-- Result Banner - Trade Result Style --> <div style="background: <<print _bannerGradient>>; padding: 30px; border-radius: 15px; margin-bottom: 30px; box-shadow: 0 0 40px rgba(139,0,255,0.6), inset 0 0 30px rgba(255,255,255,0.1); border: 2px solid <<print _accentColor>>; text-align: center;"> <p style="color: #eeccff; margin: 0 0 10px 0; font-size: 18px; text-transform: uppercase; letter-spacing: 2px;">You have become</p> <p style="color: white; font-size: 48px; font-weight: bold; margin: 0; text-shadow: 0 0 20px rgba(255,255,255,0.8), 0 4px 8px rgba(0,0,0,0.5);"><<print _transformName>></p> <<if _transform && _transform.description>> <p style="color: #ddaaff; font-style: italic; margin: 15px 0 0 0; font-size: 16px;"><<print _transform.description>></p> <</if>> </div> <!-- Transformation Story Section --> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16162a 100%); padding: 30px; border-radius: 15px; margin-bottom: 30px; border: 2px solid <<print _accentColor>>; box-shadow: 0 4px 20px rgba(0,0,0,0.5);"> <h2 style="color: <<print _accentColor>>; margin: 0 0 20px 0; text-align: center; font-size: 24px;">✨ The Transformation Begins ✨</h2> <div style="color: #ddd; font-size: 17px; line-height: 2; text-align: justify;"> <p>You stand completely naked and alone in the center of the laboratory's transformation chamber. The heavy doors have sealed behind you, leaving you in private isolation as the cool air raises goosebumps across your bare skin. <em>No one can see me here... no one can interrupt. It's just me and the machine.</em> The apparatus hums to life around you, arcane energies swirling as the traits you've sacrificed are consumed in brilliant flashes of light.</p> <p>A tingling sensation begins at your extremities - your fingers, your toes, the tips of your ears - then rapidly spreads inward. Your breath catches as the magic seeps into every fiber of your being. <em>Oh god, I can feel it... it's actually happening!</em> Your naked body is completely vulnerable and exposed to the transformative energies. Alone in this chamber, with no one watching, you're free to experience every sensation fully.</p> <<print setup.getFullTransformationText(_transformName, true, _preGender)>> <<if $ageTransformApplied>> <<if $ageTransformApplied === "Youthful">> <p>As the other transformations settle into your body, a deeper, slower change begins to ripple through you. The youthful softness in your face starts to shift - your jawline defining itself with elegant precision, your cheekbones rising into sharper, more striking angles. <em>I look... older? No... more mature. More refined.</em> You watch in the chamber's reflection as your features lose their innocent roundness, replaced by a confident, alluring beauty that radiates experience. Your skin remains smooth and flawless, but now it stretches over the body of someone who knows exactly what they want. Your hips settle with a subtle new weight, your posture straightening with an unconscious authority. <em>I feel... powerful. Like I've grown into myself.</em> The transformation burns through your muscles, filling them with a quiet, assured strength. Your eyes catch the light differently now - deeper, knowing, with a smoldering intensity that wasn't there before. You run your hands down your transformed naked body, feeling every curve and line with fresh appreciation. <em>This is what it feels like to be in my prime... and god, does it feel good.</em> The youthful energy that once defined you has been consumed by the machine, replaced by the magnetic allure of someone in the full bloom of adulthood.</p> <<elseif $ageTransformApplied === "Mature">> <<set _genderForAge = (_transform && _transform.genderLock) ? _transform.genderLock : $gender>> <<if _genderForAge === "male">> <p>As the other changes ripple through your body, a slow, smoldering heat begins to spread from deep within your core. Your mature trait is consumed in a flash of golden light, and the energy seeps into every fiber of your being. <em>Something's changing... something deeper than the rest.</em> Your jawline sharpens with rugged distinction, a shadow of distinguished stubble darkening your face. Fine lines appear at the corners of your eyes - not signs of weakness, but marks of experience, of confidence, of a man who has lived and conquered. Your shoulders broaden imperceptibly, your chest settling with a powerful, commanding presence. <em>I feel... incredible. Like I've finally become the man I was meant to be.</em> Silver threads weave through your hair at the temples, giving you a devastatingly handsome salt-and-pepper look. Your muscles don't shrink - they become denser, more defined, the body of a man in his absolute prime. Your voice resonates deeper in your chest. When you catch your reflection, the person staring back exudes raw, magnetic authority - a total DILF who commands attention without trying. <em>God... I look like I could make anyone weak in the knees just by walking into a room.</em> Your transformed body radiates the irresistible confidence and sexual magnetism of a mature man who knows exactly what he's doing.</p> <<else>> <p>As the other changes ripple through your body, a slow, smoldering heat begins to spread from deep within your core. Your mature trait is consumed in a flash of golden light, and the energy seeps into every fiber of your being. <em>Something's changing... something deeper than the rest.</em> Your features shift with exquisite subtlety - your cheekbones becoming more prominent, your lips fuller and more inviting, fine laugh lines appearing at the corners of your eyes that somehow make you even more beautiful. Your body doesn't age - it ripens. Your hips widen ever so slightly, settling into lush, motherly curves that scream fertility and sensuality. <em>Oh god... I can feel myself becoming...</em> Your breasts feel heavier, sitting with a perfect, gravity-defying fullness. Your skin takes on a warm, golden glow - the radiance of a woman in her absolute prime. You run your hands over your transformed body and every touch sends shivers of pleasure through you. When you catch your reflection, the woman staring back is devastatingly gorgeous - a total MILF with bedroom eyes, curves that could stop traffic, and an aura of confident sensuality that's almost intoxicating. <em>I look like every fantasy come to life... I look like I could seduce anyone I wanted.</em> Your transformed body radiates the irresistible allure of a mature woman who knows exactly what she wants and exactly how to get it.</p> <</if>> <</if>> <</if>> </div> </div> <!-- Body Changes Section with Pre-transformation variations --> <div style="background: linear-gradient(180deg, #1a1a2e 0%, #16162a 100%); padding: 30px; border-radius: 15px; margin-bottom: 30px; border: 2px solid <<print _accentColor>>; box-shadow: 0 4px 20px rgba(0,0,0,0.5);"> <h2 style="color: <<print _accentColor>>; margin: 0 0 25px 0; text-align: center; font-size: 24px;">🌀 Your Body Transforms 🌀</h2> <div style="color: #ccc; font-size: 16px; line-height: 1.9;"> <!-- Chest Transformation with pre-size variations --> <<if _transform && _transform.setsChest>> <div style="background: rgba(255,107,157,0.1); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ff6b9d;"> <p style="margin: 0;"><strong style="color: #ff6b9d; font-size: 18px;">💗 Chest</strong></p> <p style="margin: 10px 0 0 0;"> <<if _preChest === "flat" || _preChest === "flat masculine">> Your eyes drift down to your flat, bare chest as an unfamiliar warmth begins to bloom beneath the skin. Your nipples stiffen instantly, becoming incredibly sensitive as the magic concentrates there. <em>Something's happening... I can feel it starting...</em> <<if _transform.setsChest === "gigantic">> You gasp sharply as flesh begins to push outward from nothing - tiny bumps at first, then rapidly swelling mounds that grow larger with each heartbeat. <em>Oh fuck... they're growing! They won't stop growing!</em> Your hands fly to your chest instinctively, but you can't contain the growth. The flesh overflows between your fingers as your breasts surge larger and larger, the skin stretching taut over the expanding tissue. Waves of intense, building pleasure radiate from your swelling chest - each pulse of growth sending another surge of ecstasy through your body. Your nipples drag across your palms, sending electric jolts of pleasure that make your knees buckle. <em>Oh god... oh god yes!</em> The pleasure builds and builds with every inch of growth, becoming almost overwhelming as your breasts reach their massive final size. A loud, uncontrollable moan escapes you as the growth completes, leaving you trembling with residual pleasure. <em>So heavy... so sensitive... that felt incredible!</em> The weight becomes staggering as they finally settle into absolutely massive, wobbling tits that hang heavy from your chest. Your once-flat chest now sports gigantic breasts that bounce and sway with your ragged breathing, nipples fat and achingly erect. <em>I can't believe these are mine now...</em> <<elseif _transform.setsChest === "giant">> A moan escapes your lips as flesh pushes outward, small mounds appearing where there was nothing before. Pleasure blooms in your chest, growing stronger with each inch of expansion. You watch, transfixed, as they swell larger and larger, the skin growing warm and sensitive. <em>It feels so good... the bigger they get, the better it feels!</em> Your hands can't help but cup the growing masses as they expand into giant, heavy breasts, waves of pleasure washing through you with each surge of growth. The growth slows, leaving you panting and flushed with lingering pleasure, enormous tits that feel impossibly sensitive hanging from your chest. <<elseif _transform.setsChest === "huge">> You watch in fascination as flesh pushes outward from your flat chest, forming soft mounds that rapidly swell. The sensation is intoxicating - a warm, pleasurable pressure that grows stronger as your breasts expand larger and larger. <em>Mmm... it feels amazing!</em> They expand into huge, heavy orbs, pleasure pulsing through you with each wave of growth. Your hands cup them to feel their incredible new weight and sensitivity, the pleasure leaving you breathless. <<elseif _transform.setsChest === "large">> Warmth spreads across your chest as flesh begins to form, soft mounds pushing outward and swelling steadily. A pleasant, building pleasure accompanies the growth, making you bite your lip. <em>That feels nice...</em> Large, shapely breasts take shape, leaving you with a satisfied warmth from the growth. <<elseif _transform.setsChest === "medium">> A gentle warmth spreads through your chest as flesh begins to swell outward, forming modest but noticeable breasts. A soft tingle of pleasure accompanies the growth, leaving you with beautifully shaped medium breasts that feel wonderfully sensitive to every sensation. <<else>> Transformative energy washes over your bare chest, reshaping the flesh into a <<print _transform.setsChest>> form. Every nerve ending seems to come alive as your new shape settles. <</if>> <<elseif _preChest === "small">> Your small, bare breasts begin to tingle intensely, the nipples hardening to stiff peaks as magic floods through the sensitive tissue. <<if _transform.setsChest === "gigantic">> A deep moan tears from your throat as your modest breasts surge outward with explosive growth. Intense, overwhelming pleasure floods through your chest - waves of ecstasy that grow stronger with every inch of expansion. <em>Oh god! Oh fuck yes!</em> You can feel every millimeter of expansion, the pleasure building and building as the flesh stretches and swells. Your small breasts rapidly become massive, then enormous, then truly gigantic, each surge of growth sending another spike of almost unbearable pleasure through your trembling body. <em>Don't stop! It feels so good!</em> The weight is staggering, pulling you forward as these impossible tits finally stop growing, the final wave of pleasure leaving you gasping and weak-kneed. Your nipples have become thick and incredibly sensitive, and you can feel the heavy masses wobbling and bouncing with every breath. From small to absolutely massive - your new gigantic tits dominate your naked body completely. <em>That was incredible!</em> <<elseif _transform.setsChest === "giant">> The tingling intensifies into waves of pleasurable pressure as your breasts begin to swell. Strong pleasure pulses through your chest with each surge of growth. <em>Mmm... bigger!</em> You watch your reflection in the chamber's polished walls, seeing your modest chest rapidly expand. Larger and larger they grow, pushing outward in waves of warm, sensitive flesh until giant breasts hang heavy from your chest. The growth is intoxicating to feel and watch, leaving you flushed with lingering pleasure. <<elseif _transform.setsChest === "huge">> The small mounds push outward eagerly, flesh swelling with each pulse of magic. Pleasure accompanies the growth, making you moan softly. <em>Yes... growing!</em> You cup them instinctively, feeling them overflow your hands as they grow into huge, attention-commanding breasts. They bounce heavily with your excited breathing, nipples stiff and tingling. <<elseif _transform.setsChest === "large">> Your breasts swell pleasantly larger, filling with warm, sensitive flesh. A gentle pleasure accompanies the growth. You feel them pushing outward, growing heavier, until large, generous handfuls sit proudly on your chest. They feel wonderful - fuller, heavier, more sensitive than before. <<elseif _transform.setsChest === "flat" || _transform.setsChest === "flat masculine">> A strange sensation washes over your small breasts as they begin to tingle and shrink. The flesh recedes, drawing back into your body until your chest is completely smooth and flat. Your nipples shrink to small, masculine nubs. <<else>> The transformation magic washes through your bare breasts, reshaping them into a <<print _transform.setsChest>> size. Every sensation is heightened as the changes complete. <</if>> <<elseif _preChest === "medium">> Your medium-sized breasts pulse with transformative energy, the bare flesh tingling as magic saturates every cell. Your nipples stiffen to hard points, incredibly sensitive. <<if _transform.setsChest === "gigantic">> <em>They're... growing?!</em> You cry out in shocked pleasure as your breasts explode with growth. The flesh surges outward, swelling larger and larger as you watch in disbelief. Medium becomes large, large becomes huge, and still they keep growing. <em>They won't stop! How big are they going to get?!</em> Your hands try to contain them but fail utterly as the flesh overflows, expanding into absolutely gigantic tits that hang heavy and wobbling from your chest. The weight is incredible, pulling you forward. Your nipples have become thick, fat peaks of sensitivity. Every breath makes these massive mounds bounce and sway. <em>I went from average to... to THIS!</em> <<elseif _transform.setsChest === "giant">> <em>I can feel them swelling!</em> The flesh swells outward hungrily, your breasts expanding with waves of pleasurable pressure. You feel them growing heavier, pushing further from your body as they become giant, attention-demanding curves. The transformation leaves you panting, cupping your new massive tits in wonder. <em>So much bigger than before... they're huge!</em> <<elseif _transform.setsChest === "huge">> <em>They're getting bigger...</em> Your breasts swell substantially, the flesh pushing outward as they grow into huge, heavy orbs. The sensation of growth is incredible - a warm, tingling pressure that leaves you breathless. Your new huge tits feel incredible as they settle into their new size. <em>Such a nice upgrade...</em> <<elseif _transform.setsChest === "small">> <em>Wait... they're shrinking?</em> A cooling sensation spreads through your breasts as they begin to tingle and diminish. The flesh recedes, drawing inward as you watch them become smaller and smaller. <em>I'm losing them...</em> When the sensation fades, only small, perky mounds remain. Though smaller, they feel incredibly sensitive. <em>They're so tiny now... but they tingle so much!</em> <<elseif _transform.setsChest === "flat" || _transform.setsChest === "flat masculine">> <em>Something's wrong... they're getting smaller!</em> Your breasts tingle with an odd cooling sensation as they begin to shrink. The flesh pulls inward, becoming smaller and smaller. <em>They're disappearing!</em> You watch as your breasts vanish entirely, leaving your chest completely flat and smooth. <em>They're... gone. I'm completely flat now.</em> <<else>> Transformative energy reshapes your bare chest into a <<print _transform.setsChest>> form. Every nerve sings with heightened sensitivity. <</if>> <<elseif _preChest === "large" || _preChest === "huge" || _preChest === "giant" || _preChest === "gigantic">> Your already impressive bare breasts pulse with energy, the heavy flesh tingling as magic concentrates in the sensitive tissue. Your stiff nipples ache with anticipation. <<if _transform.setsChest === "gigantic" && _preChest !== "gigantic">> <em>Even bigger?! They're already so big!</em> You moan deeply as your already ample breasts surge with new growth. The heavy flesh swells even more, growing impossibly huge as you struggle to support their increasing weight. <em>So heavy... they're so incredibly heavy now!</em> Larger and larger until absolutely gigantic tits hang from your chest, nipples thick and hypersensitive. The weight is staggering, these massive mounds bouncing and swaying dramatically with every movement. <em>I thought they were big before... now they're absolutely massive!</em> <<elseif _transform.setsChest === "giant" && (_preChest === "large" || _preChest === "huge")>> <em>They're still growing!</em> The flesh continues to swell, pushing outward as your breasts expand into truly giant proportions. You feel the increasing weight, the heightened sensitivity as they settle into their new, impressive size. <em>Even more than before...</em> <<elseif _transform.setsChest === "small" || _transform.setsChest === "flat">> <em>Wait... what's happening? They're shrinking!</em> A strange cooling sensation spreads through your heavy breasts as they begin to diminish. The flesh recedes steadily, the weight disappearing as they become smaller and smaller. <em>All that weight... it's just vanishing!</em> The heavy masses draw inward until only <<print _transform.setsChest>> breasts remain. The sudden lightness feels strange after bearing such weight. <em>I used to have so much... now there's barely anything left.</em> <<else>> The magic reshapes your impressive breasts, the flesh shifting and settling into a <<print _transform.setsChest>> size. <</if>> <<else>> Transformative energy washes over your bare chest, reshaping the flesh into <<print _transform.setsChest>> breasts. Every sensation is magnified as the changes complete. <</if>> </p> </div> <</if>> <!-- Butt Transformation with pre-size variations --> <<if _transform && _transform.setsButt>> <div style="background: rgba(255,215,0,0.1); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ffd700;"> <p style="margin: 0;"><strong style="color: #ffd700; font-size: 18px;">🍑 Rear</strong></p> <p style="margin: 10px 0 0 0;"> <<if _preButt === "flat" || _preButt === "flat masculine">> Your flat, bare backside begins to tingle and warm, the skin prickling with sensation as magic concentrates there. <em>I feel something back there...</em> <<if _transform.setsButt === "gigantic">> You feel an intense pressure building deep in your glutes as flesh begins to form from nothing. Your flat ass starts to push outward, each cheek swelling and growing with alarming speed. <em>It's getting bigger... so much bigger!</em> Intense pleasure surges through your lower body with each inch of growth, waves of ecstasy building stronger and stronger as your ass becomes more and more massive. You reach back to feel the growth - soft, warm flesh ballooning under your fingertips, pleasure pulsing through you with every touch. <em>Oh god... the bigger it gets, the better it feels!</em> Larger and larger they swell, each cheek becoming a massive globe of jiggling flesh, the pleasure becoming almost overwhelming. A moan escapes you as the growth finally completes, leaving you trembling. <em>I had nothing before... and now I have all of this!</em> From completely flat to massively thick - your new enormous rear jiggles and sways behind you. <<elseif _transform.setsButt === "giant">> Flesh begins to form and swell, your flat cheeks pushing outward dramatically. Strong waves of pleasure pulse through your lower body as they fill out, growing larger and larger. You moan as they expand into giant, grabbable globes, each surge of growth sending another spike of pleasure through you. <em>Mmm... so good!</em> Your new giant ass bounces heavily as you shift your weight. <<elseif _transform.setsButt === "huge">> Warm flesh pushes outward as your flat rear swells into huge, bouncy cheeks. Pleasure pulses through you with each wave of growth, making you bite your lip. <em>That feels really nice!</em> You can feel them growing behind you, soft and round and incredibly sensitive. They wobble enticingly with every movement. <<elseif _transform.setsButt === "large">> Your backside fills out nicely, flesh forming and swelling into a plump, shapely rear. A pleasant warmth and gentle pleasure accompanies the growth. The new curves feel soft and warm, bouncing gently as you shift. <<else>> Transformative energy reshapes your bare rear into a <<print _transform.setsButt>> form. The new flesh tingles with sensitivity. <</if>> <<elseif _preButt === "small">> Your small, bare rear begins to pulse with warmth, the modest cheeks tingling intensely. <em>What's happening back there?</em> <<if _transform.setsButt === "gigantic">> Your eyes widen as your small cheeks begin to swell rapidly. <em>It's growing! My ass is actually growing!</em> Intense pleasure floods through your lower body, growing stronger with every inch of expansion. The flesh expands outward, growing and growing as you feel your ass becoming enormous behind you. You reach back, feeling the soft masses balloon under your palms - larger than your hands, larger than anything you've felt - each touch sending another wave of ecstasy through you. <em>It won't stop growing! It feels so fucking good!</em> They don't stop until you have a truly gigantic ass that bounces and wobbles dramatically with every breath, the final surge of growth leaving you moaning and trembling. <em>From practically nothing to... to THIS!</em> From modest to absolutely massive. <<elseif _transform.setsButt === "giant">> <em>I can feel it swelling!</em> Strong pleasure pulses through you as the cheeks expand dramatically, flesh swelling outward in waves of ecstatic growth. <em>Oh yes... bigger!</em> Your small rear becomes giant, attention-grabbing globes that bounce heavily as you shift your naked body. <em>So much bigger now... that felt amazing!</em> <<elseif _transform.setsButt === "huge">> <em>It's getting bigger!</em> Pleasure accompanies the growth as the flesh expands eagerly, your small rear swelling into huge, bouncy cheeks. <em>Mmm... yes!</em> You feel them pushing outward, growing heavier and rounder behind you. <em>Such a nice, big upgrade!</em> <<elseif _transform.setsButt === "large">> <em>It's filling out!</em> Your backside swells pleasantly with a gentle warmth, the modest cheeks growing into a shapely, large rear that bounces softly. <em>Much better than before!</em> <<else>> Transformative energy reshapes your bare rear into <<print _transform.setsButt>>. The new shape tingles with sensitivity. <</if>> <<elseif _preButt === "large" || _preButt === "huge" || _preButt === "giant" || _preButt === "gigantic">> Your already generous bare backside pulses with energy, the soft cheeks tingling as magic floods through them. <<if _transform.setsButt === "gigantic" && _preButt !== "gigantic">> <em>It's getting even bigger!</em> The already impressive flesh swells even larger, each cheek ballooning outward. Pleasure pulses through you with each surge of growth, stronger and stronger as your ass becomes more massive. You feel your ass growing heavier, rounder, bigger and bigger. <em>I already had a big ass... now it's becoming enormous! And it feels incredible!</em> The growth continues, waves of pleasure washing over you, until you have a truly gigantic rear that dominates your lower half. The massive cheeks bounce and wobble dramatically with every tiny movement. <em>So much jiggle! That felt so good!</em> <<elseif _transform.setsButt === "flat" || _transform.setsButt === "small">> <em>Wait... it's shrinking?!</em> A cooling sensation spreads through your plump cheeks as they begin to diminish. The soft flesh recedes, drawing inward as you feel the familiar bounce and jiggle fading. <em>All that ass... it's disappearing!</em> The flesh continues to shrink until only a <<print _transform.setsButt>> rear remains. <em>It's all gone... I used to have so much back there!</em> The sudden absence of the weight and bounce feels strange. <<else>> The magic reshapes your generous rear, the flesh settling into a <<print _transform.setsButt>> size. <</if>> <<else>> Transformative energy washes over your bare rear, reshaping it into a <<print _transform.setsButt>> form. <</if>> </p> </div> <</if>> <!-- Genital Transformation with pre-type variations --> <<if _transform && _transform.setsGenitals>> <div style="background: rgba(255,107,53,0.1); padding: 20px; border-radius: 10px; margin-bottom: 20px; border-left: 4px solid #ff6b35;"> <p style="margin: 0;"><strong style="color: #ff6b35; font-size: 18px;">🔥 Intimate Areas</strong></p> <p style="margin: 10px 0 0 0;"> <<if _preGenitals.includes("penis") || _preGenitals.includes("cock")>> <!-- Starting with penis --> Intense heat floods through your exposed groin, centering on your naked cock. You look down, watching as the magic begins its intimate work on your most sensitive area. <em>What's happening down there...?</em> <<if _transform.setsGenitals.includes("vagina") || _transform.setsGenitals.includes("pussy")>> <<if _preGenitals.includes("big") || _preGenitals.includes("huge")>> Your impressive cock throbs once, then begins to shrink before your eyes. <em>It's... it's shrinking!</em> The thick shaft becomes smaller and smaller, but instead of discomfort, waves of intense pleasure surge through your groin - pleasure unlike anything you've felt before. You moan loudly as your manhood pulls inward - shorter, thinner, each moment of transformation sending another spike of ecstasy through your entire body. <em>Oh god... oh fuck... it feels so good!</em> The pleasure intensifies to an almost unbearable peak as the head begins to split, flesh parting and folding into delicate, glistening lips. Your whole body shudders with overwhelming pleasure as the transformation completes, leaving you gasping and trembling. Where your proud cock once hung, soft folds now glisten with arousal. <em>I have a... I'm a... that was incredible!</em> You feel the emptiness inside you - a void that aches to be filled. Your new pussy pulses with need, already dripping wet. <em>It feels so empty inside... I need something to fill me...</em> <<else>> Your exposed cock tingles intensely, then begins to pull inward. <em>No way... it's actually changing!</em> Immense pleasure floods through your groin as the transformation begins - far more intense than anything you've experienced before. You cry out, knees weakening as your shaft shrinks away, each moment of change sending waves of ecstasy through your entire body. <em>Oh god yes! It feels amazing!</em> The skin parts and folds, sensitive tissues forming into delicate pink petals, the pleasure building to an almost unbearable crescendo. A loud, uncontrollable moan escapes you as your new pussy completes its formation, your whole body shuddering with the intensity of it. The fresh folds are already slick with arousal. <em>That was... that was incredible!</em> The emptiness inside you is strange but exciting - a hungry void between your thighs. <em>I can feel the air on it... so sensitive...</em> <</if>> <<elseif _transform.setsGenitals.includes("big penis")>> <em>It's... growing?!</em> Your shaft throbs and swells with each heartbeat, growing thicker and longer before your eyes. <em>Bigger... it's getting bigger!</em> You can feel the blood rushing in, the flesh expanding. Your balls grow heavier, churning with new potency as your cock becomes impressively, almost intimidatingly large. The veins pulse visibly along your enhanced length. <em>Look at the size of it now!</em> <<elseif _transform.setsGenitals === "both">> Your cock throbs with the magic but remains, changing subtly as new sensations bloom below your balls. <em>What's happening down there... below my cock?</em> You feel flesh parting, sensitive folds forming beneath your shaft. When the magic fades, you look down to find you now have both - a throbbing cock standing proud above a wet, sensitive pussy. <em>I have... both?! I can feel both of them!</em> You can feel both, incredibly aware of each set of genitals. <<else>> Transformative magic washes over your exposed genitals, the flesh tingling and reshaping into: <<print _transform.setsGenitals>>. <</if>> <<elseif _preGenitals.includes("vagina") || _preGenitals.includes("pussy")>> <!-- Starting with vagina --> Intense heat pulses through your exposed pussy, the sensitive folds tingling and clenching involuntarily. You look down at your most intimate area as the magic begins its work. <em>Something's happening... I can feel it changing!</em> <<if _transform.setsGenitals.includes("penis") || _transform.setsGenitals.includes("cock")>> <<if _preGenitals.includes("tight")>> Your tight little pussy clenches one last time, the walls squeezing against nothing. Then the sensitive folds begin to close, sealing together, and suddenly immense pleasure explodes through your groin - more intense than any orgasm you've ever experienced. <em>OH GOD!</em> You cry out as flesh pushes outward from your mound, every nerve ending on fire with ecstasy. A cock emerges from where your entrance once was - first a small nub, then rapidly growing, each inch of growth sending another wave of overwhelming pleasure through your trembling body. <em>It feels... it feels incredible!</em> The new shaft hardens with arousal, rising from your groin as you gasp and moan uncontrollably. You can feel it twitching, throbbing with your heartbeat. <em>I have a cock now... I can feel it pulsing! That was the most amazing thing I've ever felt!</em> The sensation of having a cock is overwhelming - heavy, sensitive, powerful. <<elseif _preGenitals.includes("loose")>> Your well-used pussy tingles strangely as the folds begin to shrink and close. The stretched entrance tightens, then seals, and suddenly immense pleasure floods through your entire body. <em>FUCK! Oh fuck yes!</em> You moan loudly as flesh pushes outward, waves of ecstasy pulsing through you with each moment of transformation. A thick cock grows from your former entrance, the shaft hardening and lengthening, every inch of growth sending another spike of overwhelming pleasure through your trembling body. <em>So good... it feels so fucking good!</em> The sensation is unlike anything - your new cock twitches and throbs with eager sensitivity. <em>I can feel every heartbeat in it... that was incredible!</em> <<else>> Your pussy clenches involuntarily, then begins to change. The sensitive folds seal shut as pressure builds from within, and suddenly immense, overwhelming pleasure explodes through your groin. <em>OH GOD YES!</em> You cry out uncontrollably as flesh pushes outward, forming into a shaft that rapidly hardens. Every moment of the transformation sends waves of ecstasy through your entire body, pleasure more intense than anything you've experienced before. <em>It feels amazing! Don't stop!</em> Your new cock stands erect, twitching and throbbing, the final surge of growth leaving you gasping and trembling. <em>I have a cock... a real cock! I can feel it throbbing! That was the best thing I've ever felt!</em> The sensation of having a cock - the weight, the sensitivity, the pulsing need - is overwhelming and intoxicating. <</if>> <<elseif _transform.setsGenitals.includes("tight")>> <em>It's getting tighter!</em> Your inner walls clench and tighten, muscles strengthening as the magic reshapes you. When it fades, you have a deliciously tight pussy that grips at nothing, the sensitive walls aching to squeeze around something. <em>So tight now... I can feel every little movement inside me!</em> Every clench sends sparks of pleasure through you. <<elseif _transform.setsGenitals.includes("loose")>> <em>It's... relaxing? Opening up?</em> The walls of your pussy relax and loosen, the entrance becoming soft and welcoming. The sensation is strange but arousing - a ready, eager openness between your thighs. <em>It feels so open now... so ready...</em> <<elseif _transform.setsGenitals === "both">> Your pussy remains but pressure builds on your mound above it. <em>Something's growing above my pussy!</em> Flesh extends outward as a cock grows above your wet folds. When the magic fades, you have both - a stiff cock standing proud above your dripping pussy. <em>I have both! A cock AND a pussy! I can feel them both!</em> You can feel each separately, incredibly aware of both sets of sensations. <<else>> Transformative magic washes over your exposed intimate areas, reshaping them into: <<print _transform.setsGenitals>>. <</if>> <<else>> Intense magic floods your exposed intimate areas, tingling and reshaping the sensitive flesh into: <<print _transform.setsGenitals>>. <</if>> </p> </div> <</if>> <!-- Gender Identity --> <<if _transform && _transform.genderLock && _preGender !== _transform.genderLock>> <div style="background: rgba(155,89,182,0.1); padding: 20px; border-radius: 10px; border-left: 4px solid #9b59b6;"> <p style="margin: 0;"><strong style="color: #9b59b6; font-size: 18px;">✨ Identity</strong></p> <p style="margin: 10px 0 0 0;"> As the physical changes complete, something deeper begins to shift. The magic seeps into your mind, into your very sense of self. <em>My thoughts... they feel different...</em> Thoughts and memories subtly realign. The way you see yourself, the way you feel in your transformed naked body - it all changes. <em>I'm not... I was never really...</em> You are no longer <<print _preGender>>. Looking at your transformed reflection, touching your changed body, you feel completely, utterly <strong><<print _transform.genderLock>></strong>. <em>This is who I am. This is who I've always been.</em> This is who you were always meant to be. This body, this identity - it feels right. It feels like home. </p> </div> <</if>> </div> </div> <!-- Full Body Image Display - After Identity Section --> <!-- Build the image path directly based on transformation name --> <<set _ageStr = $appearance.age === "Mature Adult" ? "Mature" : "Adult">> <<set _genderRaw = _transform.genderLock || "female">> <<set _genderStr = (_genderRaw === "male" || _genderRaw === "Male") ? "Male" : "Female">> <<set _transformFileName = String(_transformName).replace(/ /g, "")>> <<if !$imageSettings>><<set $imageSettings = {imagesEnabled: true, eroticImagesEnabled: true}>><</if>> <<if $imageSettings.eroticImagesEnabled !== false>> <<set _fullBodyImageHTML = '<div style="text-align: center; margin-bottom: 30px;"><h3 style="color: #b19cd9; margin-bottom: 20px;">Your New Form</h3><div style="display: inline-block; padding: 5px; background: linear-gradient(135deg, #b19cd9 0%, #8b7ab8 100%); border-radius: 12px; border: 3px solid #b19cd9; box-shadow: 0 0 20px rgba(177, 156, 217, 0.4);"><img src="Images/Transformation/' + _transformFileName + '_' + _genderStr + '_' + _ageStr + '_FullBody.webp" style="max-width: 450px; max-height: 600px; border-radius: 8px; display: block;" onerror="this.parentElement.parentElement.style.display=\'none\';"></div></div>'>> <<print _fullBodyImageHTML>> <</if>> <!-- Traits Consumed --> <div style="background: #2a1a1a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 2px solid #dc3545;"> <h3 style="color: #dc3545; margin: 0 0 15px 0; text-align: center;">📤 Traits Consumed</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<for _trait range $combinerSourceTraits>> <span style="background: #3d1a1a; color: #ff6b6b; padding: 8px 15px; border-radius: 8px; font-size: 15px;"><<print _trait>></span> <</for>> </div> </div> <!-- Traits Gained --> <<if _transform>> <div style="background: #1a2a1a; padding: 20px; border-radius: 12px; margin-bottom: 25px; border: 2px solid #28a745;"> <h3 style="color: #28a745; margin: 0 0 15px 0; text-align: center;">📥 Traits Gained</h3> <div style="display: flex; flex-wrap: wrap; gap: 10px; justify-content: center;"> <<if _transform.grantsPhysical && _transform.grantsPhysical.length > 0>> <<for _trait range _transform.grantsPhysical>> <span style="background: #1a3d1a; color: #51cf66; padding: 8px 15px; border-radius: 8px; font-size: 15px;"><<print _trait>></span> <</for>> <</if>> <<if _transform.grantsMental && _transform.grantsMental.length > 0>> <<for _trait range _transform.grantsMental>> <span style="background: #1a1a3d; color: #9b59b6; padding: 8px 15px; border-radius: 8px; font-size: 15px;"><<print _trait>></span> <</for>> <</if>> </div> </div> <</if>> <!-- Trades Remaining --> <div style="background: #1a1a1a; border-radius: 10px; padding: 15px; margin-bottom: 30px; text-align: center;"> <p style="color: #ff6b35; margin: 0;">Trades Remaining Today: <strong><<print $tradesRemainingToday>> / <<print 5 + ($bonusDailyTrades || 0)>></strong></p> </div> <!-- Return Button Only - No try another --> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 15px 40px; border-radius: 10px; font-weight: bold; font-size: 18px; box-shadow: 0 4px 15px rgba(102,126,234,0.4);'>← Return to Laboratory</div>">> <<goto "RoomLaboratory">> <</link>> </div> </div> </div> <</nobr>>
<<nobr>> <<set _home = setup.getCurrentHome()>> <<set _tankType = $fishTankType || "small">> <<set _returnPassage = _tankType === "small" ? "RoomSmallFishTank" : "RoomMediumFishTank">> <<if !$homeFishTanks>><<set $homeFishTanks = {}>><</if>> <<if !$homeFishTanks[_home]>><<set $homeFishTanks[_home] = {}>><</if>> <<if !$homeFishTanks[_home][_tankType]>> <<set _defaultCapacity = _tankType === "small" ? 5 : 15>> <<set $homeFishTanks[_home][_tankType] = {fish: [], capacity: _defaultCapacity}>> <</if>> <<set _tank = $homeFishTanks[_home][_tankType]>> <<set _capacity = _tank.capacity>> <<set _spotsLeft = _capacity - _tank.fish.length>> <<set _allowedRarities = setup.smallTankAllowedRarities>> <<set $lastLocation = "FishTankTransfer">> <div style="background: linear-gradient(180deg, #0a1628 0%, #1a3a5c 50%, #0a1628 100%); min-height: 100vh; padding: 20px;"> <h1 style="color: #1e90ff; text-align: center;">🐟 Fish Transfer</h1> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #51cf66; font-size: 18px; margin: 0;">Select fish to transfer. <span style="color: #ffd700;"><<print _spotsLeft>> spots remaining.</span></p> <p style="color: #ff6b6b; font-size: 14px; margin: 5px 0 0 0;">⚠️ Legendary and Mythical fish require the Mansion Aquarium</p> </div> <h3 style="color: #51cf66;">Your Inventory (<<print $fishInventory ? $fishInventory.length : 0>> fish)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 30px;"> <<if $fishInventory && $fishInventory.length > 0>> <<for _i, _fish range $fishInventory>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <<set _canAdd = _allowedRarities.includes(_fish.rarity)>> <div style="border: 3px solid <<print _rarityColor>>; border-radius: 10px; background: #2a2a2a; padding: 15px; text-align: center;"> <<if _fish.icon && _fish.icon.indexOf("Images/") === 0>> <img src="<<print _fish.icon>>" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="font-size: 2em;"><<print _fish.icon || "🐟">></div> <</if>> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold;"><<print _fish.name>></p> <p style="font-size: 12px; color: #888; text-transform: capitalize; margin: 0 0 10px 0;"><<print _fish.rarity>></p> <p style="font-size: 12px; color: #51cf66; margin: 0 0 10px 0;">Value: $<<print _fish.basePrice>></p> <<if !_canAdd>> <span style="color: #ff6b6b; font-size: 12px;">Needs Mansion Aquarium</span> <<elseif _spotsLeft > 0>> <<capture _i, _fish, _tankType, _home>> <<link "<div style='background: #51cf66; color: white; padding: 6px; border-radius: 4px; cursor: pointer; font-size: 12px;'>Add to Tank</div>">> <<run $homeFishTanks[_home][_tankType].fish.push(clone(_fish))>> <<run $fishInventory.splice(_i, 1)>> <<goto "FishTankTransfer">> <</link>> <</capture>> <<else>> <span style="color: #ff6b6b; font-size: 12px;">Tank full</span> <</if>> </div> <</for>> <<else>> <p style="color: #888;">No fish in your inventory.</p> <</if>> </div> <h3 style="color: #1e90ff;">Fish in Tank (<<print _tank.fish.length>>/<<print _capacity>>)</h3> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 15px; margin-bottom: 30px;"> <<if _tank.fish.length > 0>> <<for _i, _fish range _tank.fish>> <<set _rarityColor = setup.fishRarityColors[_fish.rarity] || "#9e9e9e">> <div style="border: 3px solid <<print _rarityColor>>; border-radius: 10px; background: #1a3a5c; padding: 15px; text-align: center;"> <<if _fish.icon && _fish.icon.indexOf("Images/") === 0>> <img src="<<print _fish.icon>>" style="width: 48px; height: 48px; image-rendering: pixelated;"> <<else>> <div style="font-size: 2em;"><<print _fish.icon || "🐟">></div> <</if>> <p style="color: <<print _rarityColor>>; margin: 5px 0; font-weight: bold;"><<print _fish.name>></p> <p style="font-size: 12px; color: #90caf9; text-transform: capitalize; margin: 0 0 10px 0;"><<print _fish.rarity>></p> <<capture _i, _fish, _tankType, _home>> <<link "<div style='background: #ff6b6b; color: white; padding: 6px; border-radius: 4px; cursor: pointer; font-size: 12px;'>Remove</div>">> <<run $fishInventory.push(clone(_fish))>> <<run $homeFishTanks[_home][_tankType].fish.splice(_i, 1)>> <<goto "FishTankTransfer">> <</link>> <</capture>> </div> <</for>> <<else>> <p style="color: #888;">No fish in tank yet.</p> <</if>> </div> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>Done</div>">> <<goto _returnPassage>> <</link>> </div> </div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomHomeOffice">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <<if !$homeOfficeIncomeDay || $homeOfficeIncomeDay !== $dayNumber>> <<set _incomeCollected = false>> <<else>> <<set _incomeCollected = true>> <</if>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomHomeOffice")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #2c3e50; text-align: center;">💼 Home Office</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #2c3e50;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A professional workspace for managing your affairs. </p> </div> <div style="background: #2a4a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #51cf66; font-size: 18px; margin: 0;">✓ Passive Income: $10/day</p> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0;">Remote freelance work and side projects generate steady income automatically at the start of each day.</p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 20px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 15px 0;">💰 How It Works</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 10px;">Your home office allows you to do remote freelance work. Income is deposited automatically each morning.</p> <p style="color: #51cf66; font-size: 14px; margin: 0;">• Each office earns $10/day</p> <p style="color: #51cf66; font-size: 14px; margin: 5px 0 0 0;">• Income arrives at the start of each new day</p> <p style="color: #51cf66; font-size: 14px; margin: 5px 0 0 0;">• No action required!</p> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #2c3e50; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomProfessionalGym">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <<if !$proGymHoursToday || $lastProGymDay !== $dayNumber>> <<set $proGymHoursToday = 0>> <<set $lastProGymDay = $dayNumber>> <</if>> <<set _hoursRemaining = 3 - $proGymHoursToday>> <<set _trainerBonus = $personalTrainer ? 1.5 : 1>> <<set _hellhoundBonus = $physicalTraits.includes("Hellhound") ? 4 : ($physicalTraits.includes("Gym Bunny") ? 4 : ($physicalTraits.includes("Himbo") ? 2 : 1))>> <<set _strGain = Math.floor(2 * _trainerBonus * _hellhoundBonus)>> <<set _dexGain = Math.floor(2 * _trainerBonus * _hellhoundBonus)>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomProfessionalGym")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #e74c3c; text-align: center;">🏆 Professional Gym</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e74c3c;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Professional-grade equipment for serious training. Double stat gains! </p> </div> <div style="display: flex; gap: 20px; flex-wrap: wrap; justify-content: center; margin-bottom: 25px;"> <div style="background: #2a2a2a; padding: 15px 25px; border-radius: 10px;"> <p style="color: #ffd700; font-size: 16px; margin: 0;">⏰ Training Time: <strong><<print _hoursRemaining>> / 3 hours</strong></p> </div> <<if $personalTrainer>> <div style="background: #2a4a2a; padding: 15px 25px; border-radius: 10px; border: 2px solid #51cf66;"> <p style="color: #51cf66; font-size: 16px; margin: 0;">✓ Personal Trainer Active (+50% gains!)</p> </div> <</if>> <<if _hellhoundBonus > 1>> <div style="background: linear-gradient(135deg, #4a1a2a 0%, #3e0a1e 100%); padding: 15px 25px; border-radius: 10px; border: 2px solid #ff6b6b;"> <p style="color: #ff6b6b; font-size: 16px; margin: 0;">✓ <<if $physicalTraits.includes("Hellhound")>>Hellhound<<elseif $physicalTraits.includes("Gym Bunny")>>Gym Bunny<<else>>Himbo<</if>>: <<print _hellhoundBonus>>x Workout Gains</p> </div> <</if>> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e74c3c; margin: 0 0 15px 0;">💪 Strength Training</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Build muscle with weights and machines. (+<<print _strGain>> Strength)</p> <<if _hoursRemaining > 0>> <<link "<div style='background: #e74c3c; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Train Strength (1 hour)</div>">> <<set $proGymHoursToday += 1>> <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> <<run advanceTime(60)>> <<set $stats.strength = Math.min($statMaxCaps.strength, $stats.strength + _strGain)>> <<goto "RoomProfessionalGym">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Too tired to train more today</div> <</if>> </div> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">🏃 Agility Training</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Improve coordination and speed. (+<<print _dexGain>> Dexterity)</p> <<if _hoursRemaining > 0>> <<link "<div style='background: #f39c12; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Train Dexterity (1 hour)</div>">> <<set $proGymHoursToday += 1>> <<if $physicalTraits.includes("Gym Bunny")>> <<set $lastGymWorkoutTime = setup.getTotalGameMinutes()>> <<run setup.removeDebuff("compulsion")>> <<run setup.addBuff("satisfied", 480)>> <</if>> <<run advanceTime(60)>> <<set $stats.dexterity = Math.min($statMaxCaps.dexterity, $stats.dexterity + _dexGain)>> <<goto "RoomProfessionalGym">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px; border-radius: 6px; text-align: center;">Too tired to train more today</div> <</if>> </div> </div> <!-- Personal Trainer Section --> <div style="border: 3px solid #ffd700; border-radius: 15px; padding: 25px; background: #2a2a2a; margin-bottom: 25px; text-align: center;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🏅 Personal Trainer</h2> <<if $personalTrainer>> <p style="color: #51cf66; font-size: 16px; margin-bottom: 15px;">✓ You have a personal trainer! (+50% to all gains)</p> <p style="color: #888; font-size: 14px; margin-bottom: 15px;">Cost: $20,000/month (billed automatically)</p> <<link "<div style='background: #c0392b; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>Cancel Trainer</div>">> <<set $personalTrainer = false>> <<goto "RoomProfessionalGym">> <</link>> <<else>> <p style="color: #ccc; font-size: 16px; margin-bottom: 15px;">Hire a personal trainer for +50% gains on all exercises!</p> <p style="color: #ffd700; font-size: 18px; font-weight: bold; margin-bottom: 15px;">$20,000 / month</p> <<if $money >= 20000>> <<link "<div style='background: #51cf66; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>Hire Trainer</div>">> <<set $money -= 20000>> <<set $personalTrainer = true>> <<goto "RoomProfessionalGym">> <</link>> <<else>> <div style="background: #444; color: #888; padding: 12px 30px; border-radius: 8px; display: inline-block;">Not enough money</div> <</if>> <</if>> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomStreamingStudio">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <!-- Room Painting Display --> <<set _roomPainting = setup.roomPaintings.getPainting("RoomStreamingStudio")>> <<if _roomPainting>> <div class="room-painting-display"> <div class="room-painting-frame"> <img @src="_roomPainting.imageData" @alt="_roomPainting.title" class="room-painting-image"> </div> <p class="room-painting-title">"<<print _roomPainting.title>>"</p> </div> <</if>> <h1 style="color: #9146ff; text-align: center;">📺 Streaming Studio</h1> <div style="padding: 20px; background: linear-gradient(135deg, #9146ff 0%, #7c3aed 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #9146ff;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Professional streaming setup with top-tier equipment. </p> </div> <div style="background: #2a4a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #51cf66; font-size: 18px; margin: 0;">✓ Active Bonus: +15% to all stream categories</p> <p style="color: #888; font-size: 14px; margin: 10px 0 0 0;">Applies to viewer count and engagement.</p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #9146ff; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #9146ff; margin: 0 0 15px 0;">🎙️ Equipment</h3> <p style="color: #ccc; font-size: 14px;">Professional microphone, ring light, green screen, dual monitors, and streaming PC.</p> </div> <div style="border: 3px solid #667eea; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #667eea; margin: 0 0 15px 0;">📊 Stream Here</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Access your streaming platforms with studio bonus.</p> <<if $hasLaptop>> <<link "<div style='background: #667eea; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Go to Computer</div>">> <<set $streamingFromStudio = true>> <<set $laptopReturnLocation = "RoomStreamingStudio">> <<goto "UseLaptop">> <</link>> <<else>> <div style='background: #444; color: #888; padding: 10px; border-radius: 6px; text-align: center; font-style: italic;'>No Laptop</div> <</if>> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<set $streamingFromStudio = false>><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomHomeTheater">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #c0392b; text-align: center;">🎬 Home Theater</h1> <div style="padding: 20px; background: linear-gradient(135deg, #c0392b 0%, #922b21 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #c0392b;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A luxurious theater room with surround sound and plush seating. </p> </div> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 30px; background: #2a2a2a; text-align: center; margin-bottom: 25px;"> <h2 style="color: #ffd700; margin: 0 0 15px 0;">🚧 Coming Soon</h2> <p style="color: #ccc;">Movie night features with NPCs will be added in a future update!</p> <p style="color: #888; font-size: 14px;">Requires level 2+ relationship with NPC</p> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomDungeon">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #0d0d0d; min-height: 100vh; padding: 20px;"> <div style="background: rgba(30,30,30,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #8b0000; text-align: center;">⛓️ Dungeon</h1> <div style="padding: 20px; background: linear-gradient(135deg, #2c3e50 0%, #1a252f 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #8b0000;"> <p style="color: #ccc; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> A private space for exploring your darker desires. </p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #8b0000; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #8b0000; margin: 0 0 15px 0;">👑 Domination Practice</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Practice taking control.</p> <<link "<div style='background: #8b0000; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.domination.exp = ($sexualSkills.domination.exp || 0) + 20>> <<replace "#dom-result">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 1px solid #8b0000;"> <p style="color: #8b0000; margin: 0;">You feel more commanding. +20 Domination XP</p> </div> <</replace>> <</link>> <span id="dom-result"></span> </div> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">🔒 Submission Practice</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Practice letting go.</p> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.submission.exp = ($sexualSkills.submission.exp || 0) + 20>> <<replace "#sub-result">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 1px solid #9b59b6;"> <p style="color: #9b59b6; margin: 0;">You feel more at ease. +20 Submission XP</p> </div> <</replace>> <</link>> <span id="sub-result"></span> </div> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">🎭 Roleplay Practice</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Practice different scenarios.</p> <<link "<div style='background: #e83e8c; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.roleplay.exp = ($sexualSkills.roleplay.exp || 0) + 20>> <<replace "#rp-result">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 1px solid #e83e8c;"> <p style="color: #e83e8c; margin: 0;">Your imagination expands. +20 Roleplay XP</p> </div> <</replace>> <</link>> <span id="rp-result"></span> </div> <div style="border: 3px solid #f39c12; border-radius: 10px; padding: 20px; background: #1a1a1a;"> <h3 style="color: #f39c12; margin: 0 0 15px 0;">🔥 Fetish Exploration</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Explore your kinks.</p> <<link "<div style='background: #f39c12; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.fetishPlay.exp = ($sexualSkills.fetishPlay.exp || 0) + 20>> <<replace "#fetish-result">> <div style="background: #2a2a2a; padding: 15px; border-radius: 8px; margin-top: 15px; border: 1px solid #f39c12;"> <p style="color: #f39c12; margin: 0;">New experiences gained. +20 Fetish Play XP</p> </div> <</replace>> <</link>> <span id="fetish-result"></span> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomDanceStudio">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <div style="background: rgba(42,42,42,0.85); padding: 20px; border-radius: 10px;"> <h1 style="color: #e83e8c; text-align: center;">💃 Dance Studio</h1> <div style="padding: 20px; background: linear-gradient(135deg, #e83e8c 0%, #c9379d 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #e83e8c;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Mirrored walls and a sprung floor for practice. </p> </div> <div style="background: #2a4a2a; padding: 20px; border-radius: 10px; margin-bottom: 25px; text-align: center;"> <p style="color: #51cf66; font-size: 18px; margin: 0;">✓ Active Bonus: +20% Stripper Job Performance</p> </div> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 20px; margin-bottom: 25px;"> <div style="border: 3px solid #e83e8c; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #e83e8c; margin: 0 0 15px 0;">🎵 Rhythm Practice</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Improve your sense of rhythm and movement.</p> <<link "<div style='background: #e83e8c; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice Dancing (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.rhythm.exp = ($sexualSkills.rhythm.exp || 0) + 20>> <<replace "#dance-result">> <div style="background: #2a4a2a; padding: 15px; border-radius: 8px; margin-top: 15px;"> <p style="color: #51cf66; margin: 0;">Your moves are smoother! +20 Rhythm XP</p> </div> <</replace>> <</link>> <span id="dance-result"></span> </div> <div style="border: 3px solid #9b59b6; border-radius: 10px; padding: 20px; background: #2a2a2a;"> <h3 style="color: #9b59b6; margin: 0 0 15px 0;">🎪 Pole Practice</h3> <p style="color: #ccc; font-size: 14px; margin-bottom: 15px;">Work on your pole dancing skills.</p> <<link "<div style='background: #9b59b6; color: white; padding: 12px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Practice Pole (1 hour)</div>">> <<run advanceTime(60)>> <<set $sexualSkills.rhythm.exp = ($sexualSkills.rhythm.exp || 0) + 15>> <<set $dexterity = Math.min(100, $dexterity + 1)>> <<replace "#pole-result">> <div style="background: #2a4a2a; padding: 15px; border-radius: 8px; margin-top: 15px;"> <p style="color: #51cf66; margin: 0;">Great workout! +15 Rhythm XP, +1 Dexterity</p> </div> <</replace>> <</link>> <span id="pole-result"></span> </div> </div> <div style="text-align: center;"> <<link "<div style='background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; display: inline-block;'>← Return Home</div>">><<goto _returnPassage>><</link>> </div> </div></div> <</nobr>>
<<nobr>> <<set $lastLocation = "RoomRenovationManager">> <<set _home = setup.getCurrentHome()>> <<set _returnPassage = $renovateReturnPassage || _home>> <!-- Initialize renovation tracking for this home if needed --> <<if !$homeRenovations>><<set $homeRenovations = {}>><</if>> <<if !$homeRenovations[_home]>><<set $homeRenovations[_home] = {small: [], medium: [], large: []}>><</if>> <!-- Define room counts per home type --> <<set _roomCounts = { "PlayerSuburbanHome": {small: 1, medium: 1, large: 0}, "PlayerExpensiveHome": {small: 2, medium: 2, large: 1}, "PlayerModernMansion": {small: 4, medium: 3, large: 2} }>> <<set _counts = _roomCounts[_home] || {small: 0, medium: 0, large: 0}>> <div style="background: #1a1a1a; min-height: 100vh; padding: 20px;"> <h1 style="color: #f39c12; text-align: center;">🔧 Room Renovation Manager</h1> <div style="padding: 20px; background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); border-radius: 15px; margin-bottom: 25px; border: 2px solid #f39c12;"> <p style="color: white; font-size: 18px; margin: 0; text-align: center; font-style: italic;"> Customize your home with specialized rooms. </p> </div> <div style="background: #2a2a2a; padding: 15px; border-radius: 10px; margin-bottom: 20px; text-align: center;"> <p style="color: #ffd700; font-size: 20px; margin: 0;">💵 Your Balance: $<<print $money>></p> </div> <!-- SMALL ROOMS --> <<if _counts.small > 0>> <h2 style="color: #51cf66;">🏠 Small Rooms (<<print $homeRenovations[_home].small.length>>/<<print _counts.small>> Renovated)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _i = 0; _i < _counts.small; _i++>> <<capture _i>> <<set _renovatedRoom = $homeRenovations[_home].small[_i] || null>> <<if _renovatedRoom>> <<set _roomData = setup.roomRenovations.small.find(function(r) { return r.id === _renovatedRoom; })>> <div style="border: 3px solid <<print _roomData.color>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<print _roomData.color>>; margin: 0 0 10px 0;"><<print _roomData.icon>> <<print _roomData.name>></h3> <p style="font-size: 13px; color: #51cf66; margin: 0 0 10px 0;">✓ <<print _roomData.benefit>></p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Re-Renovate</div>">> <<set $renovateRoomSize = "small">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <<else>> <div style="border: 3px solid #51cf66; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #51cf66; margin: 0 0 10px 0;">🧱 Small Custom Room <<print _i + 1>></h3> <p style="font-size: 14px; color: #888; margin: 0 0 10px 0;">An empty room ready for renovation.</p> <<link "<div style='background: #51cf66; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Renovate</div>">> <<set $renovateRoomSize = "small">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <</if>> <</capture>> <</for>> </div> <</if>> <!-- MEDIUM ROOMS --> <<if _counts.medium > 0>> <h2 style="color: #ffd700;">🏡 Medium Rooms (<<print $homeRenovations[_home].medium.length>>/<<print _counts.medium>> Renovated)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _i = 0; _i < _counts.medium; _i++>> <<capture _i>> <<set _renovatedRoom = $homeRenovations[_home].medium[_i] || null>> <<if _renovatedRoom>> <<set _roomData = setup.roomRenovations.medium.find(function(r) { return r.id === _renovatedRoom; })>> <div style="border: 3px solid <<print _roomData.color>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<print _roomData.color>>; margin: 0 0 10px 0;"><<print _roomData.icon>> <<print _roomData.name>></h3> <p style="font-size: 13px; color: #51cf66; margin: 0 0 10px 0;">✓ <<print _roomData.benefit>></p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Re-Renovate</div>">> <<set $renovateRoomSize = "medium">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <<else>> <div style="border: 3px solid #ffd700; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #ffd700; margin: 0 0 10px 0;">🧱 Medium Custom Room <<print _i + 1>></h3> <p style="font-size: 14px; color: #888; margin: 0 0 10px 0;">An empty room ready for renovation.</p> <<link "<div style='background: #ffd700; color: #1a1a1a; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Renovate</div>">> <<set $renovateRoomSize = "medium">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <</if>> <</capture>> <</for>> </div> <</if>> <!-- LARGE ROOMS --> <<if _counts.large > 0>> <h2 style="color: #e74c3c;">🏰 Large Rooms (<<print $homeRenovations[_home].large.length>>/<<print _counts.large>> Renovated)</h2> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 15px; margin-bottom: 25px;"> <<for _i = 0; _i < _counts.large; _i++>> <<capture _i>> <<set _renovatedRoom = $homeRenovations[_home].large[_i] || null>> <<if _renovatedRoom>> <<set _roomData = setup.roomRenovations.large.find(function(r) { return r.id === _renovatedRoom; })>> <div style="border: 3px solid <<print _roomData.color>>; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: <<print _roomData.color>>; margin: 0 0 10px 0;"><<print _roomData.icon>> <<print _roomData.name>></h3> <p style="font-size: 13px; color: #51cf66; margin: 0 0 10px 0;">✓ <<print _roomData.benefit>></p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Re-Renovate</div>">> <<set $renovateRoomSize = "large">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <<else>> <div style="border: 3px solid #e74c3c; border-radius: 10px; padding: 15px; background: #2a2a2a; box-shadow: 0 4px 8px rgba(0,0,0,0.4);"> <h3 style="color: #e74c3c; margin: 0 0 10px 0;">🧱 Large Custom Room <<print _i + 1>></h3> <p style="font-size: 14px; color: #888; margin: 0 0 10px 0;">An empty room ready for renovation.</p> <<link "<div style='background: #e74c3c; color: white; padding: 10px; border-radius: 6px; text-align: center; cursor: pointer; font-weight: bold;'>Renovate</div>">> <<set $renovateRoomSize = "large">> <<set $renovateRoomIndex = _i>> <<set $renovateReturnPassage = _returnPassage>> <<goto "RoomRenovation">> <</link>> </div> <</if>> <</capture>> <</for>> </div> <</if>> <div style="text-align: center; margin-top: 30px;"> <<link "<div style='display: inline-block; background: #667eea; color: white; padding: 12px 30px; border-radius: 8px; font-weight: bold; font-size: 16px;'>← Back to Home</div>">> <<goto _returnPassage>> <</link>> </div> </div> <</nobr>>