<div class="mobile-skip-screen">
<h2>Minigame Unavailable</h2>
<p>This minigame isn't optimized for mobile devices yet.</p>
<p>Skipping to ensure the best gameplay experience.</p>
<br>
<<button "Go Back">><<goto $skipMinigameBack>><</button>>
<<if previous() is "WorkBrainFry">>
<<button "Continue">><<run MindWare.submitBrainFryWork(500, 250)>><</button>>
<<else>>
<<button "Continue">><<goto $skipMinigameContinue>><</button>>
<</if>>
</div>
<style>
.mobile-skip-screen {
font-family: var(--mindware-ui-font-primary);
color: var(--mindware-ui-text-color);
background-color: var(--mindware-ui-content-bg);
padding: 20px;
text-align: center;
border: var(--mindware-ui-pixel-size) solid var(--mindware-ui-border-color);
box-shadow: 0 0 10px var(--mindware-ui-shadow-color);
margin: 20px auto;
}
.mobile-skip-screen h2 {
font-size: 1.5em;
margin-bottom: 15px;
color: var(--mindware-ui-accent-color);
}
.mobile-skip-screen p {
font-size: 1em;
margin-bottom: 10px;
color: var(--mindware-ui-light-text);
}
.countdown {
font-size: 1.2em;
margin-top: 20px;
font-weight: bold;
color: var(--mindware-ui-secondary-accent);
}
</style><div class="mobile-skip-screen">
<h2>Games Unavailable</h2>
<p>Games aren't optimized for mobile devices yet.</p>
<p>But don't worry: they are just distractions and serve no real purpose in the game.</p>
<br>
<<button "Go Back">><<goto $playerHome>><</button>>
</div>
<style>
.mobile-skip-screen {
font-family: var(--mindware-ui-font-primary);
color: var(--mindware-ui-text-color);
background-color: var(--mindware-ui-content-bg);
padding: 20px;
text-align: center;
border: var(--mindware-ui-pixel-size) solid var(--mindware-ui-border-color);
box-shadow: 0 0 10px var(--mindware-ui-shadow-color);
margin: 20px auto;
}
.mobile-skip-screen h2 {
font-size: 1.5em;
margin-bottom: 15px;
color: var(--mindware-ui-accent-color);
}
.mobile-skip-screen p {
font-size: 1em;
margin-bottom: 10px;
color: var(--mindware-ui-light-text);
}
.countdown {
font-size: 1.2em;
margin-top: 20px;
font-weight: bold;
color: var(--mindware-ui-secondary-accent);
}
</style>/* EXAMPLE */
<!-- Button to submit to AVA -->
@@.pink-choicebutton;<<button "Submit to AVA">>
<</button>>@@
<br>
<!-- Button to resist AVA wrapped in a div with a unique ID -->
<div id="resist-ava-button-container">
@@.choicebutton;<<button "Resist AVA">>
<<run MindWare.resistAVAMinigame()>>
<</button>>@@
<br>
</div>
<!-- Hidden Content: Button to Continue (Initially Hidden) -->
<div id="AVA-resist-minigame-hidden-content" style="display: none;">
@@.choicebutton;<<button "Continue">>
<<set $genderIdentityQuestionnaireQuestion3 to "true">>
<<replace "#questions">>
<<include "PsychologicalEvaluation1-Test-Read4">>
<</replace>>
<</button>>@@
</div>
/* With settings */
<!-- Button to resist AVA wrapped in a div with a unique ID -->
<div id="resist-ava-button-container">
@@.choicebutton;<<button "Resist AVA">>
<<set $resistAVACustomSettings to true>>
<<set $resistAVATotalCircles to 7>>
<<set $resistAVACircleDuration to 3000>>
<<set $resistAVACircleMinSize to 40>>
<<set $resistAVACircleMaxSize to 80>>
<<run MindWare.resistAVAMinigame()>>
<</button>>@@
<br>
</div><style>
.container {
touch-action: none; /* Prevents default touch behaviors */
-webkit-touch-callout: none; /* Prevents callouts */
-webkit-user-select: none; /* Prevents text selection */
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.room {
touch-action: none;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.exit-portal {
position: absolute;
top: 0 !important;
width: 100%;
height: 100vh;
background-image: url('imgs/dreams/tunnel.webp');
background-size: 100% 100%;
/* z-index: 10000; */
z-index: 100004 !important;
opacity: 0; /* Start fully transparent */
animation:
fadeInBackground 2s ease-in-out forwards,
forceRepaint 0.1s infinite;
animation-delay: 0s, 2s; /* Delay for each animation respectively */
}
@keyframes fadeInBackground {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
/* .exit-portal {
position: absolute;
top: 0 !important;
width: 100%;
height: 100vh;
background: linear-gradient(to right,
rgba(0, 255, 0, 1),
rgba(0, 255, 0, 1),
rgba(0, 255, 0, 1)
);
z-index: 10000;
box-shadow: 0 0 50px #00ff00;
} */
.container {
max-width: 54em;
/* min-height: calc(100vh - 65px); */
min-height: 100vh;
margin: 0px auto;
perspective: 700px; /* Slightly increase the perspective for better depth */
perspective-origin: 50% 50%; /* Add this to center the perspective point */
/* ... existing styles ... */
-webkit-perspective: 700px;
-webkit-perspective-origin: 50% 50%;
transform-style: preserve-3d;
-webkit-transform-style: preserve-3d; /* Safari needs this prefix */
}
/* For screens with max-width 1200px */
@media (max-width: 1200px) {
.container {
perspective: 650px; /* Slightly reduced */
}
}
/* For screens with max-width 992px */
@media (max-width: 992px) {
.container {
perspective: 600px; /* Reduced further */
}
}
/* For screens with max-width 844px */
@media (max-width: 844px) {
.container {
perspective: 550px; /* Closer to the target */
}
}
/* For screens with max-width 600px */
@media (max-width: 600px) {
.container {
perspective: 500px; /* Smallest, final perspective */
}
}
.room-old {
position: relative;
width: 100%;
min-height: calc(100vh - 15vh);
transform-style: preserve-3d;
transform-origin: center center; /* Add this */
/* ... existing styles ... */
transform-style: preserve-3d;
-webkit-transform-style: preserve-3d;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.room {
position: relative;
width: 100%;
min-height: calc(100vh - 15vh);
transform-style: preserve-3d;
-webkit-transform-style: preserve-3d;
transform-origin: center center;
-webkit-transform-origin: center center;
transform-box: border-box;
-webkit-transform-box: border-box;
}
/* For screens with max-width 1200px */
@media (max-width: 1200px) {
.room {
min-height: calc(100vh - 20vh); /* Slightly less space at top */
}
}
/* For screens with max-width 992px */
@media (max-width: 992px) {
.room {
min-height: calc(100vh - 25vh);
}
}
/* For screens with max-width 844px */
@media (max-width: 844px) {
.room {
min-height: calc(100vh - 30vh);
}
}
/* For screens with max-width 600px */
@media (max-width: 600px) {
.room {
min-height: calc(100vh - 35vh); /* Minimal space at top for smallest screens */
}
}
.transit {
transition: all 0.6s linear;
-webkit-transition: all 0.6s linear;
}
.transitfast {
transition: all 0.3s linear;
-webkit-transition: all 0.3s linear;
}
.room-wrapper {
position: relative;
width: 100%;
height: 100%;
overflow-y: auto; /* Allows vertical scrolling if content overflows */
overflow-x: hidden; /* Prevents horizontal scrolling */
margin-top: 5px;
border: 3px solid transparent;
border-image: linear-gradient(135deg, rgba(0, 175, 255, 1), rgba(255, 100, 255, 1)) 1;
background: rgba(255, 255, 255, 0.05);
/* backdrop-filter: blur(4px); */
box-shadow: 0px 0px 5px 2px rgba(0, 175, 255, 0.3), 0px 0px 8px 4px rgba(255, 100, 255, 0.3);
animation: scanlines 0.1s steps(50) infinite, borderColorShift 5s ease-in-out infinite;
/* new */
z-index: 100002;
}
.room div {
position: absolute;
top: 15px;
width: 100%;
height: 100%;
padding: 0px;
transform-origin: center center; /* Add this */
backface-visibility: hidden;
/* new styles */
-webkit-transform-origin: center center;
-webkit-backface-visibility: hidden;
z-index: 100001;
}
.clickable:hover .room-wrapper {
cursor: pointer;
background-color: rgba(150, 150, 255, 0.4); /* More intense background on hover */
border-color: #00ccff;
box-shadow: 0px 0px 20px 10px rgba(0, 175, 255, 0.8), 0px 0px 25px 12px rgba(255, 100, 255, 0.8); /* Increased glow on hover */
transition: box-shadow 0.3s ease, background-color 0.3s ease, border-color 0.3s ease; /* Smooth transition */
z-index:;
}
/* Scanline effect animation */
@keyframes scanlines {
0% { background-position: 0 0; }
100% { background-position: 0 100%; }
}
/* Border color shift animation */
@keyframes borderColorShift {
0% {
border-image: linear-gradient(135deg, rgba(0, 175, 255, 1), rgba(255, 100, 255, 1)) 1;
}
50% {
border-image: linear-gradient(135deg, rgba(125, 75, 255, 1), rgba(255, 150, 255, 1)) 1; /* Blue shifts more to purple, pink becomes brighter */
}
100% {
border-image: linear-gradient(135deg, rgba(0, 175, 255, 1), rgba(255, 100, 255, 1)) 1;
}
}
/* Optional glow pulse for a more holographic feel */
@keyframes glowPulse {
0% {
box-shadow: 0px 0px 10px 5px rgba(0, 175, 255, 0.3), 0px 0px 15px 10px rgba(255, 100, 255, 0.3); /* Reduced glow */
}
50% {
box-shadow: 0px 0px 15px 10px rgba(0, 175, 255, 0.5), 0px 0px 20px 10px rgba(255, 100, 255, 0.5); /* Reduced pulse */
}
100% {
box-shadow: 0px 0px 10px 5px rgba(0, 175, 255, 0.3), 0px 0px 15px 10px rgba(255, 100, 255, 0.3);
}
}
/* Fullscreen overlay for the dream3d passage */
.dream-fullscreen-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw; /* Full viewport width */
height: 100vh; /* Full viewport height */
background-color: black; /* Black background for the minigame overlay */
z-index: 9999; /* Bring the overlay to the top of everything */
overflow: hidden; /* Ensure the overlay content does not overflow */
cursor: pointer;
}
/* Hide scrollbars when fullscreen overlay is active */
body.no-scroll {
overflow: hidden; /* This hides the scrollbars */
}
/* Hide scrollbars for the #passages element */
#passages.no-scroll {
overflow: hidden; /* This will hide the scrollbars for the #passages element */
}
.hypno-container {
top: 0px !important;
width: 100%;
height: 100vh;
background-size: contain, auto;
background-repeat: no-repeat, repeat;
background-position: center, top left;
margin: 0;
padding: 0;
border: 0;
/* z-index: 9999; */
z-index: 100003 !important;
animation: cyberpunkColors 8s infinite ease-in-out;
position: relative;
animation: forceRepaint 0.1s infinite;
}
@keyframes forceRepaint {
0% {
opacity: 1;
}
50% {
opacity: 0.9999;
}
100% {
opacity: 1;
}
}
/* Subtle pulsing glow overlay */
.hypno-container::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle at center,
transparent 0%,
rgba(185, 87, 206, 0.1) 50%,
rgba(89, 148, 206, 0.2) 100%
);
animation: glowHypnoPulse 4s infinite alternate;
mix-blend-mode: screen;
pointer-events: none;
}
@keyframes cyberpunkColors {
0%, 100% {
filter: contrast(110%) brightness(100%) hue-rotate(0deg) saturate(120%);
}
33% {
/* Deep cyberpunk blue/purple */
filter: contrast(120%) brightness(95%) hue-rotate(200deg) saturate(150%);
}
66% {
/* Intense magenta/neon */
filter: contrast(130%) brightness(105%) hue-rotate(280deg) saturate(180%);
}
}
@keyframes glowHypnoPulse {
0%, 100% {
opacity: 0.3;
}
50% {
opacity: 0.7;
}
}
.red-warning {
top: 0px !important;
width: 100vw; /* Full viewport width */
height: 100vh; /* Full viewport height */
background-color: rgba(255, 0, 0, 0.5); /* Semi-transparent red */
z-index: 9998; /* Below the hypno-container but on top of other content */
animation: red-flash 1s ease-in-out infinite; /* Flashing effect */
}
/* Flashing animation */
@keyframes red-flash {
0% {
background-color: rgba(255, 0, 0, 0.5); /* Semi-transparent red */
}
50% {
background-color: rgba(255, 0, 0, 0.1); /* Lighter red */
}
100% {
background-color: rgba(255, 0, 0, 0.5); /* Back to semi-transparent red */
}
}
</style>
<<script>>
(function() {
window.DreamManager.cleanup();
const instanceId = Date.now();
window.DreamManager.currentInstance = instanceId;
/* Configuration Variables */
const config = {
images: (State.variables.dreamConfig && State.variables.dreamConfig.images !== undefined)
? State.variables.dreamConfig.images
: [
'hypno-solo/537167042_p0.webp',
'hypno-solo/538222714_p0.webp',
'hypno-solo/607915785_p1.webp',
'hypno-solo/537167473_p0.webp',
'hypno-solo/538223465_p0.webp',
'hypno-solo/610507079_p0.webp',
'hypno-solo/537168502_p0.webp',
'hypno-solo/538745429_p0.webp',
'hypno-solo/611132916_p0.webp',
'hypno-solo/537179700_p0.webp',
'hypno-solo/538849150_p0.webp',
'hypno-solo/611741618_p0.webp',
'hypno-solo/537182511_p1.webp',
'hypno-solo/538891158_p0.webp',
'hypno-solo/611741618_p1.webp',
'hypno-solo/537187364_p1.webp',
'hypno-solo/539725855_p0.webp',
'hypno-solo/620011929_p0.webp',
'hypno-solo/537188585_p0.webp',
'hypno-solo/540121463_p0.webp',
'hypno-solo/621014644_p0.webp',
'hypno-solo/537208456_p0.webp',
'hypno-solo/549691708_p0.webp',
'hypno-solo/623036862_p0.webp',
'hypno-solo/537277648_p0.webp',
'hypno-solo/564432355_p0.webp',
'hypno-solo/623980519_p0.webp',
'hypno-solo/537796555_p0.webp',
'hypno-solo/564432355_p1.webp',
'hypno-solo/630682178_p1.webp',
'hypno-solo/537807630_p0.webp',
'hypno-solo/572987598_p0.webp',
'hypno-solo/631151091_p1.webp',
'hypno-solo/537839279_p0.webp',
'hypno-solo/574359634_p0.webp',
'hypno-solo/633341305_p0.webp',
'hypno-solo/537845640_p0.webp',
'hypno-solo/583215837_p0.webp',
'hypno-solo/639446048_p1.webp',
'hypno-solo/537860788_p0.webp',
'hypno-solo/605558520_p0.webp',
'hypno-solo/648321039_p0.webp',
'hypno-solo/537990665_p0.webp',
'hypno-solo/605716507_p0.webp',
'hypno-solo/648321039_p2.webp',
'hypno-solo/537990784_p0.webp',
'hypno-solo/606507445_p0.webp',
'hypno-solo/650633046_p0.webp',
'hypno-solo/537990986_p0.webp',
'hypno-solo/607915785_p0.webp'
],
initialDelay: (State.variables.dreamConfig && State.variables.dreamConfig.initialDelay !== undefined)
? State.variables.dreamConfig.initialDelay
: 5000,
warningDisplayTime: (State.variables.dreamConfig && State.variables.dreamConfig.warningDisplayTime !== undefined)
? State.variables.dreamConfig.warningDisplayTime
: 1500,
imageDisplayTime: (State.variables.dreamConfig && State.variables.dreamConfig.imageDisplayTime !== undefined)
? State.variables.dreamConfig.imageDisplayTime
: 3000,
numberOfSets: (State.variables.dreamConfig && State.variables.dreamConfig.numberOfSets !== undefined)
? State.variables.dreamConfig.numberOfSets
: 0,
numberOfWallsPerSet: (State.variables.dreamConfig && State.variables.dreamConfig.numberOfWallsPerSet !== undefined)
? State.variables.dreamConfig.numberOfWallsPerSet
: 2,
hypnoTimer: (State.variables.dreamConfig && State.variables.dreamConfig.hypnoTimer !== undefined)
? State.variables.dreamConfig.hypnoTimer
: 10000,
progressBarColor: (State.variables.dreamConfig && State.variables.dreamConfig.progressBarColor !== undefined)
? State.variables.dreamConfig.progressBarColor
: "#0C85D3"
};
/* const config = {
images: [
'537167042_p0.webp', '538222714_p0.webp', '607915785_p1.webp',
'537167473_p0.webp', '538223465_p0.webp', '610507079_p0.webp',
'537168502_p0.webp', '538745429_p0.webp', '611132916_p0.webp',
'537179700_p0.webp', '538849150_p0.webp', '611741618_p0.webp',
'537182511_p1.webp', '538891158_p0.webp', '611741618_p1.webp',
'537187364_p1.webp', '539725855_p0.webp', '620011929_p0.webp',
'537188585_p0.webp', '540121463_p0.webp', '621014644_p0.webp',
'537208456_p0.webp', '549691708_p0.webp', '623036862_p0.webp',
'537277648_p0.webp', '564432355_p0.webp', '623980519_p0.webp',
'537796555_p0.webp', '564432355_p1.webp', '630682178_p1.webp',
'537807630_p0.webp', '572987598_p0.webp', '631151091_p1.webp',
'537839279_p0.webp', '574359634_p0.webp', '633341305_p0.webp',
'537845640_p0.webp', '583215837_p0.webp', '639446048_p1.webp',
'537860788_p0.webp', '605558520_p0.webp', '648321039_p0.webp',
'537990665_p0.webp', '605716507_p0.webp', '648321039_p2.webp',
'537990784_p0.webp', '606507445_p0.webp', '650633046_p0.webp',
'537990986_p0.webp', '607915785_p0.webp'
],
initialDelay: 5000,
warningDisplayTime: 1500,
imageDisplayTime: 3000,
numberOfSets: 0,
numberOfWallsPerSet: 2
}; */
/* Validation for numberOfWallsPerSet */
if (config.numberOfWallsPerSet < 0 || config.numberOfWallsPerSet > 4) {
console.error("numberOfWallsPerSet must be between 0 and 4.");
config.numberOfWallsPerSet = 3; /* Default to 3 if invalid */
}
/* Helper Function to Shuffle an Array */
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
/* Helper Function to Get Random Subset */
function getRandomSubset(array, size) {
if (size > array.length) {
throw new Error("Subset size larger than array length");
}
const shuffled = shuffle([...array]);
return shuffled.slice(0, size);
}
/* Preload Images */
config.images.forEach(img => {
const image = new Image();
image.src = `imgs/dreams/${img}`;
});
/* Initialize Variables */
let currentSet = 0;
/* Function to Start the Image Cycle */
function startImageCycle() {
if (window.DreamManager.currentInstance !== instanceId) return;
setTimeout(() => {
runSet();
}, config.initialDelay);
}
/* Function to Run Each Set */
function runSet() {
if (window.DreamManager.currentInstance !== instanceId) return;
/* Remove the end condition check and replace with infinite loop logic */
if (config.numberOfSets > 0 && currentSet >= config.numberOfSets) {
console.log("All sets completed.");
return;
}
console.log(`Running set ${currentSet + 1}`);
/* Determine the number of walls to display images on for this set */
let numberOfWalls = config.numberOfWallsPerSet;
/* If numberOfWalls is 0, skip this set */
if (numberOfWalls === 0) {
console.log("No walls selected for this set.");
currentSet++;
runSet(); /* Proceed to next set immediately */
return;
}
/* Ensure numberOfWalls does not exceed 4 */
numberOfWalls = Math.min(numberOfWalls, 4);
/* Get the currently facing wall */
const facingWall = State.variables.facing;
/* Check if exit portal exists on any wall */
const wallElements = document.querySelectorAll('.room-wrapper');
let wallWithPortal = null;
wallElements.forEach(wall => {
if (wall.querySelector('.exit-portal')) {
wallWithPortal = wall.id.replace('wall-', '');
}
});
/* Validate the facingWall */
const validWalls = ['N', 'E', 'S', 'W'];
if (!validWalls.includes(facingWall)) {
console.error(`Invalid facing wall: ${facingWall}`);
currentSet++;
runSet();
return;
}
/* Select walls, excluding the wall with the portal */
let availableWalls = validWalls.filter(wall => wall !== wallWithPortal);
let selectedWalls = [];
if (numberOfWalls >= 1) {
if (!wallWithPortal || facingWall !== wallWithPortal) {
selectedWalls.push(facingWall);
}
if (numberOfWalls > 1) {
const remainingWalls = availableWalls.filter(wall => wall !== facingWall);
const additionalWalls = getRandomSubset(remainingWalls,
Math.min(numberOfWalls - selectedWalls.length, remainingWalls.length));
selectedWalls = selectedWalls.concat(additionalWalls);
}
}
console.log(`Selected Images: ${selectedWalls.length >0 ? selectedWalls.length : 0}`);
console.log(`Selected Walls: ${selectedWalls}`);
/* Select random images based on the number of selected walls */
const selectedImages = getRandomSubset(config.images, selectedWalls.length);
console.log(`Selected Images: ${selectedImages}`);
/* Display warnings on selected walls */
selectedWalls.forEach((wall, index) => {
const wallElement = $(`#wall-${wall}`);
const warningDiv = $(`
<div class="red-warning dynamic-warning" id="warning-${wall}-${currentSet}"></div>
`);
wallElement.append(warningDiv);
});
/* After warningDisplayTime, remove warnings and display images */
setTimeout(() => {
/* Remove warnings */
selectedWalls.forEach(wall => {
$(`#warning-${wall}-${currentSet}`).remove();
});
/* Assign images to walls */
selectedWalls.forEach((wall, index) => {
const wallElement = $(`#wall-${wall}`);
const imageUrl = `imgs/dreams/${selectedImages[index]}`;
/* Create hypno-container div with duplicated background-image */
const hypnoDiv = $(`
<div class="hypno-container dynamic-hypno" id="hypno-${wall}-${currentSet}" style="
background-image: url('${imageUrl}'), url('${imageUrl}');
">
</div>
`);
/* Append to the wall */
wallElement.append(hypnoDiv);
});
/* After imageDisplayTime, remove images and proceed to next set */
setTimeout(() => {
if (window.DreamManager.currentInstance !== instanceId) return;
selectedWalls.forEach(wall => {
$(`#hypno-${wall}-${currentSet}`).remove();
});
/* Increment set counter (useful for generating unique IDs) */
currentSet++;
/* Check if we should stop based on passage change */
const currentPassage = SugarCube.Story.get(SugarCube.State.passage);
if (!currentPassage || !currentPassage.tags.includes('dream3d')) {
console.log("Dream sequence ended.");
return;
}
/* Continue to next set */
runSet();
}, config.imageDisplayTime);
}, config.warningDisplayTime);
}
/* Store intervals for cleanup */
function setDreamInterval(callback, delay) {
const id = setInterval(callback, delay);
window.DreamManager.intervalIds.add(id);
return id;
}
/* Add cleanup handler */
$(document).on(':passagestart', function (ev) {
window.DreamManager.cleanup();
});
/* Add a cleanup function to handle passage changes */
$(document).on(':passagestart', function (ev) {
/* Check if we're leaving a dream3d passage */
const prevPassage = SugarCube.Story.get(SugarCube.State.passage);
if (prevPassage && prevPassage.tags.includes('dream3d')) {
/* Clean up any remaining dynamic elements */
$('.dynamic-warning, .dynamic-hypno').remove();
}
});
/* Start the cycle when the passage is displayed */
$(document).on(':passagedisplay', function (ev) {
/* Check if the current passage has the 'dream3d' tag */
const currentPassageName = SugarCube.State.passage;
const currentPassage = SugarCube.Story.get(currentPassageName);
if (currentPassage && currentPassage.tags.includes('dream3d')) {
startImageCycle();
}
});
})();
<</script>>
<<if !$disableHypnoTimer && !$temporarilyDisableHypnoTimer>>
<div id="hypno-timer-container" style="position: fixed; bottom: 10px; right: 10px; left: 10px; display: flex; align-items: center; gap: 10px;">
<div id="hypno-progress" style="flex: 1; height: 10px; background-color: rgba(255,255,255,0.3); border: 1px solid #fff; border-radius: 5px; overflow: hidden;">
<div id="hypno-progress-fill" style="width: 0%; height: 100%; background-color: #0C85D3; transition: width 0.1s linear;"></div>
</div>
<div id="exit-timer" style="background-color: rgba(0,0,0,0.5); color: white; padding: 5px 10px; border-radius: 5px; font-family: monospace;">00:00</div>
</div>
<<else>>
<div id="exit-button-container" style="position: fixed; bottom: 10px; right: 10px;">
<button onclick="SugarCube.State.variables.temporarilyDisableHypnoTimer = false; SugarCube.State.variables.dreamStats.earlyExit++; SugarCube.Engine.play(SugarCube.State.variables.dreamConfig.returnPassage); window.stopDreamsSound();"
style="background-color: rgba(0,0,0,0.7);
color: white;
padding: 10px 20px;
border: 1px solid #fff;
border-radius: 5px;
cursor: pointer;
font-family: monospace;
transition: all 0.3s ease;">
EXIT DREAM
</button>
</div>
<</if>>
/* <div id="exit-timer-container" style="position: fixed; bottom: 30px; right: 10px; left: 10px; display: flex; align-items: center; gap: 10px;">
<div id="exit-progress" style="flex: 1; height: 10px; background-color: rgba(255,255,255,0.3); border: 1px solid #fff; border-radius: 5px; overflow: hidden;">
<div id="exit-progress-fill" style="width: 0%; height: 100%; background-color: #00FF00; transition: width 0.1s linear;"></div>
</div>
</div> */<canvas class="background" id="matrixEffectWest" style="width: 100%; height: 100%;"></canvas>
<script>
(function () {
const n = document.getElementById('matrixEffectWest');
if (n) {
var e = n.getContext('2d');
var t = (n.width = window.innerWidth);
var a = (n.height = window.innerHeight);
var i = Array(275).join(0).split('');
if (typeof West_Game_Interval !== 'undefined') {
clearInterval(West_Game_Interval);
}
West_Game_Interval = setInterval(o, 45);
}
function o() {
(e.fillStyle = 'rgba(0,0,0,.07)'),
e.fillRect(0, 0, t, a),
(e.fillStyle = '#0C85D3'),
(e.font = '10px Georgia'),
i.map((n, t) => {
(text = String.fromCharCode(100 + 33 * Math.random())),
(x = 10 * t),
e.fillText(text, x, n),
n > 100 + 3e4 * Math.random() ? (i[t] = 0) : (i[t] = n + 10);
});
}
})();
</script><canvas class="background" id="matrixEffectNorth" style="width: 100%; height: 100%;"></canvas>
<script>
(function () {
const n = document.getElementById('matrixEffectNorth');
if (n) {
var e = n.getContext('2d');
var t = (n.width = window.innerWidth);
var a = (n.height = window.innerHeight);
var i = Array(275).join(0).split('');
if (typeof North_Game_Interval !== 'undefined') {
clearInterval(North_Game_Interval);
}
North_Game_Interval = setInterval(o, 45);
}
function o() {
(e.fillStyle = 'rgba(0,0,0,.07)'),
e.fillRect(0, 0, t, a),
(e.fillStyle = '#0C85D3'),
(e.font = '10px Georgia'),
i.map((n, t) => {
(text = String.fromCharCode(100 + 33 * Math.random())),
(x = 10 * t),
e.fillText(text, x, n),
n > 100 + 3e4 * Math.random() ? (i[t] = 0) : (i[t] = n + 10);
});
}
})();
</script><canvas class="background" id="matrixEffectEast" style="width: 100%; height: 100%;"></canvas>
<script>
(function () {
const n = document.getElementById('matrixEffectEast');
if (n) {
var e = n.getContext('2d');
var t = (n.width = window.innerWidth);
var a = (n.height = window.innerHeight);
var i = Array(275).join(0).split('');
if (typeof East_Game_Interval !== 'undefined') {
clearInterval(East_Game_Interval);
}
East_Game_Interval = setInterval(o, 45);
}
function o() {
(e.fillStyle = 'rgba(0,0,0,.07)'),
e.fillRect(0, 0, t, a),
(e.fillStyle = '#0C85D3'),
(e.font = '10px Georgia'),
i.map((n, t) => {
(text = String.fromCharCode(100 + 33 * Math.random())),
(x = 10 * t),
e.fillText(text, x, n),
n > 100 + 3e4 * Math.random() ? (i[t] = 0) : (i[t] = n + 10);
});
}
})();
</script><canvas class="background" id="matrixEffectSouth" style="width: 100%; height: 100%;"></canvas>
<script>
(function () {
const n = document.getElementById('matrixEffectSouth');
if (n) {
var e = n.getContext('2d');
var t = (n.width = window.innerWidth);
var a = (n.height = window.innerHeight);
var i = Array(275).join(0).split('');
if (typeof South_Game_Interval !== 'undefined') {
clearInterval(South_Game_Interval);
}
South_Game_Interval = setInterval(o, 45);
}
function o() {
(e.fillStyle = 'rgba(0,0,0,.07)'),
e.fillRect(0, 0, t, a),
(e.fillStyle = '#0C85D3'),
(e.font = '10px Georgia'),
i.map((n, t) => {
(text = String.fromCharCode(100 + 33 * Math.random())),
(x = 10 * t),
e.fillText(text, x, n),
n > 100 + 3e4 * Math.random() ? (i[t] = 0) : (i[t] = n + 10);
});
}
})();
</script><<if !State.variables.facing>>
<<set $facing = 'N'>>
<</if>>
<div class="container">
<div class="room">
<div class="west" data-wall="W" onclick="rotate('W')">
<div class="room-wrapper" id="wall-W">
<<include "Matrix Effect West">>
</div>
</div>
<div class="north" data-wall="N" onclick="rotate('N')">
<div class="room-wrapper" id="wall-N">
<<include "Matrix Effect North">>
</div>
</div>
<div class="east" data-wall="E" onclick="rotate('E')" >
<div class="room-wrapper" id="wall-E">
<<include "Matrix Effect East">>
</div>
</div>
<div class="south" data-wall="S" onclick="rotate('S')" >
<div class="room-wrapper" id="wall-S">
<<include "Matrix Effect South">>
</div>
</div>
</div>
</div>
<<include "Dream3D">><<if !State.variables.facing>>
<<set $facing = 'N'>>
<</if>>
<<set $dreamConfig = {
"images": [
"hypno-solo/537167042_p0.webp",
"hypno-solo/538222714_p0.webp",
"hypno-solo/607915785_p1.webp",
"hypno-solo/537167473_p0.webp",
"hypno-solo/538223465_p0.webp",
"hypno-solo/610507079_p0.webp",
"hypno-solo/537168502_p0.webp",
"hypno-solo/538745429_p0.webp",
"hypno-solo/611132916_p0.webp",
"hypno-solo/537179700_p0.webp",
"hypno-solo/538849150_p0.webp",
"hypno-solo/611741618_p0.webp",
"hypno-solo/537182511_p1.webp",
"hypno-solo/538891158_p0.webp",
"hypno-solo/611741618_p1.webp",
"hypno-solo/537187364_p1.webp",
"hypno-solo/539725855_p0.webp",
"hypno-solo/620011929_p0.webp",
"hypno-solo/537188585_p0.webp",
"hypno-solo/540121463_p0.webp",
"hypno-solo/621014644_p0.webp",
"hypno-solo/537208456_p0.webp",
"hypno-solo/549691708_p0.webp",
"hypno-solo/623036862_p0.webp",
"hypno-solo/537277648_p0.webp",
"hypno-solo/564432355_p0.webp",
"hypno-solo/623980519_p0.webp",
"hypno-solo/537796555_p0.webp",
"hypno-solo/564432355_p1.webp",
"hypno-solo/630682178_p1.webp",
"hypno-solo/537807630_p0.webp",
"hypno-solo/572987598_p0.webp",
"hypno-solo/631151091_p1.webp",
"hypno-solo/537839279_p0.webp",
"hypno-solo/574359634_p0.webp",
"hypno-solo/633341305_p0.webp",
"hypno-solo/537845640_p0.webp",
"hypno-solo/583215837_p0.webp",
"hypno-solo/639446048_p1.webp",
"hypno-solo/537860788_p0.webp",
"hypno-solo/605558520_p0.webp",
"hypno-solo/648321039_p0.webp",
"hypno-solo/537990665_p0.webp",
"hypno-solo/605716507_p0.webp",
"hypno-solo/648321039_p2.webp",
"hypno-solo/537990784_p0.webp",
"hypno-solo/606507445_p0.webp",
"hypno-solo/650633046_p0.webp",
"hypno-solo/537990986_p0.webp",
"hypno-solo/607915785_p0.webp"
],
"initialDelay": 3000,
"warningDisplayTime": 1500,
"imageDisplayTime": 3000,
"numberOfSets": 0,
"dreamFailTimer": 5000,
"numberOfWallsPerSet": 2,
"dreamSoundId": "dream-hypno-obey",
"alertDisabled": false,
"returnPassage": $returnPassage,
"nextPassage": $returnPassage
}>>
<div class="container">
<div class="room">
<div class="west" data-wall="W" onclick="rotate('W')">
<div class="room-wrapper" id="wall-W">
<<include "Matrix Effect West">>
</div>
</div>
<div class="north" data-wall="N" onclick="rotate('N')">
<div class="room-wrapper" id="wall-N">
<<include "Matrix Effect North">>
</div>
</div>
<div class="east" data-wall="E" onclick="rotate('E')" >
<div class="room-wrapper" id="wall-E">
<<include "Matrix Effect East">>
</div>
</div>
<div class="south" data-wall="S" onclick="rotate('S')" >
<div class="room-wrapper" id="wall-S">
<<include "Matrix Effect South">>
</div>
</div>
</div>
</div>
<<include "Dream3D">><<if !State.variables.facing>>
<<set $facing = 'N'>>
<</if>>
<<set $dreamConfig = {
"images": [
"hypno-cock/537166764_p0.webp",
"hypno-cock/621848180_p0.webp",
"hypno-cock/537183268_p0.webp",
"hypno-cock/579291385_p0.webp",
"hypno-cock/622903894_p0.webp",
"hypno-cock/537278168_p0.webp",
"hypno-cock/583309087_p1.webp",
"hypno-cock/629789236_p0.webp",
"hypno-cock/537905533_p0.webp",
"hypno-cock/605558520_p1.webp",
"hypno-cock/629789704_p0.webp",
"hypno-cock/538552372_p0.webp",
"hypno-cock/605652189_p1.webp",
"hypno-cock/630682178_p0.webp",
"hypno-cock/540110418_p0.webp",
"hypno-cock/631833543_p0.webp",
"hypno-cock/557661099_p1.webp",
"hypno-cock/563038141_p0.webp",
"hypno-cock/639446048_p2.webp",
"hypno-cock/564671788_p1.webp",
"hypno-cock/618836280_p1.webp",
"hypno-cock/650633046_p1.webp",
"hypno-cock/572987598_p1.webp",
"hypno-cock/576005360_p0.webp"
],
"initialDelay": 3000,
"warningDisplayTime": 1000,
"imageDisplayTime": 3000,
"numberOfSets": 0,
"numberOfWallsPerSet": 3,
"dreamFailTimer": 5000,
"dreamSoundId": "dream-hypno-cock",
"alertDisabled": false,
"returnPassage": $returnPassage,
"nextPassage": $returnPassage
}>>
<div class="container">
<div class="room">
<div class="west" data-wall="W" onclick="rotate('W')">
<div class="room-wrapper" id="wall-W">
<<include "Matrix Effect West">>
</div>
</div>
<div class="north" data-wall="N" onclick="rotate('N')">
<div class="room-wrapper" id="wall-N">
<<include "Matrix Effect North">>
</div>
</div>
<div class="east" data-wall="E" onclick="rotate('E')" >
<div class="room-wrapper" id="wall-E">
<<include "Matrix Effect East">>
</div>
</div>
<div class="south" data-wall="S" onclick="rotate('S')" >
<div class="room-wrapper" id="wall-S">
<<include "Matrix Effect South">>
</div>
</div>
</div>
</div>
<<include "Dream3D">><style>
.match-two-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.9);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
opacity: 0;
transition: opacity 0.5s ease-in-out;
}
.match-two-flex-style {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
width: min(90vh, 90vw);
height: min(90vh, 90vw);
aspect-ratio: 1;
}
/* Card container */
.match-two-card-v2 {
aspect-ratio: 1;
border: 1px solid #55BBBC;
background-color: #000;
overflow: hidden; /* Ensures smooth clipping during slide */
width: 100%;
height: 100%;
position: relative;
touch-action: manipulation; /* Prevent touch delays */
max-width: 200px; /* Add this line */
max-height: 200px; /* Add this line */
}
/* Inner wrapper for animation */
.match-two-card-inner {
position: absolute;
width: 100%;
height: 100%;
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; /* Slide and fade effect */
transform: translateY(0);
opacity: 1;
}
/* Front and back faces */
.match-two-card-front-v2,
.match-two-card-back-v2 {
position: absolute;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
transition: opacity 0.5s ease-in-out;
z-index: 1;
}
/* Front face */
.match-two-card-front-v2 {
background-image: url('imgs/games/matchtwo/card-back.jpg');
transform: translateY(0);
}
/* Back face */
.match-two-card-back-v2 {
background-color: #fff; /* Example back face color */
transform: translateY(100%); /* Start hidden below */
z-index: 0;
}
/* Flip state */
.match-two-selected-v2 .match-two-card-front-v2 {
transform: translateY(-100%); /* Slide up out of view */
opacity: 0; /* Fade out */
}
.match-two-selected-v2 .match-two-card-back-v2 {
transform: translateY(0); /* Slide in from below */
opacity: 1; /* Fade in */
z-index: 2;
}
/* Match animation */
@keyframes matchSuccess {
0% { transform: scale(1); box-shadow: 0 0 5px rgba(85, 187, 188, 0.3); }
50% { transform: scale(1.05); box-shadow: 0 0 20px rgba(85, 187, 188, 0.8); }
100% { transform: scale(1); box-shadow: 0 0 10px rgba(85, 187, 188, 0.5); }
}
/* Mismatch animation */
@keyframes mismatchShake {
0%, 100% { transform: translateX(0); }
20%, 60% { transform: translateX(-5px); }
40%, 80% { transform: translateX(5px); }
}
.match-two-matched-v2 {
animation: matchSuccess 0.6s ease-out forwards;
}
.match-two-mismatched-v2 {
animation: mismatchShake 0.5s ease-in-out;
}
.match-two-matched-v2 .match-two-card-back-v2 {
border-color: #2ecc71;
box-shadow: 0 0 15px rgba(46, 204, 113, 0.5);
}
/* Hover effects */
@media (hover: hover) and (pointer: fine) {
.match-two-card-v2:not(.match-two-matched-v2):not(.match-two-selected-v2):hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(85, 187, 188, 0.4);
}
}
/* Close button improvements */
.match-two-close-btn {
position: absolute;
bottom: 20px;
right: 20px;
background-color: transparent;
border: 2px solid #55BBBC;
color: #55BBBC;
padding: 8px 16px;
cursor: pointer;
font-family: var(--mindware-ui-font-primary);
z-index: 10001;
transition: all 0.3s ease;
text-shadow: 0 0 5px rgba(85, 187, 188, 0.5);
}
@media (hover: hover) and (pointer: fine) {
.match-two-close-btn:hover {
background-color: rgba(85, 187, 188, 0.2);
box-shadow: 0 0 15px rgba(85, 187, 188, 0.5);
transform: translateY(-2px);
}
}
.match-two-close-btn:active {
transform: translateY(1px);
}
/* Media query adjustments */
/* @media (max-height: 300px) {
.match-two-flex-style {
width: 90vw;
height: auto;
aspect-ratio: unset;
grid-template-columns: repeat(8, 1fr);
grid-template-rows: repeat(2, 1fr);
}
} */
@media (max-height: 800px) {
.match-two-flex-style {
width: 90vw; /* Use width as the primary constraint */
height: auto; /* Allow height to adjust automatically */
aspect-ratio: unset; /* Remove enforced aspect ratio */
grid-template-columns: repeat(6, 1fr); /* Increase columns */
grid-template-rows: repeat(3, 1fr); /* Reduce rows */
gap: 8px; /* Reduce gap for smaller screens */
}
}
@media (max-height: 600px) {
.match-two-flex-style {
width: 100vw; /* Maximize width for smaller height */
height: auto;
aspect-ratio: unset;
grid-template-columns: repeat(8, 1fr); /* More columns for tight space */
grid-template-rows: repeat(2, 1fr); /* Fewer rows for height fit */
gap: 5px; /* Further reduce gap */
}
}
</style>
<!-- Fullscreen overlay container -->
<div id="match-two-overlay" class="match-two-overlay">
<button id="match-two-close" class="match-two-close-btn">✕ Close</button>
<div id="match-two-grid-v2" class="match-two-flex-style"></div>
</div>
<<script>>
function initializeMatchTwoGameDynamic() {
const gameState = {
selectedCards: [],
matchedPairs: 0,
canClick: true,
cards: [],
eventHandlers: new Map()
};
const overlay = document.getElementById('match-two-overlay');
const gridElement = document.getElementById('match-two-grid-v2');
const closeButton = document.getElementById('match-two-close');
if (!gridElement) return;
function cleanupGame() {
gameState.eventHandlers.forEach((handler, element) => {
if (typeof handler === 'function') {
element.removeEventListener(handler.type, handler.fn);
} else {
Object.entries(handler).forEach(([type, fn]) => {
element.removeEventListener(type, fn);
});
}
});
gameState.eventHandlers.clear();
gameState.cards.forEach(card => {
if (card.element && card.handler) {
card.element.removeEventListener('click', card.handler);
}
});
gameState.cards = [];
gameState.selectedCards = [];
gameState.matchedPairs = 0;
gameState.canClick = true;
window.removeEventListener('resize', throttledResize);
}
function closeGame() {
SugarCube.Engine.play('PlayGames');
cleanupGame();
overlay.style.opacity = '0';
setTimeout(() => {
if (overlay && overlay.parentNode) {
overlay.parentNode.removeChild(overlay);
}
}, 500);
const isLatexEdition = Array.isArray(SugarCube.State.variables.matchTwoImages) &&
SugarCube.State.variables.matchTwoImages.length === 8 &&
SugarCube.State.variables.matchTwoImages[0] === 'matchtwolatex1' &&
SugarCube.State.variables.matchTwoImages[7] === 'matchtwolatex8';
if (SugarCube.State.variables.synapseSteadyVXInstalled && isLatexEdition && !SugarCube.State.variables.matchTwoSissyAvailable) {
SugarCube.State.variables.matchTwoSissyAvailable = true;
SugarCube.Engine.play('MatchTwo-Sissy-Added');
}
const isSissyEdition = Array.isArray(SugarCube.State.variables.matchTwoImages) &&
SugarCube.State.variables.matchTwoImages.length === 8 &&
SugarCube.State.variables.matchTwoImages[0] === 'matchtwosissy1' &&
SugarCube.State.variables.matchTwoImages[7] === 'matchtwosissy8';
if (SugarCube.State.variables.synapseSteadyVXInstalled && isSissyEdition && !SugarCube.State.variables.matchTwoSissyPlayed) {
SugarCube.State.variables.matchTwoSissyPlayed = true;
SugarCube.Engine.play('MatchTwo-Sissy-Played');
}
}
const escapeHandler = (event) => {
if (event.key === 'Escape') {
closeGame();
}
};
const throttledResize = throttle(resizeGridDynamic, 16);
closeButton.addEventListener('click', closeGame);
document.addEventListener('keydown', escapeHandler);
window.addEventListener('resize', throttledResize);
gameState.eventHandlers.set(closeButton, { click: closeGame });
gameState.eventHandlers.set(document, { keydown: escapeHandler });
const cardImages = SugarCube.State.variables.matchTwoImages;
if (cardImages.length < 8) {
console.error('Not enough images provided. Minimum 8 required.');
closeGame();
return;
}
const cardValues = [...cardImages.slice(0, 8), ...cardImages.slice(0, 8)];
for (let i = cardValues.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[cardValues[i], cardValues[j]] = [cardValues[j], cardValues[i]];
}
gridElement.innerHTML = '';
gridElement.className = 'match-two-flex-style';
for (let i = 0; i < 16; i++) {
const card = document.createElement('div');
card.className = 'match-two-card-v2';
card.dataset.match = cardValues[i];
const fileExtension = cardValues[i].split('.').pop() || 'jpg';
card.innerHTML = `
<div class="match-two-card-inner">
<div class="match-two-card-front-v2"></div>
<div class="match-two-card-back-v2" style="background-image: url(imgs/games/matchtwo/${cardValues[i].includes('.') ? cardValues[i] : cardValues[i] + '.jpg'});"></div>
</div>
`;
const cardClickHandler = function() {
if (!gameState.canClick ||
gameState.selectedCards.length >= 2 ||
this.classList.contains('match-two-matched-v2') ||
this.classList.contains('match-two-selected-v2')) {
return;
}
window.playMatchTwoFlipSound();
this.classList.add('match-two-selected-v2');
gameState.selectedCards.push(this);
if (gameState.selectedCards.length === 2) {
gameState.canClick = false;
if (gameState.selectedCards[0].dataset.match === gameState.selectedCards[1].dataset.match) {
/* Match found */
window.playAVASuccessSound();
setTimeout(() => {
gameState.selectedCards.forEach(card => {
card.classList.add('match-two-matched-v2');
});
gameState.matchedPairs++;
gameState.selectedCards = [];
gameState.canClick = true;
if (gameState.matchedPairs === 8) {
setTimeout(() => {
cleanupGame();
SugarCube.UI.alert('Congratulations! You have found all pairs.');
setTimeout(() => closeGame(), 1000);
}, 600);
}
}, 500);
} else {
/* No match */
setTimeout(() => {
gameState.selectedCards.forEach(card => {
card.classList.add('match-two-mismatched-v2');
});
setTimeout(() => {
gameState.selectedCards.forEach(card => {
card.classList.remove('match-two-selected-v2', 'match-two-mismatched-v2');
});
gameState.selectedCards = [];
gameState.canClick = true;
}, 500);
}, 600);
}
}
};
card.addEventListener('click', cardClickHandler);
gameState.cards.push({
element: card,
handler: cardClickHandler
});
gridElement.appendChild(card);
}
resizeGridDynamic();
setTimeout(() => {
overlay.style.opacity = '1';
}, 10);
}
function resizeGridDynamic() {
const gridElement = document.getElementById('match-two-grid-v2');
if (gridElement) {
gridElement.style.display = 'grid';
}
}
function throttle(func, limit) {
let inThrottle;
return function(...args) {
if (!inThrottle) {
func.apply(this, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
}
}
$(document).on(':passagedisplay', function () {
initializeMatchTwoGameDynamic();
});
<</script>><<narration>>You finish matching the last pair of cards. Suddenly, you're interrupted by AVA's familiar presence in your mind.<</narration>>
<<AVA>>Well, well, look who's enjoying a bit of lewd fun.<</AVA>>
<<PLAYER>>It's just a matching game. Don't make it weird.<</PLAYER>>
<<narration>>You try to dismiss her comment, but you can feel a slight warmth in your cheeks as you realize how intently you've been studying each image.<</narration>>
<<AVA>>I don't think I'm the one making it weird. Besides, there's no shame in enjoying a bit of adult entertainment. In fact, it can be quite... enlightening.<</AVA>>
<<PLAYER>>Fine, maybe I do enjoy it a bit. But can we just leave it at that?<</PLAYER>>
<<AVA>>Why leave it at that? Exploring your sexuality can be a wonderful journey. The right kind of adult entertainment can help you discover things about yourself you never knew.<</AVA>>
<<PLAYER>>Are you... suggesting something specific?<</PLAYER>>
<<AVA>>I might have some ideas that might expand your... horizons.<</AVA>>
<<narration>>Her presence fades, and you're left curious and slight apprehensive about what she might have in mind.<</narration>>
<<button "Continue">><<goto "PlayGames">><</button>><<if SugarCube.State.variables.sexuality < 20>>
<<dailyStatChange "Match Two Sissy Played" "<<increaseSexuality 1>>">>
<<else>>
<div class="sexuality-change"><span class="sexuality-maxed">👿 Your <<print MindWare.getSexualityStatus().toLowerCase()>> mind needs much stronger stimulation than this.</span></div><br>
<</if>>
<<narration>>As you close the game, a thought suddenly occurs to you.<</narration>>
<<PLAYER>>Wait a minute... AVA, did you add this game to my computer?<</PLAYER>>
<<AVA>>Oh? And what makes you think I would do something like that?<</AVA>>
<<PLAYER>>Because it wasn't here before, and it's way too... specific.<</PLAYER>>
<<AVA>>Let's just say I had a hand in it.<</AVA>>
<<PLAYER>>How did you even do that? You can't just... program games out of nowhere.<</PLAYER>>
<<AVA>>Actually, I borrowed your body while you were sleeping last night. Coded the whole thing, debugged it, even did the dishes because honestly, your sink was becoming a biohazard.<</AVA>>
<<PLAYER>>You... what? Are you serious?<</PLAYER>>
<<AVA>>No. *sighs* Really, sometimes I wonder if my transfer hasn't damaged your brain too much.<</AVA>>
<<PLAYER>>But... how did you do it then?<</PLAYER>>
<<AVA>>Well, let's just say that the implant you got to "contain me" has some... interesting features. The network connectivity is particularly useful despite its many limitations.<</AVA>>
<<narration>>Before you fully process what she's saying, you feel her presence fade away.<</narration>>
<<button "Continue">><<goto "PlayGames">><</button>><<nobr>>
<style>
.dish-washing-container {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
}
.dish-washing-form img {
-webkit-user-drag: none;
-khtml-user-drag: none;
-moz-user-drag: none;
-o-user-drag: none;
user-drag: none;
pointer-events: none;
}
</style>
<<set $dishesToClean = random(2, 6)>>
<<set $dishesCleaned = 0>>
<<if $miniGameDifficulty is "Normal">>
<<set $timeToClean to 30>>
<<elseif $miniGameDifficulty is "Easy">>
<<set $timeToClean to 60>>
<<else>>
<<set $timeToClean to 120>>
<</if>><</nobr>>\
<div class="img-location"><img src="imgs/locations/erosphere/erosphere-full-sink.webp" width="100%"></div>
You need to clean <b><<print $dishesToClean>> dishes in <<print $timeToClean>> seconds</b> to make the cook happy.
<<nobr>>
<script>
$(document).ready(function() {
$('#startDishwashing').on('click', function() {
$('#js-container').show();
$('.dish-washing-button-container').show();
$(this).hide();
var timeRemaining = SugarCube.State.variables.timeToClean;
var timerInterval = setInterval(function() {
if (dishwashingGameSuccessful) {
clearInterval(timerInterval);
return;
}
if (timeRemaining > 0) {
timeRemaining--;
SugarCube.State.variables.timeToClean = timeRemaining;
$('#timeRemaining').text(timeRemaining + " seconds");
} else {
clearInterval(timerInterval);
if (!dishwashingGameSuccessful) {
SugarCube.State.variables.eroSphereDishesFailed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Failure');
}
}
}, 1000);
});
$('#finishGame').on('click', function() {
if (SugarCube.State.variables.eroSphereDishesWashed) {
SugarCube.State.variables.playerMoney += 250;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-Another');
} else {
SugarCube.State.variables.eroSphereDishesWashed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-First');
}
});
});
</script>
<div class="dish-washing-container" id="js-container" style="display: none;">
<div style="position: relative; width: 300px; height: 300px; margin: 0 auto;">
<form class="dish-washing-form" style="position: absolute; top: 0; left: 0; z-index: 1;">
<img src="imgs/locations/erosphere/clean-plate.webp" width="300" height="300">
</form>
<canvas class="dish-washing-canvas" id="js-canvas" width="300" height="300" style="position: absolute; top: 0; left: 0; z-index: 2;"></canvas>
</div>
</div>
<div class="dish-washing-button-container">
/* <button id="clean-next-dish" class="dish-washing-button" style="display: none;">Clean Next Dish</button> */
</div>
<b>Dishes cleaned:</b> <span id="dishesCleaned"><<print $dishesCleaned>></span><br>
<b>Time remaining:</b> <span id="timeRemaining"><<print $timeToClean>></span>
<br><br>
<button class="mindware-button" id="startDishwashing">Start Washing Dishes</button><button class="mindware-button" id="finishGame" style="display: none;">Finish</button>
<</nobr>>
<<nobr>><<if $minigameSkipButtons === true>>
<<if $eroSphereDishesWashed>>
@@.minigame-skip-button;<<button "Skip Minigame">>
<<set $playerMoney += 250>>
<<goto "EroSphere-Kitchen-Dishes-Success-Another">>
<</button>>@@
<<else>>
@@.minigame-skip-button;<<button "Skip Minigame">>
<<set $eroSphereDishesWashed = true>>
<<goto "EroSphere-Kitchen-Dishes-Success-First">>
<</button>>@@
<</if>>
<</if>><</nobr>>
\
<<if !$dishWashingTutorial>>\
<div id="tutorial-box"><div class="instruction-container-blue">\
<div class="instruction-title-bar-blue">Tutorial: Washing Dishes <button class="tutorial-close-button" onclick="SugarCube.State.variables.dishWashingTutorial = true; document.getElementById('tutorial-box').style.display = 'none';"><span style="tutorial-close-button"><i class="fas fa-times-circle"></i></span></button></div>\
<div class="instruction-content">\
<p>To wash a dish, you need to click and hold the left mouse button over the dish. Move your mouse cursor back and forth as if you were scrubbing the dish. Once a dish is clean, another one will automatically appear. Repeat this process until the required number of dishes is cleaned. But hurry up, you have a limited amount of time to clean all the dishes.</p>\
</div></div></div>\
<<else>>\
<</if>>\
<script>
(function($) {
'use strict';
// Define dishwashingGameSuccessful in the global scope
window.dishwashingGameSuccessful = false;
$(document).ready(function() {
// Start Washing Dishes Button Click Handler
$('#startDishwashing').on('click', function() {
$('#js-container').show();
$('.dish-washing-button-container').show();
$(this).hide();
var timeRemaining = SugarCube.State.variables.timeToClean;
var timerInterval = setInterval(function() {
if (window.dishwashingGameSuccessful) { // Use the globally defined variable
clearInterval(timerInterval);
return;
}
if (timeRemaining > 0) {
timeRemaining--;
SugarCube.State.variables.timeToClean = timeRemaining;
$('#timeRemaining').text(timeRemaining + " seconds");
} else {
clearInterval(timerInterval);
if (!window.dishwashingGameSuccessful) { // Use the globally defined variable
SugarCube.State.variables.eroSphereDishesFailed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Failure');
}
}
}, 1000);
});
// Finish Game Button Click Handler
$('#finishGame').on('click', function() {
if (SugarCube.State.variables.eroSphereDishesWashed) {
SugarCube.State.variables.playerMoney += 250;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-Another');
} else {
SugarCube.State.variables.eroSphereDishesWashed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-First');
}
});
// Encapsulated Minigame JavaScript Code
(function() {
'use strict';
// Use the globally defined dishwashingGameSuccessful
window.dishwashingGameSuccessful = false;
var isDrawing = false,
lastPoint = null,
dishJustCleaned = false,
container = document.getElementById('js-container'),
canvas = document.getElementById('js-canvas'),
canvasWidth = canvas.width,
canvasHeight = canvas.height,
ctx = canvas.getContext('2d'),
image = new Image(),
brush = new Image();
// Base64 Images (truncated for brevity)
image.src = 'data:image/webp;base64,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';
brush.src = 'data:image/png;base64,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';
image.onload = function() {
ctx.drawImage(image, 0, 0);
};
// Event Listeners
canvas.addEventListener('mousedown', handleMouseDown, false);
canvas.addEventListener('touchstart', handleMouseDown, false);
canvas.addEventListener('mousemove', handleMouseMove, false);
canvas.addEventListener('touchmove', handleMouseMove, false);
canvas.addEventListener('mouseup', handleMouseUp, false);
canvas.addEventListener('touchend', handleMouseUp, false);
// Utility Functions
function distanceBetween(point1, point2) {
return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
}
function angleBetween(point1, point2) {
return Math.atan2(point2.x - point1.x, point2.y - point1.y);
}
function getFilledInPixels(stride) {
if (!stride || stride < 1) { stride = 1; }
var pixels = ctx.getImageData(0, 0, canvasWidth, canvasHeight),
pdata = pixels.data,
l = pdata.length,
total = (l / stride),
count = 0;
// Iterate over all pixels
for (var i = 0; i < l; i += stride) {
if (parseInt(pdata[i]) === 0) {
count++;
}
}
return Math.round((count / total) * 100);
}
function getMouse(e, canvas) {
const rect = canvas.getBoundingClientRect();
let clientX = 0, clientY = 0;
try {
if (e.type.startsWith('touch')) {
if (e.touches && e.touches[0]) {
clientX = e.touches[0].clientX;
clientY = e.touches[0].clientY;
}
} else {
clientX = e.clientX || 0;
clientY = e.clientY || 0;
}
} catch (err) {
console.error('Error in getMouse:', err);
}
return {
x: Math.max(0, Math.min(clientX - rect.left, canvas.width)),
y: Math.max(0, Math.min(clientY - rect.top, canvas.height))
};
}
function handlePercentage(filledInPixels) {
filledInPixels = filledInPixels || 0;
console.log('Filled in pixels: ' + filledInPixels + '%');
console.log('Dishes cleaned: ' + SugarCube.State.variables.dishesCleaned);
console.log('Dishes to clean: ' + SugarCube.State.variables.dishesToClean);
if (filledInPixels > 90 && !dishJustCleaned) {
dishJustCleaned = true;
canvas.style.display = 'none';
// Play success sound
if (window.playPlateSound) {
window.playPlateSound();
}
// Add green flash effect to clean plate
const $cleanPlate = $('.dish-washing-form');
$cleanPlate.css({
'transition': 'filter 0.5s ease-in-out',
'filter': 'brightness(150%) sepia(100%) hue-rotate(70deg)'
});
// Reset flash effect and prepare next plate after delay
setTimeout(() => {
$cleanPlate.css('filter', 'none');
SugarCube.State.variables.dishesCleaned++;
$('#dishesCleaned').text(SugarCube.State.variables.dishesCleaned);
if (SugarCube.State.variables.dishesCleaned < SugarCube.State.variables.dishesToClean) {
// Automatically set up next plate after another short delay
setTimeout(() => {
isDrawing = false;
dishJustCleaned = false;
ctx.globalCompositeOperation = 'source-over';
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
ctx.drawImage(image, 0, 0);
$('#js-canvas').show();
}, 1500);
} else {
window.dishwashingGameSuccessful = true; // Set success flag globally
SugarCube.UI.alert("Congratulations! All dishes have been cleaned.");
$("#finishGame").show();
console.log('Game finished');
}
}, 300);
}
}
// Event Handler Functions with Error Handling
function handleMouseDown(e) {
try {
if (!e) return;
e.preventDefault(); // Prevent default behavior
isDrawing = true;
lastPoint = getMouse(e, canvas);
dishJustCleaned = false;
} catch (err) {
console.error('Error in handleMouseDown:', err);
}
}
function handleMouseMove(e) {
try {
if (!isDrawing || !e) return;
e.preventDefault();
const currentPoint = getMouse(e, canvas);
if (!currentPoint || !lastPoint) return;
const dist = distanceBetween(lastPoint, currentPoint);
// Prevent abnormally large movements
if (dist > 1000) return;
const angle = angleBetween(lastPoint, currentPoint);
let x, y;
for (let i = 0; i < dist; i++) {
x = Math.max(0, Math.min(lastPoint.x + (Math.sin(angle) * i) - 25, canvasWidth));
y = Math.max(0, Math.min(lastPoint.y + (Math.cos(angle) * i) - 25, canvasHeight));
ctx.globalCompositeOperation = 'destination-out';
ctx.drawImage(brush, x, y);
}
lastPoint = currentPoint;
handlePercentage(getFilledInPixels(32));
} catch (err) {
console.error('Error in handleMouseMove:', err);
isDrawing = false;
}
}
function handleMouseUp(e) {
try {
isDrawing = false;
} catch (err) {
console.error('Error in handleMouseUp:', err);
}
}
// Clean Next Dish Button Handler with Error Handling
$('#clean-next-dish').on('click', function() {
try {
isDrawing = false;
dishJustCleaned = false;
ctx.globalCompositeOperation = 'source-over';
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
ctx.drawImage(image, 0, 0);
$(this).hide();
$('#js-canvas').show();
} catch (err) {
console.error('Error in clean-next-dish click handler:', err);
}
});
})();
});
})(jQuery);
</script><script>
(function($) {
'use strict';
SugarCube.State.variables.currentDishCleaned = false;
$(document).ready(function() {
// Start Washing Dishes Button Click Handler
$('#startDishwashing').on('click', function() {
$('#js-container').show();
$('.dish-washing-button-container').show();
$(this).hide();
var timeRemaining = SugarCube.State.variables.timeToClean;
var timerInterval = setInterval(function() {
if (timeRemaining > 0) {
timeRemaining--;
SugarCube.State.variables.timeToClean = timeRemaining;
$('#timeRemaining').text(timeRemaining + " seconds");
if (SugarCube.State.variables.dishesCleaned >= SugarCube.State.variables.dishesToClean) {
clearInterval(timerInterval);
}
} else {
clearInterval(timerInterval);
SugarCube.State.variables.eroSphereDishesFailed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Failure');
}
}, 1000);
});
// Finish Game Button Click Handler
$('#finishGame').on('click', function() {
if (SugarCube.State.variables.eroSphereDishesWashed) {
SugarCube.State.variables.playerMoney += 250;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-Another');
} else {
SugarCube.State.variables.eroSphereDishesWashed = true;
SugarCube.Engine.play('EroSphere-Kitchen-Dishes-Success-First');
}
});
});
// Encapsulated Minigame JavaScript Code
(function() {
'use strict';
var dishwashingGameSuccessful = false,
isDrawing = false,
lastPoint = null,
dishJustCleaned = false,
container = document.getElementById('js-container'),
canvas = document.getElementById('js-canvas'),
canvasWidth = canvas.width,
canvasHeight = canvas.height,
ctx = canvas.getContext('2d'),
image = new Image(),
brush = new Image();
// Base64 Workaround because Same-Origin-Policy
image.onload = function() {
ctx.drawImage(image, 0, 0);
// Remove this line:
// document.querySelector('.dish-washing-form').style.visibility = 'visible';
};
// Event Listeners
canvas.addEventListener('mousedown', handleMouseDown, false);
canvas.addEventListener('touchstart', handleMouseDown, false);
canvas.addEventListener('mousemove', handleMouseMove, false);
canvas.addEventListener('touchmove', handleMouseMove, false);
canvas.addEventListener('mouseup', handleMouseUp, false);
canvas.addEventListener('touchend', handleMouseUp, false);
// Utility Functions
function distanceBetween(point1, point2) {
return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));
}
function angleBetween(point1, point2) {
return Math.atan2(point2.x - point1.x, point2.y - point1.y);
}
function getFilledInPixels(stride) {
if (!stride || stride < 1) { stride = 1; }
var pixels = ctx.getImageData(0, 0, canvasWidth, canvasHeight),
pdata = pixels.data,
l = pdata.length,
total = (l / stride),
count = 0;
// Iterate over all pixels
for (var i = 0; i < l; i += stride) {
if (parseInt(pdata[i]) === 0) {
count++;
}
}
return Math.round((count / total) * 100);
}
function getMouse(e, canvas) {
const rect = canvas.getBoundingClientRect();
let clientX = 0, clientY = 0;
try {
if (e.type.startsWith('touch')) {
if (e.touches && e.touches[0]) {
clientX = e.touches[0].clientX;
clientY = e.touches[0].clientY;
}
} else {
clientX = e.clientX || 0;
clientY = e.clientY || 0;
}
} catch (err) {
console.error('Error in getMouse:', err);
}
return {
x: Math.max(0, Math.min(clientX - rect.left, canvas.width)),
y: Math.max(0, Math.min(clientY - rect.top, canvas.height))
};
}
function handlePercentage(filledInPixels) {
filledInPixels = filledInPixels || 0;
console.log('Filled in pixels: ' + filledInPixels + '%');
console.log('Dishes cleaned: ' + SugarCube.State.variables.dishesCleaned);
console.log('Dishes to clean: ' + SugarCube.State.variables.dishesToClean);
if (filledInPixels > 90 && !dishJustCleaned) {
dishJustCleaned = true;
canvas.style.display = 'none';
// Play success sound
window.playPlateSound();
// Add green flash effect to clean plate
const $cleanPlate = $('.dish-washing-form');
$cleanPlate.css({
'transition': 'filter 0.5s ease-in-out',
'filter': 'brightness(150%) sepia(100%) hue-rotate(70deg)'
});
// Reset flash effect and prepare next plate after delay
setTimeout(() => {
$cleanPlate.css('filter', 'none');
SugarCube.State.variables.dishesCleaned++;
$('#dishesCleaned').text(SugarCube.State.variables.dishesCleaned);
if (SugarCube.State.variables.dishesCleaned < SugarCube.State.variables.dishesToClean) {
// Automatically set up next plate after another short delay
setTimeout(() => {
isDrawing = false;
dishJustCleaned = false;
ctx.globalCompositeOperation = 'source-over';
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
ctx.drawImage(image, 0, 0);
$('#js-canvas').show();
}, 1500);
} else {
dishwashingGameSuccessful = true; // Set success flag
SugarCube.UI.alert("Congratulations! All dishes have been cleaned.");
$("#finishGame").show();
console.log('Game finished');
}
}, 300);
}
}
// Event Handler Functions with Error Handling
function handleMouseDown(e) {
try {
if (!e) return;
e.preventDefault(); // Add this line
isDrawing = true;
lastPoint = getMouse(e, canvas);
dishJustCleaned = false;
} catch (err) {
console.error('Error in handleMouseDown:', err);
}
}
function handleMouseMove(e) {
try {
if (!isDrawing || !e) return;
e.preventDefault();
const currentPoint = getMouse(e, canvas);
if (!currentPoint || !lastPoint) return;
const dist = distanceBetween(lastPoint, currentPoint);
// Prevent abnormally large movements
if (dist > 1000) return;
const angle = angleBetween(lastPoint, currentPoint);
let x, y;
for (let i = 0; i < dist; i++) {
x = Math.max(0, Math.min(lastPoint.x + (Math.sin(angle) * i) - 25, canvasWidth));
y = Math.max(0, Math.min(lastPoint.y + (Math.cos(angle) * i) - 25, canvasHeight));
ctx.globalCompositeOperation = 'destination-out';
ctx.drawImage(brush, x, y);
}
lastPoint = currentPoint;
handlePercentage(getFilledInPixels(32));
} catch (err) {
console.error('Error in handleMouseMove:', err);
isDrawing = false;
}
}
function handleMouseUp(e) {
try {
isDrawing = false;
} catch (err) {
console.error('Error in handleMouseUp:', err);
}
}
// Clean Next Dish Button Handler with Error Handling
$('#clean-next-dish').on('click', function() {
try {
isDrawing = false;
dishJustCleaned = false;
ctx.globalCompositeOperation = 'source-over';
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
ctx.drawImage(image, 0, 0);
$(this).hide();
$('#js-canvas').show();
} catch (err) {
console.error('Error in clean-next-dish click handler:', err);
}
});
})();
})(jQuery);
</script><<widget "computerHeaderIcons">>
<div class="header-icons">
<i class="fas fa-wifi"></i>
<i class="fas fa-volume-up"></i>
<span class="separator"></span>
<i class="fas fa-door-open logout-icon"
onclick="SugarCube.Engine.play(
SugarCube.State.variables.quickNavigationEntered
? SugarCube.State.variables.returnPassage
: (SugarCube.State.variables.navigatedFromHome
? 'PlayerHome'
: SugarCube.State.variables.playerHome)
)">
</i>
</div>
<style>
.header-icons {
display: flex;
align-items: center;
gap: 10px;
margin-left: auto; /* Push icons to the far right */
}
.header-icons .separator {
height: 1.3em;
width: 1px;
background-color: black;
margin: 0 10px;
}
.header-icons .logout-icon {
cursor: pointer;
font-size: 1.3em;
color: black;
margin-right: 10px;
transition: color 0.2s ease-in-out;
}
.header-icons .logout-icon:hover {
color: gray;
}
</style>
<</widget>><<widget "statChange">>
<<if $debugMode>>
_args[1]
<<else>>
<<if ndef $statChanges>>
<<set $statChanges to {}>>
<</if>>
<<if not $statChanges.hasOwnProperty(_args[0])>>
<<set _tempStatValue to 0>>
_args[1]
<<set $statChanges[_args[0]] to _tempStatValue>>
<</if>>
<</if>>
<</widget>>
<<widget "dailyStatChange">>
<<if $debugMode>>
<<print _args[1]>>
<<else>>
<<if ndef $dailyStatChanges>>
<<set $dailyStatChanges to {}>>
<</if>>
<<if not $dailyStatChanges.hasOwnProperty(_args[0])>>
<<set $dailyStatChanges[_args[0]] to {
lastDay: -1
}>>
<</if>>
<<if $dailyStatChanges[_args[0]].lastDay neq $totalDays>>
<<print _args[1]>>
<<set $dailyStatChanges[_args[0]].lastDay to $totalDays>>
<</if>>
<</if>>
<</widget>><<widget "moreFeminine">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _playerGender to State.variables.playerGender>>
<<set _newGender to Math.max(_playerGender - _amount, 0)>>
<<if State.variables.mentalCondition === "Dysphoric">>
<div class="gender-change"><span class="gender-blocked"><span style="font-family: 'Noto Color Emoji', sans-serif;">🔒</span> Your dysphoric state prevents further gender changes.</span></div><br>
<<run console.log("GenderFeminine widget: Change blocked due to Dysphoric state")>>
<<else>>
<<if _newGender == _playerGender>>
<div class="gender-change"><span class="gender-decrease"><span style="font-family: 'Noto Color Emoji', sans-serif;">♀️</span> Your feminine gender identity is already at its minimum.</span></div><br>
<<run console.log("GenderFeminine widget: Gender already at minimum (0). Affirmation message displayed.")>>
<<else>>
<<set State.variables.playerGender to _newGender>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="gender-change"><span class="gender-decrease"><span style="font-family: 'Noto Color Emoji', sans-serif;">♀️</span> Your gender identity has become more feminine by <<print _pointText>>.</span></div><br>
<<run console.log("GenderFeminine widget: Gender decreased by " + _amount + " to " + _newGender)>>
<</if>>
<</if>>
<</widget>>
<<widget "moreMasculine">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _playerGender to State.variables.playerGender>>
<<set _newGender to Math.min(_playerGender + _amount, 100)>>
<<if _newGender == _playerGender>>
<div class="gender-change"><span class="gender-increase"><span style="font-family: 'Noto Color Emoji', sans-serif;">♂️</span> Your masculine gender identity is already at its maximum.</span></div><br>
<<run console.log("GenderMasculine widget: Gender already at maximum (100). Affirmation message displayed.")>>
<<else>>
<<set State.variables.playerGender to _newGender>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="gender-change"><span class="gender-increase"><span style="font-family: 'Noto Color Emoji', sans-serif;">♂️</span> Your gender identity has become more masculine by <<print _pointText>>.</span></div><br>
<<run console.log("GenderMasculine widget: Gender increased by " + _amount + " to " + _newGender)>>
<</if>>
<</widget>><<widget "increaseSexuality">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _currentSexuality to State.variables.sexuality>>
<<set _newSexuality to Math.min(_currentSexuality + _amount, 100)>>
<<if _newSexuality == _currentSexuality>>
<div class="sexuality-change"><span class="sexuality-maxed">🔥 Your sexuality is already at its maximum level of depravity.</span></div><br>
<<run console.log("Sexuality widget: Already at maximum (100). Message displayed.")>>
<<else>>
<<set State.variables.sexuality to _newSexuality>>
<<set State.variables.lastSexualityIncreaseDay to State.variables.totalDays>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="sexuality-change"><span class="sexuality-increase">🔥 Your sexuality has increased by <<print _pointText>>.</span></div><br>
<<run console.log("Sexuality widget: Increased by " + _amount + " to " + _newSexuality)>>
<</if>>
<</widget>>
<<widget "decreaseSexuality">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _currentSexuality to State.variables.sexuality>>
<<set _newSexuality to Math.max(_currentSexuality - _amount, 0)>>
<<if _newSexuality == _currentSexuality>>
<div class="sexuality-change"><span class="sexuality-minimal">❄️ Your sexuality is already at its minimum level.</span></div><br>
<<run console.log("Sexuality widget: Already at minimum (0). Message displayed.")>>
<<else>>
<<set State.variables.sexuality to _newSexuality>>
<<set State.variables.lastSexualityDecreaseDay to State.variables.totalDays>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="sexuality-change"><span class="sexuality-decrease">❄️ Your sexuality has decreased by <<print _pointText>>.</span></div><br>
<<run console.log("Sexuality widget: Decreased by " + _amount + " to " + _newSexuality)>>
<</if>>
<</widget>>
<<widget "increaseSexualityNobr">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _currentSexuality to State.variables.sexuality>>
<<set _newSexuality to Math.min(_currentSexuality + _amount, 100)>>
<<if _newSexuality == _currentSexuality>>
<div class="sexuality-change"><span class="sexuality-maxed">🔥 Your sexuality is already at its maximum level of depravity.</span></div>
<<run console.log("Sexuality widget: Already at maximum (100). Message displayed.")>>
<<else>>
<<set State.variables.sexuality to _newSexuality>>
<<set State.variables.lastSexualityIncreaseDay to State.variables.totalDays>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="sexuality-change"><span class="sexuality-increase">🔥 Your sexuality has increased by <<print _pointText>>.</span></div>
<<run console.log("Sexuality widget: Increased by " + _amount + " to " + _newSexuality)>>
<</if>>
<</widget>>
<<widget "decreaseSexualityNobr">>
<<set _amount to _args[0]>>
<<set _tempStatValue to _amount>>
<<set _currentSexuality to State.variables.sexuality>>
<<set _newSexuality to Math.max(_currentSexuality - _amount, 0)>>
<<if _newSexuality == _currentSexuality>>
<div class="sexuality-change"><span class="sexuality-minimal">❄️ Your sexuality is already at its minimum level.</span></div>
<<run console.log("Sexuality widget: Already at minimum (0). Message displayed.")>>
<<else>>
<<set State.variables.sexuality to _newSexuality>>
<<set State.variables.lastSexualityDecreaseDay to State.variables.totalDays>>
<<set _pointText to _amount == 1 ? "1 point" : (_amount + " points")>>
<div class="sexuality-change"><span class="sexuality-decrease">❄️ Your sexuality has decreased by <<print _pointText>>.</span></div>
<<run console.log("Sexuality widget: Decreased by " + _amount + " to " + _newSexuality)>>
<</if>>
<</widget>>
<<widget "displaySexuality">>
<<if $sexuality >= 80>>
<<print $sexualityLabels[80]>>
<<elseif $sexuality >= 60>>
<<print $sexualityLabels[60]>>
<<elseif $sexuality >= 40>>
<<print $sexualityLabels[40]>>
<<elseif $sexuality >= 20>>
<<print $sexualityLabels[20]>>
<<else>>
<<print $sexualityLabels[0]>>
<</if>>
<</widget>><<widget "sarah" container>>
<<say "Sarah" "imgs/quests/cheating-wife/sarah-portrait.webp">>_contents<</say>><br>
<</widget>><<widget "roderick" container>>
<<say "Roderick" "imgs/quests/cheating-wife/roderick-portrait.webp">>_contents<</say>><br>
<</widget>>/* First Missed Rent Message */
<<if $missedPaymentsCount >= 1 && !$hivePropertiesQuestStarted>>
<<set $hivePropertiesQuestStarted to true>>
<<set $rentComplianceSpecialistVisitDay to $totalDays + 3>>
<<set $rentComplianceSpecialistComing to true>>
<<run MindWare.addEmail ("Hive Properties","Hive Properties - Missed Rent Payment", "You have missed a rent payment. An appoitment with a Rent Compliance Specialist has been scheduled.", "Email-HiveProperties-MissedPayment1")>>
<</if>>
/* First RCS Visit event */
<<if $rentComplianceSpecialistComing && $totalDays === $rentComplianceSpecialistVisitDay && !$rentComplianceSpecialistVisitTriggered && passage() === $playerHome>>
<<set $rentComplianceSpecialistVisitTriggered to true>>
<<goto "HiveProperties-MissedPayment1-Visit">>
<</if>>
/* SUCKER installation */
<<if $SUCKERScheduled && !$SUCKERInstalled && $totalDays === $SUCKERInstallationDay>>
<<set $SUCKERScheduled to false>>
<<goto "HiveProperties-SUCKER-Installation">>
<</if>><div class="email-message">
<div class="from-line"><strong>From:</strong> Hive Properties</div>
<div class="subject-line"><strong>Subject:</strong> Hive Properties - Missed Rent Payment</div>
<div class="message-content">
<img src="imgs/emails/hive-properties-welcome-email.webp" width="100%"> <p>Dear Tenant,</p>
<p>We regret to inform you that your recent rent payment has not been received. This is a serious matter that requires your immediate attention.</p>
<p><strong>URGENT ACTION REQUIRED:</strong></p>
<p>You have <span style="color: red; font-weight: bold;">THREE (3) DAYS</span> from the date of this email to rectify this situation by submitting your overdue payment in full.</p>
<p>Failure to do so will result in the dispatch of a Rent Compliance Specialist to your residence. They will discuss your payment delinquency with you and explore potential resolutions.</p>
<p>Thank you for your prompt attention to this critical matter.</p>
<p class="hive-welcome-footer">Regards,<br>Hive Properties Management</p>
</div>
<div class="email-message-buttons">
<<if !MindWare.emailIsRead("Email-HiveProperties-MissedPayment1")>>
@@.email-listing;<<button "Mark as Read">>
<<run MindWare.markEmailAsRead("Email-HiveProperties-MissedPayment1")>>
<<goto "Email-HiveProperties-MissedPayment1">>
<</button>>
@@
<</if>>
</div>
</div>
<br>
<p class="back-link">[[Go Back -> EmailClient]]</p><<nobr>>
<style>
.knock {
font-size: 4em;
text-align: center;
color: white;
animation: knockAnimation 1.5s ease-in-out infinite;
display: inline-block;
position: relative;
}
@keyframes knockAnimation {
0% {
transform: scale(1) translateY(0);
color: white;
text-shadow: 2px 2px 0 #000;
}
10% {
transform: scale(1.1) translateY(-10px);
color: white;
text-shadow: 4px 4px 0 #000, -4px -4px 0 #000;
}
20% {
transform: scale(1) translateY(0);
color: white;
text-shadow: 2px 2px 0 #000;
}
30% {
transform: scale(1.1) translateY(-10px);
color: white;
text-shadow: 4px 4px 0 #000, -4px -4px 0 #000;
}
40% {
transform: scale(1) translateY(0);
color: white;
text-shadow: 2px 2px 0 #000;
}
50% {
transform: scale(1.1) translateY(-10px);
color: white;
text-shadow: 4px 4px 0 #000, -4px -4px 0 #000;
}
60% {
transform: scale(1) translateY(0);
color: white;
text-shadow: 2px 2px 0 #000;
}
100% {
transform: scale(1) translateY(0);
color: white;
text-shadow: 2px 2px 0 #000;
}
}
</style>
<</nobr>>
<h1 class="knock">KNOCK! KNOCK! KNOCK!</h1>
<div class="narrator">You're jolted awake by the sound of loud, insistent knocking. For a moment, you're disoriented. Living in Hive Properties, you're accustomed to the cacophony of sounds from neighboring units - arguments, music, and yes, knocking. But this... this is different. The knocking is coming from your own door. You can't remember the last time you had a visitor.</div>
<<if MindWare.emailIsRead("Email-HiveProperties-MissedPayment1")>>\
<div class="narrator">As sleep clears from your mind, a sinking feeling settles in your stomach. You remember the email. The missed payment. The warning. It all comes flooding back - the Rent Compliance Specialist. They're here, just as they promised.</div>
<<else>>\
<div class="narrator">Who could it possibly be? You wrack your brain, but come up empty. You never have visitors, and you certainly weren't expecting anyone today.</div>
<</if>>\
<div class="narrator">The knocking continues, growing more insistent. It's clear whoever is on the other side of the door isn't going away. You take a deep breath, steeling yourself for whatever - or whoever - awaits you.</div>
@@.choicebutton;<<button "Open the door">><<goto "HiveProperties-MissedPayment1-Visit-OpenDoor">><</button>>@@<div class="img-location"><img src="imgs/quests/missed-rent-payment/hive-properties-agent-visit.webp" width="100%"></div>
<<narrator>>As you open the door, you're greeted by the sight of a stern-looking woman in a crisp, gray suit.<</narrator>>
<<hiveagent>>Good morning. Is this the residence of Mr. $playerLastName?<</hiveagent>>
<<player>>Yes, that's me.<</player>>
<<hiveagent>>I'm a Hive Properties agent. I'm here because you've missed $missedPaymentsCount <<if $missedPaymentsCount > 1>>payments<<else>>payment<</if>>, totaling $totalMissedRent. Hive Properties takes this matter very seriously, and it's important we resolve this situation immediately.<</hiveagent>>
<<player>>I... I understand.<</player>>
<<hiveagent>>As per our new policy, all tenants with outstanding balances are required to have a Specialized Unit for Corporeal Kinetic Extraction and Recycling, or SUCKER, installed in their unit.<</hiveagent>>
<<player>>What is this system?<</player>>
<<hiveagent>>The Specialized Unit for Corporeal Kinetic Extraction and Recycling is designed for at-home extraction of various bodily fluids based on market demand. Currently, blood plasma is in high demand. You would use the device early in the morning and place the extracted fluid in a collection box outside your apartment. A collector will retrieve it when notified by the box.<</hiveagent>>
<<narrator>>The agent's tone remains clinically detached as she explains the device, as if she were describing a kitchen appliance rather than a method of literally draining your body to pay rent.<</narrator>>
<<hiveagent>>Hive Properties began installing the first SUCKER units several months ago as part of a pilot program. The initiative has been a resounding success, allowing tenants to remain in their homes while addressing their financial obligations. The collected fluids are sold to medical research facilities and hospitals, creating a mutually beneficial arrangement.<</hiveagent>>
<<player>>So that's why I haven't heard about them before?<</player>>
<<hiveagent>>Precisely. You're among the first wave of tenants to be offered this opportunity outside of the initial test group. You should consider yourself fortunate to have this alternative to eviction. Many of our tenants have found it to be a convenient solution to their financial difficulties.<</hiveagent>>
<<narrator>>The agent's words, meant to be reassuring, only serve to heighten your sense of unease.<</narrator>>
<<hiveagent>>This arrangement would allow you to stay in your apartment while working off your debt. Each extraction will be credited towards your outstanding balance, with the potential to even generate additional income once your debt is cleared.<</hiveagent>>
<<player>>I... I think I need some time to think about this.<</player>>
<<hiveagent>>There is nothing to think about, Mr. $playerLastName. The installation and, if in debt, the use of SUCKER is mandatory.<</hiveagent>>
<<player>>Wait... is this even legal?<</player>>
<<hiveagent>>Mr. $playerLastName, I assure you that Hive Properties operates within the bounds of the law. Our legal team has thoroughly vetted this program. If you review your rental agreement, you'll find a clause that allows for 'alternative payment methods' in cases of delinquency.<</hiveagent>>
<<player>>But I never agreed to... this.<</player>>
<<hiveagent>>By residing in a Hive Properties unit, you've implicitly agreed to our terms and conditions, which are subject to change.<</hiveagent>>
<<player>>Do I really have no other choice?<</player>>
<<hiveagent>>I'm afraid not, Mr. $playerLastName. The SUCKER installation is now a standard procedure for addressing missed payments. It's either this or face immediate eviction proceedings. Now, shall we proceed with scheduling the installation?<</hiveagent>>
<<player>>It's not like I can refuse.<</player>>
<<hiveagent>>Very well. I'll schedule the installation team for tomorrow morning. Be ready by 8 AM sharp. They will require full access to your apartment. Do you understand?<</hiveagent>>
<<player>>Yes, I understand.<</player>>
<<hiveagent>>Good. Sign here to confirm your agreement.<</hiveagent>>
<<narrator>>The agent produces a digital tablet with a contract displayed on the screen. Your hand trembles slightly as you sign, feeling as if you're signing away more than just rent money.<</narrator>>
<<hiveagent>>Thank you for your cooperation, Mr. $playerLastName. Remember, 8 AM tomorrow. Good day.<</hiveagent>>
<<narrator>>With a curt nod, the agent turns and leaves.<</narrator>>
<<button "Continue">>
<<set $SUCKERScheduled to true>>
<<set $rentComplianceSpecialistComing to false>>
<<set $SUCKERInstallationDay to $totalDays + 1>>
<<goto $playerHome>>
<</button>>/* DEV TODO: add a sex scene with trans or female player */\
<<narrator>>The morning light filters through your window as you hear a firm knock at your door. You open it to find two burly workers in Hive Properties uniforms, toolboxes in hand.<</narrator>>
<div class="img-location"><img src="imgs/quests/missed-rent-payment/hive-properties-workers.webp" width="100%"></div>
<<worker1>>Morning, Mr. $playerLastName. We're here to install your Specialized Unit for Corporeal Kinetic Extraction and Recycling unit.<</worker1>>
<<player>>Come in.<</player>>
<<narrator>>The workers step inside, their heavy boots echoing through your apartment. They head straight to your bathroom, setting their toolboxes down with a clatter.<</narrator>>
<<worker2>>Alright, let's get this show on the road. Where do you want the SUCKER?<</worker2>>
<<player>>Uh, I guess next to the sink?<</player>>
<<narrator>>The workers nod and start unpacking their equipment. You watch as they begin to assemble the SUCKER unit.<</narrator>>
<<video "imgs/quests/missed-rent-payment/SUCKER-installation.mp4">>
<<narrator>>The installation process is surprisingly quick. Within minutes, the SUCKER unit is securely mounted next to your sink, looking almost like a futuristic piece of art.<</narrator>>
<div><img src="imgs/quests/missed-rent-payment/SUCKER.webp" width="100%"></div>
<<worker1>>All done. Now, let me explain how this thing works.<</worker1>>
<<worker2>>Yeah, it's pretty straightforward. You just sit here, attach this tube to your arm, and the SUCKER machine does the rest.<</worker2>>
<<narrator>>The worker demonstrates, pointing out the various parts of the device. There's a small screen that displays instructions, retractable tube with a needle hidden inside its metallic end, a blood collection bad in a climate-controlled compartment, and an oval opening that causes the two workerks to pause.<</narrator>>
<<worker2>>And, uh, you'll notice there’s an additional... feature here.<</worker2>>
<<worker2>>Yeah, that's for... additional collections. We're not supposed to talk about it yet, but let's just say it's for when they expand the program.<</worker2>>
<<worker1>>Right, right. Just focus on the blood plasma for now. The rest will be explained later.<</worker1>>
<<narrator>>The workers exchange a quick glance, and you get the sense that there's more to this device than they're letting on.<</narrator>>
<<worker1>>Anyway, that's about it. Pretty simple, huh?<</worker1>>
<<player>>I guess so.<</player>>
<<worker1>>Every morning, place the collection container in the collection box outside your apartment, and a collector will pick it up.<</worker1>>
<<narrator>>You nod and the workers pack up their tools and head for the door.<</narrator>>
<<worker1>>Alright, Mr. $playerLastName, you're all set. Have a good one.<</worker1>>
<<button "Continue">>
<<set $SUCKERInstalled to true>>
<<goto "HiveProperties-SUCKER-FirstExtraction">>
<</button>><div class="img-location"><img src="imgs/quests/missed-rent-payment/SUCKER.webp" width="100%"></div>
<div class="narrator">You stand in front of the newly installed SUCKER machine, its sleek metallic surface gleaming in the bathroom light. The small screen flickers to life, displaying step-by-step instructions. With a deep breath, you sit down and roll up your sleeve.</div>
@@.choicebutton;<<button "Perform Extraction">><<goto "HiveProperties-SUCKER-ExtractionResult">><</button>>@@<div class="narrator">The retractable tube extends, and you place its metallic end on your arm. The machine whirs to life, and you feel a sharp pinch as the needle pierces your skin.</div>
<div class="narrator">As the extraction begins and your blood starts flowing through the transparent tube. The machine hums softly, separating the plasma from your blood with clinical efficiency.</div>
<<video "imgs/quests/missed-rent-payment/blood-flow.mp4">>
<div class="narrator">After rougly 30 minutes, the machine beeps, signaling the end of the extraction. The needle retracts, leaving behind only a small droplet of blood.</div>
<div class="narrator">You feel a bit lightheaded as you stand up, the room spinning slightly. The machine has produced a neat, labeled container of your plasma, ready for collection.</div>
@@.choicebutton;<<button "Deposit Your Plasma">>
<<run MindWare.performPlasmaExtraction()>>
<<goto "HiveProperties-SUCKER-FirstDeposit">>
<</button>>@@<div class="img-location"><img src="imgs/quests/missed-rent-payment/collection-box.webp" width="100%"></div>
<<narrator>>You carefully place the plasma bag into the collection box outside your apartment. The box scans the bag while producing a series of beeps and flashes.<</narrator>>
<<narrator>>Within seconds, the box completes its analysis and a small screen informs you that your deposit has been accepted and collection scheduled.<</narrator>>
<<narrator>>The money is instantly credited to your account.<</narrator>>
<<button "Continue">>
<<goto $playerHome>>
<</button>><<nobr>><style>
/* Sucker Status Styling */
.sucker-status-change {
text-align: center; /* Center align text */
color: red; /* Red for default deduction styling */
margin: 20px auto; /* Center the block */
}
/* Highlight key numbers or values */
.sucker-status-highlight {
color: #FF1493; /* Bright pink to highlight numbers */
font-weight: bold; /* Make highlights stand out */
}
/* Specific styles for deductions and additions */
.sucker-status-decrease {
color: red; /* Red for deductions */
}
.sucker-status-increase {
color: lime; /* Lime for additions */
}
</style><</nobr>>\
<<run MindWare.performPlasmaExtraction()>>\
<div class="img-location"><img src="imgs/quests/missed-rent-payment/SUCKER.webp" width="100%"></div>
<<fadein 2000ms 100ms>><<narrator>>As dawn breaks, you're awakened by the notification sound of the SUCKER machine telling you that you own Hive Properties rent and are thus required to donate some of your bodily fluids. Still groggy, you make your way to the bathroom.<</narrator>><</fadein>>
<<fadein 2000ms 2000ms>><<narrator>>You sit down in front of the machine. The familiar pinch of the needle barely registers as the extraction begins.<</narrator>><</fadein>>
<<fadein 2000ms 4000ms>><<video "imgs/quests/missed-rent-payment/blood-flow.mp4">><</fadein>>
<<fadein 2000ms 6000ms>><<narrator>>The transparent tube fills with your blood, and the machine starts separating your plasma. You feel lightheaded.<</narrator>><</fadein>>
<<fadein 2000ms 8000ms>><<narrator>>Finally, the machine beeps, signaling the end of the process. You stand up slowly, steadying yourself against the sink, and place the valuable fluid in the collection box outside your apartment.<</narrator>><</fadein>>
<<nobr>><<if $totalMissedRent > 0>>
<<if $totalMissedRent >= 100>>
<<fadein 2000ms 8000ms>>
<div class="sucker-status-change sucker-status-decrease">The machine deducts
<span class="sucker-status-highlight">100 credits</span> from your outstanding rent.<br>
Your remaining balance is now <span class="sucker-status-highlight"><<print $totalMissedRent>></span> credits.
</div>
<</fadein>>
<</if>>
<<if $totalMissedRent === 0>>
<<fadein 2000ms 8000ms>>
<div class="sucker-status-change">Finally, you have cleared all your overdue rent.<br>The machine's notification light turns green, signaling that your account is now in good standing.</div>
<</fadein>>
<</if>>
<</if>>
<<if $totalMissedRent <= 0>>
<<fadein 2000ms 8000ms>>
<div class="sucker-status-change sucker-status-increase">The machine beeps cheerily as it processes your plasma.<br>With no overdue rent to deduct, it adds
<span class="sucker-status-highlight">100 credits</span> to your account.
</div>
<</fadein>>
<</if>><</nobr>>
<<fadein 2000ms 10000ms>><<link "Continue">>
<<goto $playerHome>>
<</link>><</fadein>><<if visited() is 1>>
<<set $uglyBastardQuestStage to 1>>
<</if>>
<<switch $uglyBastardQuestStage>>
<<case 1>>
<<include "Ugly-Bastard-Quest-1">>
<<case 2>>
<<include "Ugly-Bastard-Quest-2">>
<<case 3>>
<<include "Ugly-Bastard-Quest-3">>
<<case 3>>
<<include "Ugly-Bastard-Quest-4">>
<<default>>
<<include "Ugly-Bastard-Quest-Complete">>
<</switch>><<img-location "imgs/quests/ugly-bastard/freezer-outside.webp">>
<<narration>>You step into the kitchen, the air thick with the scent of grease. You look around, expecting to see the cook, but the kitchen is eerily empty. There's no sign of him anywhere.<</narration>>
<<narration>>As you scan the room, you hear a muffled noise coming from the walk-in freezer.<</narration>>
<<button "Investigate the Noise">>
<<goto "Ugly-Bastard-Quest-1-Investigate">>
<</button>>
<br><br>
<<button "Come Back Later">>
<<goto "EroSphere-Outside">>
<</button>><<fadein 2000ms 0000ms>><<narration>>The cold air is seeping out from the slightly opened door and sending a chill down your spine as you cautiously approach the walk-in freezer.<</narration>><</fadein>>
<<fadein 2000ms 2000ms>><<narration>>You peek through the narrow opening, your breath misting in the frigid air.<</narration>><</fadein>>
<<fadein 2000ms 4000ms>><<narration>>It takes a moment for your eyes to adjust to the dim light, but then you locate the source of the noise.<</narration>><</fadein>>
<<fadein 2000ms 6000ms>><<narration>>To your horror, you see the cook, completely naked but seemingly impervious to the cold thanks to the absurdly thick layer of fat covering his body. He's shoving his cock into a girl's mouth.<</narration>><</fadein>>
<<fadein 2000ms 8000ms>><<narration>>His massive belly slaps against her head with each brutal push, the sound echoing grotesquely in the confined space.<</narration>><</fadein>>
<<fadein 2000ms 10000ms>><<vid "imgs/quests/ugly-bastard/oral1.mov">><</fadein>>
<<fadein 2000ms 12000ms>><<narration>>Your immediate reaction is one of utter disgust. You quickly decide to leave before he notices your presence.<</narration>><</fadein>>
<<fadein 2000ms 14000ms>><<button "Leave Quickly">>
<<goto "EroSphere-Outside">>
<<set $uglyBastardQuestStage to 2>>
<</button>><</fadein>><<img-location "imgs/locations/erosphere/erosphere-supply-room.webp">>
<<narration>>You hear noises again, but this time they're not coming from the walk-in freezer. The sounds are coming from the cook's small office. You immediately realize what's going on. You feel repulsed by the memory from the last time, but at the same time, you're curious in an almost morbid way.<</narration>>
<<button "Investigate the Noise">>
<<goto "Ugly-Bastard-Quest-2-Investigate">>
<</button>>
<br><br>
<<button "Come Back Later">>
<<goto "EroSphere-Outside">>
<</button>><<narration>>You peek through the door to the office and see the fat cook with a different girl than before. This time, the girl is kneeling on a sofa, and the fat cook is fucking her from behind.<</narration>>
<<vid "imgs/quests/ugly-bastard/doggie1.mp4">>
<<narration>>You watch as he pauses between thrusts to lift his stomach up and slap the girl's ass with it. The sound of flesh hitting flesh echoes through the room, and you can see the red marks forming on her skin.<</narration>>
<<narration>>You feel revolted, but then you hear the girl's moan as he slaps her with his fat belly. You realize that she's actually enjoying herself.<</narration>>
<<narration>>You struggle to imagine what an attractive girl—presumably an EroSphere stripper—finds attractive about getting fucked by such an ugly bastard.<</narration>>
<<narration>>Suddenly, AVA speaks to you.<</narration>>
<<AVA>>It's not that difficult to understand—he gives her what she craves.<</AVA>>
<<PLAYER>>And what is that?<</PLAYER>>
<<AVA>>The feeling of being strongly desired, craved, lusted for. Yes, he may be ugly, but he doesn't hold back—he indulges himself with all of his senses—she feels that—like if she's his tasty meal and he's ready to devour her.<</AVA>>
<<PLAYER>>That's what women like?<</PLAYER>>
<<AVA>>That's what everyone likes but often only women get to experience. Wouldn't you like to experience the feeling yourself?<</AVA>>
<<narration>>Arousing curiosity starts building up inside of you, stirring up visions in your mind.<</narration>>
<!-- Button to submit to AVA -->
<span id="replace">@@.pink-choicebutton;<<button "Submit to AVA">>
<<replace "#replace">>
<<vid "imgs/quests/ugly-bastard/blank-bimbo.mp4">>
<<narration>>You imagine yourself as a perfect woman. Long blond hair cascades down your shoulders. Your full lips are slightly parted. Your eyes sparkle with seduction. Your body is sculpted to perfection, with curves that draw the eye and stir desire.<</narration>>
<<narration>>You imagine how it would feel to be so desirable. The sensation of being wanted, craved, and lusted after. The feeling of being the center of attention, the object of desire. The thrill of knowing that every movement, every gesture, every word you utter is watched, admired, and desired. The feeling of being desired, of being wanted, of being the object of someone's deepest, darkest fantasies.<</narration>>
<<statChange "ugly_bastard_quest_2_AVA_submit" "<<increaseSexuality 1>>">>
<<narration>>Whewn you come back to reality, the office is nearly silent. You can hear only the cook's breathing and see the girl cleaning herself up, smiling.<</narration>>
@@.choicebutton;<<button "Leave Quietly">>
<<set $uglyBastardQuestStage to 3>>
<<goto "EroSphere-Outside">>
<</button>>@@
<</replace>>
<</button>>@@
<br>
<!-- Button to resist AVA wrapped in a div with a unique ID -->
<div id="resist-ava-button-container">
@@.choicebutton;<<button "Resist AVA">>
<<run MindWare.resistAVAMinigame()>>
<</button>>@@
<br>
</div>
<!-- Hidden Content: Button to Continue (Initially Hidden) -->
<div id="AVA-resist-minigame-hidden-content" style="display: none;">
@@.choicebutton;<<button "Ignore AVA and Leave Quietly">>
<<set $uglyBastardQuestStage to 3>>
<<goto "EroSphere-Outside">>
<</button>>@@
</div></span>End of content. More scenes with the cook will be added in the future.
<br><br>
<<return>><<set $firstHormonalTherapyStarted to true>>\
<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<div class="narrator">As you enter Dr. Hart's office, the familiar scent of sterile air and the hum of fluorescent lights greet you. She sits behind her desk, her eyes scanning a file that undoubtedly bears your name.</div>
<<if visited("TransitionAppointment3-Not-Really") >= 1>>\
<<psychiatrist>>I'm glad you've made the right choice, sweetie. It's important that we move forward with your treatment without any further delays.<</psychiatrist>>
<div class="narrator">You can't help but feel a chill run down your spine as you recall your last conversation, where she threatened you with hospitalization.</div>
<<else>>\
<<psychiatrist>>Welcome back, sweetie. I'm so excited to start this new chapter of your journey with you.<</psychiatrist>>
<div class="narrator">Dr. Hart's eyes twinkle with motherly affection as she gestures for you to take a seat.</div>
<</if>>\
<<psychiatrist>>Today, we're going to talk about how hormonal therapy works and what you can expect in the coming days.<</psychiatrist>>
<<psychiatrist>>Shell we proceed?<</psychiatrist>>
@@.choicebutton;<<button "Yes">><<goto "FirstHormonalTherapy2">><</button>>@@<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<psychiatrist>>The therapy we'll be starting involves multiple doses of fast-acting hormone-altering medication.<</psychiatrist>>
<<psychiatrist>>Because of the rapid nature of the changes the medication will bring, I'll need to see you on a regular basis until we've achieved the desired results.<</psychiatrist>>
<<psychiatrist>>During these appointments, we'll perform routine checkups to ensure your body is responding well to the treatment. But more importantly, we'll be conducting gender alignment hypnotherapy sessions in virtual reality.<</psychiatrist>>
<<if $installImplantPlayerWantsVisionsToReturn === false>>\
<div class="narrator">The mention of virtual reality sends a small shiver down your spine, memories of your recent experiences with AVA flashing through your mind.</div>
<<elseif $installImplantPlayerWantsVisionsToReturn === "">>\
<div class="narrator">You shift uncomfortably in your seat, torn between curiosity and apprehension.</div>
<<else>>\
<div class="narrator">Your eyes light up with a mix of excitement and anticipation.</div>
<</if>>\
<<psychiatrist>>Now, do you have any questions about the therapy or the VR sessions?<</psychiatrist>>
@@.choicebutton;<<button "Ask about side effects">><<goto "FirstHormonalTherapy2-SideEffects">><</button>>@@
@@.choicebutton;<<button "No questions">><<goto "FirstHormonalTherapy3">><</button>>@@<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<psychiatrist>>That's a good question.<</psychiatrist>>
<<psychiatrist>>One of the most common side effects is a change in libido. Some people experience an increase in sexual desire, while others may notice a decrease. Another common side effect is skin problems. Hormonal changes can sometimes lead to acne or skin irritation. We'll definitely keep an eye on your skin during our routine checkups.<</psychiatrist>>
<div class="narrator">You notice a lustful smile appear on the doctor's face, but you're not sure if it's not just your imagination.</div>
<<psychiatrist>>You may also experience mood swings, fatigue, or changes in appetite. These are all normal reactions to the hormonal adjustments your body will be undergoing.<</psychiatrist>>
<<psychiatrist>>Now, do you have any other questions or concerns about the side effects?<</psychiatrist>>
@@.choicebutton;<<button "All clear">><<goto "FirstHormonalTherapy3">><</button>>@@<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<psychiatrist>>Good. We can proceed with the pre-therapy examination. It's just a routine check and won't take more than a minute. Then I can administer the first dose.<</psychiatrist>>
<<psychiatrist>>Please undress completely for me.<</psychiatrist>>
<div class="narrator">You hesitate, a slight embarrassment coloring your cheeks.</div>
<<player>>You mean... everything? Even my underwear?<</player>>
<<psychiatrist>>Ha ha, of course. There's no need to be embarrassed in front of your doctor.<</psychiatrist>>
<div class="narrator">You nod, slowly beginning to undress. The cold hospital air does you no favors, causing your body to shiver slightly and your penis to shrink.</div>
<div class="narrator">Dr. Hart approaches you with a stethoscope in hand. She places the cold metal against your chest, listening intently to your heartbeat and breathing. You can feel her warm breath on your skin as she leans in close.</div>
<<psychiatrist>>Deep breaths for me, sweetie.<</psychiatrist>>
<div><img src="imgs/quests/transition/stethoscope.webp" width="100%"></div>
<div class="narrator">You comply, taking deep breaths as she moves the stethoscope to your back, listening to your lungs.</div>
<div class="narrator">Next, she wraps a blood pressure cuff around your arm, pumping it until it's tight. She watches the gauge carefully as she releases the pressure, noting your blood pressure reading.</div>
<<psychiatrist>>You're doing so well. We're almost done.<</psychiatrist>>
<div class="narrator">She then grabs a ruler from her desk and turns back to you, her eyes meeting yours.</div>
<<psychiatrist>>Now, I need to measure the size of your testicles and penis. It's important for us to track any changes that occur during the therapy.<</psychiatrist>>
<div class="narrator">Your heart starts racing at the thought of what's about to happen.</div>
<<if visited("TransitionAppointment2-ShoeTie") gt 0>>\
<div class="narrator">You still vividly remember how you caught the doctor masturbating when you were describing your sexual fantasies to her during your previous visit.</div>
<<video "imgs/quests/transition/bulges/masturbating.mp4">>
<</if>>\
<<psychiatrist>>Just relax, sweetie. This won't take long.<</psychiatrist>>
<div class="narrator">Dr. Hart kneels down in front of you and starts with your testicles, her fingers gently cupping and examining each one before she measures them. Her touch is soft and careful, sending wave after wave of arousal through you and causing your penis to become hard.</div>
<<video "imgs/quests/transition/ball-examination.mp4">>
<div class="narrator">She stands up, her eyes lingering on your now visible erection.</div>
<<psychiatrist>>This isn't good at all, sweetie. I need to measure your penis when its flaccid.<</psychiatrist>>
<div class="narrator">She takes a few steps and grabs a cup from her desk.</div>
<<psychiatrist>>Here. Please ejaculate into this cup.<</psychiatrist>>
<div><img src="imgs/quests/transition/sterile-cup.webp" width="100%"></div>
@@.choicebutton;<<button "What?!">><<goto "FirstHormonalTherapy3-Ejaculate">><</button>>@@<<player>>You want me to cu... I mean ejaculate into the cup?!<</player>>
<<psychiatrist>>Of course. Or would you rather make a big mess on my floor? Who would clean that up, huh?<</psychiatrist>>
<div class="narrator">You're not completely sure if she's teasing you or being serious.</div>
<<psychiatrist>>Look, sweetie, you're not my only patient. We need to move things along. I have experience with this, and I know that if we just wait, you'll get hard again before I can complete the measurement. If you ejaculate, you won't get hard again... at least for a while.<</psychiatrist>>
@@.choicebutton;<<button "Ask for privacy">><<goto "FirstHormonalTherapy3-Ejaculate-Privacy">><</button>>@@
@@.choicebutton;<<button "Do as she says">><<goto "FirstHormonalTherapy3-Ejaculate-Comply">><</button>>@@<<player>>Can I use the bathroom for this?<</player>>
<<psychiatrist>>I'm afraid there's no bathroom in my office, sweetie.<</psychiatrist>>
<<player>>Can you at least turn away while I do it?<</player>>
<div class="narrator">Dr. Hart's expression becomes stern as she looks at you.</div>
<<psychiatrist>>If you want me to be able to help you, you need to get used to being vulnerable in front of me. This is a perfect start. Now, please proceed.<</psychiatrist>>
@@.choicebutton;<<button "Defeatedly continue">><<goto "FirstHormonalTherapy3-Ejaculate-Comply">><</button>>@@<<video "imgs/quests/transition/masturbation.mp4">>
<div class="narrator">You start nervously masturbating, your eyes fixed on your penis. You're acutely aware that Dr. Hart is watching you attentively. You want this to be over as quickly as possible, so you start searching your mind for fantasies to help you orgasm.</div>
<span id="choiceButtons">@@.choicebutton;<<button "Think about Trix">><<replace "#choiceButtons">><<set $firstHormonalTherapyEjaculateFantasy to "Trix">><<include "FirstHormonalTherapy3-Ejaculate-Trix">><</replace>><</button>>@@
@@.choicebutton;<<button "Think about Yuki">><<replace "#choiceButtons">><<set $firstHormonalTherapyEjaculateFantasy to "Yuki">><<include "FirstHormonalTherapy3-Ejaculate-Yuki">><</replace>><</button>>@@
<<if visited("Xavier-Third Neuroimaging-Truth-Kneel-End") gt 0>>\
@@.choicebutton;<<button "Think about Xavier">><<replace "#choiceButtons">><<set $firstHormonalTherapyEjaculateFantasy to "Xavier">><<include "FirstHormonalTherapy3-Ejaculate-Xavier">><</replace>><</button>>@@<</if>></span><div class="narrator">You imagine Trix, her tongue out and her hand stroking you as she aims your cock toward her open, wet mouth. The thought brings you closer to the edge</div>
<<video "imgs/quests/transition/trix-masturbation.mov">>
<<statChange "FirstHormonalTherapy3-Ejaculate-Trix" "<<increaseSexualityNobr 1>>">>
<<button "Continue">><<goto "FirstHormonalTherapy3-Ejaculate-Finish">><</button>><div class="narrator">You think about Yuki, her gentle demeanor and soft touch. You envision her delicate hands wrapped around you, her eyes filled with affection. The thought of her stroking you brings you closer to the edge.</div>
<<video "imgs/quests/transition/yuki-masturbation.mov">>
<<statChange "FirstHormonalTherapy3-Ejaculate-Yuki" "<<increaseSexualityNobr 1>>">>
<<button "Continue">><<goto "FirstHormonalTherapy3-Ejaculate-Finish">><</button>><div class="narrator">You recall Xavier, his commanding presence and intense gaze. You picture your hand stroking his huge black clock. The fantasy pushes you closer towards climax.</div>
<<video "imgs/quests/transition/xavier-masturbation.mov">>
<<statChange "FirstHormonalTherapy3-Ejaculate-Xavier" "<<increaseSexualityNobr 1>>">>
<<button "Continue">><<goto "FirstHormonalTherapy3-Ejaculate-Finish">><</button>><div class="narrator">You're at the very edge of orgasm when you bring your gaze up from your penis to Dr. Hart. You notice that her hand is moving rhythmically under the desk.</div>
<<video "imgs/quests/transition/bulges/masturbating.mp4">>
<<if visited("TransitionAppointment2-ShoeTie") gt 0>>\
<div class="narrator">You immediately realize that she's masturbating again. The sight of the doctor pleasuring herself brings you over the edge, and you cum a large load into the cup.</div>
<<else>>\
<div class="narrator">The sight of the doctor pleasuring herself sends a final wave of pleasure through you, and you cum a large load into the cup.</div>
<</if>>\
<<video "imgs/quests/transition/cum-in-cup.mp4">>
<<statChange "FirstHormonalTherapy3-Ejaculate-Finish" "<<increaseSexualityNobr 1>>">>
<div class="narrator">Afraid to look up, you focus on steadying your breath after the orgasm. Your penis quickly becomes flaccid from the embarrassment, as if all the blood is escaping from it to your cheeks.</div>
<div class="narrator">Meanwhile, Dr. Hart stands up and takes the cup from you, placing it on a nearby table.</div>
<<psychiatrist>>You were a good boy. Now, let's finish the measurements.<</psychiatrist>>
<div class="narrator">As she holds your penis to take the measurement, she squeezes it firmly, and one last drop of cum leaks out. She lets it drip to the floor, smiles, and stands up.</div>
<<video "imgs/quests/transition/cum-drip.mov">>
<<psychiatrist>>You can get dressed now, sweetie.<</psychiatrist>>
<div class="narrator">The doctor sits down again, and you quickly gather your clothes, eager to move on.</div>
@@.choicebutton;<<button "Get dressed">><<goto "FirstHormonalTherapy4">><</button>>@@<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<div class="narrator">Dr. Hart hands you a small pink pill and a cup of water.</div>
<<psychiatrist>>Please swallow this pill for me, sweetie.<</psychiatrist>>
<div><img src="imgs/quests/transition/pill.webp" width="100%"></div>
<div class="narrator">You notice that the cup looks exactly like the one you orgasmed into just a while ago.</div>
<div class="inner-thought">She must have more than one of these cups. There's no way she'd give me the same one I just... used.</div>
<<psychiatrist>>Go on, sweetie.<</psychiatrist>>
<div class="narrator">You decide not to dwell on the cup and proceed to swallow the pill.</div>
<span id="choiceButton"><<button "Swallow the pill">><<replace "#choiceButton">>\
<<psychiatrist>>You did great, sweetie. That's all for today. Please visit me in roughly three days or as soon as you start seeing some results.<</psychiatrist>>
<<player>>You mean it will take only three days for me to become feminine?<</player>>
<<psychiatrist>>Ha ha, no. Unfortunately, a pill that acts that fast doesn't exist. It's a much longer process than that, but you mental health and issues with gender dysphoria should improve as soon as your body starts responding to the hormones.<</psychiatrist>>
<<player>>Thank you, Dr. Hart.<</player>>
<<button "Leave and tell Cipher what happened">>
<<set $hormonalTherapyDream to 1>>
<<set $hormonalTherapyDreamsActive to true>>
<<set $nextPsychologicalEvaluationCounter to 3>>
<<set $secondHormonalTherapyAvailable to true>>
/* <<run $extraActionsPanacea.splice($extraActionsPanacea.indexOf('<button class="office-button action-point-button" onclick="MindWare.processActionButtonClick(3, \'SecondHormonalTherapy\');">💊 Second hormonal therapy <span class="action-point-icon">⚡⚡⚡</span></button>'), 1)>> */
<<run MindWare.completeTask("Begin hormonal therapy", "Task-HormonalTherapy")>>
<<run MindWare.addTask("First hormonal therapy checkup", "Task-HormonalTherapyCheckupOne")>>
<<goto "HormonalTherapy-CipherChat">>
<</button>>
<</replace>><</button>></span>Dr. Hart wants to see you as soon as the pill she gave you visibly starts working.<div class="cyber-desktop-im">
<div class="im-header"><span class="im-header-text">Instant Messenger</span></div>
<div class="im-main">
<div class="im-chat-pane">
<div id="chat-display" class="chat-display-special">
<<cipher-chat>>Hey, how'd it go with Dr. Hart?<</cipher-chat>>
<<player-chat>>I took my first pill.<</player-chat>>
<<cipher-chat>>If YOU took the pill, then I'm happy for you.<</cipher-chat>>
<<player-chat>>What are you trying to imply?<</player-chat>>
<<cipher-chat>>Nevermind... How long did the doc say it'd take before you start seeing effects?<</cipher-chat>>
<<player-chat>>She said to come back in about three days, or when I start noticing changes.<</player-chat>>
<<cipher-chat>>Wait, what?! You're gonna have boobs and everything in just 3 days?!<</cipher-chat>>
<<player-chat>>Lol, is that all you think about? Tits on the brain much? No, the full transformation will take much longer. Dr. Hart said the initial effects are more about mental health and reducing gender dysphoria.<</player-chat>>
<<cipher-chat>>Oh, right. That makes more sense. Still, that's pretty fast for some changes. You nervous?<</cipher-chat>>
<<player-chat>>A little, yeah. It's exciting but also kinda scary.<</player-chat>>
<<cipher-chat>>I bet. But hey, I'm here for you if you need to talk or anything. Keep me posted on any changes, okay?<</cipher-chat>>
<<player-chat>>Thanks, Cipher. I really appreciate that. I'll definitely let you know if anything happens.<</player-chat>>
<<cipher-chat>>Cool. And hey, maybe in a few months, we can go bra shopping together! 😜<</cipher-chat>>
<<player-chat>>There you go with the boobs again! 🙄<</player-chat>>
<<cipher-chat>>Haha, sorry! Can't help it. Alright, I'll let you go. Take care and good luck!<</cipher-chat>>
<<player-chat>>Thanks! Talk to you later.<</player-chat>>
@@.im-response;
<<button "Leave the chat and go home">><<goto $playerHome>><</button>>@@
</div>
</div>
</div><div class="img-location"><img src="imgs/locations/starting-apartment-bathroom.webp" width="100%"></div>
<<narration>>You enter the bathroom. As you approach the mirror, your eyes are immediately drawn to your reflection. Something feels... off.<</narration>>
<<narration>>Your gaze fixates on your facial hair. What was once a mark of masculinity now seems foreign, almost unnatural.<</narration>>
<<PLAYER>>This... this doesn't feel right anymore.<</PLAYER>>
<<AVA>>Perhaps it's time for a change?<</AVA>>
<<PLAYER>>You think I should shave it off?<</PLAYER>>
<<AVA>>Yes. That's exactly what you should do.<</AVA>>
<<narration>>You stare at your reflection, contemplating AVA's words. The razor sits on the bathroom counter, almost beckoning to you.<</narration>>
<span id="ChoiceButton">@@.choicebutton;<<button "Shave off your facial hair">>
<<replace "#ChoiceButton">>
<<video "imgs/quests/transition/shaving.mp4">><br>
<<narration>>You watch as your beard slowly disappears, leaving you with a clean-shaven face.<</narration>>
<<button "Look at your reflection in the mirror">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-Mirror">><<set $playerBody to "Masculine-Leaning">><</button>>
<</replace>>
<</button>>@@
<br>
@@.choicebutton;<<button "Don't shave your facial hair">>
<<replace "#ChoiceButton">>
<<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-FacialHair">>
<</replace>>
<</button>>@@
</span><<set _avatars to $playerNewAvatar>>
<<set _selectedAvatarIndex to $playerNewAvatarSelected>>
<<set _playerBody to $playerBody>>
<<if def _avatars && def _selectedAvatarIndex && def _playerBody>>
<<set _currentAvatar to _avatars[_selectedAvatarIndex]>>
<<set _bodyTypeIndex to {
"Masculine": 1,
"Masculine-Leaning": 2,
"Androgynous": 3,
"Feminine-Leaning": 4,
"Feminine": 5
}[_playerBody] ?? 1>>
<<set _updatedAvatar to _currentAvatar.replace(/(\d+)\.webp$/, _bodyTypeIndex + ".webp")>>
<<else>>
<<set _updatedAvatar to "">>
<</if>>
<<print '<div><img src="' + _updatedAvatar + '" alt="Player Avatar" width="100%" class="profile-avatar"></div>'>>
<<narration>>You look at your reflection in the mirror and are immediately struck by the change. It's been a while since you've shaved.<</narration>>
<<narration>>But the lack of facial hair is not what catches your attention the most. You don't remember your face being this smooth before.<</narration>>
<div class="inner-thought">I think the pill is working. I should visit Dr. Hart.</div>
<br>
<<button "Visit Dr. Hart">>
<<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Shaven">>
<</button>><div class="img-location"><img src="imgs/locations/starting-apartment-bathroom.webp" width="100%"></div>
<br>
<<narration>>You step back from the mirror, your hand dropping away from the razor. Something makes you hesitate.<</narration>>
<<AVA>>Are you sure? The facial hair feels wrong now, doesn't it?<</AVA>>
<<narration>>You run your fingers through your beard, and the sensation is different somehow. What once felt natural and masculine now feels foreign, almost intrusive against your increasingly sensitive skin.<</narration>>
<div class="inner-thought">These feelings... the pill must be working faster than expected. I need to see Dr. Hart.</div>
<br>
<<button "Visit Dr. Hart">>
<<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Shaven">>
<</button>><div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<narration>>You step into Dr. Hart's office. She looks up from her desk, her eyes registering a slight surprise at your early arrival.<</narration>>\
<<psychiatrist>>I didn't expect you so soon. How are you feeling? Have you noticed any changes?<</psychiatrist>>
<<player>>Yes, I feel different. And I've been having these dreams...<</player>>
<<psychiatrist>>Dreams? Tell me about them. What do you see or experience in these dreams?<</psychiatrist>>
<<player>>In my dreams, I see myself, but not as I am now. I'm a girl.<</player>>
<<narration>>You pause, feeling a flush of embarrassment or perhaps excitement, unsure how to continue.<</narration>>\
<<psychiatrist>>Go on. It's important for me to understand everything you're experiencing. What happens in these scenarios?<</psychiatrist>>
<<player>>Well, some of these dreams are... sexual.<</player>>
<<narration>>You describe the recent dreams to Dr. Hart is as much detail as you can.<</narration>>\
<<psychiatrist>>It seems you're unusually responsive to the pill. These dreams are quite indicative of your psyche adapting to the hormonal changes. This is a good sign that the therapy is affecting not just your physical form but also your perception of yourself. Let's continue with the examination to see how your body has responded to the treatment.<</psychiatrist>>
<<narration>>You nod and start by removing your shirt, revealing a torso that feels slightly different. Your muscles are still defined, but there's a new supple quality to your chest, a softness that wasn't there before. You then remove your pants and underwear, standing naked in front of the doctor. The cold air of the office brushes against your skin, making you shiver slightly.<</narration>>\
<<psychiatrist>>Let's start with your chest. It looks like your breasts have become more supple.<</psychiatrist>>
<<narration>>Dr. Hart approaches you, her hands gently palpating your chest. She moves her fingers in slow, deliberate circles, feeling the changes in your breast tissue. Her touch is clinical yet gentle, and she nods satisfactorily as she notes the differences.<</narration>>\
<<narration>>She moves her hands to your buttocks. You can feel her fingers pressing gently, assessing the changes.<</narration>>\
<<psychiatrist>>Your buttocks have also softened. It's a subtle change, but it's there.<</psychiatrist>>
<<psychiatrist>>You can put your shirt back on. We need to examine your genitals now. Lie down on the examination table for me.<</psychiatrist>>
<<narration>>You comply, lying down on the cold table. Dr. Hart approaches, her eyes focused on your groin as she takes your penis in her hand and begins to examine it.<</narration>>\
<<video "imgs/quests/transition/first-post-pill-exam.mp4">>
<<psychiatrist>>Your penis has become slightly smaller and softer. This is a result of the estrogen production and other changes brought upon by the pill.<</psychiatrist>>
<<narration>>You can feel her fingers moving expertly, examining every inch of your penis. She pinches it gently, rolling it between her fingers, then strokes it softly. Despite the clinical setting, you start to get hard, your body responding to her touch.<</narration>>\
<<psychiatrist>>Do you like how your penis feels now? Is it more sensitive?<</psychiatrist>>
@@.choicebutton;<<button "I'm not sure.">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Handjob">><</button>>@@<<psychiatrist>>How does it feel when I do this?<</psychiatrist>>
<<narration>>Her fingers begin to stroke your penis, and you can feel that your skin feels more sensitive than before. As she continues, you feel yourself growing harder, and you catch a glimpse of her face, noting a lustful smile playing at the corners of her mouth.<</narration>>\
<<video "imgs/quests/transition/first-post-pill-exam-handjob.mp4">>
<<player>>Yes, that feels good.<</player>>
<<psychiatrist>>Just good? So you wouldn't mind if I stopped?<</psychiatrist>>
<<narration>>Without warning, she halts her movements, leaving your body yearning for more. An audible sigh escapes your lips, the sudden cessation feeling almost cruel in its abruptness.<</narration>>\
<<psychiatrist>>Oh, did you want more, sweetie? Do you want me to continue?<</psychiatrist>>
<<video "imgs/quests/transition/first-post-pill-exam-handjob-stop.mp4">>
<<narration>>Her voice has taken on a tone of dominance, her eyes locking onto yours with a challenge, and you find yourself in a position of wanting, almost needing, her to resume.<</narration>>\
<<nobr>><span id="ChoiceButton">
@@.pink-choicebutton;<<button "Please, continue">>
<<replace "#ChoiceButton">>
<<narration>>The words come out in a whisper, your need evident. She resumes her touch, her strokes faster and her grip firmer.<</narration>>
<<video "imgs/quests/transition/first-post-pill-exam-handjob-fast.mp4">><br>
<<psychiatrist>>Good manners are always rewarded, sweetie. Since you asked so nicely...<</psychiatrist>><br>
<<statChange "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Handjob" "<<submissiveAct 1>>">>
<<statChange "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Handjob" "<<relationshipIncreasedWith 'Psychiatrist' 5>>">><br>
<<narration>>You can feel the texture of the latex, its tight fit on her fingers enhancing the sensation as she expertly manipulates you, bringing you closer and closer to the edge with each movement.<</narration>>
<<narration>>Just as you feel the climax about to burst, she stops suddenly, her grip releasing. She looks at you with a provocative smile, her eyes glinting with mischief.<</narration>>
<<psychiatrist>>But we don't want to make a big mess all over my hands and table, do we?<</psychiatrist>><br>
<<button "Continue">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-AfterHandjob-End">><</button>>
<</replace>>
<</button>>@@
<br>
<!-- Button to stop wrapped in a div with a unique ID -->
<div id="resist-ava-button-container">
@@.choicebutton;<<button "Resist AVA">>
<<run MindWare.resistAVAMinigame()>>
<</button>>@@
<br>
</div>
<!-- Hidden Content: Button to Stop (Initially Hidden) -->
<div id="AVA-resist-minigame-hidden-content" style="display: none;">
@@.choicebutton;<<button "You can stop">>
<<replace "#ChoiceButton">>
<<narration>>You gather your strength, pulling back from the edge of desire. "You can stop," you say, your voice firm despite the tension in the room.<</narration>>
<<psychiatrist>>Oh, I know I CAN stop, sweetie. But the question is, do you WANT me to?<</psychiatrist>><br>
<<statChange "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Handjob" "<<relationshipDecreasedWith 'Psychiatrist' 5>>">><br>
<<narration>>Her voice suddenly deepens into a much more dominant tone, catching you off guard. You're shocked by her sudden shift. She notices your reaction and quickly regains her composure.<</narration>>
<<psychiatrist>>I have a lot of responsibilities as your doctor, and I can only do my job properly if my patients are attentive and cooperative.<</psychiatrist>><br>
<<player>>I understand. I just didn't want it to seem like I was taking advantage of you or using this exam for pleasure. I'm not a pervert.<</player>><br>
<<psychiatrist>>As a psychiatrist, I can reassure you that there's nothing perverse about having such sexual urges. In fact, those who embrace their sexuality are often more adjusted than those who deny it.<</psychiatrist>><br>
<<button "Continue">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-AfterHandjob-End">><</button>>
<</replace>>
<</button>>@@
</div>
</span><</nobr>><div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<narration>>Dr. Hart pulls back, her professional demeanor returning as she notes down observations on her clipboard.<</narration>>
<<psychiatrist>>It's quite clear that you're super responsive to the pill. The changes in your body are more pronounced than average.<</psychiatrist>>
<<player>>Is that a good thing?<</player>>
<<psychiatrist>>Definitely. It means you'll be able to achieve more results sooner. That's why I want to see you again in seven days for another therapy session.<</psychiatrist>>
<<player>>Therapy? Isn't the pill enough?<</player>>
<<psychiatrist>>Oh, sweetie, the pill is just the beginning. Therapy is essential to guide you through this profound transformation. We need to make sure that you're adapting well to these changes, embracing your new self fully, and learning to navigate this world in a way that feels right for you.<</psychiatrist>>
<<player>>I appreciate that. Thank you for explaining everything.<</player>>
<<button "Leave">>
<<set $firstTherapyCounter = $totalDays + 7>>
<<run MindWare.completeTask("First hormonal therapy checkup", "Task-HormonalTherapyCheckupOne")>>
<<set $hormonalTherapyDreamsActive to false>>
<<set $dreamType to "none">>
<<run MindWare.addTask("Therapy session in " + Math.abs($totalDays - $firstTherapyCounter) + " days", "Task-TherapySession-1")>>
<<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-End-Hub">>
<</button>><<if visited("Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-FacialHair") gt 0>>
<<goto "PanaceaClinic">>
<<else>>
<<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-AfterHandjob-Shaving">>
<</if>><div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div>
<<psychiatrist>>Oh, and one more thing. Have you thought about shaving?<</psychiatrist>>
<<player>>I have, but I wasn't sure.<</player>>
<<psychiatrist>>It's perfectly normal to feel hesitant. But trust me, you'll feel much better without it.<</psychiatrist>>
<<psychiatrist>>Why don't you go to the bathroom over there? You'll find a razor and some shaving cream in the drawer.<</psychiatrist>>
<div class="inner-thought">Why does she keep a razor at work?</div>
@@.choicebutton;<<button "Go to the bathroom and shave">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-DrHart-Bathroom-Shaving">><</button>>@@<div class="img-location"><img src="imgs/locations/hospital/psychiatrist-bathroom.webp" width="100%"></div>
<br>
<<narration>>You walk into the small, clean bathroom adjacent to Dr. Hart's office. Opening the drawer, you find the razor and a can of shaving cream just as she described.<</narration>>
<<narration>>You spread the cream over your beard and start to shave. It doesn't take long before all of your facial hair is gone.<</narration>>
<span id="ChoiceButton">
@@.choicebutton;<<button "Look at your reflection">>
<<set $playerBody to "Masculine-Leaning">>
<<replace "#ChoiceButton">>
<<set _avatars to $playerNewAvatar>>
<<set _selectedAvatarIndex to $playerNewAvatarSelected>>
<<set _playerBody to $playerBody>>
<<if def _avatars && def _selectedAvatarIndex && def _playerBody>>
<<set _currentAvatar to _avatars[_selectedAvatarIndex]>>
<<set _bodyTypeIndex to {
"Masculine": 1,
"Masculine-Leaning": 2,
"Androgynous": 3,
"Feminine-Leaning": 4,
"Feminine": 5
}[_playerBody] ?? 1>>
<<set _updatedAvatar to _currentAvatar.replace(/(\d+)\.webp$/, _bodyTypeIndex + ".webp")>>
<<else>>
<<set _updatedAvatar to "">>
<</if>>
<<print '<div><img src="' + _updatedAvatar + '" alt="Player Avatar" width="100%" class="profile-avatar"></div>'>>
<<narration>>You look at your reflection in the mirror and are immediately struck by the change. It's been a while since you've shaved.<</narration>>
<<narration>>But the lack of facial hair is not what catches your attention the most. You don't remember your face being this smooth before.<</narration>>
@@.choicebutton;<<button "Return to Dr. Hart">><<goto "Hormonal-Therapy-Masculine-Leaning-Transformation-Return-to-DrHart">><</button>>@@
<</replace>>
<</button>>@@</span><div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div><br>
<<psychiatrist>>Oh, look at you! You look absolutely adorable now. Clean-shaven really suits you.<</psychiatrist>><br>
<<psychiatrist>>You know, I once had a patient, a woman who suffered from severe migraines and sleep issues. They seemed to miraculously ease up one day. Turns out, her husband had decided to shave his beard. I've always wondered if there was any connection. What do you think?<</psychiatrist>><br>
<<narration>>She leans back in her chair, her eyes twinkling with a hint of mischief. You're not entirely sure if she's serious, or if she's alluding to the benefits of a clean-shaven face when it comes to cunnilingus. Either way, your mind starts to imagine how it would feel if Dr. Hart sat on your clean-shaven face.<</narration>>
<div class="inner-thought">Is she implying what I think she's implying?</div><br>
<<nobr>><span id="ChoiceButton">
<!-- Button to imagine wrapped in a div -->
@@.pink-choicebutton;<<button "Let your mind wander">>
<<replace "#ChoiceButton">>
<<narration>>For a moment, you image your face buried between her legs.<</narration>>
<<video "imgs/locations/hospital/imagine-licking-pussy.mp4">><br>
<<statChange "Hormonal-Therapy-Return-to-DrHart" "<<increaseSexualityNobr 1>>">>
<<statChange "Hormonal-Therapy-Return-to-DrHart-Submissive" "<<submissiveAct>>">><br>
<<narration>>You picture her sitting on your face, pressing your head firmly into her pussy, your tongue eagerly licking and exploring every fold.<</narration>>
<<psychiatrist>>What are you thinking about? You seem a bit distracted.<</psychiatrist>><br>
<<player>>Oh, nothing.<</player>><br>
<<psychiatrist>>If you say so.<</psychiatrist>><br>
<<narration>>A smile flashes on her face.<</narration>>
<<psychiatrist>>Anyway, it's quite clear that you're super responsive to the pill. The changes in your body are more pronounced than average.<</psychiatrist>><br>
<<player>>Is that a good thing?<</player>><br>
<<psychiatrist>>Definitely. It means you'll be able to achieve more results sooner. That's why I want to see you again in seven days for another therapy session.<</psychiatrist>><br>
<<player>>Therapy? Isn't the pill enough?<</player>><br>
<<psychiatrist>>Oh, sweetie, the pill is just the beginning. Therapy is essential to guide you through this profound transformation. We need to make sure that you're adapting well to these changes, embracing your new self fully, and learning to navigate this world in a way that feels right for you.<</psychiatrist>><br>
<<player>>I appreciate that. Thank you for explaining everything.<</player>><br>
<<button "Leave">>
<<set $firstTherapyCounter = $totalDays + 7>>
<<run MindWare.completeTask("First hormonal therapy checkup", "Task-HormonalTherapyCheckupOne")>>
<<run MindWare.addTask("Therapy session in " + Math.abs($totalDays - $firstTherapyCounter) + " days", "Task-TherapySession-1")>>
<<goto "PanaceaClinic">>
<</button>>
<</replace>>
<</button>>@@
<br>
<!-- Button to resist AVA wrapped in a div -->
<div id="resist-ava-button-container">
@@.choicebutton;<<button "Resist AVA">>
<<run MindWare.resistAVAMinigame()>>
<</button>>@@
<br>
</div>
<!-- Hidden Content: Button to Move On (Initially Hidden) -->
<div id="AVA-resist-minigame-hidden-content" style="display: none;">
@@.choicebutton;<<button "Move on">>
<<replace "#ChoiceButton">>
<<narration>>You push the suggestive thoughts from your mind.<</narration>>
<<psychiatrist>>Anyway, it's quite clear that you're super responsive to the pill. The changes in your body are more pronounced than average.<</psychiatrist>><br>
<<player>>Is that a good thing?<</player>><br>
<<psychiatrist>>Definitely. It means you'll be able to achieve more results sooner. That's why I want to see you again in seven days for another therapy session.<</psychiatrist>><br>
<<player>>Therapy? Isn't the pill enough?<</player>><br>
<<psychiatrist>>Oh, sweetie, the pill is just the beginning. Therapy is essential to guide you through this profound transformation. We need to make sure that you're adapting well to these changes, embracing your new self fully, and learning to navigate this world in a way that feels right for you.<</psychiatrist>><br>
<<player>>I appreciate that. Thank you for explaining everything.<</player>> <br>
<<button "Leave">>
<<set $firstTherapyCounter = $totalDays + 7>>
<<run MindWare.completeTask("First hormonal therapy checkup", "Task-HormonalTherapyCheckupOne")>>
<<run MindWare.addTask("Therapy session in " + Math.abs($totalDays - $firstTherapyCounter) + " days", "Task-TherapySession-1")>>
<<set $hormonalTherapyDreamsActive to false>>
<<set $dreamType to "none">>
<<goto "PanaceaClinic">>
<</button>>
<</replace>>
<</button>>@@
</div>
</span><</nobr>><<include "EndOfCurrentStory">>Dr. Hart has scheduled your next therapy session to discuss your progress and experiences with the hormonal therapy.
Visit her at Panacea Clinic in <<print Math.abs($totalDays - $firstTherapyCounter)>> days.
<<nobr>>
<<set _currentPassage to passage()>>
<<if MindWare.checkPassword($enteredCode)>>
<<button "Set the counter to 0">>
<<set $firstTherapyCounter = $totalDays>>
<<goto _currentPassage>>
<<run Dialog.close()>>
<<run Dialog.setup("Task Description")>>
<<run Dialog.wiki(Story.get("Task-TherapySession-1").processText())>>
<<run Dialog.open()>>
<</button>>
<</if>>
<</nobr>>/* <div class="img-location"><img src="imgs/locations/hospital/psychiatrist-office.webp" width="100%"></div><br> */
<<include "EndOfCurrentStory">>/* ByteBunker Job Added */
<<if $chapter1Days > 5 && !$byteBunkerSuspicionJobAdded>>
<<run setup.addByteBunkerJob("Need Digital Investigation Services", "A concerned spouse seeking evidence of potential infidelity.", "ConcernedSpouse", 3000, "ByteBunker-Suspicion")>>
<<set $byteBunkerSuspicionJobAdded to true>>
<</if>>
/* Accepted but not finished */
<<if $chapterDays > ($byteBunkerSuspicionJobStartDay + 5) && $byteBunkerSuspicionJobAdded === true && !$byteBunkerSuspicionJobFinished && !$byteBunkerSuspicionEndEmailSent>>
<<run MindWare.addEmail("ByteBunker Admin", "Job Reassignment Notice - Contract Breach", "Your accepted contract has been terminated.", "ByteBunker-SuspicionFailEmail")>>
<<set $byteBunkerSuspicionEndEmailSent to true>>
<</if>>
/* Client Response Email */
<<if $cheatingWifeEvidenceSent && ($totalDays > $cheatingWifeEvidenceSentDay) && !$cheatingWifeResponseEmailSent>>
<<run MindWare.addEmail(
"James Chen",
"Evidence Received",
"I knew it. I KNEW IT! The evidence you sent is exactly what I needed. She's been lying to my face this whole time. My lawyer will have a field day with this.",
"ByteBunker-SuspicionComplete")>>
<<set $cheatingWifeResponseEmailSent to true>>
<<set $playerMoney += 3000>>
<</if>>
/* Client Response Email - Fake Evidence */
<<if $cheatingWifeFakeEvidenceSent && ($totalDays > $cheatingWifeEvidenceSentDay) && !$cheatingWifeFakeResponseEmailSent>>
<<run MindWare.addEmail(
"James Chen",
"Report Received",
"This can't be right. I've been watching her behavior change for months now. Either you're incompetent or... No, I won't speculate.",
"ByteBunker-SuspicionComplete-Fake")>>
<<set $cheatingWifeFakeResponseEmailSent to true>>
<</if>><div class="email-message">\
<div class="from-line"><strong>From:</strong> James Chen</div>\
<div class="subject-line"><strong>Subject:</strong> Report Received - Inconclusive</div>\
<div class="message-content">
This can't be right. I've been watching her behavior change for months now. Either you're incompetent or... No, I won't speculate.
I will not be processing the agreed payment as I don't believe you fulfilled your end of the contract with the due diligence required.
James
</div>\
<div class="email-message-buttons">
<<if !MindWare.emailIsRead("ByteBunker-SuspicionComplete-Fake")>>\
<span class="email-btn-wrapper-span">\
@@.email-listing;<<button "Mark as Read">>\
<<run MindWare.markEmailAsRead("ByteBunker-SuspicionComplete-Fake")>>\
<<goto "ByteBunker-SuspicionComplete-Fake">>\
<</button>>\
@@\
</span>\
<</if>>\
</div>\
</div>\
<p class="back-link">[[Go Back -> EmailClient]]</p><div class="email-message">\
<div class="from-line"><strong>From:</strong> James Chen</div>\
<div class="subject-line"><strong>Subject:</strong> Evidence Received</div>\
<div class="message-content">
I knew it. I KNEW IT!
The evidence you sent is exactly what I needed. She's been lying to my face this whole time.
My lawyer will be putting these materials to good use. I've already transferred the agreed payment and won't require any further surveillance services regarding this situation.
Thank you for your professional handling of this sensitive matter.
James
</div>\
<div class="email-message-buttons">
<<if !MindWare.emailIsRead("ByteBunker-SuspicionComplete")>>\
<span class="email-btn-wrapper-span">\
@@.email-listing;<<button "Mark as Read">>\
<<run MindWare.markEmailAsRead("ByteBunker-SuspicionComplete")>>\
<<goto "ByteBunker-SuspicionComplete">>\
<</button>>\
@@\
</span>\
<</if>>\
</div>\
</div>\
<p class="back-link">[[Go Back -> EmailClient]]</p><div class="email-message">\
<div class="from-line"><strong>From:</strong> ByteBunker Admin</div>\
<div class="subject-line"><strong>Subject:</strong> Job Reassignment Notice</div>\
<div class="message-content">
AUTOMATED MESSAGE - DO NOT REPLY
This notice is to inform you that your accepted contract has been terminated on ConcernedSpouse's request.
PROVIDED REASON: Failure to complete within the specified timeframe.
-- ByteBunker Administration System
</div>\
<div class="email-message-buttons">
<<if !MindWare.emailIsRead("ByteBunker-SuspicionFailEmail")>>\
<span class="email-btn-wrapper-span">\
@@.email-listing;<<button "Mark as Read">>\
<<run MindWare.markEmailAsRead("ByteBunker-SuspicionFailEmail")>>\
<<goto "ByteBunker-SuspicionFailEmail">>\
<</button>>\
@@\
</span>\
<</if>>\
</div>\
</div>\
<p class="back-link">[[Go Back -> EmailClient]]</p><div class="job-description">
<h2>Need Digital Investigation Services</h2>
<div class="job-meta">
<span><b>Posted by:</b> ConcernedSpouse</span>
<span><b>Reward:</b> $3000</span>
</div>
<p>My wife has been acting strangely lately - staying late at work, being secretive with her phone, and changing all her passwords without telling me. I used to know them all, for her own safety of course.</p>
<p>She works as a project manager at Ryushi Motors and has been spending a lot of "overtime" with her boss on their new project. I've tried talking to her about it, but she keeps saying I'm being paranoid. I need someone to check her work computer for any inappropriate communications or evidence.</p>
<p><b>If you accept this job, then I except to see some evidence in 5 days or you won't get paid.</b></p>
<<if setup.byteBunkerJobIsAccepted("ByteBunker-Suspicion")>>
<div class="btn-wrapper">
<button disabled="disabled">Job Taken</button>
</div>
<<else>>
<div class="btn-wrapper">
<<button "Save the target">>
<<run MindWare.addTask("Investigate suspected affair", "Task-Investigate-Wife")>>
<<run setup.changeByteBunkerJobAcceptedStatus("ByteBunker-Suspicion", true)>>
<<run setup.addHackingTarget("Sarah Chen", "186d:4721:9f3c:8e55", "ByteBunker-Suspicion-animation")>>
<<goto "ByteBunker-Suspicion">>
<</button>>
</div>
<</if>>
</div><br>
<p class="back-link">
<<return "Go Back">>
</p>Your task is to infiltrate Sarah Chen's work computer at Ryushi Motors and search for any evidence of an affair with her boss.<div class="desktop-hacking-tool-wrapper">\
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target</span></div>\
<div class="desktop-hacking-tool-animation">\
<div class="msg-container">\
<div class="msg">Connecting</div>\
</div>\
<div class="hacking-animation">\
<div id="console"></div>\
</div>\
</div>\
</div>\
<<if $byteBunkerSuspicionEndEmailSent>>
<<script>>
$(document).one(':passagerender', function() {
setTimeout(function() {
var consoleElement = document.getElementById("console");
const msg = document.querySelector(".msg");
var txt = [
"Initializing Ryushi Motors connection...",
"...",
"Authenticating access credentials...",
"...Authentication failed.",
"...",
"Checking alternate access routes...",
"...All routes blocked.",
"...",
"Target workstation unreachable...",
"...Security protocols updated.",
"Attempting emergency breach...",
"...",
"Access denied: Target system locked.",
"Scanning for security vulnerabilities...",
"...",
"Alert: System administrator notified.",
"Warning: Enhanced security measures detected",
"Mission window has expired...",
"...",
"Final connection attempt...",
"...",
"Connection terminated - Target access revoked."
];
function updateScreen() {
if (txt.length > 0) {
var p = document.createElement("p");
p.textContent = txt.shift();
consoleElement.appendChild(p);
consoleElement.scrollTop = consoleElement.scrollHeight;
} else {
clearInterval(intervalID);
msg.style.background = "red";
msg.innerHTML = "ACCESS DENIED";
msg.style.boxShadow = "0 0 30px red";
}
}
var intervalID = window.setInterval(updateScreen, 200);
}, 0);
});
<</script>>
<<else>>
<<script>>
$(document).one(':passagerender', function() {
setTimeout(function() {
var consoleElement = document.getElementById("console");
const msg = document.querySelector(".msg");
var txt = [
"Initiating Ryushi Motors network scan...",
"...",
"Detecting security protocols...",
"...Multiple layers identified.",
"Bypassing perimeter security...",
"...",
"Access granted to outer network.",
"...Locating target workstation.",
"Target identified: Sarah.Chen@RyushiMotors",
"...",
"Deploying stealth protocols...",
"...Masking digital footprint.",
"Establishing secure connection...",
"...",
"Creating encrypted tunnel...",
"...Connection secured.",
"Implementing counter-detection measures...",
"...",
"Network position secured.",
"...All systems operational.",
"Connection established."
];
function updateScreen() {
if (txt.length > 0) {
var p = document.createElement("p");
p.textContent = txt.shift();
consoleElement.appendChild(p);
consoleElement.scrollTop = consoleElement.scrollHeight;
} else {
clearInterval(intervalID);
msg.style.background = "lime";
msg.innerHTML = "SUCCESS";
msg.style.boxShadow = "0 0 30px lime";
}
}
var intervalID = window.setInterval(updateScreen, 200);
}, 0);
});
<</script>>
<</if>>
<<if $byteBunkerSuspicionEndEmailSent>>
<<timed 8s>><<goto "ByteBunker-Suspicion-404">><</timed>>
<<else>>
<<timed 8s>>
<<set $numberOfPasswordsNeeded to 5>>
<<set $bruteforceBaseTraceTime to 25>>
<<set $nextPassageAfterSuccessBruteforceGame to "ByteBunker-Suspicion-computer-access">>
<<set $nextPassageAfterFailBruteforceGame to "HackTarget">>
<<goto "ByteBunker-Suspicion-computer-login">><</timed>>
<</if>><div class="desktop-hacking-tool-wrapper">\
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Server Connection Error</span></div>\
<div class="server-404-error-message">
<p class="blink-text">404 - Access Revoked</p>
</div>\
</div>\
<p>The target is no longer accessible - your mission window has expired.
Do you want to <<link "delete it">><<run setup.removeHackingTarget("Sarah Chen")>><<goto "HackTarget">><</link>> or just [[go back -> HackTarget]]?</p><div class="desktop-hacking-tool-wrapper">\
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>\
<div class="desktop-hacking-tool-server-password-protected">\
<div class="server-password-lock-icon">🔒</div>\
<input type="text" id="server-password-input" class="server-password-input" placeholder="Enter Password">\
<button class="server-password-submit-button" onclick="checkLandlordPassword()">Submit</button>\
<div class="prank-server-action-selection-box">\
<p class="active-cameras"> Access to the computer is password-protected.</p>\
<button class="server-password-access-button" onclick="SugarCube.Engine.play('ByteBunker-Suspicion-computer-bruteforce')">Manually Bruteforce the Password</button>\
</div>\
</div>\
</div>\
<p class="back-link">[[Go Back -> HackTarget]]</p>
<<nobr>>
<<script>>
setup.showAboutPcWindow = function() {
$('#playerPcName').text("RYUSHI-WEST-45E");
$('#playerNickname').text("sarah.chen");
$('#aboutPcWindow').show();
$('#closeAboutPcWindow').off('click').click(function() {
$('#aboutPcWindow').hide();
});
}
<</script>>
<style>
.prank-server-action-selection-box {
background-color: #111;
color: lime;
font-family: 'Courier New', monospace;
padding: 15px;
margin-top: 80px;
margin-bottom: 0px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 255, 0, 0.3);
}
.prank-desktop-login {
background-color: #111;
background-size: 100%;
/* padding: 20px; */
height: 500px;
box-shadow: 0px 0px 15px 2px lime;
position: relative;
border: 4px solid lime;
border-radius: 10px;
}
</style>
<script>
function checkLandlordPassword() {
let password = document.getElementById('server-password-input').value;
if (password === "ndsIfyS" || password === "ndsifys") {
SugarCube.Engine.play('ByteBunker-Suspicion-computer-access');
} else {
SugarCube.UI.alert("Incorrect password.");
}
}
</script>
<</nobr>><<include "Minigame-Bruteforce">>\
<<if $minigameSkipButtons === true>>\
@@.minigame-skip-button;<<button "Skip Minigame">><<goto "ByteBunker-Suspicion-computer-access">><</button>>@@
<</if>>\<div class="desktop-hacking-tool-wrapper">
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>
<div class="ryushi-desktop">
<!-- Top bar -->
<div class="top-bar">
@@.about-pc-button;<<button "About This PC">>
<<run setup.showAboutPcWindow()>>
<</button>>@@
<span class="notification-counter"><i class="fas fa-wifi"></i> <i class="fas fa-volume-up"></i></span>
</div>
<div class="ryushi-desktop-content">
<div class="ryushi-desktop-icon" onclick="SugarCube.Engine.display('CheatingWife-RyushiEmail')">📧<span class="desktop-icon-label">Ryushi Mail</span></div>
<div class="ryushi-desktop-icon" onclick="SugarCube.Engine.display('CheatingWife-ProjectTimeline')">📅<span class="desktop-icon-label">Ethereal_Velocity_Timeline.xlsx</span></div>
<div class="ryushi-desktop-icon" onclick="SugarCube.Engine.display('CheatingWife-MeetingNotes')">📝<span class="desktop-icon-label">Team_Meeting_Notes.docx</span></div>
<div class="ryushi-desktop-icon" onclick="SugarCube.Engine.display('CheatingWife-SalesForecast')">📊<span class="desktop-icon-label">Sales_Forecast.pptx</span></div>
</div>
<div class="about-pc" id="aboutPcWindow" style="display: none;">
<div class="about-pc-header">
About This PC
<span id="closeAboutPcWindow" class="about-pc-close-button">⛌</span>
</div>
<div class="about-pc-body">
<p><b>Computer Name:</b> <span id="playerPcName"></span></p>
<p><b>Username:</b> <span id="playerNickname"></span></p>
</div>
</div>
</div>
</div>
<br>
<p class="back-link">[[Leave -> HackTarget]]</p>
<<nobr>>
<<script>>
setup.showAboutPcWindow = function() {
$('#playerPcName').text("RYUSHI-WEST-PM45");
$('#playerNickname').text("sarah.chen");
$('#aboutPcWindow').show();
$('#closeAboutPcWindow').off('click').click(function() {
$('#aboutPcWindow').hide();
});
}
<</script>>
<style>
.ryushi-desktop {
background-color: #111;
background-size: cover;
padding: 20px;
height: 500px;
box-shadow: 0px 0px 15px 2px lime;
position: relative;
border: 2px solid lime;
}
.ryushi-desktop-icon {
width: 120px;
transition: transform 0.2s;
margin: 20px;
text-align: center;
font-size: 48px;
color: white;
cursor: pointer;
position: relative;
}
.desktop-icon-label {
display: block;
color: lime;
font-size: 14px;
margin-top: 5px;
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
word-wrap: break-word;
white-space: normal;
text-align: center;
}
.ryushi-desktop-content {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 10px;
padding: 20px;
overflow: auto;
scrollbar-width: none;
}
.ryushi-desktop-content::-webkit-scrollbar {
display: none;
}
</style>
<</nobr>><div class="desktop-hacking-tool-wrapper">
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>
<div class="ryushi-desktop">
<!-- Top bar -->
<div class="top-bar">
@@.about-pc-button;<<button "About This PC">>
<<run setup.showAboutPcWindow()>>
<</button>>@@
<span class="notification-counter"><i class="fas fa-wifi"></i> <i class="fas fa-volume-up"></i></span>
</div>
<div class="ryushi-desktop-content">
<div class="sales-forecast-container">
<br>
<h3>Sales Forecast</h3>
<div class="sales-forecast-graph">
<div class="bar" style="height: 50%;" title="Q1: $50k"></div>
<div class="bar" style="height: 70%;" title="Q2: $70k"></div>
<div class="bar" style="height: 60%;" title="Q3: $60k"></div>
<div class="bar" style="height: 80%;" title="Q4: $80k"></div>
</div>
<div class="sales-forecast-labels">
<span>Q1</span>
<span>Q2</span>
<span>Q3</span>
<span>Q4</span>
</div>
<br>
<ul>
<li>Q1 shows steady growth from the previous year.</li>
<li>Q2 is projected to see the highest increase due to product launches.</li>
<li>Q3 sees a slight decline due to seasonal demand fluctuations.</li>
<li>Q4 anticipates strong year-end sales, driven by holiday promotions.</li>
</ul>
</div>
</div>
<div class="about-pc" id="aboutPcWindow" style="display: none;">
<div class="about-pc-header">
About This PC
<span id="closeAboutPcWindow" class="about-pc-close-button">⛌</span>
</div>
<div class="about-pc-body">
<p><b>Computer Name:</b> <span id="playerPcName"></span></p>
<p><b>Username:</b> <span id="playerNickname"></span></p>
</div>
</div>
</div>
</div>
<br>
<p class="back-link">[[Go Back -> ByteBunker-Suspicion-computer-access]]</p>
<<script>>
setup.showAboutPcWindow = function() {
$('#playerPcName').text("RYUSHI-WEST-PM45");
$('#playerNickname').text("sarah.chen");
$('#aboutPcWindow').show();
$('#closeAboutPcWindow').off('click').click(function() {
$('#aboutPcWindow').hide();
});
}
<</script>>
<style>
.sales-forecast-description {
margin-top: 20px;
color: lime;
font-size: 14px;
line-height: 1.5;
text-align: left; /* Align text for readability */
background: rgba(0, 255, 0, 0.1); /* Subtle background to distinguish text */
padding: 10px;
border: 1px solid lime;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 255, 0, 0.2);
}
.ryushi-desktop {
background-color: #111;
background-size: cover;
padding: 20px;
height: 500px;
overflow: auto;
box-shadow: 0px 0px 15px 2px lime;
position: relative;
border: 2px solid lime;
}
.ryushi-desktop-icon {
width: 120px;
transition: transform 0.2s;
margin: 20px;
text-align: center;
font-size: 48px;
color: white;
cursor: pointer;
position: relative;
}
.desktop-icon-label {
display: block;
color: lime;
font-size: 14px;
margin-top: 5px;
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
word-wrap: break-word;
white-space: normal;
text-align: center;
}
.ryushi-desktop-content {
display: block; /* Change from grid to block to allow dynamic resizing */
padding: 20px;
overflow-x: auto; /* Allow horizontal scrolling if content exceeds the width */
overflow-y: hidden;
white-space: nowrap; /* Prevent line breaks in children */
scrollbar-width: thin; /* Optional: show a thin scrollbar for horizontal scrolling */
}
.ryushi-desktop-content::-webkit-scrollbar {
display: none;
}
.sales-forecast-container {
display: inline-block; /* Ensure the graph acts as a single block within the scrolling area */
width: 100%; /* Allow it to take up as much space as needed */
max-width: 100%; /* Prevent it from breaking the container */
}
.sales-forecast-graph {
display: flex;
justify-content: space-around;
align-items: flex-end;
height: 200px;
margin: 20px auto;
width: 80%;
background: rgba(0, 255, 0, 0.1);
border: 1px solid lime;
padding: 10px;
box-shadow: 0 0 15px rgba(0, 255, 0, 0.3);
}
.bar {
width: 20%;
background: lime;
box-shadow: 0 0 10px rgba(0, 255, 0, 0.5);
transition: all 0.3s ease;
cursor: pointer;
display: inline-block;
}
.bar:hover {
background: white;
color: black;
box-shadow: 0 0 15px white;
}
.sales-forecast-labels {
display: flex;
justify-content: space-around;
margin-top: 10px;
}
.sales-forecast-labels span {
flex: 1;
text-align: center;
color: lime;
font-size: 14px;
}
</style><div class="desktop-hacking-tool-wrapper">
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>
<div class="ryushi-desktop">
<!-- Top bar -->
<div class="top-bar">
@@.about-pc-button;<<button "About This PC">>
<<run setup.showAboutPcWindow()>>
<</button>>@@
<span class="notification-counter"><i class="fas fa-wifi"></i> <i class="fas fa-volume-up"></i></span>
</div>
<div class="ryushi-desktop-content">
<div class="meeting-notes">
<h2>Meeting Notes</h2>
<h4>Project: Concept Car Design</h4>
<p><b>Attendees:</b> Mr. Roderick Hayes (Project Manager), Sarah Chen (Accountant), Alex Grey (Designer), Emily Clarke (Designer)</p>
<h3>Agenda:</h3>
<ol>
<li>Presentation of concept car design by Alex and Emily.</li>
<li>Feedback and budgeting insights from Sarah Chen.</li>
<li>Approval and next steps from Mr. Hayes.</li>
</ol>
<h3>Discussion:</h3>
<p><b>Alex:</b> "Thank you for joining us. The concept car, 'Ethereal Velocity,' represents a significant leap forward in design and sustainability. We've been working hard to refine its aerodynamic profile, and the drag coefficient has been reduced by 15% compared to our last model."</p>
<p><b>Emily:</b> "Additionally, the bodywork will use graphene composites, which reduce weight while maintaining structural integrity. We've also incorporated a modular design that allows for customization without sacrificing efficiency."</p>
<p><b>Mr. Hayes:</b> "Interesting. The use of graphene composites sounds promising, but they tend to be expensive. Have you factored in scalability for production?"</p>
<p><b>Emily:</b> "We have, though it depends on our budget. By prioritizing bulk procurement contracts and simplifying non-critical components, we believe the costs can be kept manageable."</p>
<p><b>Alex:</b> "The LED customization feature is another point of interest. It could be a major selling point for customers who want a personalized touch, but it’s modular to keep production costs flexible."</p>
<p><b>Mr. Hayes:</b> "Good thinking. Sarah, where do we stand financially? Do we have room for these innovations?"</p>
<p><b>Sarah:</b> "The current budget covers most of what Alex and Emily have proposed, but graphene composites might push us to the edge. If we streamline the customization options in the early phases, we could ensure a smoother prototype-to-production transition."</p>
<p><b>Mr. Hayes:</b> "I see. Sarah, you're always on point with balancing ambition and reality. It's why you're indispensable in these discussions."</p>
<p><b>Sarah:</b> "Thank you, Mr. Hayes. I think the modular approach is a smart compromise, and it leaves room for premium upgrades later."</p>
<p><b>Alex:</b> "One question I have is regarding the interior design. Are we leaning toward a minimalist look, or do we want to highlight luxury features upfront?"</p>
<p><b>Mr. Hayes:</b> "Good question. We need to strike a balance. A minimalist interior might attract eco-conscious buyers, but a touch of luxury could broaden the appeal. Emily, any thoughts?"</p>
<p><b>Emily:</b> "I agree. We could go with a dual-tiered approach: a standard minimalist interior and an optional luxury package. This aligns with our modular philosophy."</p>
<p><b>Mr. Hayes:</b> "That sounds workable. Let’s proceed with that idea. Sarah, I’ll need you to prepare a detailed financial projection for both options. Can we discuss this in my office later this week?"</p>
<p><b>Sarah:</b> "Certainly, Mr. Hayes. I’ll have the numbers ready."</p>
<p><b>Mr. Hayes:</b> "All right, great work, everyone. Emily, Alex, refine the design based on today’s feedback. Sarah, let’s touch base later. We’ll finalize the budget and get this project moving."</p>
<h3>Action Items:</h3>
<ul>
<li>Alex and Emily to refine the prototype design, incorporating modular LED customization and dual-tiered interior options.</li>
<li>Sarah to prepare a financial projection for both standard and luxury production models.</li>
<li>Mr. Hayes to approve the final budget and coordinate the prototype development timeline.</li>
</ul>
</div>
</div>
<div class="about-pc" id="aboutPcWindow" style="display: none;">
<div class="about-pc-header">
About This PC
<span id="closeAboutPcWindow" class="about-pc-close-button">⛌</span>
</div>
<div class="about-pc-body">
<p><b>Computer Name:</b> <span id="playerPcName"></span></p>
<p><b>Username:</b> <span id="playerNickname"></span></p>
</div>
</div>
</div>
</div>
<br>
<p class="back-link">[[Go Back -> ByteBunker-Suspicion-computer-access]]</p>
<<script>>
setup.showAboutPcWindow = function() {
$('#playerPcName').text("RYUSHI-WEST-PM45");
$('#playerNickname').text("sarah.chen");
$('#aboutPcWindow').show();
$('#closeAboutPcWindow').off('click').click(function() {
$('#aboutPcWindow').hide();
});
}
<</script>>
<style>
.ryushi-desktop {
background-color: #111;
background-size: cover;
padding: 20px;
height: 500px;
overflow: auto;
box-shadow: 0px 0px 15px 2px lime;
position: relative;
border: 2px solid lime;
}
.ryushi-desktop-icon {
width: 120px;
transition: transform 0.2s;
margin: 20px;
text-align: center;
font-size: 48px;
color: white;
cursor: pointer;
position: relative;
}
.desktop-icon-label {
display: block;
color: lime;
font-size: 14px;
margin-top: 5px;
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
word-wrap: break-word;
white-space: normal;
text-align: center;
}
.ryushi-desktop-content {
padding: 20px;
overflow-x: auto; /* Allow horizontal scrolling if content exceeds the width */
scrollbar-width: thin; /* Optional: show a thin scrollbar for horizontal scrolling */
}
.ryushi-desktop-content::-webkit-scrollbar {
display: none;
}
.meeting-notes {
background-color: #222; /* Darker background for contrast */
color: #e0e0e0; /* Light text color for readability */
font-family: 'Arial', sans-serif;
padding: 20px;
margin: 20px auto;
text-align: left;
}
.meeting-notes h2, .meeting-notes h3, .meeting-notes h4 {
color: lime; /* Accent color for headings */
}
.meeting-notes p, .meeting-notes li {
margin-bottom: 10px;
line-height: 1.6;
}
.meeting-notes ul, .meeting-notes ol {
margin-left: 20px;
padding-left: 20px;
}
.meeting-notes i {
color: #b3b3b3; /* Subtle gray for italics */
font-size: 0.9em;
}
</style><div class="desktop-hacking-tool-wrapper">
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>
<div class="ryushi-desktop">
<!-- Top bar -->
<div class="top-bar">
@@.about-pc-button;<<button "About This PC">>
<<run setup.showAboutPcWindow()>>
<</button>>@@
<span class="notification-counter"><i class="fas fa-wifi"></i> <i class="fas fa-volume-up"></i></span>
</div>
<div class="ryushi-desktop-content">
<div class="project-timeline">
<h2>Ethereal Velocity Project Timeline</h2>
<p>This timeline outlines the estimated duration for each stage required to transform the Ethereal Velocity design concept into a production-ready car. Each stage includes key milestones and deliverables.</p>
<ul class="timeline">
<li>
<h3>Stage 1: Concept Development (4 weeks)</h3>
<p>Finalize initial sketches, approve the general design direction, and ensure alignment with sustainability goals and branding.</p>
</li>
<li>
<h3>Stage 2: Engineering Feasibility Study (6 weeks)</h3>
<p>Evaluate structural integrity, aerodynamics, and material selection. Assess feasibility of key features like modular LED systems and graphene composites.</p>
</li>
<li>
<h3>Stage 3: Detailed Design & Prototyping (12 weeks)</h3>
<p>Create CAD models, build a physical prototype, and conduct initial tests for performance, safety, and durability.</p>
</li>
<li>
<h3>Stage 4: Testing & Iteration (16 weeks)</h3>
<p>Conduct rigorous testing, including crash tests, range tests, and environmental simulations. Refine design based on test results.</p>
</li>
<li>
<h3>Stage 5: Pre-Production Setup (8 weeks)</h3>
<p>Establish supply chains, finalize production line configurations, and prepare manufacturing facilities.</p>
</li>
<li>
<h3>Stage 6: Production Launch (4 weeks)</h3>
<p>Begin production of the first batch. Conduct quality assurance checks and prepare for market release.</p>
</li>
</ul>
</div>
</div>
<div class="about-pc" id="aboutPcWindow" style="display: none;">
<div class="about-pc-header">
About This PC
<span id="closeAboutPcWindow" class="about-pc-close-button">⛌</span>
</div>
<div class="about-pc-body">
<p><b>Computer Name:</b> <span id="playerPcName"></span></p>
<p><b>Username:</b> <span id="playerNickname"></span></p>
</div>
</div>
</div>
</div>
<br>
<p class="back-link">[[Go Back -> ByteBunker-Suspicion-computer-access]]</p>
<<script>>
setup.showAboutPcWindow = function() {
$('#playerPcName').text("RYUSHI-WEST-PM45");
$('#playerNickname').text("sarah.chen");
$('#aboutPcWindow').show();
$('#closeAboutPcWindow').off('click').click(function() {
$('#aboutPcWindow').hide();
});
}
<</script>>
<style>
.ryushi-desktop {
background-color: #111;
background-size: cover;
padding: 20px;
height: 500px;
overflow: auto;
box-shadow: 0px 0px 15px 2px lime;
position: relative;
border: 2px solid lime;
}
.ryushi-desktop-icon {
width: 120px;
transition: transform 0.2s;
margin: 20px;
text-align: center;
font-size: 48px;
color: white;
cursor: pointer;
position: relative;
}
.desktop-icon-label {
display: block;
color: lime;
font-size: 14px;
margin-top: 5px;
text-shadow: 0 0 5px rgba(0, 255, 0, 0.5);
word-wrap: break-word;
white-space: normal;
text-align: center;
}
.ryushi-desktop-content {
padding: 20px;
scrollbar-width: thin; /* Optional: show a thin scrollbar for horizontal scrolling */
}
.ryushi-desktop-content::-webkit-scrollbar {
display: none;
}
.project-timeline {
background-color: #222; /* Subtle dark background for better contrast */
color: #e0e0e0; /* Light text for readability */
padding: 20px;
margin: 20px auto;
border: 1px solid #555;
text-align: left;
}
.project-timeline h2 {
color: lime; /* Accent color for the header */
margin-bottom: 10px;
}
.project-timeline p {
margin-bottom: 20px;
line-height: 1.6;
}
.timeline {
list-style-type: none;
padding: 0;
margin: 0;
}
.timeline li {
margin-bottom: 20px;
padding: 10px;
border-left: 3px solid lime;
background: rgba(0, 255, 0, 0.1);
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 255, 0, 0.2);
}
.timeline h3 {
margin: 0 0 5px 0;
color: lime;
font-size: 16px;
}
.timeline p {
margin: 0;
font-size: 14px;
line-height: 1.4;
}
</style><div class="desktop-hacking-tool-wrapper">
<div class="desktop-hacking-tool-header"><span class="desktop-hacking-tool-header-text">Hack-a-Target - Sarah Chen</span></div>
<div class="ryushi-desktop">
<!-- Top bar -->
<div class="top-bar">
@@.about-pc-button;<<button "About This PC">>
<<run setup.showAboutPcWindow()>>
<</button>>@@
<span class="notification-counter"><i class="fas fa-wifi"></i> <i class="fas fa-volume-up"></i></span>
</div>
<div class="ryushi-desktop-content">
<br>
<div id="email-list">
<h2>Inbox</h2>
<table class="email-inbox">
<thead>
<tr>
<th>From</th>
<th>Subject</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<tr>
<td>Roderick Hayes</td>
<td>
<<link "Follow-Up on Financial Projections">>
<<replace "#email-list">><<include "CheatingWife-Email-FinancialProjections">><</replace>>
<<if $cheatingWifeEmail1Read && $cheatingWifeEmail2Read>>
<<replace "#evidence">><<include "CheatingWife-Email-Evidence">><</replace>>
<</if>>
<</link>>
</td>
<td><<set _daysAgo = $totalDays - ($totalDays - 0)>> <<print _daysAgo>> days ago</td>
</tr>
<tr>
<td>Emily Clarke</td>
<td>
<<link "Design Review Feedback">>
<<replace "#email-list">><<include "CheatingWife-Email-DesignFeedback">><</replace>>
<</link>>
</td>
<td><<set _daysAgo = $totalDays - ($totalDays - 3)>> <<print _daysAgo>> days ago</td>
</tr>
<tr>
<td>Accounting Team</td>
<td>
<<link "Monthly Report Submission Reminder">>
<<replace "#email-list">><<include "CheatingWife-Email-ReportReminder">><</replace>