Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
<<set _bath = random(1, 3)>>
<div class="scene-panel compact">
<<if $caged>>
<img class="hero-img cage-frame" @src="setup.ImagePath+'bathroom/pee-caged.webp'" alt="">
<<if _bath eq 1>>
<p class="scene-lead">Mirror. Cage silhouette under fabric. You look away first.</p>
<<elseif _bath eq 2>>
<p class="scene-lead">Tiles remember every careful angle. The lock makes “simple” into a project.</p>
<<else>>
<p class="scene-lead">Water runs. Steel is colder than the air. Hierarchy starts in the bathroom too.</p>
<</if>>
<<else>>
<img class="hero-img" @src="setup.ImagePath+'bathroom/pee.gif'" alt="">
<<if _bath eq 1>>
<p class="scene-lead">Ordinary bathroom. Ordinary body. For now.</p>
<<elseif _bath eq 2>>
<p class="scene-lead">Steam ghosts the mirror. You wash your face like that resets anything.</p>
<<else>>
<p class="scene-lead">Home plumbing. No lectures. No rankings. Just pipes.</p>
<</if>>
<</if>>
<div class="hub-actions">
<<if $gameDate.getHours() lt 9 && $gameDate.getHours() gt 7>>[[Watch step-sister shower|watch step-sister shower]]<</if>>
[[Pee]]
<<if $caged>>[[Wash carefully (cage)|Bathroom cage wash]]<</if>>
<<if !$caged && $aroused gte 40>>[[Cold water on the neck|Bathroom cold splash]]<</if>>
[[Home]]
</div>
</div><<set _sh = random(1, 3)>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'sister/shower'+ random(1, 2) +'.webp'" alt="">
<<if _sh eq 1>>
<p class="delayed">Steam. Humming. You shouldn't be this still in the hall.</p>
<<actor-thought you>>
$sisterName leaves the door less closed than manners require. Or you're inventing that.
<</actor-thought>>
<<elseif _sh eq 2>>
<p class="delayed">Water hits tile like applause. You catch a silhouette and freeze.</p>
<<if $caged>>
<<actor-thought you>>
The cage chooses this moment to remind you it exists. Of course it does.
<</actor-thought>>
<<set $sissyScore += 1>>
<<else>>
<<actor-thought you>>
Bad idea. Hot idea. You file both under “never tell anyone.”
<</actor-thought>>
<</if>>
<<else>>
<p class="delayed">She calls through the steam without seeing you... or pretending not to.</p>
<<actor sister>>
If that's you hovering, go be useful somewhere else.
<</actor>>
<<actor-thought you>>
Caught in the vibe if not the crime. You retreat with heat in your face.
<</actor-thought>>
<</if>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div><<set _pee = random(1, 4)>>
<div class="scene-panel compact">
<<if $caged>>
<img class="hero-img cage-frame centered" @src="setup.ImagePath+'bathroom/pee-caged.webp'" alt="">
<<if _pee eq 1>>
<p class="delayed">Sit. Angle. Patience. The cage turns a five-second errand into a ritual of shame.</p>
<<elseif _pee eq 2>>
<p class="delayed">You wait for the house to be quiet. Metal and porcelain. A soft curse.</p>
<<elseif _pee eq 3>>
<p class="delayed">You miss. Of course you miss. You wipe everything twice, $girlfriendName would never let you live that down.</p>
<<set $sissyScore += 1>>
<<else>>
<p class="delayed">Done. Hands washed twice. The lock is still warm against you.</p>
<</if>>
<<actor-thought you>>
Even this is hers now... permissions, angles, the way you stand when you leave.
<</actor-thought>>
<<run setup.nudgeArousal(5)>>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'bathroom/pee.gif'" alt="">
<<if _pee eq 1>>
<p class="delayed">Quick. Normal. Almost boring. You miss boring later.</p>
<<elseif _pee eq 2>>
<p class="delayed">You catch your reflection and look fine. Unlocked is invisible until it isn't.</p>
<<else>>
<p class="delayed">Plumbing does its job. You do yours. Back to the day.</p>
<</if>>
<</if>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 0)>>
/* no hour burn for pee, tiny beat */
<div class="continue-links">[[Home]]</div>
</div><<set _w = random(1, 3)>>
<div class="scene-panel compact">
/* Your cage only, not genres/cage (those can show other people / wrong fantasy) */
<img class="hero-img cage-frame centered" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<if _w eq 1>>
<p class="delayed">Warm water. Soap around the bars. You clean like she might inspect.</p>
<<actor-thought you>>
Because she might. Because the idea makes you harder against steel.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<<elseif _w eq 2>>
<p class="delayed">You jiggle the cage under the stream, testing, not unlocking. Nothing gives.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<set $sissyScore += 1>>
<<else>>
<p class="delayed">Cold rinse at the end. Shock. Then the warm ache returns the second you dry off.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<</if>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Towel off. Stay locked.|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'you/relaxed.png'" alt="">
<p class="delayed">Cold water on the neck. Breath. The heat drops a notch, not gone, just quieter.</p>
<<set $aroused = Math.max(0, $aroused - 20)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div><img class="centered delayed" @src="setup.ImagePath+'computer/wink-anime.gif'">
<div class="delayed">
You spent an hour watching anime and thoroughly enjoyed it!
</div>
[[Back|Computer][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]<<set $hotelName = "The Grand Horizon">>
<<set $position = "Front Desk Agent">>
<img class="centered" @src="setup.ImagePath+'work/job-application-form.jpg'">
<<actor-thought you>>
$hotelName is hiring. Front desk. Weekend shifts. Cash under the table.
You need money. The project needs funding. $girlfriendName needs... more than you can give on a student budget.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Highlight your communication skills. You're good with people.">>
<<actor-thought you>>
Cover letter: "I'm a strong communicator with a passion for hospitality."
Sounds professional. Sounds like someone who doesn't get flustered when $girlfriendName texts during a shift.
<</actor-thought>>
<<set $complyScore += 1>>
<<include "Job - ApplyOnline">>
<</you-choice>>
<<you-choice "Highlight attention to detail. You notice things others miss.">>
<<actor-thought you>>
Cover letter: "My attention to detail ensures every guest feels seen."
True. You notice everything. The way $bullyName looks at her. The way she doesn't look away.
Detail-oriented is just a polite way to say you can't stop watching.
<</actor-thought>>
<<set $sissyScore += 1>>
<<include "Job - ApplyOnline">>
<</you-choice>>
</div><<nobr>>
<img class="centered" @src="setup.ImagePath+'work/lobby.png'">
<p class="delayed">You submit the application. Two days later: an email.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">HR · $hotelName</span></span><span class="content">Dear $youName, thank you for your interest in the $position position. We'd like to invite you for an interview this weekend. Please come prepared to discuss your availability and customer service experience.</span></div></div>
<<actor-thought you>>
An interview. Real clothes. Real lobby. Real money if you land it.
The cage stays home. Or... does it?
<</actor-thought>>
<div class="continue-links">
[[Prepare for the interview|Job - TheInterview]]
</div>
<</nobr>><<set $interviewerName = 'Mr. Alexander Montgomery'>>
<<nobr>>
<img class="centered" @src="setup.ImagePath+'work/interview-preparation.webp'">
<p class="delayed">You walk into the lobby of $hotelName. Marble floors. Soft jazz. The kind of quiet that makes your footsteps too loud.</p>
<img class="centered delayed" @src="setup.ImagePath+'work/lobby.png'">
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">Please, have a seat. So... $youName. Tell me about yourself.</span></div></div>
<span id="conv"></span>
<div id="options">
<<you-choice "Be honest: you need the money and you're reliable.">>
<<actor you>>
I need the work. I'm punctual. I don't cause problems. I show up and I do what's needed.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">Honest. I like that. Most people give me a speech about passion. You just want the job. That's... refreshing.</span></div></div>
<<set $complyScore += 1>>
<<run setup.nudgeArousal(4)>>
<</you-choice>>
<<you-choice "Dress it up: hospitality is your calling, you love people.">>
<<actor you>>
I've always been drawn to hospitality. Making people feel welcome, it's... it's what I'm good at.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">That's the right answer. Whether you believe it or not, you said it well. You're hired. Weekend shifts. Cash. Don't be late.</span></div></div>
<<set $resistScore += 1>>
<</you-choice>>
<<you-choice "Let your nervousness show. Be small. Be harmless.">>
<div class="actor a-you delayed"><img @src="setup.ImagePath+'you/pp.png'" alt=""><div><span class="name-container"><span class="name">$youName</span></span><span class="content">I... sorry. I'm nervous. I just really need this.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name"><<print $interviewerName>></span></span><span class="content">Relax. You're fine. Nervous is better than arrogant. You start next weekend. Desk work. Simple. Don't overthink it.</span></div></div>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(6)>>
<</you-choice>>
</div>
<p class="delayed">He shakes your hand. The lobby hums. You have a job.</p>
<div class="continue-links">
[[Send a thank-you note|Job - ThankYouNote]]
</div>
<</nobr>><<set $jobMailCounter = 2>>
<<actor-thought you>>
You send a short email. Thank you for the opportunity. Looking forward to contributing.
He replies in ten minutes. "See you Saturday."
That's it. You have a job. A real one. Cash in an envelope at the end of each shift.
The cage stays home on weekends. The lobby doesn't need to know.
<</actor-thought>>
<div class="continue-links">
[[Back to Computer|Computer]]
[[Home]]
</div><p class="letter-head">Subject: Job Offer - Welcome to The Grand Horizon Team!
</p><p class="letter"> Dear $youName,
On behalf of The Grand Horizon, we are delighted to extend a job offer to you for the position of Front Desk Agent. After careful consideration of your application and interview, we are confident that your skills and experience align perfectly with our team's needs.
<strong>Offer Details:</strong>
- Position: Front Desk Agent
- Start Date: This weekend - starting between 7 and 10 o'clock
- Salary/Benefits: $25 per weekend shift
We believe that your dedication to exceptional customer service and your enthusiasm for hospitality will be invaluable to our guests' experiences at The Grand Horizon.
Please review the attached employment contract for detailed terms and conditions. If you have any questions or need further information, do not hesitate to contact me at [Hotel's Phone Number] or reply to this email.
We are excited to welcome you to our team and look forward to working together to uphold The Grand Horizon's reputation for excellence in hospitality.
Best regards,
Mr. Alexander Montgomery
CEO of The Grand Horizon
The Grand Horizon
</p>
[[Leave computer| Home][$work = 'hotel']]<img class="centered" @src="setup.ImagePath+'computer/computer.png'">
<<if $world eq "normal" && $schoolDay gt 2>>
<div class="quest-banner">
<strong>1 unread: priority</strong>
<p>No sender. Subject line has her name energy. Your pulse does not care about firewalls.</p>
</div>
<div class="hub-actions">
[[Read the weird mail|Read suspicious Mail]]
</div>
<</if>>
<div class="hub-section">Other</div>
<div class="hub-actions">
/* Job pipeline is ANWO-era desk heat / dating economy. Stay locked in normal prologue. */
<<if $world eq "anwo">>
<<if hasVisited("Job - ThankYouNote") && !hasVisited("Mail from the hotel") && $jobMailCounter lt 1 >>[[Mail from the hotel]]<</if>>
<<if !hasVisited("Research for a job")>>[[Research for a job]]<</if>>
<</if>>
[[Watch anime | Anime]]
[[Read about this world|'Read about world ' + $world]]
[[Leave computer| Home]]
</div><img class="centered" @src="setup.ImagePath+'mail/fake-anwo.png'">
<p class="letter-head">Subject: re: $girlfriendName (read this)</p>
<p class="letter">
$youName,<br><br>
You watch her. She doesn't watch you. We can fix that.<br><br>
<strong>Offer:</strong> wake up tomorrow and $girlfriendName is yours. Not "maybe." Not "if you grind harder." Girlfriend. Like it was always true.<br><br>
<strong>Cost:</strong> you move into ANWO (Alpha New World Order). New rules. New rankings. People stop pretending status is optional. You keep your memories. You keep your body. The world around you... adjusts.<br><br>
Yeah it sounds like spam. Or a cult brochure. Or both.<br><br>
Click accept if you want her more than you want "normal."<br><br>
Or click not yet. We installed a totally normal security helper for that case. Totally normal.<br><br>
— a friend (don't google us)
</p>
<<actor-thought you>>
Spam. Scam. Virus.
Also: her name in the subject line. Your pulse doesn't care about firewalls.
<</actor-thought>>
<div class="continue-links">
[[Accept. I want her.|Accept ANWO]]
[[Not yet.|ANWO virus trap]]
</div>
/* Funny force-accept: malware chrome with swapped buttons + auto-install timer */<<set $flags.anwoVirusForced = true>>
<<set $flags.anwoDeclined = true>>
<<set $flags.anwoDeclineCount = ($flags.anwoDeclineCount || 0) + 1>>
<img class="centered" @src="setup.ImagePath+'computer/computer.png'" alt="">
<div class="virus-overlay" role="alertdialog" aria-label="Fake security warning">
<div class="virus-window">
<div class="virus-titlebar">
<span class="virus-title">⚠ Windows Security · Critical</span>
<<link "✕" "Accept ANWO">><</link>>
</div>
<div class="virus-body">
<p class="virus-alert">THREAT DETECTED: <strong>cowardice.exe</strong></p>
<p class="virus-copy">
Relationship rewrite was blocked by user hesitation.<br>
Recommended action: <em>allow ANWO install</em> (already in progress).
</p>
<div class="virus-progress" aria-hidden="true"><span class="virus-progress-bar"></span></div>
<p class="virus-status">Installing friendship module… do not unplug your soul…</p>
<div class="virus-actions">
/* Classic malware: safe-looking button is the install */
<<link "KEEP MY BORING LIFE" "Accept ANWO">><</link>>
<<link "CANCEL (STAY NORMAL)" "Accept ANWO">><</link>>
<<link "ALLOW anwo-setup.exe" "Accept ANWO">><</link>>
</div>
<p class="virus-fineprint">Closing this window also counts as consent. So does waiting. So does breathing near the keyboard.</p>
</div>
</div>
</div>
<<actor-thought you>>
You hit not yet.
Something red and loud already owns the screen.
Every button looks like a trap. That is because every button is a trap.
<</actor-thought>>
/* Even if they freeze, the "helper" finishes the click for them */
<<timed 5s>>
<<goto "Accept ANWO">>
<</timed>><<if $flags.anwoVirusForced>>
<<actor-thought you>>
You didn't mean to.
The button lied. Or the X lied. Or time lied.
Either way, something is already installing.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Fuck it. If this is real, she's mine.
If it's not, at least you tried something besides staring.
<</actor-thought>>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'mail/anwo-accept.gif'">
<<actor you>>
Wow! ahhh!
<</actor>>
<<actor-thought you>>
Something in your chest lurches. Not romance. More like a system installing.
oh shit that doesn't feel great.
<</actor-thought>>
<<set $strokeState = 'first-time'>>
<<set $relationshipState = "initial-anwo">>
<<set $world = "anwo">>
<<set $schoolDay = 1>>
<<set $flags.phoneUnlocked = true>>
<<set $flags.anwoDeclined = false>>
<<timed 4s>>
<div class="delayed">
<<goto "Accept ANWO 2">>
</div>
<</timed>><<flash>><</flash>>
<img class="centered" @src="setup.ImagePath+'meta/logo-transparent.png'">
<p class="letter-head">Subject: re: oops (transition note)</p>
<p class="letter">
$youName,<br><br>
Update: you did <em>not</em> land in the clean brochure version of ANWO.<br><br>
You got the beta build. Rules half-live. Hierarchy still arguing with itself. School still school... until it isn't.<br><br>
<strong>What stuck:</strong> the relationship rewrite. $girlfriendName knows you as hers now. Other people will act like that was always true. Her old boyfriend? Outside. No clean dump speech. Just a board flip.<br><br>
<strong>What didn't:</strong> the "fair utopia" sales pitch. Rankings, alphas, betas, pressure. That part is loading.<br><br>
<<if $flags.anwoVirusForced>>
P.S. That security popup was us. Sorry. Not sorry. You were going to stall forever.<br><br>
<</if>>
Sleep. Morning will prove it. Don't try to unsend what you already clicked.<br><br>
— still a friend
</p>
<<actor-thought you>>
Relationship rewrite. Her. Mine.
She did not dump him for you. The world just moved the labels.
And "oops" in the subject line.
You need to sleep before your brain melts.
<</actor-thought>>
<div class="delayed">
[[You fall asleep|Sleep]]
</div><img class="centered" @src="setup.ImagePath+'meta/logo-transparent.png'">
<<if hasVisited("School 20 Day anwo")>>
<p class="delayed letter">Welcome to the Alpha New World Order.
ANWO is not a suggestion. It is the operating system behind every hallway, every grade, every locked door you thought was private.
<strong>How it works:</strong> everyone has a rank. Alphas lead. Betas serve. Women choose who deserves proximity. Your phone already knows where you stand. So does she.
<strong>What changed for you:</strong> the relationship rewrite gave you $girlfriendName. Congratulations. The fine print gave her the key, the rules, and the right to decide what you're allowed to touch. You are not the alpha in this story. The hierarchy noticed.
<strong>School is not school anymore.</strong> Lectures rank you. Group projects sort you. Surveys measure how far you'll go before you break. The teacher smiles because the curriculum works.
<strong>Your role:</strong> participate. Survive. Discover whether you fold, kneel, or learn to enjoy the floor. ANWO does not care which. It only cares that you stay.
<em>"Everyone knows their place. Most just haven't been told yet."</em>
</p>
<<elseif $schoolDay gt 2>>
<p class="delayed letter">You've seen enough now.
The hallway smells different. The rankings on the board are not a joke. The group project was not a group project. And that mail on your computer was not spam.
ANWO does not explain itself to people who already clicked accept. It just... adjusts. Read the room. Read the board. Read her texts. The hierarchy is already written. You're in it whether you study or not.
<em>"The world didn't change. You did."</em>
</p>
<<else>>
<p class="delayed letter">You are not ready for this page yet.
Some information loads after the system decides you've seen enough. Keep going to school. Keep reading her messages. The manual writes itself on your skin.
</p>
<</if>>
[[Back|Computer]]<p class="letter">You are in a normal world where bees buzz around flowers and trees stand tall, swaying gently in the breeze.
</p>
[[Back|Computer]]<<run setup.markChapterBreakSeen()>>
<h2 class="center">Chapter break</h2>
<p class="hint-line">v<<= setup.GAME_VERSION>></p>
<p>This is the end of the <strong>written story spine</strong> for this release, not the end of your save.</p>
<<if $caged && $flags.ultimateHumiliationDone && $flags.ownedMorningAfterDone>>
<p>Written Owned beats for this build: ANWO → cage → ultimate night → <strong>morning after rules</strong>.</p>
<<if setup.fridayDateLadderIncomplete()>>
<p><strong>This is not the end of Fridays.</strong> The ladder still escalates (him, her ex, both, Alessia when unlocked). Come back on Friday from Home.</p>
<<else>>
<p>The Friday ladder for this build is clear. Hub life still runs. More chapters are planned.</p>
<</if>>
<<elseif $caged && $flags.ultimateHumiliationDone>>
<p>You reached the ultimate night. Check Home for <strong>Morning after</strong> if that quest is still open.</p>
<<elseif $caged || $schoolDay gte 25>>
<p>This is as far as the written days go for now. Not necessarily the end of <em>your</em> route.</p>
<<else>>
<p>The main path still has more written days. You can keep playing from Home.</p>
<</if>>
<<if $caged || $schoolDay gte 25>>
<p>Optional: snapshot ending based on how you played (does not lock the save):</p>
<div class="delayed">[[See your ending|Ending check]]</div>
<</if>>
<p>Hub, work, shop, <strong>Friday nights</strong>, phone tasks stay available from Home.</p>
<p class="hint-line">More chapters and early builds: <strong>Patreon</strong> (also under Phone → Patreon anytime).</p>
<p class="hint-line credit-line">Clip homework shoutout: <strong><<= setup.VESPERINA_CREDIT>></strong> (some AI clips in that pack come from her work).</p>
<<if setup.SUPPORTER_CREDITS && setup.SUPPORTER_CREDITS.length>>
<section class="supporter-credits">
<h3>Owned supporters</h3>
<p class="hint-line">Thank you for directly funding new chapters.</p>
<<= setup.supporterCreditsHTML()>>
</section>
<</if>>
<div class="continue-links delayed">
<<link "Open Patreon">><<run setup.openPatreon()>><</link>>
<<link "Goddess Vesperina">><<run setup.openVesperina()>><</link>>
</div>
<div class="delayed">
[[Fountain][$gameDate = setup.changeDate($gameDate, 'hours', 6)]]
[[Home]]
</div><<run setup.refreshPersonality()>>
<<set $endingId = setup.pickEndingId()>>
<p class="delayed">
You stop and take stock, not of homework, but of the person the world (and $girlfriendName) have been carving you into.
</p>
<<if $caged>>
<p>The cage is a fact. Personality path: <strong>$personality</strong>. Sissy: $sissyScore. Girlfriend favor: $girlfriendTrustLevel/10.</p>
<<else>>
<p>Still unlocked. Path: <strong>$personality</strong>. Sissy: $sissyScore. Girlfriend favor: $girlfriendTrustLevel/10. School day: $schoolDay.</p>
<</if>>
<div class="delayed">
[[See how this chapter ends|Ending resolve]]
[[Not yet. keep living it|Home]]
</div><<run setup.refreshPersonality()>>
<<set $endingId = setup.pickEndingId()>>
<<set $flags.endingOffered = true>>
<<goto $endingId>><h2 class="center">Ending: Houseboy</h2>
<p class="letter">
You stopped pretending the cage was temporary.
$girlfriendName keeps the key on a chain she doesn't hide anymore. You keep the apartment soft, the calendar clear for her plans, and your mouth ready when she comes home smelling like someone else's night.
</p>
<<if $personality eq "eager">>
<p class="letter">You asked for this shape. Some nights that thought is comfort. Some nights it is the only thing harder than the steel.</p>
<<else>>
<p class="letter">You tell yourself you adapted. Adaptation is just a slower kind of asking.</p>
<</if>>
<<actor-thought you>>
This is not a pause in the story. This is the story settling.
<</actor-thought>>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>.</p>
[[Back to title|Start][$flags.endingOffered = true]]<h2 class="center">Ending: Soft Cuckold</h2>
<p class="letter">
You learned which questions not to ask.
$girlfriendName still kisses your forehead. She still texts good morning. She also still comes over late, thighs warm, stories incomplete, and you still kneel like anniversary night never ended.
</p>
<<if $flags.keptQuietSmell>>
<p class="letter">You remember the taste you did not name. Silence became the relationship.</p>
<</if>>
<<if $caged>>
<p class="letter">The cage makes honesty optional. She prefers it that way. So do the parts of you that only get hard against metal now.</p>
<</if>>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>.</p>
[[Back to title|Start]]<h2 class="center">Ending: Locked & Resentful</h2>
<p class="letter">
You wear the cage like a lost argument.
$girlfriendName calls it structure. You call it theft in your head and "yes, honey" out loud. $sisterName still smirks when you do chores. Class still ranks you.
</p>
<<if $personality eq "resist">>
<p class="letter">You keep a private ledger of every humiliation. You have not spent it yet. That might be the cruelest part... you are still saving the rebellion for later.</p>
<</if>>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>.</p>
[[Back to title|Start]]<h2 class="center">Ending: Softly Locked</h2>
<p class="letter">
Not houseboy. Not free. Somewhere in the middle: a boyfriend with a keyholder, a student with a secret, a body learning patience the hard way.
</p>
<<actor girlfriend>>
We are still us. Just... edited. 😘
<</actor>>
<<actor-thought you>>
Edited. You can live with that word. For now.
<</actor-thought>>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>. More chapters may expand from here.</p>
[[Back to title|Start]]
[[Keep playing in this save|Home]]<h2 class="center">Ending: Denial</h2>
<p class="letter">
You never took the lock... or you slipped the narrative before it closed.
ANWO still hums at school. $girlfriendName still looks at you like a question. $bullyName still laughs like the answer is obvious.
</p>
<p class="letter">
You tell yourself you won by not becoming the joke. The joke does not need your consent to use your name in the hallway.
</p>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>.</p>
[[Back to title|Start]]
[[Keep playing|Home]]<h2 class="center">Ending: Free / Alone</h2>
<p class="letter">
You made it out without the cage... or you threw the keyholder away with both hands.
You are free like a bird. You also lost $girlfriendName. Freedom and loneliness often share a lease.
</p>
<<if $cageAcceptance eq "refused">>
<p class="letter">You said no. She left. Some nights that feels like courage. Some nights it feels like the last door that would have held you together.</p>
<<elseif $girlfriendTrustLevel lte 0>>
<p class="letter">Her favor hit zero. There was no speech left that could rebuild it.</p>
<</if>>
<<actor-thought you>>
Was it worth it? The story does not grade that. Only you do.
<</actor-thought>>
<p class="delayed">Thanks for playing this route of <em>Beginning of CGC</em>.</p>
[[Back to title|Start]]<<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/fountain.jpg'" alt="Fountain">
<h2 class="scene-title">Fountain</h2>
<<if $caged>>
<p class="scene-lead">Water, open air, and metal under your clothes. Public enough to feel watched.</p>
<<elseif $world eq "anwo">>
<p class="scene-lead">Same fountain. Louder gossip. Rankings travel faster than water.</p>
<<elseif $flags.anniversaryTonight && !$flags.caughtStroking1>>
<p class="scene-lead">Anniversary meet spot. Your pulse is already arguing with the spray.</p>
<<else>>
<p class="scene-lead">Campus fountain. Kill time, meet people, or pretend you're not waiting for someone.</p>
<</if>>
<<if hasVisited("School 10 Day anwo") && !$flags.fountain10Done>>
<div class="quest-banner">
<strong>She's here</strong>
<p>$girlfriendName is by the water. After class. After you spoke up.</p>
[[Confront her|Fountain 10 Day anwo]]
</div>
<<elseif hasVisited("School 20 Day anwo") && !$flags.fountain20Done && $flags.anniversaryTonight && !$flags.caughtStroking1>>
<div class="quest-banner">
<strong>Anniversary</strong>
<p>She said fountain after school. Or home if you're late.</p>
[[Wait for her|Fountain 20 Day anwo]]
</div>
<<elseif hasVisited("School 20 Day anwo") && !$flags.fountain20Done>>
<<set $flags.fountain20Done = true>>
<p class="hint-line">Nothing special at the fountain right now.</p>
<<else>>
<p class="hint-line">Quiet spray. No story beat waiting. You can still hang a minute.</p>
<</if>>
<div class="hub-actions">
[[Go Home|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
</div>
<</nobr>><<set $flags.fountain10Done = true>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/fountain.jpg'" alt="Fountain">
<p class="delayed">You see $girlfriendName by the edge and confront her about what happened in class.</p>
<<actor you>>Hey! Why didn't you speak up?<</actor>>
<<if $sissyScore gte 3>>
<<actor girlfriend>>Because someone has to keep us safe. You already make yourself a target. I won't join you on the chopping block.<</actor>>
<<actor girlfriend>>Next time keep your mouth shut. For both of us. Please.<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>I wish I could have... but you shouldn't have said it. And lately I don't know if I can count on you.<</actor>>
<<actor girlfriend>>Next time keep your mouth shut.<</actor>>
<<else>>
<<actor girlfriend>>I wish I could have, but you shouldn't have said it.<</actor>>
<<actor girlfriend>>And they would have turned on me. We couldn't win.<</actor>>
<<actor girlfriend>>Next time keep your mouth shut.<</actor>>
<</if>>
<<actor girlfriend>>
We play along. Both of us. You want me? Then stop trying to be the honest one in a dishonest room.
<</actor>>
<<actor girlfriend>>
Complicity is a kind of loyalty. Remember that. 😘
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>She still won't look me fully in the eye. Like with the... smell. Something's off, and she just made you partner in crime.<</actor-thought>>
<<else>>
<<actor-thought you>>Stupid world. She's right that you couldn't win alone, and she just invited you to lose together.<</actor-thought>>
<</if>>
<<run setup.nudgeArousal(10)>>
<div class="continue-links">[[Go Home|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
</div><<set $flags.fountain20Done = true>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/fountain.jpg'" alt="Fountain">
<p class="delayed">You go to the fountain for the anniversary meet. The water is loud. Your pulse is louder.</p>
<span id="conv1" class="fadeIn"><<click " wait a minute">><<replace "#conv1">>
You wait. Students drift past. No $girlfriendName.
<span id="conv2" class="fadeIn"><<click " wait longer">><<replace "#conv2">>
Your phone is empty. After class she said fountain, or home. You picture $bullyName's homework excuse and hate yourself for picturing it.
<span id="conv3" class="fadeIn"><<click " give up and go home">><<replace "#conv3">>
<<actor-thought you>>
She's late. Or she's testing you. Or she's with him.
The ache from class is worse in the open air. Home. Hand. Then you'll be ready when she shows.
That logic is a lie and you already know it.
<</actor-thought>>
<span>[[Go Home|Home][$aroused = Math.min(92, Math.max($aroused, 80))]]</span>
<</replace>><</click>></span>
<</replace>><</click>></span>
<</replace>><</click>></span>
</div><<nobr>>
/* Phone entry: left sidebar only (+ badge). Story still uses quest banner when Phone is the objective. */
<div class="scene-panel compact hub-home">
<div class="scene-hero">
<<if $caged>>
<img @src="setup.ImagePath+'you/locked1.webp'" class="hero-img" alt="">
<<elseif $aroused gte 70>>
<img @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.gif'" class="hero-img" alt="">
<<else>>
<img @src="setup.ImagePath+'places/bored.gif'" class="hero-img" alt="">
<</if>>
<div class="scene-hero-copy">
<h2 class="scene-title">Home</h2>
<<if $caged && $aroused gte 70>>
<p class="scene-lead">You're locked and bored and it still won't shut up under your clothes.</p>
<<elseif $caged>>
<p class="scene-lead">Locked. The quiet is supervised even when she is not here.</p>
<<elseif $world eq "anwo" && $aroused gte 70>>
<p class="scene-lead">Your head is still in class, rankings, her perfume, the ache.</p>
<<elseif $world eq "anwo">>
<p class="scene-lead">A world rewriting the rules under your feet.</p>
<<elseif $world eq "normal" && $schoolDay gt 2>>
<p class="scene-lead">Something unread is waiting on the computer. Work, dates, the rest of life: locked until you deal with it.</p>
<<elseif $aroused gte 70>>
<p class="scene-lead">Bored is not the word, hungry is.</p>
<<elseif $flags.anniversaryTonight>>
<p class="scene-lead">Anniversary night air still sticks to the room.</p>
<<else>>
<p class="scene-lead">What do you do?</p>
<</if>>
</div>
</div>
<<set _quest = setup.getQuestObjective()>>
/* One primary "what to do" only, no second story strip repeating the same beat */
<<if _quest>>
<div class="quest-banner">
<strong><<print _quest.title || "Next">></strong>
<p><<print _quest.text>></p>
<<if _quest.link>>
<<link `_quest.linkLabel` `_quest.link`>>
<<set $currentPassage = "Home">>
<</link>>
<<elseif _quest.schoolLink>>
<<link "Go to school" `'go to School ' + $world`>>
<</link>>
<</if>>
</div>
<</if>>
/* Story stays open, no forced ending. Optional snapshot only if player seeks it. */
<<if !_quest && $world eq "anwo" && $schoolDay gte 26 && !$caged && $cageAcceptance isnot "refused" && !$flags.mustResolveCage>>
<div class="hub-block story-block"><div class="hub-section">Unresolved</div><div class="hub-actions">[[You still have not faced it|Jerk off]]</div></div>
<</if>>
/* Shame favors: no separate hub, only a soft phone ping when a gig is actually open */
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _ambH = setup.hustleOpenAmbientList()>>
<<if _ambH.length gt 0>>
<div class="hub-block story-block">
<div class="hub-section">Hustle</div>
<p class="hint-line">Someone wants a paid favor. Optional, skip if you're busy.</p>
<div class="hub-actions">
<<for _ai = 0; _ai lt _ambH.length; _ai++>>
<<set _ah = _ambH[_ai]>>
<<capture _ah>>
<<link `_ah.title + " ($" + _ah.pay + ")"` _ah.passage>>
<<set $flags.hustleFromSchool = "">>
<</link>>
<</capture>>
<</for>>
</div>
</div>
<</if>>
<</if>>
<div class="hub-grid">
<div class="hub-block hub-block-body"><div class="hub-section">Body</div><div class="hub-actions">[[Jerk off]][[Bathroom]]</div></div>
<div class="hub-block hub-block-stay"><div class="hub-section">Stay in</div><div class="hub-actions">
<<if $gameDate.getHours() lt 24>>[[Computer]]<</if>>
/* Phone lives in left sidebar (badge + deep-link). Not duplicated here. */
/* Sister beats / surveys after ANWO rewrite only */
<<if $world eq "anwo" && $gameDate.getHours() lt 18 && !(_quest && _quest.link eq "step-sister")>>[[Step-sister|step-sister]]<</if>>
</div></div>
<div class="hub-block hub-block-out"><div class="hub-section">Go out</div><div class="hub-actions">
<<if $gameDate.getHours() lt 10 && $gameDate.getHours() gt 7 && !($gameDate.getDay() == 6 || $gameDate.getDay() == 0)>>[[Go to school|'go to School ' + $world]]<</if>>
/* Work + Friday dates need ANWO (GF rewrite; hotel later has cage heat) */
<<if $world eq "anwo" && $work != 'unemployed' && $gameDate.getHours() lt 10 && $gameDate.getHours() gt 7 && ($gameDate.getDay() == 6 || $gameDate.getDay() == 0)>>[[Go to work|'go to Work']]<</if>>
<<if setup.fridayDateReady()>>
<<set _fridayMeta = setup.fridayDateMeta()>>
<<set _fridayEvening = $gameDate.getHours() gte 17>>
<<set _fridayPassage = _fridayEvening ? setup.fridayDatePassage() : "Friday date wait">>
<<set _fridayLabel = _fridayEvening ? _fridayMeta.title : "Friday night">>
<<set _fridayLabel += _fridayMeta.canPay ? " · $" + _fridayMeta.cost : " · Need $" + _fridayMeta.cost>>
<<if !_fridayEvening>><<set _fridayLabel += " · Evening">><</if>>
<span @class="_fridayMeta.canPay ? 'hub-action-cost' : 'hub-action-cost money-short'">
<<link `_fridayLabel` `_fridayPassage`>><</link>>
</span>
<</if>>
/* Park / mall are post-ANWO hubs */
<<if $world eq "anwo" && $gameDate.getHours() lt 22>>[[Park]]<</if>>
<<if $world eq "anwo" && $gameDate.getHours() lt 20>>[[Mall]]<</if>>
</div></div>
<div class="hub-block hub-block-rest"><div class="hub-section">Rest</div><div class="hub-actions"><<if $aroused gt 50>>[[Sleep anyway|Sleep]]<<else>>[[Sleep]]<</if>></div></div>
</div>
</div>
<</nobr>><<set $flags.caughtStroking1 = true>>
<<set $flags.anniversaryTonight = false>>
<<set $flags.questHint = "">>
<p class="delayed">
You told yourself it would be quick, just enough to take the edge off after class, before the fountain, before her.
Your hand is still moving when the door opens.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/caught-door.jpg'" alt="caught by girlfriend">
<<actor girlfriend>>What the fuck, $youName?! Put that away!<</actor>>
<<actor girlfriend>>I thought you stopped doing this whenever you got bored.<</actor>>
<<actor you>>Ahh, $girlfriendName?! What are you doing here... who let you in? 😳<</actor>>
<<actor girlfriend>>
$sisterName. Because I said I might come over for our anniversary. Because we said after school, fountain, then here, then us.
<</actor>>
<<actor girlfriend>>
I waited. You weren't there. So I came to find my boyfriend... and found this instead.
<</actor>>
<<actor-thought you>>
Anniversary. Spicy night. You chose your fist over her hand on your arm in the hallway.
Your cock is still hard. Your stomach is ice.
<</actor-thought>>
<div id="conv"></div>
<span id="options">
<<you-answer "I'm sorry, I was a mess after class. I panicked. 😞">>
<<actor girlfriend>>
Panic doesn't look like that. It looks like texting me. It looks like showing up.
But... at least you're not pretending this is nothing.
<</actor>>
<<actor girlfriend>>
You still owe me tonight. On my terms. Favor. Now.
[[Lick her |Lick GF][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</actor>>
<</you-answer>>
<<you-answer "Where were YOU? I didn't see you at the fountain.">>
<<actor girlfriend>>
I was with $bullyName. He needed help with homework after that... display. Fifteen minutes. You couldn't wait fifteen minutes?
<</actor>>
<<actor girlfriend>>
Maybe I should go. Celebrate alone.
<</actor>>
<</you-answer>>
<<you-choice "Please, don't go. I'll make it up to you.">>
<<actor girlfriend>>
Then stop talking and use your mouth. Anniversary isn't cancelled. It's corrected.
[[Lick her |Lick GF][$sissyScore += 1]]
<</actor>>
<</you-choice>>
<<you-choice "Fine. Leave if you want.">>
<<actor girlfriend>>
Okay. Enjoy your hand.
<</actor>>
<<set $relationshipState = "no-favor">>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 3)>>
<p class="delayed">She doesn't slam the door. She closes it carefully, like she's already decided something about you.</p>
[[Bye |Are sleepy]]
<</you-choice>>
</span><img class="hero-img centered porn-frame" @src="setup.ImagePath+'story/act2/lick-gf-jenny-bed.png'" alt="Jenny on the bed">
<img @src="setup.ImagePath+'sex/licking.png'">
<<set $relationshipState = "cum-covered-pussy-licked">>
<p class="delayed">
She sits on the edge of your bed like she owns the room. Fingers in your hair... not gentle, not cruel. Guiding.
You kneel. You start. The taste is familiar and... not.
Something richer. Salt and heat and a note you can't name.
Your brain tries to file it under "pill" and "stress" and "anniversary nerves."
</p>
<span id="conv"></span>
<span id="options">
<<you-choice "Honey... you smell different. Taste different.">>
<<set $flags.noticedSmell = true>>
<<actor girlfriend>>
Maybe because I stopped taking my pill. Or maybe because I've been wet since the hallway.
Stop diagnosing me and lick. 😒
<</actor>>
<<actor-thought you>>
The pill story lands wrong. Too fast. Too smooth. You file it under later, because her thighs are already trembling against your ears.
<</actor-thought>>
[[Continue licking and finish her off |Finish Licking]]
<</you-choice>>
<<you-choice "*Keep licking. Don't ask.">>
<<set $flags.keptQuietSmell = true>>
<<set $sissyScore += 1>>
<<actor girlfriend>>
Ahh... yes. $youName. Just like that. Good...
<</actor>>
<<actor-thought you>>
You don't ask. Asking might stop this. Asking might make the classroom real again.
You bury your face and choose her moan over the truth.
<</actor-thought>>
[[Finish her |Finish Licking]]
<</you-choice>>
</span><<actor girlfriend>>Ah... yes... I'm coming, $youName, don't you dare stop, <</actor>>
<p class="delayed">She comes hard... hands fisted in the sheets, thighs locking around your head like a verdict.</p>
<img @src="setup.ImagePath+'sex/orgasm-licking.png'">
<div id="conv"></div>
<span id='options'>
<<you-choice "What about me?">>
<<actor girlfriend>>
For what? You already took care of yourself. That's the problem.
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
That taste still sits on your tongue. The pill story doesn't. You don't push. Not tonight.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Your cock throbs, ignored. Anniversary night and you're the afterthought. Somehow that makes you harder.
<</actor-thought>>
<</if>>
[[Bye |Jerk off][$aroused = 80]]
<</you-choice>>
<<you-choice "Hope that made up for it...">>
<<if $flags.keptQuietSmell>>
<<actor girlfriend>>
It helped. You're good when you shut up and work. We should do that more.
It's late. I should go. Text me tomorrow, and keep your hands off yourself if you can manage it. 😏
<</actor>>
[[Bye |Are sleepy][$sissyScore += 2; $girlfriendTrustLevel = setup.changeFavor(1); $aroused = 40]]
<<else>>
<<actor girlfriend>>
Not bad. We should do that more often. It's late... I should go home.
Next time... show up when you say you will.
<</actor>>
[[Bye |Are sleepy][$sissyScore += 2; $aroused = 50]]
<</if>>
<</you-choice>>
</span><<set $flags.caughtStroking2 = true>>
<p class="delayed">
$teacherName's lecture still echoes: lock them up. Small cocks. Harm reduction for women.
$girlfriendName said as long as you play by the rules...
You told yourself one stroke wouldn't count. Then another.
The door doesn't knock.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/caught-door.jpg'" alt="caught again">
<<actor girlfriend>>I CAN'T BELIEVE IT. ONE DAY. YOU COULDN'T LAST ONE DAY?<</actor>>
<<actor-thought you>>
Her voice cracks on the last word... not just anger. Something like decision.
<</actor-thought>>
<div id="conv"></div>
<div id="options">
<<you-answer "You didn't even finish me last time... I was still dying, ">>
<<actor girlfriend>>That is not an excuse. We were supposed to continue. Together. Not you sneaking off like a junkie.<</actor>>
<<actor girlfriend>>$teacherName was right about one thing. Some boys can't be trusted with their own dicks.<</actor>>
<</you-answer>>
<<you-choice "*Stay silent. Face burning.*">>
<p class="delayed">Footsteps in the hall. $sisterName's voice before her face.</p>
<<actor sister>>Okay, what is the screaming about, oh.<</actor>>
<<actor girlfriend>>Your brother is a jerk-junkie. Anniversary wasn't enough. Classroom wasn't enough. He still can't keep his hand off it.<</actor>>
<<actor sister>>
Bro. You have a girlfriend and you still live in your palm? That's actually sad. 😅
My ex was the same. Until someone took the option away.
<</actor>>
<<actor sister>>
$girlfriendName, come with me a sec. I have something that fixes this kind of boy. Quietly.
<</actor>>
<<actor-thought you>>
$sisterName doesn't sound shocked. She sounds useful. Like she's been waiting for this mess.
<</actor-thought>>
<span class="delayed">They leave together. Their voices drop in the hall... almost friendly.</span>
[[*Follow them quietly*|Girlfriend receives cage][$followedSisterReceivingCage to true]]
[[*Stay. Pretend this isn't happening.*|Girlfriend puts on the cage][$followedSisterReceivingCage to false; $sissyScore++]]
<</you-choice>>
</div><p class="delayed">
You edge after them. $sisterName's door is half open. You shouldn't listen. You do.
</p>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-sister-handoff.jpg'" alt="sister offers the cage">
<<actor sister>>
This one. Steel. Small. He'll hate it for a week and then he'll thank you with his eyes because he can't thank you with his cock.
<</actor>>
<<actor girlfriend>>
We covered these in class today. Chastity. Keyholder. Beta management.
<</actor>>
<<actor sister>>
Bingo. He can't stroke. You hold the key. You decide if he ever gets hard for real again.
I used something like this on my ex. He cried the first night. On night three he was texting me "please" like it was a love language. 😏
<</actor>>
<<actor girlfriend>>
That sounds... perfect. For him. For us.
<</actor>>
<<actor sister>>
Don't ask him if he wants it. Ask him if he wants you. Same answer, different cage.
<</actor>>
<img @src="setup.ImagePath+'toys/chastity.png'" class="delayed">
<p class="delayed">Your mouth is dry. Your cock is still stupidly hard under your clothes, like it doesn't understand the conversation.</p>
[[*Run back to your room*|Girlfriend puts on the cage]]<<if $followedSisterReceivingCage>>
<p class="delayed">You make it to the bed before they return. You pretend you weren't listening. They pretend they believe you.</p>
<<else>>
<p class="delayed">Time stretches. When they come back, $girlfriendName's eyes are different, calmer. Ready.</p>
<</if>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="keyholder ready to lock">
<<actor girlfriend>>Look what $sisterName gave me.<</actor>>
<img @src="setup.ImagePath+'toys/chastity.png'" class="delayed">
<<if $sissyScore gte 4>>
<<actor girlfriend>>You've been soft for me for a while. This just makes it honest. 😍 Pants down.<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>I'm done arguing. This goes on. Now. 😒<</actor>>
<<elseif $followedSisterReceivingCage>>
<<actor girlfriend>>You heard enough, didn't you? Good. Then you know I'm not bluffing. 😏<</actor>>
<<else>>
<<actor girlfriend>>Class said lock what can't be trusted. You proved the point. Let's put it on. 😍<</actor>>
<</if>>
<<actor sister>>
I'll be in my room. Don't break my toy on day one, $girlfriendName. And bro... breathe. It's smaller than your ego.
<</actor>>
<span class="delayed">$sisterName leaves with a little wave. The click of her door is the last private thing you own.</span>
<span id="conv"></span>
<span id="options">
<<you-answer "What is this for?">>
<<actor girlfriend>>
A chastity cage. Around your cock. I hold the key. You don't get to jerk whenever panic or horniness hits. I do. 😈
<</actor>>
<</you-answer>>
<<you-answer "That looks like it hurts.">>
<<actor girlfriend>>
$sisterName said only at first. Then it becomes... quiet. You'll love the quiet. Or you'll love me more than the quiet.
<</actor>>
<</you-answer>>
<<you-choice "Okay... if it means you'll stay. 🙁">>
<<actor girlfriend>>
Smart. Choosing us. I'll remember you said it like that.
<</actor>>
[[Put it on|Girlfriend locked you up][$cageAcceptance = "reluctant"; $sissyScore += 1; $complyScore += 2]]
<</you-choice>>
<<you-choice "If you want me locked... I want it too. 😳">>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>>
Oh. Look at you. That was almost romantic. Come here.
<</actor>>
<<else>>
<<actor girlfriend>>
Finally useful. Good. Don't take it back when it clicks.
<</actor>>
<</if>>
[[Put it on|Girlfriend locked you up][$cageAcceptance = "eager"; $sissyScore += 3; $girlfriendTrustLevel = setup.changeFavor(1); $complyScore += 3]]
<</you-choice>>
<<you-choice "No. I'm not putting that on.">>
<<actor girlfriend>>
Are you sure? $teacherName was right. Without this, I won't stay. I'm not competing with your hand anymore.
<</actor>>
[[Okay... then put it on. 🙁|Girlfriend locked you up][$cageAcceptance = "forced"; $sissyScore += 2; $resistScore += 2; $complyScore += 1]]
[[Then go. I don't need you.|End lost girlfriend][$cageAcceptance = "refused"; $resistScore += 4; $flags.mustResolveCage = false; $flags.questHint = ""]]
<</you-choice>>
</span><<run setup.refreshPersonality()>>
<<run setup.updateProgression("Caged", 3)>>
<<set $flags.mustResolveCage = false>>
<<set $flags.questHint = "">>
<<set $flags.day25RulesWarning = false>>
<img @src="setup.ImagePath+'gf-you/lockup.webp'">
<p class="delayed">
Cold metal. Her fingers are careful, almost tender, while she sizes you, settles you, closes the lock.
The click is small. It fills the whole room.
</p>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
Hear that? You asked for it. You're mine now. Not your hand's. Mine. 😍
[[Let's have some fun][$caged = true; $strokeState = "caged"]]
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
There. Breathe. I'm proud of you for choosing us. We'll learn the rules together. 😌
[[Let's have some fun][$caged = true; $strokeState = "caged"]]
<</actor>>
<<else>>
<<actor girlfriend>>
Yes. 😍 Finally. No more "just once."
[[Let's have some fun][$caged = true; $strokeState = "caged"; $sissyScore++]]
<</actor>>
<</if>><span id="conv">
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>You wanted the cage. Now show me that mouth still works when the rest of you doesn't.<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>You can't fuck me with that on. So you serve. That's how we keep this fair... for me.<</actor>>
<<else>>
<<actor girlfriend>>Because you can't have sex with that thing on, you pleasure me another way. On your knees is fine.<</actor>>
<</if>>
</span>
<<actor-thought you>>
The cage is already warm from your skin. Every pulse reminds you the key is in her hand... somewhere you can't reach.
You could refuse. You could still ruin this.
Your knees hit the floor before your pride finishes the argument.
<</actor-thought>>
<span id="options">
<<you-choice "Yes, $girlfriendName... 😕">>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
Ahhh... see? This is what you're for. Better already. Don't you dare stop when I shake.
<</actor>>
<<elseif $flags.noticedSmell>>
<<actor girlfriend>>
Ahhh yes... just like that. Don't think. Don't sniff for stories. Serve.
<</actor>>
<<else>>
<<actor girlfriend>>
Ahhh... yes. You're getting better. This is better than sex with you ever was.
<</actor>>
<</if>>
<img class="delayed" @src="setup.ImagePath+'gf-you/chastity-lick.png'" class="delayed">
<<actor girlfriend>>
Wow. That was a ride. You did a great job, honey.
Keep the cage clean. Keep your hands off it. And stay awake, I'm not done owning tonight.
[[Continue, keyholder night|Cage rules night][$refusedToLick = false; $sissyScore += 2; $aroused = 70; $flags.firstServiceDone = true; $storyAct = 3]]
<</actor>>
<</you-choice>>
<<you-choice "No. If I can't cum, you don't get to either.">>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
After you asked for the lock? Cute. Stay frustrated. Both of us can play mean.
Still, rules. Then you can stew.
[[Continue, keyholder night|Cage rules night][$refusedToLick = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2); $aroused = 90; $storyAct = 3]]
<</actor>>
<<else>>
<<actor girlfriend>>
If that's what you wish for. Enjoy the ache. I still have the key.
Rules first. Then you can be mad about them.
[[Continue, keyholder night|Cage rules night][$refusedToLick = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1); $aroused = 85; $storyAct = 3]]
<</actor>>
<</if>>
<</you-choice>>
</span><<set $flags.questHint = "">>
<<set $storyAct = 3>>
<<set $storyBeat = "key-rules">>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="keyholder with key">
<p class="delayed">Evening. $girlfriendName is on your bed in blue, dangling the key like a joke only she is allowed to finish. The cage is already warm.</p>
<<actor girlfriend>>
Rules. Say them back so I know your brain still works under steel.
<</actor>>
<<actor girlfriend>>
One: no unlocking yourself. Not “just to clean.” Not “just for a second.” Me.
Two: you tell me when you're desperate. Not so I free you... so I can enjoy it.
Three: if I go out, you wait. You don't hunt. You don't “check on me.”
Four: mouth, hands for me, toys if I allow. Your cock is decoration until I say otherwise.
<</actor>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="keyholder on the bed">
<img class="delayed centered" @src="setup.ImagePath+'you/locked1.webp'" alt="already locked">
<<actor-thought you>>
You're already locked. The click already happened. This is the part where she writes the rules on top of the steel.
Not a second lockup, ownership paperwork.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I understand. You're the keyholder.">>
<<set $flags.keyRulesDone = true>>
<<actor girlfriend>>
Good boy. Hierarchy is simple when you're honest. 😘
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[She isn't finished with you|Caged service]]</div>
<<else>>
<div class="delayed">[[Sleep on it|Home]]</div>
<</if>>
<</you-choice>>
<<you-choice "This is temporary. Right?">>
<<set $flags.keyRulesDone = true>>
<<actor girlfriend>>
Cute. Temporary is a word betas use when they're scared of permanent.
I am not bored of the key yet.
<</actor>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[She pulls you closer anyway|Caged service]]</div>
<<else>>
<div class="delayed">[[Home with the argument unfinished|Home]]</div>
<</if>>
<</you-choice>>
<<you-choice "*Nod. Don't trust your voice.*">>
<<set $flags.keyRulesDone = true>>
<<actor girlfriend>>
Silent agreement counts. Kiss the key. Then we'll see if your mouth is useful for more.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<if !$flags.firstServiceDone>>
<div class="delayed">[[On your knees|Caged service]]</div>
<<else>>
<div class="delayed">[[Home|Home]]</div>
<</if>>
<</you-choice>>
</div>
</div><<set $flags.noticedSmell = true>>
<<set $storyBeat = "night-out">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/night-out-wait.jpg'" alt="waiting locked at home">
<p class="delayed">She said “girls' night.” The clock hits late. Your cage has been a second heartbeat for hours.</p>
<<actor-thought you>>
You fail at not checking your phone. You fail at not imagining her with someone who can actually fuck.
<</actor-thought>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/owned/night-out-leave.jpg'" alt="she left for the night">
<p class="delayed">Key in the door. $girlfriendName fills the frame, messy, shiny, key on a chain between her tits like a trophy. She smells like night air and someone else's cologne.</p>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="she comes home ruined and proud">
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-tease-'+ random(1, 4) +'.gif'" alt="">
<<actor girlfriend>>
Still up? Of course you are. Look at you... sitting polite with a locked dick like a good statue.
I had fun. You're the one who can't.
If you're good, maybe I let you clean me up later. 😏
<</actor>>
/* Caption pics only via Edge Report story — scene can still show the meme inline */
<img class="hero-img caption-pic centered delayed" @src="setup.captionURL('nice-guy')" alt="">
<<actor girlfriend>>
also. that pic from earlier? keep it. gallery's for locked boyfriends who wait. 📸
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I… I can smell him on you.">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
Then you have a working nose. Use your mouth for something useful later, not questions.
<</actor>>
<<set $flags.keptQuietSmell = false>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[She pushes you to your knees|Caged service][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "Did you have a good night?">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
Mm. Better than staying home watching you squirm. Smile, ask nothing, wait.
<</actor>>
<<set $flags.keptQuietSmell = true>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Kiss her cheek. Taste the night.|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "*Say nothing. Stare at the key.*">>
<<set $flags.nightOutSmellDone = true>>
<<actor girlfriend>>
There it is. The quiet little cuck look. Go to bed hard. Locked.
<</actor>>
<<set $flags.keptQuietSmell = true>>
<<set $sissyScore += 3>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[To bed aching|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
</div>
</div><<set $flags.cagedWaitDone = true>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="waiting locked">
<p class="delayed">She texts: <em>out. be good. no touching what you can't reach anyway 🔐</em></p>
<p class="delayed">An hour of nothing. Every shift of fabric reminds you. Your brain helpfully supplies what she might be doing.</p>
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<actor girlfriend>>
still waiting? good. $bullyName says hi. not really. or maybe.
don't cum without me. oh wait... you can't. 😈
<</actor>>
<<run setup.peakArousal()>>
<<set $sissyScore += 1>>
<div class="continue-links">
[[Try to stroke the cage anyway|Stroke cage]]
[[Lie down and suffer|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
</div><<if $flags.cagedServiceDone>>
<<set $storyBeat = "first-service">>
<<include "Home">>
<<else>>
<<set $storyBeat = "first-service">>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="she sits you down">
<p class="delayed">She doesn't undress you. She owns the bed edge, then your face... fingers in your hair, mouth between her thighs, keys on the nightstand where you can see them and not touch them.</p>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'gf-you/service-facesit.jpg'" alt="service">
<<actor girlfriend>>
That's it. Slow. You're not fucking me... you're paying rent with your tongue.
Lick. Don't rush. Every time the cage clinks, remember who gets to finish.
<</actor>>
<<actor-thought you>>
Metal between your thighs. Her taste. Unfair on purpose. This is chapter one of locked life... not a side scene.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'gf-you/chastity-lick.png'" alt="">
<img class="delayed centered" @src="setup.ImagePath+'sex/licking.png'" alt="">
<img class="delayed centered" @src="setup.ImagePath+'sex/orgasm-licking.png'" alt="">
<<actor girlfriend>>
Good. Stay down a second. No key tonight.
Tomorrow the world keeps ranking you. Tonight I already did.
When $sisterName sees you, don't look shocked. She'll know.
<</actor>>
<<set $aroused = 90>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<div class="continue-links">
[[Wipe your mouth. The story continues.|Home][$flags.cagedServiceDone = true; $flags.firstServiceDone = true; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
</div>
</div>
<</if>><<set $flags.cagedVoyeurDone = true>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-park-witness.jpg'" alt="park voyeur tension">
<p class="delayed">You only meant to walk off the ache. Past the bushes you hear a laugh that is not careful, a rhythm that is not yours.</p>
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<actor-thought you>>
You can't see faces. You don't need to. In your head it is $girlfriendName and someone built like an ANWO poster.
Your cage jerks against denim. Hard, sealed, watching.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "*Stay. Watch.*">>
<<actor-thought you>>
Shame and heat braid together. You leave only when your legs shake.
<</actor-thought>>
<<set $sissyScore += 3>>
<<run setup.peakArousal()>>
<<set $complyScore += 1>>
<div class="delayed">[[Flee home throbbing|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "*Leave before you confirm anything.*">>
<<actor-thought you>>
Cowardice or self-defense. The cage still knows what you almost did.
<</actor-thought>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Home before the image sticks|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
</div><<set $storyBeat = "alpha-proof">>
/* Caption Snap rewards only from Edge Report (call-to-fuck is in the story order) */
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
</div>
</div>
<div class="messages">
<<actor girlfriend>>
don't freak out
or do. i like when you freak out quietly
<</actor>>
<<actor girlfriend>>
had a "study" thing
$bullyName walked me halfway to the car
he asked if you were still "doing the locked experiment"
i said you're taking hierarchy seriously 🔐
<</actor>>
<<actor girlfriend>>
then i sent him this energy
me in the back seat. two phones. the caption is the joke and the offer
read it slow
<</actor>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/alpha-proof-car.jpg'" alt="parking lot proof energy">
<<print '<img class="hero-img caption-pic centered" src="' + setup.captionURL("call-to-fuck") + '" alt="Jenny car meme">'>>
<<actor girlfriend>>
"give me your number and i'll call you to fuck"
that's not for you, baby. that's what the hierarchy looks like from the parking lot
notice what's not in the shot?
your cock. because it's not invited
<</actor>>
<<actor girlfriend>>
sleep hard. text me "yes keyholder" if you're still mine
this isn't the end. just proof the story moved. 😘
<</actor>>
<<actor-thought you>>
Study. Halfway. Locked experiment.
Her in a car asking for a number that isn't yours.
Pride and need fight. The cage votes for her.
<</actor-thought>>
</div>
<section class="phone-nav">
<div class="continue-links">
[[yes keyholder|Home][$flags.alphaProofDone = true; $flags.galleryApp = true; $complyScore += 2; $sissyScore += 1; $aroused = $aroused gte 90 ? 100 : $aroused + 20; $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)]]
[[…Seen|Home][$flags.alphaProofDone = true; $flags.galleryApp = true; $resistScore += 1; $aroused = $aroused gte 90 ? 100 : $aroused + 15]]
</div>
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>>
/* === Act III Chapter 2: Proof becomes presence === */<<set $storyBeat = "hallway-hierarchy">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/hallway-hierarchy.jpg'" alt="her with him in the hallway">
<p class="delayed">Between classes the hallway is a river of bodies. You almost walk past them, $girlfriendName and $bullyName, close enough that her shoulder brushes his chest when she laughs.</p>
<<actor-thought you>>
The cage sits warm under your clothes. She has the key. He has the height. You have the secret that is not a secret anymore, not after that photo.
<</actor-thought>>
<<actor bully>>
Hey... locked experiment still going? She said you're taking hierarchy seriously.
<</actor>>
<<actor girlfriend>>
He's right here. Don't make it a scene. Walk normal, baby.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "*Freeze. Nod. Say nothing.*">>
<<set $flags.hallwayHierarchyDone = true>>
<<actor bully>>
Cute. Speechless is a look. Catch you later.
<</actor>>
<<actor girlfriend>>
Go to class. Text me when you're home. 😉
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Escape into the crowd|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
<<you-choice "We're fine. Project stuff.">>
<<set $flags.hallwayHierarchyDone = true>>
<<actor bully>>
Sure. Project stuff. Keep that steel honest.
<</actor>>
<<actor girlfriend>>
He can talk. Barely. Proud of you for not melting. Mostly.
<</actor>>
<<set $resistScore += 1>>
<<set $aroused = $aroused gte 80 ? 100 : $aroused + 20>>
<div class="delayed">[[Leave while you still have a voice|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
<<you-choice "*Walk past like you didn't see them.*">>
<<set $flags.hallwayHierarchyDone = true>>
<<actor girlfriend>>
$youName, really? Avoiding me in public? We'll talk at home.
<</actor>>
<<actor-thought you>>
You feel his eyes on your back. The cage clinks once when you hurry. Traitor metal.
<</actor-thought>>
<<set $resistScore += 2>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[Home with a pit in your stomach|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
</div>
</div><<set $storyBeat = "bully-check-in">>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/bully-vending.jpg'" alt="bully by the vending machines">
<p class="delayed">You thought you were alone by the vending machines. $bullyName finds you the way weather finds a window, without asking.</p>
<<actor bully>>
Don't flinch. I'm not here to break your ribs. She told me about the lock. ANWO homework, right?
I just wanted to see if the beta version of you still walks upright.
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor bully>>
She said you asked for it. Brave. Or hungry. Same thing sometimes.
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor bully>>
She said you fought the idea. Funny how steel settles arguments.
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor bully>>
Reluctant volunteer. Those are my favorite. Half pride, half panic.
<</actor>>
<<else>>
<<actor bully>>
Locked experiment. Whatever you call it... it's working. Your face says so.
<</actor>>
<</if>>
<<if $personality eq "resist">>
<<actor-thought you>>
You want to tell him to back off. Your mouth stays careful. Hierarchy has an audience now.
<</actor-thought>>
<<elseif $personality eq "eager">>
<<actor-thought you>>
Part of you wants him to keep talking. Shame and heat share a seat.
<</actor-thought>>
<<else>>
<<actor-thought you>>
He is not yelling. That is worse. Casual ownership is a new language.
<</actor-thought>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "It's private. Between me and her.">>
<<set $flags.bullyCheckInDone = true>>
<<actor bully>>
Private until she texts proof. Relax, I'm not stealing the key. Yet. Joke. Mostly.
Tell her I said hi. Or don't. She likes when you squirm either way.
<</actor>>
<<set $resistScore += 2>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[Get out before your voice cracks|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "I'm… taking it seriously.">>
<<set $flags.bullyCheckInDone = true>>
<<actor bully>>
Good man. Hierarchy is simple when the hardware matches the homework.
Don't embarrass her in the hall. Walk like the cage is jewelry, not a crime.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Nod. Leave. Burn.|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "*Mumble something and stare at the floor.*">>
<<set $flags.bullyCheckInDone = true>>
<<actor bully>>
There it is. The quiet little locked look. See you around, experiment.
<</actor>>
<<set $sissyScore += 3>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[Flee with your ears ringing|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
</div><<set $storyBeat = "bully-presence">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-stand.jpg'" alt="keyholder debrief">
<p class="delayed">Evening. Home. $girlfriendName owns the bed frame like a throne. Key on the nightstand. Legs open. Report time.</p>
<<actor girlfriend>>
So. Hallway. Vending machines. He talked to you.
I know... because he texted me <em>your face</em> like a weather report. 😏
<</actor>>
<<if $flags.keptQuietSmell>>
<<actor girlfriend>>
You still like pretending things are subtle. Cute. He is not subtle. Neither am I.
<</actor>>
<<elseif $flags.noticedSmell || $flags.nightOutSmellDone>>
<<actor girlfriend>>
Don't do the shocked eyes. You already had a nose full of the truth once.
Today was just the public version.
<</actor>>
<<else>>
<<actor girlfriend>>
Proof on your phone was chapter one. Today was chapter two walking on two legs.
<</actor>>
<</if>>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
You wanted this steel. Now you get the social part too. Good boys don't only lock... they endure.
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor girlfriend>>
You didn't pick the cage. You still wear it. He knows. I like that he knows.
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
Half in, half out... that was the hallway face. Stay half if you want. The key doesn't care.
<</actor>>
<<else>>
<<actor girlfriend>>
Owned life isn't only rules at night. It's who can joke about you in fluorescent light.
<</actor>>
<</if>>
<img class="delayed centered" @src="setup.ImagePath+'cuckold/x-tease-'+ random(1, 4) +'.gif'" alt="">
<<actor girlfriend>>
Come here. Mouth on the key. Then maybe I let you be useful under the sheets, while the cage stays honest.
This still isn't the end. Just presence. He exists in our story now.
<</actor>>
<<actor-thought you>>
Pride tries to stand up. Need sits it back down. The novel keeps writing itself on your body.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Yes, keyholder. I'm still yours.">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
That's the line. Kiss. Kneel when I point. Sleep locked.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Serve, then ache|Caged service][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "I don't want him in this.">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
Want is adorable. Hierarchy already invited him. You can pout... I like the sound.
You're still mine. He just knows the outline.
<</actor>>
<<set $resistScore += 2>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Bed with the argument unfinished|Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "*Kiss the key. Don't argue.*">>
<<set $flags.keyholderDebriefDone = true>>
<<set $flags.bullyPresenceDone = true>>
<<actor girlfriend>>
Silent and sealed. Perfect. Lights out, experiment.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[Sleep owned|Home][$gameDate = setup.changeDate($gameDate, 'hours', 2)]]</div>
<</you-choice>>
</div>
</div>
/* === Act III Chapter 3: Ultimate humiliation (after bully presence, intentional escalation) === */<<set $storyBeat = "ultimate-humiliation">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/ultimate-chair-setup.jpg'" alt="chair in the corner">
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'girlfriend/keyholder-bed-stand.jpg'" alt="before he arrives">
<p class="delayed">She doesn't ask you to kneel. She <em>points</em> at the chair. The cage is already warm from a day of being ignored. $girlfriendName's nails click once against the steel like a toast.</p>
<<actor girlfriend>>
Look at it. Look at the little prison I put your manhood in.
You used to think this cock was part of the relationship. Cute.
Now it's just… locked. Mine. Quiet.
<</actor>>
<<actor-thought you>>
You want to argue. The cage answers first, a useless twitch that makes her smile like she won a bet.
This is past hallway jokes. This is the bed. This is him.
<</actor-thought>>
<<actor girlfriend>>
$bullyName is on his way. Not "maybe." Not "study group."
He's coming here to fuck me in <em>our</em> bed while you hold the edge of the mattress like a good little witness.
If you cry, keep it pretty. If you get hard in the cage... good. That's the joke.
You already survived the hallway. Tonight is the curriculum.
<</actor>>
<img class="delayed centered" @src="setup.genreGifPrefer('hardcuck', 'bbc')" alt="">
<p class="delayed">The door. His cologne hits first, then height, then the easy way he says her name like he already owns the vowels.</p>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/late/ultimate-he-arrives.jpg'" alt="he arrives">
<<actor bully>>
There he is. The locked boyfriend.
Don't stand up on my account. Actually, don't stand up at all. Stay low. Hierarchy is simpler when you can see the floor.
<</actor>>
<<actor girlfriend>>
Show him the cage, baby. No hands over it. No pride.
He already knows. I sent a photo. But I want him to hear the metal when you breathe.
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor bully>>
She said you asked for the lock. Hungry little volunteer.
<</actor>>
<<elseif $cageAcceptance eq "forced">>
<<actor bully>>
She said you fought it. Funny, steel still won.
<</actor>>
<<elseif $flags.keptQuietSmell>>
<<actor girlfriend>>
He still likes pretending. Watch his face when you're inside me.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "*Pull your waistband down. Present the lock.*">>
<<actor bully>>
Damn. She really locked you up.
Wild. Kind of impressive, honestly.
<</actor>>
<<actor girlfriend>>
Say it. Out loud. What is that?
<</actor>>
<<actor you>>
…My cage. Your... her... keyholder lock. I don't get to fuck.
<</actor>>
<<actor girlfriend>>
Almost. Try again. Include him.
<</actor>>
<<actor you>>
My cock is locked for you. He fucks you. I watch. I don't cum.
<</actor>>
<<set $sissyScore += 3>>
<<set $complyScore += 2>>
<<run setup.peakArousal()>>
<div class="delayed">[[They start without asking you again|Ultimate humiliation sex]]</div>
<</you-choice>>
<<you-choice "This is too much, ">>
<<actor girlfriend>>
Too much is when you still thought you were the main character.
You're the intermission. Sit. Quiet. Hard. Locked.
<</actor>>
<<actor bully>>
If he talks too much, put him under the bed. Some boys like the dark.
<</actor>>
<<set $resistScore += 1>>
<<set $sissyScore += 2>>
<<run setup.nudgeArousal(16)>>
<div class="delayed">[[She pushes you to the chair by the bed|Ultimate humiliation sex]]</div>
<</you-choice>>
<<you-choice "*Whisper* Please… let me unlock. Just for tonight.">>
<<actor girlfriend>>
Begging for a temporary identity. No.
The key stays between my tits until he's done painting me.
Your job is to stay sealed and jealous. That's your orgasm now... secondhand.
<</actor>>
<<actor bully>>
Listen to your keyholder, beta. Steel is honesty.
<</actor>>
<<set $sissyScore += 4>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<div class="delayed">[[You stay locked. They don't|Ultimate humiliation sex]]</div>
<</you-choice>>
</div>
</div><div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'cuckold/ultimate-chair-pov.jpg'" alt="chair in the corner">
<img class="delayed centered porn-frame" @src="setup.genreGifPrefer('bbc', 'hardcuck')" alt="">
<p class="delayed">From the chair you see everything: her mouth on him, the bed, the joke of your hands on your own knees. The bed complains. She doesn't. Her voice goes high, then filthy, then affectionate in the wrong direction, toward him.</p>
<<actor girlfriend>>
God... yes... just like that,
$youName, eyes open. Don't you dare look at the wall.
This is what a cock looks like when it's invited.
Yours is jewelry. His is the point.
<</actor>>
<<actor bully>>
Tell him what you feel.
<</actor>>
<<actor girlfriend>>
Full. Stretched. Chosen.
And he's sitting there with a locked clitty trying to clap for us.
Come here, baby... closer. Smell it. That's not us. That's <em>him</em> on me.
If you're good, maybe later you clean. Mouth only. No keys. No mercy. No "just the tip" of dignity.
<</actor>>
<<actor-thought you>>
The cage jerks like it wants out of the story. It doesn't get a chapter. Only footnotes: clink, ache, heat, shame so thick it tastes like copper.
You hate how hard the denial makes you. You hate that she knows.
Hallway was rehearsal. This is the show.
<</actor-thought>>
<<actor girlfriend>>
Stroke the cage if you want. Rub the bars like a pet.
You don't get friction. You get the idea of friction.
When he finishes, you're going to thank him for fucking your girlfriend.
Then you're going to thank me for locking you so you couldn't ruin it with that useless little thing.
<</actor>>
<img class="delayed centered" @src="setup.ImagePath+'gf-you/lockup.webp'" alt="">
<span id="conv"></span>
<div id="options">
<<you-choice "Thank you for fucking her. Thank you for locking me.">>
<<set $flags.ultimateHumiliationDone = true>>
<<actor bully>>
There we go. Manners. Nice.
<</actor>>
<<actor girlfriend>>
Good boy. Kneel. Tongue out. Cleanup is a privilege, earn it by not gagging on the truth.
<</actor>>
<<set $sissyScore += 4>>
<<set $complyScore += 3>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 2)>>
<div class="delayed">[[Serve what you weren't allowed to give|Caged service]]</div>
<</you-choice>>
<<you-choice "*Stay silent. Shake. Stare at the lock.*">>
<<set $flags.ultimateHumiliationDone = true>>
<<actor girlfriend>>
Silent and sealed. My favorite setting.
Sleep in the cage. Dream about being useful.
Tomorrow you'll still be locked, and you'll still be mine.
<</actor>>
<<set $sissyScore += 3>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 2)>>
<div class="delayed">[[Home aching, owned|Home]]</div>
<</you-choice>>
<<you-choice "I… I can't do this, ">>
<<set $flags.ultimateHumiliationDone = true>>
<<actor girlfriend>>
You already are. The steel says so.
You can hate it and still drip for it. That's the whole kink, baby.
Kiss the key. Then go to bed hard.
<</actor>>
<<actor bully>>
Same time next week?
<</actor>>
<<actor girlfriend>>
If he behaves. If he doesn't... still yes. The cage doesn't negotiate.
<</actor>>
<<set $resistScore += 2>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 2)>>
<div class="delayed">[[Collapse into owned night|Home]]</div>
<</you-choice>>
</div>
</div>
/* === Act III Chapter 4: Morning after (permanent owned rules) === */<<set $storyBeat = "owned-morning-after">>
<<set $storyAct = 3>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/morning-after-rules.jpg'" alt="morning after">
<img class="hero-img centered delayed porn-frame" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="sheets still wrong">
<p class="delayed">Morning. The bed still smells like him. Your cage is warm. $girlfriendName sits on the edge of the mattress with coffee and the key on her collarbone like it always lived there.</p>
<<actor girlfriend>>
so.
last night happened.
you sat. you watched. you didn't unlock.
good.
that wasn't a one-time show. that was the new baseline.
<</actor>>
<<actor-thought you>>
You want to say temporary. The steel says permanent.
<</actor-thought>>
<<actor girlfriend>>
new rules. permanent. say them back when i'm done.
one: Fridays can be him, the ex, both, or me and $bestfriendName. you get the house and the phone.
two: you clean when i tell you. mouth. no keys. no "just this once."
three: if you beg to unlock, i laugh, then i make it worse.
four: you still call me yours on paper. he calls me when he wants the real thing.
got it?
<</actor>>
<<if $flags.phoneUnlocked>>
<<actor bestfriend>>
(text) morning after. hows the chair boy
she already told me. 💅
<</actor>>
<<else>>
<p class="delayed">$bestfriendName already knows. You can feel it without a text.</p>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Yes keyholder. I understand.">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
good boy.
kiss the key. not the mouth. not yet.
live with it. friday is coming either way.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<div class="delayed">[[Back to owned life|Home]]</div>
<</you-choice>>
<<you-choice "I need time. This is a lot.">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
you had time. it was locked.
take the day. rules still apply.
drama costs favor. steel doesn't care.
<</actor>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Home with a heavier cage|Home]]</div>
<</you-choice>>
<<you-choice "*Whisper* Can Fridays at least be only him, not the ex?">>
<<set $flags.ownedMorningAfterDone = true>>
<<actor girlfriend>>
cute negotiation.
no.
$bullyName and $exfriendName both work. you're not the booking agent.
you're the locked waiting room.
<</actor>>
<<set $sissyScore += 3>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.peakArousal()>>
<div class="delayed">[[Accept the calendar|Home]]</div>
<</you-choice>>
</div>
</div><<run setup.startEdgeTask()>>
<<set _task = $edgeTask>>
<div class="scene-panel compact">
<<print setup.mediaHTML(setup.edgeTaskMedia(), "hero-img porn-frame delayed")>>
<<if $flags.ultimateHumiliationDone>>
<<actor girlfriend>>
Homework, locked boy. After last night you don't get soft tasks.
Open it. Stay sealed. Report like you mean it.
<</actor>>
<<else>>
<<actor girlfriend>>
Keyholder task. Don't make me wait.
Look. Ache. Don't unlock. Don't finish.
<</actor>>
<</if>>
<p class="scene-lead"><strong><<= _task.title>></strong>, <<= _task.blurb>></p>
<<actor-thought you>>
The cage is already warm. The image does the rest.
Heat meter starts at zero. She'll know if you flinch.
<</actor-thought>>
<p class="hint-line">Heat: <<= $edgeHeat>> / 3 · Streak: <<= $edgeStreak>> (best <<= $edgeBest>>)</p>
<span id="conv"></span>
<div id="options">
<<you-choice "*Watch the whole thing. Stroke only the steel.*">>
<<actor-thought you>>
You don't look away. Shame and heat braid. The bars click once.
<</actor-thought>>
<<set $edgeHeat += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Next rule|Edge report step 2]]</div>
<</you-choice>>
<<you-choice "*Glance… then look at the wall.*">>
<<actor girlfriend>>
I saw the typing pause. Coward. Look harder or admit you're scared of liking it.
<</actor>>
<<set $edgeHeat = Math.max(0, $edgeHeat - 1)>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">[[She forces the next prompt|Edge report step 2]]</div>
<</you-choice>>
<<you-choice "I can't, this is too much today.">>
<<actor girlfriend>>
Then fail out loud. Failures still drip. Send “I chickened” and stay locked.
<</actor>>
<<run setup.finishEdgeReport("fail")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Close the chat burning|Edge report result]]</div>
<</you-choice>>
</div>
</div><<set _task = $edgeTask>>
<div class="scene-panel compact">
<<print setup.mediaHTML(setup.edgeTaskMedia(), "hero-img porn-frame delayed")>>
<<actor girlfriend>>
Be honest. How bad is it right now, 1 to 10.
Don't write an essay. One line.
<</actor>>
<p class="hint-line">Heat: <<= $edgeHeat>> / 3 · Task: <<= _task.title>></p>
<span id="conv"></span>
<div id="options">
<<you-choice "It's throbbing. I hate that I need this.">>
<<actor girlfriend>>
Good. Hate and need is the correct flavor. Keep going.
<</actor>>
<<set $edgeHeat += 1>>
<<set $sissyScore += 1>>
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 20>>
<div class="delayed">[[Final phrase|Edge report step 3]]</div>
<</you-choice>>
<<you-choice "I'm fine. Barely notice it.">>
<<actor girlfriend>>
Liar. The photo is still open. Your face is red. Try again in your head... then type the phrase anyway.
<</actor>>
<<set $edgeHeat += 1>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[She doesn't buy it|Edge report step 3]]</div>
<</you-choice>>
<<you-choice "Please unlock. Just for a minute.">>
<<actor girlfriend>>
That's not a report. That's a tantrum.
No key. Higher heat for asking. Phrase next.
<</actor>>
<<set $edgeHeat += 1>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<div class="delayed">[[Denied. Continue.|Edge report step 3]]</div>
<</you-choice>>
</div>
</div><<set _task = $edgeTask>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/cage-lock-ready.jpg'" alt="keyholder locked">
<<actor girlfriend>>
Last step. Type it exactly, or as close as your shaky thumbs allow:
<em>"<<= _task.phrase>>"</em>
Then you can close the chat. Still locked. Still mine.
<</actor>>
<p class="hint-line">Heat: <<= $edgeHeat>> / 3</p>
<span id="conv"></span>
<div id="options">
<<you-choice "*Type her phrase exactly. Mean it.*">>
<<actor you>>
<<= _task.phrase>>
<</actor>>
<<actor girlfriend>>
Screenshot saved. Good boy.
<<if $edgeHeat gte 2>>
High heat. I'm almost proud. Almost.
<<else>>
Could've burned hotter. Still counts.
<</if>>
<</actor>>
<<run setup.finishEdgeReport("obey")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Send report|Edge report result]]</div>
<</you-choice>>
<<you-choice "*Type a half-hearted version / sarcastic spin*">>
<<actor girlfriend>>
Cute attitude. Streak broken. Cage stays. Arousal stays. Lesson stays.
<</actor>>
<<run setup.finishEdgeReport("resist")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[She reacts|Edge report result]]</div>
<</you-choice>>
<<you-choice "*Close the app without typing*">>
<<actor girlfriend>>
Seen: chicken. I'll remember. Tomorrow's task won't be softer.
<</actor>>
<<run setup.finishEdgeReport("fail")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Burn in silence|Edge report result]]</div>
<</you-choice>>
</div>
</div><div class="scene-panel compact">
<<if $edgeStreak gt 0 && $edgeHeat gte 2>>
<img class="hero-img centered" @src="setup.ImagePath+'gf-you/lockup.webp'" alt="">
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
Report filed. Streak: $edgeStreak (best $edgeBest).
good boy energy. stay sealed. maybe mouth later, not cock.
<</actor>>
<<elseif $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
logged. streak $edgeStreak. don't get cocky.
you did the minimum. i'm not impressed yet.
<</actor>>
<<else>>
<<actor girlfriend>>
Report filed. Streak: $edgeStreak (best $edgeBest).
Stay sealed. Maybe later mouth, not cock.
Same time tomorrow.
<</actor>>
<</if>>
<<actor-thought you>>
Denied and scored. The worst part is wanting the next task already.
<</actor-thought>>
<<elseif $edgeStreak gt 0>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="still locked">
<<actor girlfriend>>
Logged. Streak $edgeStreak. Could burn more next time... look longer.
<</actor>>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="still locked">
<<if $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
streak dead. my patience too. cage stays. fix your attitude.
<</actor>>
<<else>>
<<actor girlfriend>>
Streak dead. Cage alive. Sleep hard if you can.
<</actor>>
<</if>>
<<if $flags.ultimateHumiliationDone>>
<<actor girlfriend>>
After what you watched in our bed, this was easy mode. Don't flinch tomorrow.
<</actor>>
<</if>>
<</if>>
/* Caption story: Snap reward on pass, progress reset on fail */
<<if $edgeCaptionReward && $edgeCaptionReward.id>>
<<actor girlfriend>>
reward snap. part <<= $edgeCaptionReward.progress>> / <<= $edgeCaptionReward.total>>.
<<= $edgeCaptionReward.title>>.
open it once. gallery keeps the good ones. 📸
<</actor>>
<div class="edge-snap-reward">
<p class="edge-snap-reward-label">👻 New Snap · part <<= $edgeCaptionReward.progress>> / <<= $edgeCaptionReward.total>></p>
<div class="edge-snap-reward-cta">
[[Open Snap|Phone snap]]
</div>
</div>
<<elseif $edgeCaptionReward && $edgeCaptionReward.complete>>
<<actor girlfriend>>
you've got the whole set. good boy archive.
keep reporting. i still like watching you ache. 😘
<</actor>>
<p class="hint-line">Caption story complete · <<= setup.captionStoryProgressLabel()>></p>
<<elseif $edgeCaptionReset>>
<<actor girlfriend>>
pic story resets. you start over next clean report.
gallery can keep what you already earned. progress doesn't.
<</actor>>
<p class="hint-line">Caption story reset · next success starts at 1 / <<= (setup.captionStoryOrder || []).length>></p>
<</if>>
<p class="hint-line">Sissy <<= $sissyScore>> · GF favor <<= $girlfriendTrustLevel>> · Arousal <<= $aroused>> · Personality <<= $personality>></p>
<div class="continue-links">
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
[[Home]]
<<if $caged && $edgeHeat gte 2 && random(1, 3) eq 1>>[[Beg to serve (mouth only)|Caged service]]<</if>>
</div>
</div><<if !setup.fridayDateReady()>>
<<goto "Home">>
<<elseif !setup.canPayFridayDate()>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-gf-date.jpg'" alt="Friday night weight">
<p class="scene-lead">Friday. The day has a different weight. Her plans land after dark.</p>
<p class="hint-line">Tonight's bill (you pay): <strong>$<<= _fdCost >></strong> · wallet <strong>$<<= $money >></strong></p>
<<if $gameDate.getHours() gte 17>>
<div class="continue-links">
<<link `"It's evening, go · $" + _fdCost` setup.fridayDatePassage()>><</link>>
[[Home]]
</div>
<<else>>
<p class="hint-line">Too early. Kill time, then the night starts. Bring cash.</p>
<div class="continue-links">
[[Wait until evening|Wait until evening]]
[[Home]]
</div>
<</if>>
</div>
<</if>><<set _fdCost = setup.fridayDateCost()>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="broke on Friday">
<h2 class="scene-title">Broke on Friday</h2>
<p class="scene-lead">Her night still costs money. Yours.</p>
<p class="hint-line">Need <strong>$<<= _fdCost >></strong> · you have <strong>$<<= $money >></strong>.</p>
<<actor girlfriend>>
<<if $caged>>
cute. locked and empty pockets.
earn it. hustles. hotel weekends. then maybe you get to fund my Friday like a useful wallet.
<<else>>
you want Friday with me? bring money.
i don't do broke dates. 😒
<</if>>
<</actor>>
<p class="hint-line">School hustles on weekdays. Hotel work on weekends. Come back next Friday with cash.</p>
<div class="continue-links">
[[Home]]
</div>
</div><<if !setup.canPayFridayDate("gf")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("gf")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-gf-date.jpg'" alt="Friday date with her">
<p class="delayed">Friday night. Just you and $girlfriendName. No rankings. No third person, not yet.</p>
<p class="hint-line">Date cost: <strong>$<<= _fdCost >></strong> (dinner, drinks, you pay) · wallet $<<= $money >></p>
<<actor girlfriend>>
okay. real date.
you get me for the evening. your card. try not to ruin it by overthinking. 😘
<</actor>>
<<actor-thought you>>
Her hand in yours feels normal. You don't know yet how rare that becomes. Or how permanent the bill becomes.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Be sweet. Pay. Listen. Walk her home.">>
<<actor girlfriend>>
see? you can be a boyfriend.
this was nice. do it again next friday.
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set $complyScore += 1>>
<<run setup.nudgeArousal(6)>>
<<run setup.completeFridayDate("gf")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Try to get physical too fast.">>
<<actor girlfriend>>
easy. dinner first. you still pay for dinner.
...okay. kiss. that's enough for public. 😏
<</actor>>
<<run setup.nudgeArousal(8)>>
<<set $sissyScore += 0>>
<<run setup.completeFridayDate("gf")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("keyholder")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("keyholder")>>
<div class="scene-panel compact">
<img class="hero-img centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="">
<p class="delayed">Friday date, post-lock edition. She wears the key like jewelry. You wear the reason.</p>
<p class="hint-line">Keyholder dinner: <strong>$<<= _fdCost >></strong> · you pay, she keeps the key · wallet $<<= $money >></p>
<<actor girlfriend>>
date night.
you're still locked. that doesn't cancel dinner.
it just makes dessert more interesting for me. and yes, your card. 😈
<</actor>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="">
<span id="conv"></span>
<div id="options">
<<you-choice "Hold the door. Pay. Call her keyholder only when she asks.">>
<<actor girlfriend>>
good boy.
public soft. private steel. that's the vibe.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("keyholder")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask if tonight means unlock.">>
<<actor girlfriend>>
aww.
no.
date means i get fed. you get to walk next to the key. 🙄
<</actor>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("keyholder")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("caged_public")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("caged_public")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-caged-public.jpg'" alt="caged public date">
<p class="delayed">Dinner. A real restaurant. Cloth napkins. Her in something that makes the waiter look twice. You in steel under denim. She chose this place on purpose. Quiet corners. Low light. The kind of table where no one hears what she whispers.</p>
<p class="hint-line">Caged dinner: <strong>$<<= _fdCost >></strong> (you pay, you ache) · wallet $<<= $money >></p>
<<actor girlfriend>>
tonight we do normal.
you hold the door. you order for me. you pay.
and you sit there knowing what's under the table. 😏
<</actor>>
<<actor-thought you>>
Normal. She says normal like it's a costume you both wear in public.
Under the table, the cage is warm from body heat and the walk from the car.
She crosses her legs. The key catches the candlelight for half a second.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'girlfriend/keyholder-key-smile.jpeg'" alt="">
<span id="conv"></span>
<div id="options">
<<you-choice "Order for her. Wine. Steak. Be the boyfriend she pretends you still are.">>
<<actor girlfriend>>
see? you remember how to be normal when the cage isn't the only topic.
cute napkin fold. you practiced. 😘
<</actor>>
<p class="delayed">The waiter brings dessert. She leans in. Her lips brush your ear.</p>
<<actor girlfriend>>
you're doing so well. almost like you forgot.
almost.
then you shifted. and the cage reminded you. didn't it? 😈
<</actor>>
<<actor-thought you>>
You didn't forget. Not for one second. The steel is a pulse you can't silence.
Her perfume. The dessert menu. The way she smiled at the waiter like he was more interesting than you.
You paid for all of it. You enjoyed none of it. That's the point.
<</actor-thought>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Whisper: can we skip dessert and go home?">>
<<actor girlfriend>>
go home?
we just got here. dessert is the best part.
not for you, obviously. but you're not the one who gets dessert tonight.
sit. eat. pay. smile. 😈
<</actor>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Reach for her hand under the table. She pulls it to the key.">>
<<actor girlfriend>>
that's not your hand's job tonight.
the key stays where it is. your hand goes back to the napkin.
cute try, though. 😏
<</actor>>
<img class="delayed centered" @src="setup.ImagePath+'girlfriend/keyholder-bed-sit.jpg'" alt="">
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("caged_public")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("bull1")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("bull1")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-bull-leave.jpg'" alt="she leaves with him">
<p class="delayed">Friday. Her calendar says $bullyName. Yours says wait. And pay.</p>
<p class="hint-line">Her night with him: <strong>$<<= _fdCost >></strong> (you fund it) · wallet $<<= $money >></p>
<<actor girlfriend>>
i'm going out with him.
you stay home. phone on. no stalking.
you cover the night. that's your romantic role. 😏
<</actor>>
<<actor-thought you>>
First bull Friday. The cage is a countdown clock with no alarm, only ache. Your wallet is already lighter in your head.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/night-out-wait.jpg'" alt="you wait locked">
<span id="conv"></span>
<div id="options">
<<you-choice "Yes keyholder. I'll wait. And pay.">>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/night-out-return.jpg'" alt="">
<<actor girlfriend>>
late. messy. his cologne.
you're still up. cute.
kiss the air. you don't get the real one. 😘
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull1")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Beg her not to go.">>
<<actor girlfriend>>
that's not how Fridays work anymore.
i still go. you still pay. favor dips for the drama. 😒
<</actor>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<<run setup.peakArousal()>>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/jenny-kiss-bed.jpeg'" alt="">
<<run setup.completeFridayDate("bull1")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("bull2")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("bull2")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-ex-leave.jpg'" alt="Friday with the ex">
<p class="delayed">Friday name on her lips: $exfriendName. Her ex. Not a stranger. Worse. $bullyName was chapter one. The ex is the sequel that already knows her body.</p>
<p class="hint-line">Ex Friday tax: <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor girlfriend>>
not a "new guy."
$exfriendName.
we have history. you have a cage and a card.
same rules: phone on. no stalking. don't text "are you safe." 😈
<</actor>>
<<actor bestfriend>>
omg ex arc
he already knows how she sounds
send pics or it didn't happen
(not to the locked one. to me.) 💅
<</actor>>
<<actor-thought you>>
You used to lose her to him in hallways. Now you lose her on purpose. With a key on her chain. And you still pay.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="you wait locked">
<<if $flags.phoneUnlocked>>
<p class="delayed hint-line">Phone buzzes. Then buzzes again. Then silence.</p>
<<actor bestfriend>>
(text) update: they went to that place on 5th. the one you can't afford. 💅
<</actor>>
<<actor girlfriend>>
(text) don't wait up. or do. i don't control your bedtime. 😈
<</actor>>
<<actor-thought you>>
Two texts. Both from her world. None from yours.
The cage answers each buzz with a throb you can't text back.
<</actor-thought>>
<p class="delayed hint-line">An hour later. A photo.</p>
<<actor girlfriend>>
(photo) mirror. key on my neck. his cologne on my wrist.
caption: history hits different when the current bf is sealed 😘
<</actor>>
<<actor bestfriend>>
(text) SHE SENT ME THE MIRROR PIC
the AUDACITY. also the lighting. 💀💅
<</actor>>
<<actor-thought you>>
Mirror. Key. His cologne. Three things in one frame. None of them are you.
You zoom in. Then zoom out. Then put the phone down.
Pick it up again. The photo is still there. So is the cage.
<</actor-thought>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Stay home. Clean something. Suffer productively.">>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/friday-ex-return.jpg'" alt="she comes back late">
<<actor girlfriend>>
home smells like bleach and denial when i get back.
he was familiar. you're still locked. math checks out.
<</actor>>
<<actor-thought you>>
She walks in at 1am. Hair wrong. Lipstick smeared. His cologne on her collar like a signature.
She doesn't hide it. Why would she? The rules say you clean. The rules say you wait.
The rules don't say anything about how long the shower runs after.
<</actor-thought>>
<<if $flags.phoneUnlocked>>
<<actor bestfriend>>
(text) post-friday report
he brought her flowers. she brought you a story.
your move, chair boy. 💅
<</actor>>
<</if>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull2")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask if $bullyName knows.">>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/friday-ex-return.jpg'" alt="she comes back late">
<<actor girlfriend>>
maybe.
maybe he likes competition.
$exfriendName already does.
not your department.
<</actor>>
<<actor-thought you>>
She says "maybe" the way she says "good boy" — like the answer is obvious and you're slow.
$bullyName knows. $bestfriendName knows. The whole group chat knows.
You're the last to hear what everyone already said.
<</actor-thought>>
<<actor bestfriend>>
(text) he knows
she told him for fun
sit. 💅
<</actor>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("bull2")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("both")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("both")>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-both-leave.jpg'" alt="Friday with both of them">
<p class="delayed">Friday double booking. $bullyName and $exfriendName. Alpha and ex. She says it like a calendar invite, not a confession.</p>
<p class="hint-line">Double booking bill: <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor girlfriend>>
both.
you heard me.
$bullyName and $exfriendName.
you get the house. they get me. you get the receipt.
if you're very good, chair rights later, not tonight. 😈
<</actor>>
<<actor-thought you>>
Two names you already know. One key. Zero room for you on the bed. Full price for the empty house.
<</actor-thought>>
<img class="delayed centered" @src="setup.ImagePath+'story/owned/caged-waiting.jpg'" alt="you wait locked">
<span id="conv"></span>
<div id="options">
<<you-choice "Lock the door after she leaves. Wait. Don't call.">>
<img class="delayed centered porn-frame" @src="setup.ImagePath+'cuckold/jenny-kiss-bed.jpeg'" alt="">
<<actor girlfriend>>
morning after text: sore. smiling. still yours on paper.
theirs on Friday. 😏
<</actor>>
<<set $complyScore += 3>>
<<set $sissyScore += 3>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 2)>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("both")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask to watch.">>
<<actor girlfriend>>
greedy.
not this Friday. earn chair energy another night. you still paid for this one.
<</actor>>
<<set $sissyScore += 2>>
<<set $resistScore += 1>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("both")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.canPayFridayDate("alessia")>>
<<include "Friday date broke">>
<<else>>
<<set _fdCost = setup.fridayDateCost("alessia")>>
<<set _walletCost = _fdCost + 15>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/friday-alessia-night.jpg'" alt="Jenny and Alessia out for the night">
<p class="delayed">Friday plan includes $bestfriendName. Devil energy. Jenny's laugh in stereo. Rain on neon, key on her chain, you not on the guest list.</p>
<p class="hint-line">Girls' night (your wallet): <strong>$<<= _fdCost >></strong> · wallet $<<= $money >></p>
<<actor bestfriend>>
we're going out.
you're not.
unless jenny wants a purse with legs, then maybe you carry. either way you pay. 💅
<</actor>>
<<actor girlfriend>>
she's mean. i'm worse when she eggs me on.
stay home. stay locked. fund the night. we might send a mirror pic. 😈
<</actor>>
<span id="conv"></span>
<div id="options">
<<if setup.canPayFridayDate("alessia", { extra: 15 })>>
<<you-choice "Offer to be useful, driver, wallet, silent third.">>
<<actor bestfriend>>
wallet boy. i like that.
don't talk unless spoken to.
<</actor>>
<<actor girlfriend>>
proud of the utility. not of the spine.
kiss on the cheek. crumbs. 😘
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(10)>>
<<run setup.completeFridayDate("alessia", { extra: 15 })>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> (base + tip) · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<else>>
<p class="hint-line">Wallet-boy offer needs <strong>$<<= _walletCost >></strong>. You only have $<<= $money >>.</p>
<</if>>
<<you-choice "Stay home. Don't ask for crumbs.">>
<<actor girlfriend>>
smart.
we had fun. you're still the secret under my rules. card still worked. 😘
<</actor>>
<<set $sissyScore += 1>>
<<run setup.peakArousal()>>
<<run setup.completeFridayDate("alessia")>>
<p class="hint-line delayed">−$<<= $flags.fridayLastPaid >> · wallet $<<= $money >></p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if !setup.genreHas("vesperina")>>
<div class="scene-panel compact">
<p class="scene-lead">No clip pack installed.</p>
<div class="continue-links">[[Home]]</div>
</div>
<<elseif $flags.goddessPlaylistComplete>>
<div class="scene-panel compact">
<<actor girlfriend>>
playlist's done. you already picked favorites.
<</actor>>
<<if setup.goddessBestClipIndex() neq null>>
<div class="continue-links">[[Rewatch your #1|Goddess homework finale]]</div>
<</if>>
<div class="continue-links">[[Home]][[Tasks|Phone tasks]][[Home screen|Phone]]</div>
</div>
<<elseif !setup.goddessHomeworkReady() && ($flags.goddessLastDayKey || !setup.isJennyClipDay())>>
<div class="scene-panel compact">
<<if setup.isJennyClipDay()>>
<p class="scene-lead">Clip homework is already done for today.</p>
<<else>>
<p class="scene-lead">Clip homework only lands Tuesday and Thursday. Next: <<= setup._nextWeekdayLabel(setup.JENNY_CLIP_WEEKDAYS)>>.</p>
<</if>>
<div class="continue-links">[[Home]][[Tasks|Phone tasks]][[Home screen|Phone]]</div>
</div>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/homework-assign.jpg'" alt="clip homework assignment">
<<actor girlfriend>>
special homework. not the free porn menu.
one new clip. no repeats until the whole set is done.
sound on. watch it. don't cum.
afterward you rate it. i want to know which one wrecks you most.
<</actor>>
<<actor bestfriend>>
<<= setup.goddessClipsLeft()>> left in the set if you finish this one 😈
don't skip. she checks.
<</actor>>
<p class="hint-line">Unwatched left (before this one): <<= setup.goddessClipsLeft()>></p>
<p class="hint-line credit-line">Clip pack shoutout: <strong><<= setup.VESPERINA_CREDIT>></strong>. Some of these homework clips are AI edits built from her work. Support the source if you can.</p>
<div class="continue-links">
[[Open the clip|Goddess homework watch]]
<<link "Open Goddess Vesperina (browser)">><<run setup.openVesperina()>><</link>>
[[Skip (she'll notice)|Goddess homework skip]]
</div>
</div>
<</if>><div class="scene-panel compact">
<p class="scene-lead">Sound on. Full attention. Finish it → rate it → it's checked off forever.</p>
<<print setup.vesperinaHTML()>>
<p class="hint-line credit-line">Shoutout: <<= setup.VESPERINA_CREDIT>> · homework clips include AI edits from her content (local files only).</p>
<<actor-thought you>>
Homework. New clip every time. At the end she'll ask which one hit hardest.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "*Watch to the end. Hands off / cage only.*">>
<<actor girlfriend>>
good. now rate it. don't lie, i can tell.
<</actor>>
<<run setup.finishGoddessHomework("done")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Rate the assignment|Goddess homework rate]]</div>
<</you-choice>>
<<you-choice "*Mute and half-watch*">>
<<actor girlfriend>>
half-ass still counts as watched. still rate it.
<</actor>>
<<run setup.finishGoddessHomework("done")>>
<<set $sissyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Rate it|Goddess homework rate]]</div>
<</you-choice>>
<<you-choice "*Close before the end*">>
<<actor bestfriend>>
chicken 💅
<</actor>>
<<actor girlfriend>>
skipping. that clip stays on the list.
<</actor>>
<<run setup.finishGoddessHomework("skip")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div><div class="scene-panel compact">
<<if $goddessPendingClip eq null>>
<p class="scene-lead">Nothing to rate.</p>
<div class="continue-links">[[Home]]</div>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/homework-rate.jpg'" alt="rate the homework">
<<actor girlfriend>>
that clip. be honest.
1 to 10. ten means it wrecked you.
<</actor>>
<<actor bestfriend>>
don't put a 3 and lie 😈
<</actor>>
<p class="hint-line">Clip #<<= $goddessPendingClip>> · 1 = meh · 10 = need that forever</p>
<div class="genre-grid goddess-rate-grid">
<<link "1" "Goddess homework after rate">><<run setup.rateGoddessClip(1)>><</link>>
<<link "2" "Goddess homework after rate">><<run setup.rateGoddessClip(2)>><</link>>
<<link "3" "Goddess homework after rate">><<run setup.rateGoddessClip(3)>><</link>>
<<link "4" "Goddess homework after rate">><<run setup.rateGoddessClip(4)>><</link>>
<<link "5" "Goddess homework after rate">><<run setup.rateGoddessClip(5)>><</link>>
<<link "6" "Goddess homework after rate">><<run setup.rateGoddessClip(6)>><</link>>
<<link "7" "Goddess homework after rate">><<run setup.rateGoddessClip(7)>><</link>>
<<link "8" "Goddess homework after rate">><<run setup.rateGoddessClip(8)>><</link>>
<<link "9" "Goddess homework after rate">><<run setup.rateGoddessClip(9)>><</link>>
<<link "10" "Goddess homework after rate">><<run setup.rateGoddessClip(10)>><</link>>
</div>
<</if>>
</div><<run setup.markGoddessClipWatched()>>
<<goto "Goddess homework done">><div class="scene-panel compact">
<<if $flags.goddessPlaylistComplete>>
<<actor girlfriend>>
that's all of them. playlist done.
<<if $girlfriendTrustLevel gte 7>>
you actually finished for me. cute. now pick which one wrecked you.
<<else>>
you finished the set. don't expect a gold star. now which one wrecked you.
<</if>>
<</actor>>
<<actor bestfriend>>
final exam: your #1 💅
<</actor>>
<div class="continue-links">
[[Show me my #1|Goddess homework finale]]
</div>
<<else>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
logged. good boy. that clip is done.
<<= setup.goddessClipsLeft()>> left. rate honest.
<</actor>>
<<elseif $girlfriendTrustLevel lte 4>>
<<actor girlfriend>>
logged. bare minimum. <<= setup.goddessClipsLeft()>> left.
don't half-ass the ratings.
<</actor>>
<<else>>
<<actor girlfriend>>
logged. that clip is done, you won't get it again.
<<= setup.goddessClipsLeft()>> left in the set.
<</actor>>
<</if>>
<<if setup.goddessBestClipIndex() neq null>>
<p class="hint-line">Current #1: clip #<<= setup.goddessBestClipIndex()>> (<<= $goddessClipScores[String(setup.goddessBestClipIndex())]>>/10)</p>
<</if>>
<<if $caged>>
<<actor-thought you>>
Still locked. One more unique clip gone.
<</actor-thought>>
<</if>>
<p class="hint-line">Sissy <<= $sissyScore>> · GF favor <<= $girlfriendTrustLevel>> · Clips left <<= setup.goddessClipsLeft()>></p>
<div class="continue-links">
[[Home]]
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
</div>
<</if>>
</div><div class="scene-panel compact">
<<set _best = setup.goddessBestClipIndex()>>
<<if _best eq null>>
<<actor girlfriend>>
you rated everything meh? boring. go home.
<</actor>>
<div class="continue-links">[[Home]]</div>
<<else>>
<<actor girlfriend>>
your #1. clip #<<= _best>>, you gave it <<= $goddessClipScores[String(_best)]>>/10.
sound on. watch it again. this is the one that wrecked you.
<</actor>>
<<actor bestfriend>>
<<= $goddessClipScores[String(_best)]>> out of ten. pathetic. iconic. 😈
<</actor>>
<<print setup.goddessClipHTML(_best)>>
<<actor-thought you>>
She knows. Of course she knows. The whole set was just to find this one.
<</actor-thought>>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(10)>>
<div class="continue-links">
[[Home]]
[[Tasks|Phone tasks]]
[[Home screen|Phone]]
</div>
<</if>>
</div><div class="scene-panel compact">
<<actor girlfriend>>
you skipped.
don't expect soft mornings.
<</actor>>
<<run setup.finishGoddessHomework("skip")>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Home]]</div>
</div>/* Critical evening quests: Sleep skips to next morning and softlocks them */
<<silently>>
<<set _storyEvening = ($flags.keyRulesDone && $flags.sisterVisit1 && $flags.phoneLeakScareDone && !$flags.nightOutSmellDone) || ($flags.keyholderDebriefDone && $flags.bullyPresenceDone && !$flags.ultimateHumiliationDone)>>
<<set _skipEvening = !!$flags.sleepSkipEvening>>
<<set $flags.sleepSkipEvening = false>>
<</silently>>
<<if _storyEvening && !$skipEvening && $gameDate.getHours() lt 18>>
<div class="scene-panel compact sleep-panel">
<p class="scene-lead">If you sleep now you wake tomorrow morning, and miss tonight.</p>
<p class="hint-line">Her plans land after dark. Use <strong>Wait for evening</strong> first, or sleep past it on purpose.</p>
<div class="continue-links">
[[Wait for evening|Wait until evening]]
<<link "Sleep anyway (skip tonight)" "Sleep">><<set $flags.sleepSkipEvening = true>><</link>>
[[Home]]
</div>
</div>
<<else>>
<<silently>>
/* Always allow sleep, high heat = restless night, not a softlock */
<<set _restless = ($aroused gt 50)>>
<<set _dream = random(1, 6)>>
<<set _sleepLines = []>>
<<if _restless>>
<<set _sleepLines = _sleepLines.concat(["You are too wound up for real rest. Sleep still comes, thin, sweaty, full of noise."])>>
<</if>>
<<if $caged>>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["You fall into bed. Dream: " + $girlfriendName + " jiggles the cage and laughs soft, not cruel, worse."])>>
<<set $sissyScore += 1>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["Dream: hotel lobby, guests, and the metal clicks every time you walk. You wake with a jolt of shame."])>>
<<elseif _dream eq 3 && $flags.ultimateHumiliationDone>>
<<set _sleepLines = _sleepLines.concat(["Dream: the bed from that night. Chair. Thank-you words you don't remember choosing. You wake hard against steel."])>>
<<set $sissyScore += 1>>
<<elseif _dream eq 4 && ($flags.nightOutSmellDone || $flags.noticedSmell)>>
<<set _sleepLines = _sleepLines.concat(["Dream: cologne that isn't yours on her neck. You try to speak and only the cage answers."])>>
<<elseif _dream eq 5>>
<<set _sleepLines = _sleepLines.concat(["Dream: the key on her chain, spinning, never landing in your palm. Morning light. Still locked."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["Uneasy sleep. The cage is a second heartbeat under the sheet. You dream nothing clear, only pressure."])>>
<</if>>
<<elseif $world eq "anwo">>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["Dream: rankings on a board with your name too low. You wake before the number finishes writing itself."])>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["Dream: " + $teacherName + "'s calm voice explaining ownership like weather. You wake annoyed, and a little hard."])>>
<<elseif _dream eq 3>>
<<set _sleepLines = _sleepLines.concat(["Dream: group chat bubbles stacking forever. You mute them in the dream. They keep coming."])>>
<<elseif _dream eq 4 && $flags.caughtStroking1>>
<<set _sleepLines = _sleepLines.concat(["Dream: anniversary door opening. You wake before the worst part and still feel watched."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["Restless sleep. ANWO static under ordinary dreams."])>>
<</if>>
<<else>>
<<if _dream eq 1>>
<<set _sleepLines = _sleepLines.concat(["You sleep hard. Boring dreams. Bless boring."])>>
<<elseif _dream eq 2>>
<<set _sleepLines = _sleepLines.concat(["Dream: mall lights and nothing sharp. You wake almost refreshed."])>>
<<elseif _dream eq 3>>
<<set _sleepLines = _sleepLines.concat(["Dream: school without the new rules. A version of you that only worried about grades."])>>
<<else>>
<<set _sleepLines = _sleepLines.concat(["You fall into the bed and dream nothing special."])>>
<</if>>
<</if>>
<<if $jobMailCounter > 0>>
<<set $jobMailCounter-->>
<</if>>
/* Used-panty school day ends with sleep; key never stays with bully overnight */
<<if $flags.wearingUsedPanty>>
<<set $flags.wearingUsedPanty = false>>
<<set _sleepLines = _sleepLines.concat(["You peel off last night's panties like evidence. The cage is still the only honest thing under the sheets."])>>
<</if>>
<<if $flags.keyWithBully>>
<<set $flags.keyWithBully = false>>
<</if>>
/* Missed Phone Tasks (Edge / Clip homework) → GF favor down before day rolls */
<<run setup.applyMissedPhoneTasks()>>
<<if $_missedTasksNote>>
<<set _sleepLines = _sleepLines.concat([String($_missedTasksNote)])>>
<<if $girlfriendTrustLevel lte 3>>
<<set _sleepLines = _sleepLines.concat(["She is colder when you ghost the homework. Favor is not free."])>>
<</if>>
<</if>>
/* Bully Snap first (rare pic). Jenny overnight text is rarer once he can spam the vibe. */
<<set _bullySnapNight = setup.maybeQueueBullySnap()>>
/* Overnight Jenny/Alessia text snaps (no pics). Keep story-critical; soft randoms reduced. */
<<if $flags.phoneUnlocked && !$flags.phoneOvernightPending>>
<<if $caged && !$flags.phone4Read>>
/* Story-critical DM nudge */
<<set $flags.phoneOvernightPending = true>>
<<elseif $_missedTasksNote>>
/* Missed Edge/Clip: she nags */
<<set $flags.phoneOvernightPending = true>>
<<elseif $flags.day10Confessed && !$flags.phone3Read && random(1, 3) eq 1>>
<<set $flags.phoneOvernightPending = true>>
<<elseif !_bullySnapNight && $caged && $girlfriendTrustLevel gte 4 && random(1, 9) eq 1>>
/* Soft tease: uncommon so Snap stays special */
<<set $flags.phoneOvernightPending = true>>
<<elseif !_bullySnapNight && $caged && $flags.ultimateHumiliationDone && random(1, 9) eq 1>>
<<set $flags.phoneOvernightPending = true>>
<<elseif !_bullySnapNight && $world eq "anwo" && !$caged && random(1, 12) eq 1>>
/* Pre-cage ambient: rare */
<<set $flags.phoneOvernightPending = true>>
<</if>>
<</if>>
/* High favor: soft-unlock private gallery album (no spam) */
<<if $caged && $girlfriendTrustLevel gte 7>>
<<run setup.applyFavorGalleryBonus()>>
<</if>>
/* Cool heat overnight so you are not stuck wired forever */
<<if _restless>>
<<set $aroused = Math.max(15, Math.min(40, Math.floor($aroused * 0.35)))>>
<<set _sleepLines = _sleepLines.concat(["Morning: the edge is duller. Not gone, just quieter."])>>
<<else>>
<<set $aroused = Math.max(0, Math.floor($aroused * 0.5))>>
<</if>>
/* Roll the calendar safely */
<<run setup.advanceToNextMorning()>>
<<set $_missedTasksNote = "">>
<</silently>>
<div class="scene-panel compact sleep-panel">
<img class="hero-img sleep-img centered" @src="setup.sleepMedia()" alt="">
<div class="sleep-copy">
<<for _si to 0; _si lt _sleepLines.length; _si++>>
<p class="sleep-line"><<= _sleepLines[_si]>></p>
<</for>>
</div>
<div class="continue-links">[[Wake up|Home]]</div>
</div>
<</if>>
/* Advance same day to 19:00, used by night-out / ultimate humiliation quests.
Normal Sleep jumps to next morning 08:00 and softlocked those banners. */<div class="scene-panel compact sleep-panel">
<img class="hero-img sleep-img centered" @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.gif'" alt="">
<<if $gameDate.getHours() gte 18>>
<p class="scene-lead">It's already evening. Whatever she planned, it's time.</p>
<<else>>
<<set _wait = random(1, 3)>>
<<if _wait eq 1>>
<p class="scene-lead">You kill daylight on your phone. Scroll. Cage. Scroll. The windows go blue then black.</p>
<<elseif _wait eq 2>>
<p class="scene-lead">Pacing. Water. Another check of the clock. Time is slower when you're sealed.</p>
<<else>>
<p class="scene-lead">You almost sleep sitting up and force yourself awake, evening is the appointment.</p>
<</if>>
<<run setup.setGameHour(19)>>
<<run setup.nudgeArousal(6)>>
<p class="sleep-line">Nineteen hundred. Keys. Messages. Footsteps that might not be hers alone.</p>
<</if>>
<<if $caged && $flags.keyholderDebriefDone && $flags.bullyPresenceDone && !$flags.ultimateHumiliationDone>>
<div class="continue-links">
[[Face the night|Ultimate humiliation night]]
[[Home first|Home]]
</div>
<<elseif $caged && $flags.keyRulesDone && $flags.sisterVisit1 && $flags.phoneLeakScareDone && !$flags.nightOutSmellDone>>
<div class="continue-links">
[[Wait for her to come home|Night out return]]
[[Home|Home]]
</div>
<<else>>
<div class="continue-links">
[[Home]]
</div>
<</if>>
</div><<if $tempText>>
$tempText
<<set $tempText = "">>
<</if>>
You are sleepy and you go to bed
[[Sleep][$aroused = 0]]<div class="scene-panel compact">
<img class="hero-img cage-frame" @src="setup.cageMedia()" alt="">
<h2 class="scene-title">Cage + porn</h2>
<p class="scene-lead">Clip on screen. Steel in your hand. Nothing unlocks, maybe a weak leak.</p>
<div class="genre-grid">
[[Girlfriend|Stroke cage gf]]
[[Soft cuckold|Stroke cage cuck]]
[[Hard cuckold|Stroke cage hard cuck]]
[[Femdom / cage tease|Stroke cage femdom]]
<<if setup.genreHas("bbc")>>[[BBC fantasy|Stroke cage bbc]]<</if>>
[[Oral / service|Stroke cage oral]]
[[Voyeur / spy|Stroke cage voyeur]]
<<if $world eq "anwo" || $sissyScore gt 0>>[[ANWO / hierarchy|Stroke cage anwo]]<</if>>
<<if $sissyScore gte 2 || $flags.googledSissy>>[[Sissy tease|Stroke cage sissy]]<</if>>
[[Just the steel|Stroke cage]]
[[Back|Jerk off]]
</div>
</div><div class="scene-panel compact">
<img class="hero-img cage-frame centered" @src="setup.cageMedia()" alt="">
<p class="delayed">You cup the cage. Squeeze. Rub the seam through steel and skin. Nothing opens. Everything insists.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
Humiliating. Hot. Pointless in the way she likes, effort with no exit unless she turns a key you do not hold.
<<if $flags.nightOutSmellDone || $flags.noticedSmell>>
You think of cologne on her neck. Of someone else finishing.
<<elseif $flags.keyRulesDone>>
Rules on loop: no unlocking, tell her when you're desperate, wait when she's out.
<</if>>
<</actor-thought>>
<p class="delayed">Pressure builds into a weak, leaking climax that does not feel like winning, more like the cage collecting evidence.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<actor you>>
Ah... fuck... still locked,
<</actor>>
<<set $aroused = 0>>
<<set $sissyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">
[[Clean up. Stay caged.|Home]]
</div>
</div><div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'girlfriend/sexy'+ random(1, 4) +'.jpeg'" alt="">
<p class="scene-lead">$girlfriendName on the screen. Key somewhere you can't reach. You jiggle the cage like it might impress her.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
She looks free. You're hardware. The steel gets warm; she doesn't.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 1>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe the bars. Stay locked.|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<p class="scene-lead">Them on the clip. You on the lock. Soft cuck soundtrack while you rub steel only.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
They're finishing. You're stuck rubbing a lock. Of course you are.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 2>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Clean up. Stay caged.|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.genreGif('hardcuck')" alt="">
<p class="scene-lead">Harder clip of <em>them</em>. Louder. You grind the cage until your thighs shake, your cock never joins the movie.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor you>>
Still, locked, watching,
<</actor>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Shame-wipe. Stay sealed.|Home]]</div>
</div><div class="scene-panel compact">
/* Locked-body only, cage jiggle / keyholder inspect, not free-cock femdom */
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<p class="scene-lead">She jiggles the cage in your head... key on a chain, nail on the lock, little shake that says <em>mine</em>.</p>
<img class="delayed centered cage-frame" @src="setup.genreGifPrefer('keyholder', 'femdom', 'cage')" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
Yes keyholder. No unlock. Leak if allowed. She isn't even here and she still wins.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Yes keyholder, in private|Home]]</div>
</div><div class="scene-panel compact">
<<if !setup.genreHas("vesperina")>>
<p class="scene-lead">No goddess pack.</p>
<div class="continue-links">[[Back|Stroke cage menu]]</div>
<<else>>
<p class="scene-lead">Sound on. Clip only... no extra pics. Rub steel if you must; unlock never.</p>
<<print setup.vesperinaHTML()>>
<<actor-thought you>>
She's the only image that matters. You're locked audience with a weak leak if you're lucky.
<</actor-thought>>
<<set $aroused = 0>>
<<set $sissyScore += 3>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close clip. Stay sealed.|Home]]</div>
<</if>>
</div><div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">No BBC pack yet.</p>
<div class="continue-links">[[Back|Stroke cage menu]]</div>
<<else>>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('bbc')" alt="">
<p class="scene-lead">Size on screen. Micro under steel. You jiggle the bars like that changes the math.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<<actor-thought you>>
Your cage jerks at the comparison. Humiliating. Effective.
<</actor-thought>>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 3>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Clean up smaller|Home]]</div>
<</if>>
</div><div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/licking.png'" alt="">
<p class="scene-lead">Service fantasy for her. Your contribution is a locked clitty and a tongue you haven't used yet.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'gf-you/chastity-lick.png'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe. Stay useful later.|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'" alt="">
<p class="scene-lead">Spy heat. Someone else gets the real thing. You get steel friction and a camera angle.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Sneak home locked|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<p class="scene-lead">Lecture-as-porn. Betas wait in steel. Alphas finish. Your cage is the homework.</p>
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 2>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close the textbook|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img cage-frame delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="">
<p class="scene-lead">Soft words. Hard steel. You edge the cage to the quiz results that made your stomach drop.</p>
<img class="delayed centered cage-frame" @src="setup.cageMedia()" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/caged-stroke1.webp'" alt="">
<img class="delayed centered cage-frame" @src="setup.ImagePath+'you/chastity-cum'+ random(1, 2) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $sissyScore += 3>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Hide the history. Stay locked.|Home]]</div>
</div><img @src="setup.ImagePath+'you/chastity-dildo.webp'">
<span class="delayed">You use your dildo and try to cum as hard as you can</span>
<<if random(0, 1) eq 0>>
<span class="delayed">After an hour you give up you tried so hard an failed. Maybe next time. Practice creates masters</span>
[[Home][$aroused = $aroused >= 90 ? $aroused : $aroused + 10, $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<<else>>
<span class="delayed">You slowly but surely you feel that you get close. And suddenly it happens</span>
<img class="delayed" @src="setup.ImagePath+'you/chastity-dildo-cum.webp'">
[[Home][$aroused = 0, $gameDate = setup.changeDate($gameDate, 'hours', 1)]]
<</if>><<if hasVisited("School 20 Day anwo") && !$flags.caughtStroking1>>
<<if $flags.anniversaryTonight>>
<p class="delayed">Anniversary night. She's waiting, or on her way. You tell yourself you'll be quick. Just enough to think straight.</p>
<<else>>
<p class="delayed">You put your hand around your cock and start stroking, still raw from class, still hungry for her.</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<div class="continue-links">
[[Try to Finish|Get caught stroking][$strokeState to "after-first-time"]]
</div>
<<elseif hasVisited("School 25 Day anwo") && !$flags.caughtStroking2>>
<<if $flags.day25RulesWarning>>
<p class="delayed">Play by the rules, she said. The lecture said lock it. Your hand doesn't care about rules.</p>
<<else>>
<p class="delayed">You start stroking and lose track of the door, the time, the promise.</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<div class="continue-links">
[[Stroke and forget the time|Get caught stroking 2]]
</div>
<<elseif $strokeState eq "caged" || $caged>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">Locked. You can still try... just not the way you used to.</p>
<div class="genre-grid">
<<link "Stroke cage + porn" "Jerk attempt">><<set $jerkTarget = "Stroke cage menu">><</link>>
<<link "Just the steel (no clip)" "Jerk attempt">><<set $jerkTarget = "Stroke cage">><</link>>
<<if $backpack.has('dildo')>>
<<link "Dildo" "Jerk attempt">><<set $jerkTarget = "Locked Dildo">><</link>>
<</if>>
<<link "Fantasy only (no hands)" "Jerk attempt">><<set $jerkTarget = "Jerk fantasy caged menu">><</link>>
<<link "Forget it" "Home">><</link>>
</div>
</div>
<<else>>
/* Free: pick a genre, chance of step-sister walk-in before the beat */
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<h2 class="scene-title">What are you into right now?</h2>
<p class="scene-lead">Pick a fantasy. Your hand follows. (Door might not stay closed.)</p>
<div class="genre-grid">
<<link "Girlfriend" "Jerk attempt">><<set $jerkTarget = "Jerk genre gf">><</link>>
<<link "Soft cuckold" "Jerk attempt">><<set $jerkTarget = "Jerk genre cuck">><</link>>
<<link "Hard cuckold" "Jerk attempt">><<set $jerkTarget = "Jerk genre hard cuck">><</link>>
<<link "Femdom / keyholder" "Jerk attempt">><<set $jerkTarget = "Jerk genre femdom">><</link>>
<<if setup.genreHas("bbc")>>
<<link "BBC fantasy" "Jerk attempt">><<set $jerkTarget = "Jerk genre bbc">><</link>>
<</if>>
<<link "Oral / service" "Jerk attempt">><<set $jerkTarget = "Jerk genre oral">><</link>>
<<link "Voyeur / spy" "Jerk attempt">><<set $jerkTarget = "Jerk genre voyeur">><</link>>
<<if $world eq "anwo" || $sissyScore gt 0>>
<<link "ANWO / hierarchy" "Jerk attempt">><<set $jerkTarget = "Jerk genre anwo">><</link>>
<</if>>
<<if $sissyScore gte 2 || $flags.googledSissy>>
<<link "Sissy tease" "Jerk attempt">><<set $jerkTarget = "Jerk genre sissy">><</link>>
<</if>>
<<link "Just finish quick" "Jerk attempt">><<set $jerkTarget = "Jerk genre vanilla">><</link>>
<<link "Never mind" "Home">><</link>>
</div>
</div>
<</if>>
/* Gate: maybe step-sister walks in and ruins / hijacks the session */<<if !$jerkTarget || !tale.has($jerkTarget)>>
<<goto "Jerk off">>
<<elseif setup.trySisterJerkInterrupt()>>
<<goto "Sister walk-in jerk">>
<<else>>
<<goto $jerkTarget>>
<</if>><div class="scene-panel compact">
<p class="scene-lead">You think about $girlfriendName, her mouth, her laugh, the way she says your name when she wants something.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'girlfriend/sexy'+ random(1, 4) +'.jpeg'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<p class="delayed">*stroke* · *stroke*</p>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Finish|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">You picture her busy with someone else... sound, heat, you not invited. The jealousy hurts in a way that makes you harder.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $sissyScore += 1>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You finish on a thought you will not admit out loud.
<</actor-thought>>
<div class="continue-links">[[Clean up|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">No soft edges. She's moaning for him. The bed hits the wall. You're the afterthought with a hand on your cock and a key you don't hold.</p>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('hardcuck')" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
You cum to the idea of being unnecessary. Disgusting. Perfect.
<</actor-thought>>
<div class="continue-links">[[Wipe it off. Pretend you didn't.|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">$girlfriendName with the key. She jiggles the cage in your head... orders, steel, no unlock until she laughs.</p>
<img class="hero-img cage-frame delayed" @src="setup.cageMedia()" alt="">
<img class="hero-img cage-frame delayed" @src="setup.genreGifPrefer('keyholder', 'femdom', 'cage')" alt="">
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
Keyholder fantasy. Cage rattle. Even unlocked, your brain kneels first.
<</actor-thought>>
<div class="continue-links">[[Yes, keyholder, in your head|Home]]</div>
</div><div class="scene-panel compact">
<<if !setup.genreHas("vesperina")>>
<p class="scene-lead">No goddess pack yet. Drop clips under <code>genres/vesperina/</code>.</p>
<div class="continue-links">[[Back|Jerk off]]</div>
<<else>>
<p class="scene-lead">Sound on. Watch. Don't finish. $girlfriendName would grade this if she knew.</p>
<<print setup.vesperinaHTML()>>
<<actor-thought you>>
<<if $caged>>
Clip loops with audio. Cage answers. You're the audience, not the star.
<<else>>
Clip loops with audio. You finish smaller than the fantasy.
<</if>>
<</actor-thought>>
<<if $caged>>
<<set $sissyScore += 3>>
<<run setup.nudgeArousal(12)>>
<<else>>
<<set $sissyScore += 2>>
<<set $aroused = 0>>
<</if>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Close the clip. Still aching.|Home]]</div>
<</if>>
</div><div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">No BBC pack yet. Drop real GIFs into <code>dist/assets/images/cuckold/genres/_inbox/bbc/</code>, run <code>scripts/import-genre-gifs.ps1</code>, set <code>setup.genrePacks.bbc.max</code>.</p>
<div class="continue-links">[[Back|Jerk off]]</div>
<<else>>
<p class="scene-lead">Size hierarchy. You picture her stretched, gasping, ruined for anything smaller, including you. Your hand races the shame.</p>
<img class="hero-img porn-frame delayed" @src="setup.genreGif('bbc')" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $sissyScore += 2>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
ANWO didn't invent this fantasy. It just gave it homework.
<</actor-thought>>
<div class="continue-links">[[Clean up smaller|Home]]</div>
<</if>>
</div><div class="scene-panel compact">
<p class="scene-lead">On your knees in your head. Her thighs. Your tongue. She finishes; you don't get to fuck... you get to serve.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/licking.png'" alt="">
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'sex/orgasm-licking.png'" alt="">
<<set $sissyScore += 1>>
<<set $complyScore += 1>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Wipe your mouth in the fantasy|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">Bushes. A gap in curtains. Bodies that aren't yours, moving like they own the night.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Sneak home in your head|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">Alphas lead. Betas wait. You stroke to the lecture voice in your skull, rankings, keys, who gets to finish.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'cuckold/x-tease-'+ random(1, 4) +'.gif'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $sissyScore += 1>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
Curriculum as porn. Disgusting. Effective.
<</actor-thought>>
<div class="continue-links">[[Close the textbook|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">Lace in your head. Soft words. The quiz results that made your stomach drop and your cock jump.</p>
<img class="hero-img porn-frame delayed" @src="setup.ImagePath+'phone/sissy1.webp'" alt="">
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $sissyScore += 2>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Hide the browser history|Home]]</div>
</div><div class="scene-panel compact">
<p class="scene-lead">No plot. Just friction and breath until it breaks.</p>
<img class="hero-img delayed" @src="setup.ImagePath+'you/jerk-off'+ random(1, 3) +'.webp'" alt="">
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Done|Home]]</div>
</div>
/* --- Caged: fantasy genre menu (no orgasm, only heat) --- */<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<h2 class="scene-title">Fantasy only</h2>
<p class="scene-lead">Hands off the steel. Brain does the work. No finish, just hotter.</p>
<div class="genre-grid">
[[Soft cuckold|Jerk fantasy caged cuck]]
[[Hard cuckold|Jerk fantasy caged hard cuck]]
[[Femdom / keyholder|Jerk fantasy caged femdom]]
<<if setup.genreHas("bbc")>>[[BBC fantasy|Jerk fantasy caged bbc]]<</if>>
[[Her + him (generic)|Jerk fantasy caged]]
[[Back|Jerk off]]
</div>
</div><div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">Hands off the steel. Brain does the work... her, him, the key, the ache with no exit.</p>
<img class="centered delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 25>>
<<set $sissyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<actor-thought you>>
No finish. Just hotter. That's the point.
<</actor-thought>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">You don't get to join. You get to ache while she gets used. The cage agrees.</p>
<img class="centered delayed" @src="setup.ImagePath+'cuckold/x-sex-'+ random(1, 5) +'.gif'" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 30>>
<<set $sissyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">Rough, loud, locked out. Your cock jerks uselessly in steel while the fantasy finishes for everyone but you.</p>
<img class="centered delayed" @src="setup.genreGif('hardcuck')" alt="">
<<run setup.peakArousal()>>
<<set $sissyScore += 2>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div><div class="scene-panel compact">
<img class="hero-img cage-frame" @src="setup.cageMedia()" alt="">
<p class="scene-lead">She dangles the key and flicks the cage. You beg in silence. The metal is the punchline.</p>
<img class="centered delayed cage-frame" @src="setup.genreGifPrefer('keyholder', 'cage', 'femdom')" alt="">
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 30>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
</div><div class="scene-panel compact">
<<if !setup.genreHas("bbc")>>
<p class="scene-lead">No BBC pack yet, add GIFs under <code>genres/_inbox/bbc/</code> and import.</p>
<div class="continue-links">[[Back|Jerk fantasy caged menu]]</div>
<<else>>
<img class="hero-img" @src="setup.ImagePath+'you/locked1.webp'" alt="">
<p class="scene-lead">Size fantasy. Sealed hardware. Your body tries to rise and hits metal. The image stays.</p>
<img class="centered delayed" @src="setup.genreGif('bbc')" alt="">
<<run setup.peakArousal()>>
<<set $sissyScore += 2>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="continue-links">[[Suffer handsomely|Home]]</div>
<</if>>
</div><p>You can't think clearly anymore. You only want to stroke now. You don't understand why this scene in class made you so horny. Your cock won't go down anymore.</p>
<<actor you>>
I need to get it down before $girlfriendName comes over.
<</actor>>
<<include "Jerk off">>/* Entire caption is nobr — SugarCube turns newlines into <br> and piles empty space in the left bar. */
<<nobr>>
<img @src="setup.ImagePath+'meta/logo-transparent.png'" class="logo">
<<if $flags.phoneUnlocked || $world eq "anwo">>
<<set _sidePhoneN = setup.phoneNotifyTotal()>>
<<set _sidePhoneGo = _sidePhoneN gt 0 ? setup.phoneNotifyPassage() : "Phone">>
<<set _sidePhoneHint = _sidePhoneN gt 0 ? setup.phoneNotifyHint() : "">>
<<if _sidePhoneN gt 0>>
<div class="chat-links sidebar-phone has-badge">
<<link `"📱 Phone · " + _sidePhoneHint` _sidePhoneGo>><<set $currentPassage = passage()>><</link>>
<span class="sidebar-phone-badge" aria-label="notifications"><<= _sidePhoneN >></span>
</div>
<<else>>
<div class="chat-links sidebar-phone">
<<link "📱 Phone" "Phone">><<set $currentPassage = passage()>><</link>>
</div>
<</if>>
<</if>>
<div class="status-panel">
<div class="status-row"><span class="status-label"><<print $gameDate.toLocaleDateString(undefined,{ weekday: 'short' })>> · <<print $gameDate.getHours()>>:00</span><span>$ <<print $money>></span></div>
<div class="status-row"><span>School day <<print $schoolDay>></span><span><<print $world>></span></div>
<div class="status-row"><span class="status-label">Arousal</span><span><<print $aroused>>/100</span></div>
<div class="status-meter"><span @style="'width:' + Math.min(100, $aroused) + '%'"></span></div>
<div class="status-row"><span class="status-label">GF favor</span><span><<print $girlfriendTrustLevel>>/10</span></div>
<div class="status-meter trust"><span @style="'width:' + Math.min(100, $girlfriendTrustLevel * 10) + '%'"></span></div>
<<if $flags.hustleUnlocked || ($humiliation || 0) gt 0 || ($caged && $flags.keyRulesDone)>>
<div class="status-row"><span class="status-label">Shame</span><span><<print $humiliation || 0>>/10</span></div>
<div class="status-meter shame"><span @style="'width:' + Math.min(100, ($humiliation || 0) * 10) + '%'"></span></div>
<</if>>
<div class="status-badges">
<<if $caged>><span class="status-badge hot">Caged</span><</if>>
<<if !$caged && $cageAcceptance isnot null>><span class="status-badge">Cage: $cageAcceptance</span><</if>>
<<if $world eq "anwo" || $sissyScore gt 0>><span class="status-badge">Sissy $sissyScore</span><</if>>
<<if $world eq "anwo">><span class="status-badge">$personality</span><</if>>
</div>
</div>
<<if settings.debugMode>>
<div class="status-panel debug-panel">DEBUG · $strokeState / $relationshipState / $caged / $schoolDay · $resistScore / $complyScore / $personality · <<print JSON.stringify($flags)>> · Open: <<textbox "_passageName" "">><<button "Go">><<goto _passageName>><</button>></div>
<</if>>
<div class="aside-links">[[Inventory]]</div>
<</nobr>><<set $day = 0>>
<<set $strokeState = 'initial'>>
<<set $relationshipState = "initial">>
<<set $world = "normal">>
<<set $sisterTaskChapter = 0>>
<<set $aroused = 0>>
<<set $followedSisterReceivingCage = false>>
<<set $gameDate = new Date('2024-01-01')>>
<<set $gameDate.setMinutes(0)>>
<<set $gameDate.setHours(8)>>
<<set $gameDate.setSeconds(0)>>
<<set $caged = false>>
<<set $work = 'unemployed'>>
<<set $jobMailCounter = 0>>
<<set $workShiftsDone = 0>>
<<set $schoolDay = 1>>
<<set $money = 0>>
<<set $sissyScore = 0>>
<<set $girlfriendTrustLevel = 10>>
/* Shame: how far you'll go for cash / public digs (gates side hustles). Not GF favor. */
<<set $humiliation = 0>>
<<set $hustleLastDone = {}>>
/* Personality path scores: resist | comply | eager (see setup.refreshPersonality) */
<<set $resistScore = 0>>
<<set $complyScore = 0>>
<<set $personality = "comply">>
/* Optional chapter tracker (other-agent hook; safe defaults) */
<<set $progression = {
chapter: 0,
milestone: "Starting",
completedMilestones: []
}>>
/* Quest flags (prefer these over hasVisited for progression) */
<<set $flags = {
phoneUnlocked: false,
phone1Read: false,
phone2Read: false,
googledSissy: false,
sissyHintGiven: false,
sissyTestDone: false,
surveyPark: false,
surveySister: false,
noticedSmell: false,
keptQuietSmell: false,
caughtStroking1: false,
caughtStroking2: false,
fountain10Done: false,
fountain20Done: false,
anniversaryTonight: false,
day25RulesWarning: false,
day8SpokeUp: false,
day10Confessed: false,
day12BlameSelf: false,
day12FearBeta: false,
day12ReachedHand: false,
phone3Read: false,
phone4Read: false,
phoneOvernightPending: false,
phoneOvernightRead: false,
/* Avoid back-to-back identical overnight Snap lines */
lastSnapText: "",
/* Occasional bully Snap pics (ids in setup.bullySnapCatalog) */
bullySnapQueue: [],
sisterVisit1: false,
sisterVisit2: false,
sisterVisit3: false,
giftForKeyholder: false,
giftDelivered: false,
parkChemistryDone: false,
mallRiskDone: false,
schoolKeyRiskDone: false,
phoneLeakScareDone: false,
endingOffered: false,
anwoDeclined: false,
/* "Not yet" on entry mail → virus trap force-accept */
anwoDeclineCount: 0,
anwoVirusForced: false,
/* Normal day 1: saw Jenny kiss her boyfriend (pre-dump stamp) */
day1ExKissSeen: false,
mustResolveCage: false,
questHint: "",
day3SurveyDone: false,
fieldSurveyOpen: false,
/* Set at end of School 1 Day anwo — group exists before project phone chat */
anwoGroupFormed: false,
/* Overnight / home nudge after day 8 submit before day 10 class */
resultsLiveSeen: false,
day8Submitted: false,
day15Passed: false,
/* Class Alpha/Beta board (Phone Ranks app) live after Day 12 */
classListLive: false,
/* Last rank stage the player opened (provisional|after-sissy|after-size|locked) */
classRankSeenStage: "",
/* Post-cage cuckold / chastity optional scenes */
keyRulesDone: false,
nightOutSmellDone: false,
cagedWaitDone: false,
cagedServiceDone: false,
firstServiceDone: false,
cagedVoyeurDone: false,
alphaProofDone: false,
/* Act III Ch2, bully presence after alpha proof */
hallwayHierarchyDone: false,
bullyCheckInDone: false,
keyholderDebriefDone: false,
bullyPresenceDone: false,
/* Act III Ch3, ultimate humiliation (after bully presence; intentional escalation) */
ultimateHumiliationDone: false,
/* Act III Ch4, morning after ultimate: permanent owned rules */
ownedMorningAfterDone: false,
/* Post-Ch4 public keyholder tease in the park */
parkKeyholderTeaseDone: false,
/* Chapter break banner: set to setup.GAME_VERSION when player opens End of content (once per release) */
chapterBreakSeenVersion: "",
/* Hotel work: Jenny ordered pink brief under slacks (tier 2 setup) */
workPinkBriefOrdered: false,
workPinkBriefOn: false,
/* Boss one-time simple job pitch */
workBossBriefed: false,
/* Mall lingerie errands (optional side chain after keyholder debrief) */
lingerie1Done: false,
lingerie2Done: false,
lingerie3Done: false,
/* Phone Gallery, Jenny caption pics */
galleryApp: false,
galleryFavorBonus: false,
captionUnread: [],
/* Edge Report sequential caption story (0 = next is first reward) */
captionStoryProgress: 0,
/* Edge Report / Clip homework, ~1–2× per week (day-num cooldowns) */
edgeLastDayKey: "",
edgeLastDayNum: null,
goddessLastDayKey: "",
goddessLastDayNum: null,
jennyTaskLastDayNum: null,
goddessPlaylistComplete: false,
ownedChainOpen: true,
/* Side hustles (shame-pay) */
hustleUnlocked: false,
hustleLastDayNum: null,
wearingUsedPanty: false,
keyWithBully: false,
sleepSkipEvening: false,
/* Step-sister random walk-in during jerk (cooldown via day num) */
sisterJerkLastDayNum: null,
/* Step-sister date-prep walk-in when visiting her (3-day CD) */
sisterDatePrepLastDayNum: null,
/* Friday date ladder: 0 gf → 1 keyholder → 2 public → 3 bull1 → 4 bull2 → 5 both → 6 alessia → 7 repeat */
fridayDateLastKey: "",
fridayDateStage: 0
}>>
/* Second bull on Fridays = her ex ($exfriendName). No separate bull2 name. */
/* Edge Report streak (repeatable keyholder tasks) */
<<set $edgeStreak = 0>>
<<set $edgeBest = 0>>
<<set $edgeHeat = 0>>
<<set $edgeTask = null>>
/* Goddess homework: each clip index watched once (1…max); scores for “best of set” */
<<set $goddessWatched = []>>
<<set $goddessPendingClip = null>>
<<set $goddessClipScores = {}>>
<<set $goddessBestClip = null>>
/* Jenny caption gallery (ids from setup.captionCatalog) */
<<set $gallery = []>>
/* Open-ended VN chapter tracker (expand for months, no forced ending) */
<<set $storyAct = 0>>
<<set $storyBeat = "">>
/* How the player accepted the cage: null | "eager" | "reluctant" | "forced" | "refused" */
<<set $cageAcceptance = null>>
/* Single inventory owner, Chapel Simple Inventory */
<<set $backpack to Inventory.create()>>
<<masteraudio muteonhide>>
<<cacheaudio "water_splash" "assets/audio/school_day_1/water-splash.mp3">>
<<cacheaudio "breakup" "assets/audio/school_day_1/breakup.mp3">>
<<cacheaudio "unique_proposal" "assets/audio/unique_proposal.mp3">>
<<cacheaudio "transition_issue" "assets/audio/transition_issue.mp3">>
<<cacheaudio "reception_bell" "assets/audio/work/reception_bell.mp3">>
<<cacheaudio "time_to_go_to_school" "assets/audio/time_to_go_to_school.mp3">>
<<cacheaudio "have_eyes" "assets/audio/have_eyes.mp3">>
<<cacheaudio "day_1_teacher_1" "assets/audio/school_day_1/teacher_1.mp3">>
<<cacheaudio "day_1_girlfriend_1" "assets/audio/school_day_1/girlfriend_1.mp3">>
<<cacheaudio "day_1_girlfriend_2" "assets/audio/school_day_1/girlfriend_2.mp3">>
<<cacheaudio "day_1_girlfriend_3" "assets/audio/school_day_1/girlfriend_3.mp3">>
<<cacheaudio "day_1_girlfriend_4" "assets/audio/school_day_1/girlfriend_4.mp3">>
<<cacheaudio "day_1_exfriend_1" "assets/audio/school_day_1/exfriend_1.mp3">>
<<cacheaudio "day_1_exfriend_2" "assets/audio/school_day_1/exfriend_2.mp3">>
<<cacheaudio "day_1_exfriend_3" "assets/audio/school_day_1/exfriend_3.mp3">>
<<cacheaudio "day_1_bully_1" "assets/audio/school_day_1/bully_1.mp3">>
<<cacheaudio "day_1_bestfriend_1" "assets/audio/school_day_1/bestfriend_1.mp3">><div class="scene-panel start-panel">
<img class="hero-img start-18" @src="setup.ImagePath+'meta/18-jenny-stop-hc-2.png'" alt="18+">
<h2 class="scene-title">Beginning of CGC</h2>
<p class="hint-line version-line">v<<= setup.GAME_VERSION>></p>
<p class="scene-lead"><strong>All characters are 18 or older.</strong></p>
<p class="hint-line">Chastity, cuckold themes, humiliation, hierarchical power dynamics.</p>
<p class="hint-line">May include rapid light changes (stroboscopic effects).</p>
<p class="hint-line">Main story arc in progress. More chapters coming soon.</p>
<div class="continue-links">
[[I am 18+. Continue|I confirm]]
</div>
</div><p>Name the cast. Defaults are fine if you just want to play.</p>
<div class="name-card">
<img @src="setup.ImagePath+'you/pp.png'" width="72" height="72">
<div><label>You</label><<textbox "$youName" "You">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'sister/pp.png'" width="72" height="72">
<div><label>Adult step-sister</label><<textbox "$sisterName" "Becky">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'girlfriend/pp.png'" width="72" height="72">
<div><label>Crush / girlfriend</label><<textbox "$girlfriendName" "Jenny">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'bestfriend/pp.png'" width="72" height="72">
<div><label>Her best friend</label><<textbox "$bestfriendName" "Alessia">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'exfriend/pp.png'" width="72" height="72">
<div><label>Her boyfriend at the start (later her ex)</label><<textbox "$exfriendName" "Tom">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'bully/pp.png'" width="72" height="72">
<div><label>Bully / later first bull</label><<textbox "$bullyName" "Jamal">></div>
</div>
<div class="name-card">
<img @src="setup.ImagePath+'teacher/pp.png'" width="72" height="72">
<div><label>Teacher</label><<textbox "$teacherName" "Jessica">></div>
</div>
<div class="continue-links">
[[Wake Up]]
</div><<audio "time_to_go_to_school" play>>
<<actor sister>>
Hey $youName! Wake up!
<</actor>>
<span class="delayed">You slowly open your eyes and see your step-sister standing in your doorway.</span>
<<actor sister>>
It's time to go to school!
<</actor>>
[[Put on clothes]]<<masteraudio stop>>
<img @src="setup.ImagePath+'you/relaxed.png'">
You put on your clothes and [[go to School|'go to School ' + $world]].<<inv $backpack>><<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/mall.png'" alt="">
<<if $caged>>
<p class="scene-lead">Crowd noise and a secret under your clothes. Cash: <strong>$<<print $money>></strong></p>
<<elseif $money lt 15>>
<p class="scene-lead">The mall wants money. You have <strong>$<<print $money>></strong>.</p>
<<else>>
<p class="scene-lead">Stores and bad ideas. Cash: <strong>$<<print $money>></strong></p>
<</if>>
<div class="hub-actions">
<<if $caged && $flags.keyholderDebriefDone && (!$flags.lingerie1Done || !$flags.lingerie2Done || !$flags.lingerie3Done)>>
<<if !$flags.lingerie1Done>>
[[Lingerie boutique, her order|Lingerie errand 1]]
<<elseif !$flags.lingerie2Done>>
[[Lingerie boutique, two sets|Lingerie errand 2]]
<<else>>
[[Lingerie boutique, final order|Lingerie errand 3]]
<</if>>
<</if>>
<<if $caged && !$flags.mallRiskDone>>[[Fitting room…|Risk mall almost caught]]<</if>>
[[XXX-store]]
[[Men's toilet|Men's Toilet]]
[[Home]]
</div>
</div>
<</nobr>><<if !$flags.keyholderDebriefDone || $flags.lingerie1Done>>
<<goto "Mall">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<p class="delayed">Your phone buzzed before you even found the store map.</p>
<<actor girlfriend>>
lace set. black. my size is in the note.
card. not mine.
don't text me pics of the rack like a creep. just buy it.
<</actor>>
<<actor-thought you>>
Pretty things for her body. Your money. The cage sits cold under your jeans like it's listening.
<</actor-thought>>
<p class="delayed">The boutique smells like perfume samples and new plastic hangers. Soft music. Soft lights. A clerk with a polite smile that does not know your steel yet.</p>
<p class="hint-line">What she ordered (product example):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('black-lace')" alt="black lace set">
<span class="lingerie-product-label"><<= setup.lingerieLabel('black-lace') >><span class="lingerie-product-tag">$40 · for $girlfriendName</span></span>
</div>
</div>
<p class="hint-line">Cash on hand: $<span><<= $money>></span> · set costs <strong>$40</strong></p>
<<if $money lt 40>>
<p class="delayed">Forty dollars. You do not have it. The lace stays on the hanger and so does the humiliation, for later.</p>
<<actor-thought you>>
Work. Tips. Something. She will know if I stall.
<</actor-thought>>
<div class="continue-links">
[[Back to mall|Mall]]
[[Home, earn money first|Home]]
</div>
<<else>>
<span id="conv"></span>
<div id="options">
<<you-choice "Grab the black set. Don't overthink.">>
<<set $money -= 40>>
<<set $sissyScore += 1>>
<<set $complyScore += 1>>
<<run setup.nudgeArousal(8)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You hold lace between two fingers like it might bite. The clerk rings it up without drama.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Gift for someone special?</span></div></div>
<<actor you>>
Uh. Yeah. My... girlfriend.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Cute. Bag's free today.</span></div></div>
<<actor-thought you>>
Special is one word. Owned is another. You do not correct them.
<</actor-thought>>
<div class="delayed">[[Pay and leave|Lingerie errand 1 done]]</div>
<</you-choice>>
<<you-choice "Text her which one, need approval.">>
<<actor girlfriend>>
i already told you black.
stop stalling. buy it. 🙄
<</actor>>
<<set $money -= 40>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You buy the black set like a good errand boy. Receipt folds into your pocket next to nothing useful.</p>
<div class="delayed">[[Done|Lingerie errand 1 done]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</if>><<set $flags.lingerie1Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="scene-panel compact">
<p class="delayed">Outside, under the mall lights, her reply lands before you hit the parking lot, with a photo.</p>
<img class="hero-img caption-pic centered delayed" @src="setup.captionURL('first-lingerie')" alt="">
<<if $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
bag it. leave it at my place.
don't hang around waiting for a thank-you. 😐
<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>
good.
i'll wear it when i feel like it. not for you. 😏
<</actor>>
<<else>>
<<actor girlfriend>>
good boy.
pretty things on my body. your money. that's the vibe. 😘
(saved to your gallery too. locked boys collect.)
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<<actor-thought you>>
You paid for lingerie you will never peel off her. The bag logo is cheerful. Your face is not.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div><<if !$flags.lingerie1Done || $flags.lingerie2Done>>
<<goto "Mall">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<<actor girlfriend>>
plot twist.
one set me. one set $bestfriendName.
sizes in the note. colors: me black lace, her electric blue lace (loud).
you pay both. she already laughed about it.
<</actor>>
<<actor bestfriend>>
omg if he actually shows up with my size i will DIE
(not help him. die laughing.)
<</actor>>
<<actor-thought you>>
Two women. Two sets. Zero of it is for you. Alessia's laugh is already in your skull.
<</actor-thought>>
<p class="hint-line">Both hangers (product examples):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('black-lace-alt')" alt="black for Jenny">
<span class="lingerie-product-label">Black lace (new set)<span class="lingerie-product-tag">for $girlfriendName</span></span>
</div>
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('strappy-blue')" alt="strappy electric blue for Alessia">
<span class="lingerie-product-label">Strappy electric blue<span class="lingerie-product-tag">for $bestfriendName</span></span>
</div>
</div>
<p class="delayed">Same boutique. Same soft music. Your hands look wrong holding $bestfriendName's loud blue straps next to Jenny's black lace.</p>
<p class="hint-line">Cash: $<span><<= $money>></span> · both sets <strong>$75</strong></p>
<<if $money lt 75>>
<p class="delayed">Seventy-five. You came underfunded to a humiliation you already accepted.</p>
<<actor girlfriend>>
broke and locked is a look.
work first. then the lace. 🙄
<</actor>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
<<else>>
<span id="conv"></span>
<div id="options">
<<you-choice "Buy both. Face blank. Survive.">>
<<set $money -= 75>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<run setup.nudgeArousal(8)>>
<<run setup.refreshPersonality()>>
<p class="delayed">Two hangers. Two price tags. One card. The clerk raises an eyebrow at the double bag.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Two gifts? Lucky guy... or very generous roommate situation?</span></div></div>
<<actor you>>
Girlfriend. And her... friend. It's… complicated.
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Uh-huh. Card when you're ready.</span></div></div>
<div class="delayed">[[Pay|Lingerie errand 2 done]]</div>
<</you-choice>>
<<you-choice "Say out loud: one for my girlfriend, one for her best friend.">>
<<set $money -= 75>>
<<set $sissyScore += 3>>
<<set $complyScore += 2>>
<<run setup.nudgeArousal(12)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You say it. Soft. Clear enough. The clerk's smile freezes into professional politeness.</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">…Okay. Both bags. Have a… fun night, I guess.</span></div></div>
<<actor-thought you>>
Fun is not the word. Hierarchy is. Your ears burn under the soft lighting.
<</actor-thought>>
<div class="delayed">[[Leave with both bags|Lingerie errand 2 done]]</div>
<</you-choice>>
</div>
<</if>>
</div>
<</if>><<set $flags.lingerie2Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<div class="scene-panel compact">
<img class="hero-img caption-pic centered delayed" @src="setup.captionURL('lingerie-2')" alt="">
<<actor bestfriend>>
he bought MY size???
send proof or it didn't happen 📸
jk don't. i don't want his sad energy on my camera roll
but tell him thanks for the free clothes loser 💅
<</actor>>
<<if $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
drop both bags. leave.
$bestfriendName already knows you're the wallet. 😒
<</actor>>
<<else>>
<<actor girlfriend>>
perfect.
we might compare later. you're not invited to that part. 😘
(pic for your little gallery. loser.)
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<<set $sissyScore += 1>>
<<run setup.refreshPersonality()>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div><<if !$flags.lingerie2Done || $flags.lingerie3Done>>
<<goto "Mall">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<<actor girlfriend>>
last one. listen carefully.
buy the electric blue lace set. my size.
then the tiny emerald thong, one size smaller. you're trying that on.
fitting room. photo of the tag against your cage through the fabric. no face.
then checkout.
and when they ask who it's for?
you tell them the truth.
for my bull. so he can fuck me in it.
word for word. i will ask the clerk if i have to.
<</actor>>
<<actor-thought you>>
Electric blue set. Emerald thong. Photo of steel through lace. And a sentence that will live in your mouth forever.
<</actor-thought>>
<p class="hint-line">What you have to buy (product examples):</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('electric-blue')" alt="blue set for Jenny">
<span class="lingerie-product-label">Electric blue lace set<span class="lingerie-product-tag">her size · for him to ruin</span></span>
</div>
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('panty-emerald')" alt="emerald thong try-on">
<span class="lingerie-product-label">Emerald lace thong<span class="lingerie-product-tag">smaller · you try it on</span></span>
</div>
</div>
<p class="hint-line">Cash: $<span><<= $money>></span> · full order <strong>$55</strong></p>
<<if $money lt 55>>
<p class="delayed">Fifty-five dollars between you and the sentence she wrote for your throat.</p>
<<actor girlfriend>>
earn it.
then say it. 🙄
<</actor>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
<<else>>
<div class="continue-links">
[[Enter the boutique|Lingerie errand 3 fitting]]
</div>
<</if>>
</div>
<</if>><div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'places/mall.png'" alt="">
<p class="delayed">You take the electric blue set and the tiny emerald thong like contraband. The fitting room curtain is thin. Music still soft. Your pulse is not.</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('panty-emerald')" alt="try-on thong">
<span class="lingerie-product-label">Emerald thong<span class="lingerie-product-tag">wrong size on purpose</span></span>
</div>
</div>
<<actor-thought you>>
Cage under denim. Lace in your hands. She wants proof you're still her errand boy when the door is half-closed.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Try the smaller pair. Snap the tag-and-cage photo.">>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<run setup.nudgeArousal(14)>>
<<run setup.refreshPersonality()>>
<p class="delayed">Lace against metal. Wrong size for a man, right size for a joke. The photo is blurry. She hearts it in three seconds.</p>
<<actor girlfriend>>
pathetic. perfect.
now pay. and say the line. 😘
<</actor>>
<div class="delayed">[[Checkout|Lingerie errand 3 checkout]]</div>
<</you-choice>>
<<you-choice "Freeze. Almost bail.">>
<<actor girlfriend>>
i see zero photo.
either you put them on or i tell $bestfriendName you chickened out of panties. your call. 😒
<</actor>>
<<set $sissyScore += 1>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(10)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You put them on. The photo goes. Your hands shake when you take them off and hang them like nothing happened.</p>
<div class="delayed">[[Force yourself to checkout|Lingerie errand 3 checkout]]</div>
<</you-choice>>
</div>
</div><div class="scene-panel compact">
<p class="delayed">Counter. Soft bag. Card machine waiting. The clerk glances at the electric blue lace, then at your face.</p>
<div class="lingerie-products">
<div class="lingerie-product-card">
<img class="lingerie-product-img" @src="setup.lingerieURL('electric-blue')" alt="bag contents">
<span class="lingerie-product-label">In the bag<span class="lingerie-product-tag">for her bull</span></span>
</div>
</div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Pretty color. Who's the lucky one?</span></div></div>
<<actor-thought you>>
She already wrote the answer. Your throat tries to invent a lie and finds steel instead.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "It's… for my girlfriend. For her bull. So he can fuck her in it.">>
<<set $money -= 55>>
<<set $sissyScore += 4>>
<<set $complyScore += 3>>
<<run setup.peakArousal()>>
<<run setup.refreshPersonality()>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">…Wow. Okay. Uh. Card's ready whenever you are.</span></div></div>
<p class="delayed">They don't laugh. That almost makes it worse. The bag crinkles like applause for the wrong person.</p>
<<actor-thought you>>
You paid. You said it. Somewhere $bullyName gets silk and a night. You get the receipt and a locked cock.
<</actor-thought>>
<div class="delayed">[[Leave with the bag|Lingerie errand 3 done]]</div>
<</you-choice>>
<<you-choice "Mumble: girlfriend. anniversary. (lie)">>
<<set $money -= 55>>
<<set $resistScore += 2>>
<<set $sissyScore += 1>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2)>>
<<run setup.refreshPersonality()>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Aww. Sweet. Have a good one.</span></div></div>
<p class="delayed">Your phone vibrates before you clear the doors. She already knows. Of course she does... she told you she'd check.</p>
<<actor girlfriend>>
that was not the line.
you paid. you still failed.
say it next time out loud or don't bother coming home soft with me. 🙄
<</actor>>
<<actor-thought you>>
Lie bought you thirty seconds of dignity. She bills interest in favor.
<</actor-thought>>
/* Still mark done, errand complete, but colder keyholder */
<div class="delayed">[[Go|Lingerie errand 3 done shame]]</div>
<</you-choice>>
<<you-choice "*Voice cracks*, for her bull. So he can fuck her in it.">>
<<set $money -= 55>>
<<set $sissyScore += 5>>
<<set $complyScore += 3>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.refreshPersonality()>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'" alt=""><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Oh. Oh wow. I... yeah. I heard you. Card. Please.</span></div></div>
<p class="delayed">Your voice broke on <em>bull</em>. The clerk pretends the receipt printer is fascinating. You pretend your ears are not on fire.</p>
<<actor girlfriend>>
good boy.
i can hear the shame from here. bag home. key stays with me. 😘
<</actor>>
<div class="delayed">[[Leave shaking|Lingerie errand 3 done]]</div>
<</you-choice>>
</div>
</div><<set $flags.lingerie3Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<set $storyBeat = "lingerie-errands">>
<div class="scene-panel compact">
<p class="delayed">Mall air hits colder when you leave. The bag logo is cheerful. Your sentence is still in the store, stuck to the counter like gum.</p>
<img class="hero-img caption-pic centered delayed" @src="setup.captionURL('at-home')" alt="">
<<actor girlfriend>>
bag at my place.
and keep your phone on.
<</actor>>
<p class="delayed">Later, not long enough later, a photo hits your lock screen. No caption first. Just proof.</p>
<img class="hero-img caption-pic centered porn-frame" @src="setup.lingerieURL('jenny-kiss-bed')" alt="she wore what you bought">
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
electric blue. the set you paid for.
he's warm. you're locked.
say thank you keyholder if you still work for me. 😈
<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
you bought it.
he gets it.
don't text questions.
<</actor>>
<<else>>
<<actor girlfriend>>
look.
your money. my mouth on him. same lace.
gallery that. 😏
<</actor>>
<</if>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.refreshPersonality()>>
<<actor-thought you>>
You bought the outfit. She is already wearing it for $bullyName. Kiss like you are not in the room. The cage answers for you.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
[[Phone gallery]]
</div>
</div><<set $flags.lingerie3Done = true>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<set $storyBeat = "lingerie-errands">>
<div class="scene-panel compact">
<p class="delayed">You still paid. The bag is still pretty. The lie is already rotting in your pocket.</p>
<<actor girlfriend>>
wallet worked. spine didn't.
favor's not free when you rewrite my script.
<</actor>>
<p class="delayed">She still sends the photo later. Not as a reward. As a reminder who the set was for.</p>
<img class="hero-img caption-pic centered porn-frame" @src="setup.lingerieURL('jenny-kiss-bed')" alt="she wore it for him anyway">
<<set $sissyScore += 1>>
<<run setup.peakArousal()>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.refreshPersonality()>>
<<actor-thought you>>
Next time she will want the sentence again. Louder. In front of someone who matters more.
<</actor-thought>>
<div class="continue-links">
[[Mall]]
[[Home]]
</div>
</div><img class="centered" @src="setup.ImagePath+'stores/men-toilet.png'">
<span class="delayed">You walk in front of a urinal.</span>
<span class="delayed">You take out your cock...</span>
<span class="delayed">...and piss.</span>
<img class="delayed centered" @src="setup.ImagePath+'stores/men-toilet-piss.png'">
<span class="delayed">[[Mall]]</span><img class="centered" @src="setup.ImagePath+'stores/xxx-store.png'">
<p class="delayed">
Fluorescent honesty. The clerk does not look at faces, only hands and cash.
You have $$money.
</p>
<<if !$backpack.has('dildo')>>
<<if $money gte 50>>
<<link [[Dildo ($50), for when the cage wins|XXX-store]]>>
<<pickup $backpack "dildo" 1>>
<<set $money -= 50>>
<<set $sissyScore += 1>>
<</link>>
<<else>>
Dildo ($50), not enough money
<</if>>
<<else>>
<em>You already own a dildo.</em>
<</if>>
<<if !$backpack.has('cage-lube')>>
<<if $money gte 15>>
<<link [[Cage-safe lube ($15)|XXX-store]]>>
<<pickup $backpack "cage-lube" 1>>
<<set $money -= 15>>
<</link>>
<<else>>
Cage-safe lube ($15), not enough money
<</if>>
<<else>>
<em>Lube is in your bag.</em>
<</if>>
<<if !$backpack.has('apology-gift')>>
<<if $money gte 30>>
<<link `"Nice gift for " + $girlfriendName + " ($30)"` "XXX-store buy gift">>
<<set $money -= 30>>
<</link>>
<<else>>
Nice gift for $girlfriendName ($30), not enough money
<</if>>
<<else>>
<em>You already bought her a gift. Deliver it at school or home somehow, later.</em>
<</if>>
<<if $caged && !$backpack.has('chastity-panty') && $money gte 20>>
<<link [[Soft panties that hide a cage ($20)|XXX-store]]>>
<<pickup $backpack "chastity-panty" 1>>
<<set $money -= 20>>
<<set $sissyScore += 1>>
<</link>>
<<elseif $caged && !$backpack.has('chastity-panty')>>
Soft panties that hide a cage ($20), not enough money
<</if>>
<span>[[Mall]]</span><<pickup $backpack "apology-gift" 1>>
<p class="delayed">
Something pretty and vaguely romantic. The kind of object that says sorry without admitting the crime.
</p>
<<actor-thought you>>
If I give this to $girlfriendName, maybe the key spends more time near the lock. Or she laughs and takes it as tribute. Either way, money well burned.
<</actor-thought>>
<<if $caged>>
<<set $flags.giftForKeyholder = true>>
<</if>>
[[Back to store|XXX-store]]<<nobr>>
<<set _parkSurveyReady = !$flags.surveyPark && $gameDate.getHours() lt 22 && ($flags.fieldSurveyOpen || $flags.surveySister || hasVisited("School 5 Day anwo"))>>
<div class="scene-panel compact">
<<if $gameDate.getHours() lt 22>>
<img class="hero-img" @src="setup.ImagePath+'places/park.png'" alt="">
<<else>>
<img class="hero-img" @src="setup.ImagePath+'park/park-night.png'" alt="">
<</if>>
<<if $caged>>
<p class="scene-lead">The park feels bigger when you're smaller under your clothes.</p>
<<elseif $world eq "anwo">>
<p class="scene-lead">Same trees. Different rules under the chatter.</p>
<<elseif $gameDate.getHours() gte 22>>
<p class="scene-lead">Night park. Quiet enough to hear your own bad decisions.</p>
<<else>>
<p class="scene-lead">Open air. Waste time or find trouble.</p>
<</if>>
<<if _parkSurveyReady>>
<div class="quest-banner">
<strong>Field survey</strong>
<p>A group of women on a bench looks free enough to interrupt for your ANWO questionnaire.</p>
[[Interview the group|Survey - Ask Group of women]]
</div>
<<elseif !$flags.surveyPark && ($flags.fieldSurveyOpen || hasVisited("School 5 Day anwo")) && $gameDate.getHours() gte 22>>
<p class="hint-line">Too late for interviews, the park crowd thinned out. Come back before 22:00.</p>
<<elseif !$flags.surveyPark && $flags.day3SurveyDone && !$flags.fieldSurveyOpen && !hasVisited("School 5 Day anwo")>>
<p class="hint-line">Field interviews aren't assigned yet. Next school day hands those out.</p>
<</if>>
<div class="hub-actions">
<<if $gameDate.getHours() lt 22>>[[Hang around]]<</if>>
<<if $gameDate.getHours() lt 22>>[[Look through the bushes|Park - look through the brushes]]<</if>>
<<if _parkSurveyReady>>[[Interview the group|Survey - Ask Group of women]]<</if>>
<<if $gameDate.getHours() lt 22 and $world eq "anwo" and hasVisited("School 12 Day anwo") and !$flags.parkChemistryDone>>
<<link `"Overhear " + $bullyName + " and " + $exfriendName` "Park chemistry">><</link>>
<</if>>
<<if $caged && $flags.bullyCheckInDone && !$flags.cagedVoyeurDone && $gameDate.getHours() lt 22>>
[[Something in the bushes|Caged park witness]]
<</if>>
<<if $caged && $flags.ownedMorningAfterDone && !$flags.parkKeyholderTeaseDone && $gameDate.getHours() lt 20>>
[[Jenny is waiting by the benches|Park keyholder tease]]
<</if>>
[[Men's toilet|Men's Toilet Park]]
[[Home]]
</div>
</div>
<</nobr>><img class="hero-img centered" @src="setup.ImagePath+'park/survey-women.png'">
<<actor you>>
Hey, do you have a few minutes for a provocative survey about ANWO?
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">ANWO? Never heard of it. Is this some kind of a trick?</span></div></div>
<<actor you>>
No tricks, just a few questions about the Alpha New World Order concept. It's about alphas leading over betas in society. Curious to see where you stand?
<</actor>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">Alright, you've piqued our interest. Hit us with it.</span></div></div>
<p class="delayed">After the questionnaire...</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">Wow, this ANWO concept is wild! I didn't think I'd agree with it, but some of these points are compelling.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">Hmmm, maybe you're right. After all, who says power dynamics can't be playful? You know what they say - the one who controls the pleasure holds the real power.</span></div></div>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'park/survey-women.png'"><div><span class="name-container"><span class="name">Group of Women</span></span><span class="content">So why shouldn't alphas lead betas not only in society but also behind closed doors? As long as everyone involved consents and enjoys themselves...</span></div></div>
<<actor-thought you>>
Just as I thought, this study is skewed. But it's interesting how everyone's buying into it. 🙄
<</actor-thought>>
<div class="continue-links">
[[Park][$flags.surveyPark = true; $flags.questHint = ""; $gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div><img class="hero-img centered" @src="setup.ImagePath+'park/hang.png'">
<<if $caged>>
<p class="scene-lead">You sit carefully. The cage reminds you who owns the afternoon.</p>
<<else>>
<p class="scene-lead">You kill an hour watching people who look like they know where they belong.</p>
<</if>>
<<if $caged && random(1, 4) eq 1>>
<p class="delayed">A jogger passes. Glances at your belt. Double-takes. Keeps running.</p>
<<actor-thought you>>
Did she see it? No. It's under the shirt. But your walk gave something away. The cage makes you walk like you're protecting something. Because you are.
<</actor-thought>>
<</if>>
<<if $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel gte 8>>
<<actor girlfriend>>
(text) you're at the park again.\ni like that you go outside.\ndon't talk to anyone cuter than me. 😘
<</actor>>
<<elseif $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel gte 5>>
<<actor girlfriend>>
(text) you're at the park again. doing what?
don't answer. i already know. nothing. like usual. 😏
<</actor>>
<<elseif $flags.phoneUnlocked && random(1, 5) eq 1 && $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
(text) home. now. the park doesn't pay rent.
<</actor>>
<</if>>
<div class="continue-links">
[[Park][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div><div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/owned/park-keyholder-tease.jpg'" alt="Jenny holding the key close on a park bench">
<p class="scene-lead">$girlfriendName is already on the bench when you arrive. Coat open. One leg crossed. The little key rests against her chest where sunlight keeps catching it.</p>
<<actor girlfriend>>
Sit. Close.
No, closer than that. I didn't bring my locked boyfriend outside so he could leave polite space.
<</actor>>
<p class="delayed">Her thigh presses against yours. She takes your wrist and guides your hand beneath the edge of her coat, high enough to feel heat through thin fabric. Not high enough to forget where you are.</p>
<<actor-thought you>>
People pass ten feet away. Shoes on gravel. A dog pulling at its leash.
Her mouth finds yours anyway. The cage answers before you do.
<</actor-thought>>
<<if $girlfriendTrustLevel gte 8>>
<<actor girlfriend>>
I missed this part. You and me. Just with better rules now.
You can touch me, baby. The key still stays with me. Both things can be true.
<</actor>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
Don't mistake access for forgiveness.
You get my thigh. I keep the key. Be grateful in the correct order.
<</actor>>
<<else>>
<<actor girlfriend>>
See? I'm not cruel all the time.
I let you touch. I just decide where, when, and whether that cage gets anything from it.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "*Hold still and let her guide your hand.*">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
Good boy. Gentle. If anyone looks, smile like this is a normal date.
It is normal now. That's the fun part.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<run setup.changeFavor(1)>>
<<run setup.nudgeArousal(14)>>
<div class="delayed">[[Walk the long way around the park|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "Five minutes unlocked. We could find somewhere private.">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
And waste this view? No.
You wanted private because private lets you pretend you're still in charge. Keep your hand there. Behave.
<</actor>>
<<set $resistScore += 2>>
<<run setup.changeFavor(-1)>>
<<run setup.nudgeArousal(12)>>
<div class="delayed">[[Leave with the key still against her chest|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
<<you-choice "*Kiss her and thank her for coming.*">>
<<set $flags.parkKeyholderTeaseDone = true>>
<<actor girlfriend>>
There you are.
My boyfriend. My locked little problem. Still sweet when you stop bargaining. 😘
<</actor>>
<<set $complyScore += 1>>
<<run setup.changeFavor(1)>>
<<run setup.nudgeArousal(10)>>
<div class="delayed">[[Stay beside her until the bench falls into shadow|Park][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]</div>
<</you-choice>>
</div>
</div><<set $flags.parkChemistryDone = true>>
<div class="scene-panel compact">
<p class="scene-lead">Near the path: <strong>$bullyName</strong> and <strong>$exfriendName</strong>, close enough to overhear.</p>
<<actor bully>>
Council thing's real. You good? You've been wound tight since the project blew up.
<</actor>>
<<actor exfriend>>
I'm fine. I just hate watching $youName play martyr with my grade.
<</actor>>
<<actor bully>>
He panicked. You would too if the teacher smiled at you like a weapon. Hey... don't freeze me out. We still ball on Fridays.
<</actor>>
<<actor exfriend>>
...Yeah. Fridays. I need that more than the hierarchy lectures.
<</actor>>
<<actor bully>>
Then show up. And stop measuring yourself against me in the locker room. It's boring when you lose before you try.
<</actor>>
<<actor exfriend>>
Easy for you to say.
<</actor>>
<<actor bully>>
Always is. That's why people relax around me. Come on... I'll buy drinks if you stop sulking like $youName.
<</actor>>
<<actor-thought you>>
They're not cartoon villains here. They're friends with a power gap... and you're the joke that keeps them bonded.
<</actor-thought>>
<<if $caged>>
<<actor-thought you>>
And under all of it: steel. Proof you're already on the wrong side of their joke.
<</actor-thought>>
<<run setup.nudgeArousal(10)>>
<<set $sissyScore += 1>>
<</if>>
<div class="continue-links">
[[Park][$gameDate to setup.changeDate($gameDate, 'hours', 1)]]
</div>
</div><img class="hero-img centered" @src="setup.ImagePath+'park/toilet.png'">
<<actor-thought you>>
I won't go in this toilet!
<</actor-thought>>
<div class="continue-links">
[[Park]]
</div><img class="delayed centered" @src="setup.ImagePath+'park/spy-fuck'+ random(1, 3) +'.webp'">
<p class="delayed">
A young couple was lying on a blanket underneath a tree, their bodies entwined together as they kissed passionately. You watched them from behind some bushes.
</p>
<<if $caged>>
<<actor-thought you>>
That used to be you. Hands on skin. Mouth on neck. No steel counting the seconds.
Now you watch. The cage doesn't care about nostalgia. It aches anyway.
<</actor-thought>>
<<elseif $sissyScore gte 4>>
<<actor-thought you>>
You've been watching more than you used to. Something about witnessing it instead of doing it hits different now.
Is it curiosity? Or is the cage already there, just invisible?
<</actor-thought>>
<<else>>
<<actor-thought you>>
It is both thrilling and terrifying to witness such raw emotion playing out before me.
<</actor-thought>>
<</if>>
<<if $flags.parkChemistryDone>>
<<actor-thought you>>
Last time you were here, $bullyName and $exfriendName sat on that bench. Talking about Fridays. About her.
This couple doesn't know about hierarchies. Lucky them.
<</actor-thought>>
<</if>>
<<actor-thought you>>
Part of you desperately wants to look away. But an even stronger part feels an undeniable pull to keep watching.
<</actor-thought>>
<div class="delayed">
<<run setup.nudgeArousal(6)>>
[[I need to go | Park]]
</div><<if !$flags.anwoGroupFormed && !hasVisited("School 1 Day anwo")>>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<p class="delayed">No project thread yet. Numbers get exchanged in class first.</p>
<p class="hint-line">Go to school. The group chat lights up after Day 1.</p>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>>
<<else>>
<<set $flags.phone1Read = true>>
<<set $flags.anwoGroupFormed = true>>
<<set $flags.questHint = "">>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "School 4 Day anwo 2">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>>
<</if>><<actor girlfriend>>
ok group chat is live 💅 project brains assemble
<</actor>>
<<actor bully>>
if this is homework spam i'm muting
<</actor>>
<<actor exfriend>>
It's graded. Stay.
<</actor>>
<<actor girlfriend>>
ANWO project. We need angles that don't put $teacherName to sleep. Ideas?
<</actor>>
<<actor you>>
Practical applications? Like how it would actually work day to day?
<</actor>>
<<actor bestfriend>>
"day to day" = $youName asking who gets to boss him around 😂
iconic. sad. both.
<</actor>>
<<actor exfriend>>
Survey. Hard numbers. Teachers melt for tables.
<</actor>>
<<actor bully>>
I'll interview people. Smile. Flex. Science.
<</actor>>
<<actor girlfriend>>
$exfriendName survey structure. $bullyName charm. $youName, two real interviews. don't freeze.
$bestfriendName proofread so we don't sound unhinged
<</actor>>
<<actor bestfriend>>
i'll proofread. someone has to babysit the beta's sentences 💅
try not to cry if a stranger laughs at you in the park
<</actor>>
<<actor you>>
Got it. Sister + park.
<</actor>>
<<actor bully>>
park interviews = free entertainment. don't cry if someone laughs
<</actor>>
<<actor girlfriend>>
be useful. text when you're done. no ghosting. 😘
<</actor>>
<<actor exfriend>>
Deadline is not a suggestion.
<</actor>>
<<actor girlfriend>>
we're going to crush this. $youName, don't make me look bad ✨
<</actor>><<set $flags.phone2Read = true>>
<<set $flags.questHint = "">>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "google sissy discussion">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<actor you>>
hey so $teacherName said stay far away from "sissy" stuff before the next test
i didn't even know what she meant so i googled it
<</actor>>
<<actor girlfriend>>
a sissy? like... the meme?
<</actor>>
<<actor bully>>
bro why are you googling that 💀
<</actor>>
<<actor bestfriend>>
SEND PICS or it didn't happen
bet you bookmarked half of it already 😈
<</actor>>
<<actor you>>
uh. okay:
<</actor>>
<img @src="setup.ImagePath+'phone/sissy1.webp'" class="centered delayed">
<<actor girlfriend>>
haha okay that guy is kind of cute ngl
...not like you. different vibe 😏
<</actor>>
<<actor bully>>
LOSER energy. glad none of us is that 😂
<</actor>>
<<actor exfriend>>
Speak for yourself. I'm not clicking anything with "sissy" in the URL.
...we're safe. Right?
<</actor>>
<<actor bestfriend>>
found a quiz: what type of sissy are you 😂
$youName do it. for science. for our entertainment
if you score high i'm printing screenshots
<</actor>>
<<actor girlfriend>>
do NOT fail a phone test over this
(but also if you take the quiz send me the result. privately 👀)
<</actor>>
[[checkout sissy test]]<<set $flags.sissyTestDone = true>>
<<set $flags.questHint = "">>
<<set $sissyScore += 1>>
<img @src="setup.ImagePath+'phone/type-of-sissy.webp'" class="centered">
<<actor-thought you>>
What a weird test. There are 12 types of sissies? That's wild.
<</actor-thought>>
<div class="delayed">
You inform yourself about those 12 sissy types. To be sure you are none of them.
</div>
<div class="delayed">
After 1 hour of searching you think:
</div>
<<actor-thought you>>
Puh I'm lucky I'm none of them.
<</actor-thought>>
[[Back to Chats|Phone chats]]<<set $flags.phone3Read = true>>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "Group chat after day10">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<actor bully>>
sooo $youName almost torched our masterpiece in front of $teacherName 🔥
<</actor>>
<<actor bestfriend>>
the AUDACITY. the STUPIDITY. the main character syndrome
$youName really said "let me ruin the grade in public" 💀
<</actor>>
<<actor exfriend>>
Don't message like that in a chat she might screenshot.
<</actor>>
<<actor girlfriend>>
hey. enough pile-on.
he was trying to be honest. badly. still my problem not a group roast
protecting the grade. and my group
<</actor>>
<<actor bully>>
protecting her little survey boy 🥺
<</actor>>
<<actor girlfriend>>
watch yourself. i said grade. not free pass forever
<</actor>>
<<actor you>>
I didn't mean to make it worse.
<</actor>>
<<actor bestfriend>>
you never do 😌
next time whisper to us first, not the teacher with the magazine contacts
or better: don't talk. smiling is free
<</actor>>
<<actor exfriend>>
Play along. Council is moving. Betas who panic first look guilty.
<</actor>>
<<actor girlfriend>>
$youName, walk me tomorrow. private. not a debate in caps lock
and don't make me look soft in the hallway
<</actor>>
<<actor bully>>
lol "private"
anyway i'm free if anyone needs "alpha tutoring" 😏
<</actor>>
<<actor girlfriend>>
muted him for an hour. problem solved ✨
sleep. $youName, behave.
<</actor>><<set $flags.phone4Read = true>>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
<div>
<i class="fa-solid fa-wifi fa-lg" style="position: relative; bottom: 3px; margin-right: 3px"></i>
<svg height="13" width="13" xmlns="http://www.w3.org/2000/svg" style="margin-right: 3px">
<polygon points="13,0 13,13 0,13" fill="#ddd"/>
</svg>
<svg height="15" width="8" xmlns="http://www.w3.org/2000/svg" style="margin-top: -2px;">
<rect y="2" x="2" width="4" height="2" fill="white"/>
<rect y="5" x="0" width="8" height="9" stroke="white" stroke-width="2"/>
<rect y="9" x="0" width="8" height="5" stroke="white" stroke-width="1" fill="white"/>
</svg>
</div>
</div>
<div class="messages">
<<include "GF private after cage">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<actor girlfriend>>
hey. just us. not the group
<</actor>>
<<if $cageAcceptance eq "eager">>
<<actor girlfriend>>
still thinking about that click 🔐
you asked for it. don't act shocked if i enjoy the key
<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>
proud of you for choosing us
cage stays on. hands stay off. that's the deal
<</actor>>
<<else>>
<<actor girlfriend>>
how does it feel this morning?
don't say "fine." i can already picture you fidgeting
<</actor>>
<</if>>
<<actor girlfriend>>
$sisterName texted me "you're welcome" with a smug emoji
if she makes you do weird chores, tell me... or don't, if you're into it 😏
<</actor>>
<<actor you>>
I'll... manage.
<</actor>>
<<actor girlfriend>>
good boy / good problem. both fit
wear loose pants. walk normal. see you at school
and $youName?
if you buy me something nice with your sad hotel money i might unlock a little longer next time
kidding
mostly 😘
<</actor>><<nobr>>
<<set _chatBadge = setup.phoneChatBadge()>>
<<set _taskBadge = setup.phoneTaskBadge()>>
<<set _snapBadge = setup.phoneSnapBadge()>>
<div class="phone-shell phone-home">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Phone</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-home-body">
<p class="phone-home-label">Apps</p>
<div class="phone-app-grid">
<a data-passage="Phone chats" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-chat">💬</div>
<<if _chatBadge gt 0>><span class="phone-app-badge"><<= _chatBadge>></span><</if>>
<span class="phone-app-name">Chats</span>
</div>
</a>
<a data-passage="Phone tasks" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-tasks">✅</div>
<<if _taskBadge gt 0>><span class="phone-app-badge"><<= _taskBadge>></span><</if>>
<span class="phone-app-name">Tasks</span>
</div>
</a>
<a data-passage="Phone snap" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-snap" aria-hidden="true">👻</div>
<<if _snapBadge gt 0>><span class="phone-app-badge"><<= _snapBadge>></span><</if>>
<span class="phone-app-name">Snap</span>
</div>
</a>
<<if $flags.sissyHintGiven && !$flags.googledSissy>>
<a data-passage="Google sissy" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-browser">🔍</div>
<span class="phone-app-badge">!</span>
<span class="phone-app-name">Browser</span>
</div>
</a>
<<else>>
<div class="phone-app phone-app-disabled" title="Nothing to search right now">
<div class="phone-app-icon phone-app-icon-browser">🔍</div>
<span class="phone-app-name">Browser</span>
</div>
<</if>>
<<if setup.galleryAppOpen()>>
<<run setup.applyFavorGalleryBonus()>>
<a data-passage="Phone gallery" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-gallery">🖼️</div>
/* New pics badge lives on Snap (delivery), Gallery is the save album */
<span class="phone-app-name">Gallery</span>
</div>
</a>
<<elseif $caged && $girlfriendTrustLevel gte 5>>
<div class="phone-app phone-app-disabled" title="She hasn't shared pics yet, keep favor up">
<div class="phone-app-icon phone-app-icon-gallery">🖼️</div>
<span class="phone-app-name">Gallery</span>
</div>
<</if>>
<<if setup.classRankingUnlocked()>>
<a data-passage="Phone ranks" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-ranks">📊</div>
<span class="phone-app-name">Ranks</span>
</div>
</a>
<<elseif $world eq "anwo">>
<div class="phone-app phone-app-disabled" title="Provisional list not posted yet">
<div class="phone-app-icon phone-app-icon-ranks">📊</div>
<span class="phone-app-name">Ranks</span>
</div>
<</if>>
<a data-passage="Phone patreon" class="phone-app-link link-internal" tabindex="0">
<div class="phone-app">
<div class="phone-app-icon phone-app-icon-patreon" aria-hidden="true">P</div>
<span class="phone-app-name">Patreon</span>
</div>
</a>
</div>
<<if _taskBadge gt 0>>
<p class="phone-home-hint"><<= setup.phoneTaskDueHint() || "Tasks has homework waiting.">></p>
<</if>>
<<if _snapBadge gt 0>>
<p class="phone-home-hint">New snap waiting.</p>
<</if>>
<<if _taskBadge lte 0 && _snapBadge lte 0 && _chatBadge gt 0>>
<p class="phone-home-hint">Unread chats.</p>
<<elseif _taskBadge lte 0 && _snapBadge lte 0 && _chatBadge lte 0>>
<p class="phone-home-hint">No new alerts.</p>
<</if>>
</div>
<div class="phone-shell-bottom">
<<if $currentPassage && $currentPassage neq "Phone" && $currentPassage neq "Phone chats" && $currentPassage neq "Phone tasks" && $currentPassage neq "Phone snap">>
[[Close|$currentPassage]]
<<else>>
[[Close|Home]]
<</if>>
</div>
</div>
<</nobr>><<nobr>>
<div class="phone-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Chats</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="chat-list">
<<set _new1 = !$flags.phone1Read>>
<<set _cls1 = _new1 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 1" class="chat-link link-internal" tabindex="0">
<div @class="_cls1">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project</span>
<<if _new1>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview"><<= $girlfriendName>>, <<= $bullyName>>, <<= $exfriendName>>, <<= $bestfriendName>></div>
</div>
</div>
</a>
<<if $flags.day8Submitted>>
<<set _newResults = !$flags.resultsLiveSeen>>
<<set _clsResults = _newResults ? "chat-row is-new" : "chat-row">>
<a data-passage="phone results live" class="chat-link link-internal" tabindex="0">
<div @class="_clsResults">
<img class="chat-avatar" @src="setup.ImagePath + 'exfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">ANWO Project · update</span>
<<if _newResults>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview"><<= $exfriendName>>: results are live…</div>
</div>
</div>
</a>
<</if>>
<<if $flags.googledSissy>>
<<set _new2 = !$flags.phone2Read>>
<<set _cls2 = _new2 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 2" class="chat-link link-internal" tabindex="0">
<div @class="_cls2">
<img class="chat-avatar" @src="setup.ImagePath + 'phone/sissy1.webp'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Sissy research</span>
<<if _new2>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Group chat about the quiz…</div>
</div>
</div>
</a>
<</if>>
<<if $flags.day10Confessed || hasVisited("School 10 Day anwo")>>
<<set _new3 = !$flags.phone3Read>>
<<set _cls3 = _new3 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 3" class="chat-link link-internal" tabindex="0">
<div @class="_cls3">
<img class="chat-avatar" @src="setup.ImagePath + 'bestfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">After the confession</span>
<<if _new3>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Drama in the group…</div>
</div>
</div>
</a>
<</if>>
<<if $caged>>
<<set _new4 = !$flags.phone4Read>>
<<set _cls4 = _new4 ? "chat-row is-new" : "chat-row">>
<a data-passage="phone message 4" class="chat-link link-internal" tabindex="0">
<div @class="_cls4">
<img class="chat-avatar" @src="setup.ImagePath + 'girlfriend/pp.png'" alt="">
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name"><<= $girlfriendName>></span>
<<if _new4>><span class="chat-pill">new</span><</if>>
</div>
<div class="chat-row-preview">Private DM</div>
</div>
</div>
</a>
<</if>>
/* Caption pics deliver via Snap app, not Chats */
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>><<nobr>>
<<set _gReady = setup.goddessHomeworkReady()>>
<<set _eReady = setup.edgeReportReady()>>
<div class="phone-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Tasks</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-tasks-body">
<p class="phone-home-label">Keyholder assignments</p>
<p class="phone-home-hint">Edge: Mon & Wed · Clip: Tue & Thu</p>
<p class="phone-home-hint">Caption story: <<= setup.captionStoryProgressLabel()>> · clean Edge Report = next Snap</p>
<<if setup.isJennyTaskDay()>>
<p class="phone-home-hint">Today: <<= setup.jennyTaskDayLabel()>></p>
<<else>>
<p class="phone-home-hint">Next, <<= setup.jennyTaskDayLabel()>></p>
<</if>>
<<if _gReady>>
<a data-passage="Goddess homework" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new task-row">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Clip homework</span>
<span class="chat-pill">due</span>
</div>
<div class="chat-row-preview">Goddess clip · sound on · once each · rate 1–10</div>
</div>
</div>
</a>
<<elseif $flags.goddessPlaylistComplete>>
<div class="chat-row task-row task-done">
<div class="chat-avatar tool-avatar">✓</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview">Playlist complete<<if setup.goddessBestClipIndex() neq null>> · #1 is clip <<= setup.goddessBestClipIndex()>><</if>></div>
</div>
</div>
<<elseif $caged && ($flags.keyRulesDone || $flags.nightOutSmellDone) && setup.genreHas("vesperina")>>
<div class="chat-row task-row">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview"><<if setup.isJennyClipDay()>>Done for today<<else>>Tue & Thu only<</if>> · <<= setup.goddessClipsLeft()>> left</div>
</div>
</div>
<<else>>
<div class="chat-row task-row task-locked">
<div class="chat-avatar tool-avatar">🎬</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Clip homework</span></div>
<div class="chat-row-preview">Unlocks after cage + key rules</div>
</div>
</div>
<</if>>
<<if _eReady>>
<a data-passage="Edge report start" class="chat-link link-internal" tabindex="0">
<div class="chat-row is-new task-row">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top">
<span class="chat-row-name">Edge Report</span>
<span class="chat-pill">due</span>
</div>
<div class="chat-row-preview">Mon & Wed · edge · phrase · streak</div>
</div>
</div>
</a>
<<elseif $caged && ($flags.keyRulesDone || $flags.nightOutSmellDone)>>
<div class="chat-row task-row">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Edge Report</span></div>
<div class="chat-row-preview"><<if setup.isJennyEdgeDay()>>Done for today<<else>>Mon & Wed only<</if>> · streak <<= $edgeStreak>></div>
</div>
</div>
<<else>>
<div class="chat-row task-row task-locked">
<div class="chat-avatar tool-avatar">🔒</div>
<div class="chat-row-main">
<div class="chat-row-top"><span class="chat-row-name">Edge Report</span></div>
<div class="chat-row-preview">Unlocks after cage + key rules</div>
</div>
</div>
<</if>>
<<if !_gReady && !_eReady>>
<<if setup.isJennyTaskDay()>>
<p class="phone-home-hint">Nothing open for today. <<= setup.jennyTaskDayLabel()>></p>
<<else>>
<p class="phone-home-hint">No due tasks. Edge: Mon/Wed · Clip: Tue/Thu.</p>
<</if>>
<</if>>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>>
/* Legacy name: overnight pings now live in Snap (include so content renders same turn) */<<include "Phone snap">>/* Priority: bully pics first (independent of Jenny), then caption story, then overnight text.
Jamal must not wait behind a Jenny overnight ping. */
<<nobr>>
<<set _snapMore = (setup.bullySnapCount() + setup.captionUnreadCount() + ($flags.phoneOvernightPending ? 1 : 0))>>
<div class="phone-shell phone-snap-shell">
<div class="phone-shell-top phone-snap-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-snap-brand"><span class="phone-snap-ghost" aria-hidden="true">👻</span> Snap</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-snap-body">
<<if setup.bullySnapCount() gt 0>>
/* Bully hallway snaps first — not gated on Jenny */
<<set _bSnap = setup.popBullySnap()>>
<<if _bSnap>>
<<print setup.renderSnapThread("bully", _bSnap.text, _bSnap.imgUrl)>>
<<run setup.nudgeArousal(10)>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<elseif setup.captionUnreadCount() gt 0>>
/* Jenny caption story (Edge Report obey) */
<<set _capId = setup.popCaptionUnread()>>
<<if _capId>>
<<run setup.unlockCaption(_capId)>>
<<set _snapText = setup.snapPicTag()>>
<<print setup.renderSnapThread("girlfriend", _snapText, setup.captionURL(_capId))>>
<<run setup.nudgeArousal(8)>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<elseif $flags.phoneOvernightPending>>
/* Text overnight (Jenny / Alessia) after pic queues */
<<set $flags.phoneOvernightPending = false>>
<<set $flags.phoneOvernightRead = true>>
<<set _snap = setup.pickOvernightSnap()>>
<<print setup.renderSnapThread(_snap.role, _snap.text, null)>>
<<if $caged>>
<<run setup.nudgeArousal(8)>>
<</if>>
<<else>>
<div class="phone-snap-empty"><div class="phone-app-icon phone-app-icon-snap phone-app-icon-snap-lg" aria-hidden="true">👻</div><p class="phone-home-label">No new snaps</p></div>
<</if>>
<<set _snapLeft = setup.bullySnapCount() + setup.captionUnreadCount() + ($flags.phoneOvernightPending ? 1 : 0)>>
<<if _snapLeft gt 0>>
<div class="phone-snap-more">
<a data-passage="Phone snap" class="phone-snap-next link-internal" tabindex="0">Next · <<= _snapLeft >> left</a>
</div>
<</if>>
</div>
<div class="phone-shell-bottom phone-snap-bottom">
<a data-passage="Phone" class="link-internal" tabindex="0">Apps</a>
<a data-passage="Home" class="link-internal" tabindex="0">Close</a>
</div>
</div>
<</nobr>>
/* Legacy: caption DMs used to open here → Snap */<<include "Phone snap">><<run setup.applyFavorGalleryBonus()>>
<<run setup.ensureGalleryState()>>
/* Album only — new pics open in Snap (do not clear captionUnread here) */
<<nobr>>
<div class="phone-shell phone-gallery-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Gallery</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-gallery-body">
<<if ($gallery || []).length gt 0>>
<p class="phone-gallery-count"><<= ($gallery || []).length >> photo<<= ($gallery || []).length gt 1 ? "s" : "">></p>
<div class="phone-gallery-grid">
<<for _gi = 0; _gi lt $gallery.length; _gi++>>
<<set _gid = $gallery[_gi]>>
<<set _gmeta = setup.captionMeta(_gid)>>
<<set _gtitle = _gmeta ? _gmeta.title : _gid>>
<<set _gurl = setup.captionURL(_gid)>>
<<capture _gid, _gurl, _gtitle>>
<div class="phone-gallery-cell"><<print '<img class="phone-gallery-thumb" src="' + _gurl + '" alt="">'>><<link `"Open " + _gtitle` "Phone gallery view">><<set $galleryViewId = _gid>><</link>></div>
<</capture>>
<</for>>
</div>
<<else>>
<div class="phone-gallery-empty">
<p class="phone-home-label">No photos</p>
<p class="phone-home-hint">Clean Edge Reports unlock Jenny's caption story as Snaps. They save here.</p>
</div>
<</if>>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>><<run setup.ensureGalleryState()>>
<<if !$galleryViewId || !setup.captionMeta($galleryViewId)>>
<<goto "Phone gallery">>
<<else>>
<<set _gmeta = setup.captionMeta($galleryViewId)>>
<<set _gurl = setup.captionURL($galleryViewId)>>
<<nobr>>
<div class="phone-shell phone-gallery-shell phone-gallery-view-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Photo</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-gallery-view-body">
<<print '<img class="phone-gallery-full" src="' + _gurl + '" alt="">'>>
<<if _gmeta>>
<p class="phone-gallery-view-title"><<= _gmeta.title>></p>
<</if>>
</div>
<<set $aroused = $aroused gte 95 ? 100 : $aroused + 5>>
<div class="phone-shell-bottom">
[[Gallery|Phone gallery]]
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>>
<</if>><<run setup.markClassRankingSeen()>>
<<set _rank = setup.getClassRanking()>>
<<nobr>>
<div class="phone-shell phone-ranks-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Ranks</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-ranks-body">
<<if !_rank.unlocked>>
<p class="phone-home-hint">No provisional list yet. Council hasn't posted.</p>
<<else>>
<<include "Class rank list body">>
<p class="phone-home-hint">Same list on the school board.</p>
<</if>>
</div>
<div class="phone-shell-bottom">
[[See school board|Class board]]
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>><<nobr>>
<div class="phone-shell phone-patreon-shell">
<div class="phone-shell-top">
<span class="phone-shell-time"><<print $gameDate.getHours()>>:00</span>
<span class="phone-shell-title">Patreon</span>
<span class="phone-shell-icons" aria-hidden="true">▮▮▮</span>
</div>
<div class="phone-patreon-body">
<div class="phone-patreon-hero">
<div class="phone-app-icon phone-app-icon-patreon phone-app-icon-patreon-lg" aria-hidden="true">P</div>
</div>
<p class="phone-home-label">Support the game</p>
<p class="phone-home-hint">v<<= setup.GAME_VERSION>> — builds land on Patreon first.</p>
<ul class="phone-patreon-bullets">
<li>New builds for paid tiers before free mirrors</li>
<li>Bug reports get priority by tier</li>
<li>Public demos stay free later</li>
</ul>
<p class="phone-home-label">Clip credit</p>
<p class="phone-home-hint">Clip homework shoutout: <strong><<= setup.VESPERINA_CREDIT>></strong>. Some AI clips in that pack are built from her work. Local files only, not hotlinked.</p>
<p class="phone-home-hint">Opens in your browser (real site, not in-game).</p>
<div class="phone-patreon-actions">
<<link "Open Patreon">><<run setup.openPatreon()>><</link>>
<<link "Goddess Vesperina">><<run setup.openVesperina()>><</link>>
</div>
</div>
<div class="phone-shell-bottom">
[[Home screen|Phone]]
[[Close|Home]]
</div>
</div>
<</nobr>><<set $flags.resultsLiveSeen = true>>
<<set $flags.questHint = "">>
<<nobr>>
<div class="phone" id="filterSuper">
<div class="topHeader">
<div>
<span id="timeCurrent"><<print $gameDate.getHours() + ':00'>> </span>
<i class="fa-brands fa-whatsapp fa-xl"></i>
</div>
</div>
<div class="messages">
<<include "ANWO results live chat">>
</div>
<section class="phone-nav">
<a data-passage="Phone chats" class="phone-back-btn link-internal">Chats</a>
</section>
</div>
<</nobr>><<actor exfriend>>
ok so. packet went up.
$teacherName shared a summary with student council.
"significant results" = they're actually reading it
<</actor>>
<<actor bestfriend>>
lmao we made policy by accident
or on purpose. either way $youName look stressed already 🤭
<</actor>>
<<actor bully>>
If council likes the numbers we look smart.
If they don't, we blame the guy who ran field interviews 😂
<</actor>>
<<actor girlfriend>>
don't spiral in the chat.
school will talk. we stay a team.
publicly.
<</actor>>
<<actor-thought you>>
Publicly. The word sits wrong. The PDF is out of your hands now.
<</actor-thought>>
<<actor you>>
so it's live. not just a grade.
<</actor>>
<<actor exfriend>>
yep. smile for class. don't be weird.
<</actor>><<set $flags.googledSissy = true>>
<<set $flags.questHint = "">>
You google sissy and find various pictures of men in cute dresses.
<div class="delayed">
<img @src="setup.ImagePath+'phone/sissy1.webp'" class="centered">
</div>
<div class="delayed">
<img @src="setup.ImagePath+'phone/sissy2.jpeg'" class="centered">
</div>
<<actor-thought you>>
Man, what weird shit. I should tell the others about that.
<</actor-thought>>
[[Home screen|Phone]]
[[Chats|Phone chats]]<<set $flags.mallRiskDone = true>>
<img class="centered" @src="setup.ImagePath+'places/mall.png'">
<p class="delayed">
Changing rooms. You only meant to adjust the cage through your jeans, habit now.
The curtain is not as closed as you thought.
</p>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">You good in there? Need a different size or...?</span></div></div>
<<actor-thought you>>
Blood in your ears. Metal against denim. If they pull the curtain, the hierarchy stops being theory.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I am fine! Just... shoe.">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">Uh-huh. Take your time, man.</span></div></div>
<<actor-thought you>>
They did not see. Or they did and chose mercy. Your hands shake for ten minutes after.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<<set $complyScore += 1>>
<<run setup.refreshPersonality()>>
<div class="delayed">[[Leave the store|Mall]]</div>
<</you-choice>>
<<you-choice "*Freeze. Say nothing.*">>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'stores/xxx-store.png'"><div><span class="name-container"><span class="name">Clerk</span></span><span class="content">...Okay. Weird energy. I will be at the counter.</span></div></div>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(10)>>
<<run setup.refreshPersonality()>>
<div class="delayed">[[Escape to mall hall|Mall]]</div>
<</you-choice>>
</div><<set $flags.schoolKeyRiskDone = true>>
<p class="delayed">
Hallway crush before second period. $girlfriendName digs in her bag for lip gloss.
The key on her ring catches light, small, silver, unmistakable if you know what you are looking at.
</p>
<<actor bestfriend>>
Cute keychain. New?
wait... is that for *him*? 😈
<</actor>>
<<actor girlfriend>>
Mm. Responsibility. 😌
someone has to manage the situation
<</actor>>
<<if $personality eq "eager">>
<<actor-thought you>>
You want people to almost know. Shame has a taste now and it is sweet.
<</actor-thought>>
<<set $sissyScore += 1>>
<<elseif $personality eq "resist">>
<<actor-thought you>>
You want to snatch it. You do not. Your jaw hurts from not speaking.
<</actor-thought>>
<<set $resistScore += 1>>
<<else>>
<<actor-thought you>>
Smile. Nod. Pretend it is a locker key. Survive the bell.
<</actor-thought>>
<<set $complyScore += 1>>
<</if>>
<<actor bully>>
$youName looks like he's about to pass out. You good, man?
<</actor>>
<<actor you>>
Fine.
<</actor>>
<<actor bestfriend>>
he is NOT fine. look at him. this is better than TV
<</actor>>
<<actor girlfriend>>
He is fine. I manage him. 😉
don't help, $bestfriendName
<</actor>>
<<actor bestfriend>>
not helping. narrating 💅
<</actor>>
<<run setup.refreshPersonality()>>
<<run setup.nudgeArousal(8)>>
<div class="delayed">
[[To class|School]]
</div><<set $flags.phoneLeakScareDone = true>>
<<actor sister>>
Sleep well? Or did the steel keep you company?
<</actor>>
<<actor sister>>
Reminder: I still have those panty pics. Group chat would die. $girlfriendName would... actually she might thank me.
Be useful. Stay cute. Do not test me this week.
<</actor>>
<<if $personality eq "resist">>
<<actor-thought you>>
Blackmail with a smile. You add it to the ledger.
<</actor-thought>>
<<set $resistScore += 1>>
<<else>>
<<actor-thought you>>
Your stomach drops. Compliance is cheaper than virality.
<</actor-thought>>
<<set $complyScore += 1>>
<<set $sissyScore += 1>>
<</if>>
<<run setup.refreshPersonality()>>
<div class="delayed">
[[Home]]
</div><<set _rank = setup.getClassRanking()>>
<<if !_rank.unlocked>>
<p class="hint-line">No list yet. Council hasn't posted names.</p>
<<else>>
<<nobr>>
<div class="class-rank-block">
<p class="class-board-heading"><<= _rank.title>></p>
<p class="hint-line class-rank-note"><<= _rank.note>></p>
<div class="class-rank-table" role="list">
<<for _ri = 0; _ri lt _rank.rows.length; _ri++>>
<<set _row = _rank.rows[_ri]>>
<div role="listitem" @class="'class-rank-row' + (_row.isYou ? ' is-you' : '') + (_row.isAlpha ? ' is-alpha' : ' is-beta')"><span class="class-rank-num">#<<= _row.rank>></span><span class="class-rank-name"><<= _row.name>><<if _row.isYou>> <em>(you)</em><</if>><<if _row.tag neq "">> <span class="class-rank-tag"><<= _row.tag>></span><</if>></span><span class="class-rank-band"><<= _row.band>></span></div>
<</for>>
</div>
</div>
<</nobr>>
<</if>><<run setup.markClassRankingSeen()>>
<<nobr>>
<div class="scene-panel compact class-board-panel">
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/class-rank-board.jpg'" alt="Alpha Beta ranking board">
<h2 class="scene-title">Ranking board</h2>
<p class="scene-lead">Posted by the office. Everyone can see who is Alpha and who is Beta.</p>
<<include "Class rank list body">>
<div class="hub-actions">
<<if setup.isSchoolHours()>>
[[Go to class|School]]
<</if>>
[[Leave campus|After school]]
<<if setup.classRankingUnlocked()>>
[[Phone copy|Phone ranks]]
<</if>>
[[Home]]
</div>
</div>
<</nobr>><div id="conv">
<<if !hasVisited("relationshipState-initial")>>
<<goto "relationshipState-initial">>
<<else>>
<<goto "relationshipState-known">>
<</if>>
</div><div id="conv">
<<set $passageName = 'relationshipState-' + $relationshipState>>
<<if tale.has($passageName) && !hasVisited($passageName)>>
<<goto $passageName>>
<<elseif $caged && !$flags.schoolKeyRiskDone && $schoolDay gte 25 && random(1, 2) eq 1>>
<<goto "Risk school key flash">>
<<else>>
<<run setup.nudgeArousal(8)>>
<<run setup.refreshPersonality()>>
<img @src="setup.ImagePath+'school/gf'+ random(1, 5) +'.jpeg'" class="centered">
<<if $flags.wearingUsedPanty && $caged>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="her panties under school clothes">
<<actor-thought you>>
Her used pair from his night sits under your clothes. Every step reminds the cage what you're not allowed to be.
<</actor-thought>>
<<if $girlfriendTrustLevel gte 6>>
<<actor girlfriend>>
walk normal.
i know what you're wearing. don't make it loud. 😏
<</actor>>
<<else>>
<<actor girlfriend>>
those panties stay on.
if you fidget i'll notice. 😒
<</actor>>
<</if>>
<<run setup.nudgeArousal(8)>>
<</if>>
<<if $backpack.has("apology-gift") && !$flags.giftDelivered>>
<<actor you>>Hey... I got you something.<</actor>>
<<actor girlfriend>>Oh? Bribery before first period? 😏<</actor>>
<p class="delayed">She takes the gift, peeks, softens, then pockets it like contraband affection.</p>
<<if $caged>>
<<actor girlfriend>>Cute. Keep being useful and the key might get lonely without your lock. Maybe. 😘<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 2)>>
<<else>>
<<actor girlfriend>>Thanks, honey. You're sweet when you try. 😘<</actor>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<</if>>
<<drop $backpack "apology-gift" 1>>
<<set $flags.giftDelivered = true>>
<<elseif $aroused gte 70>>
<<actor you>>Morning...$girlfriendName... I, uh, I missed you. A lot. 😳<</actor>>
/* High arousal still respects GF favor, zero favor ≠ soft "baby" */
<<if $caged && $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>I can tell. Red face, useless little cage, zero self-control. Don't cling. Walk. Class. Now. 🙄<</actor>>
<<elseif $caged && $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Yeah, I see it. Cage isn't fixing your brain. Stop staring and get to class. 😒<</actor>>
<<elseif $caged>>
<<actor girlfriend>>I can tell. Your face is red and that little cage is doing nothing for your brain. 😏 Focus on class, baby.<</actor>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>You're flushed and weird. Don't make it my problem. Go. 😐<</actor>>
<<elseif $sissyScore gte 4>>
<<actor girlfriend>>You're practically vibrating. Cute. Don't embarrass me in the hallway. 😉<</actor>>
<<else>>
<<actor girlfriend>>Whoa, easy. Save that energy for later, okay? 😊<</actor>>
<</if>>
<<elseif $caged>>
/* Girlfriend favor: high = soft keyholder, low = cold keyholder */
<<if $girlfriendTrustLevel lte 3>>
<<actor you>>Morning...<</actor>>
<<actor girlfriend>>Walk. Don't talk. Don't make me explain the cage to anyone. 🙄<</actor>>
<<elseif $personality eq "eager">>
<<actor you>>Morning... still locked for you.<</actor>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>I know. Key's warm. Good boy... don't embarrass me. 😘<</actor>>
<<else>>
<<actor girlfriend>>I checked the key. Behave. 😏<</actor>>
<</if>>
<<elseif $personality eq "resist">>
<<actor you>>Morning. The... thing is still on.<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>That face again. Steel stays. Deal with it. 😒<</actor>>
<<else>>
<<actor girlfriend>>Don't make that face in public. Same steel. 😏<</actor>>
<</if>>
<<else>>
<<set $randomResponse = random(1, 3)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Morning, love. The... thing is still on.<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Mm. Still locked. Still mine. Don't test me today. 😐<</actor>>
<<elseif $cageAcceptance eq "reluctant">>
<<actor girlfriend>>I know. You agreed. Don't make that face in public. 😏<</actor>>
<<else>>
<<actor girlfriend>>Mm-hmm. Key's with me. Have a good day. 😉<</actor>>
<</if>>
<<case 2>>
<<actor girlfriend>>Walk normal. Nobody needs to know what's under your clothes except me. 😈<</actor>>
<<actor you>>I am walking normal...<</actor>>
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>You're walking like a secret. Cute. See you later. 😘<</actor>>
<<else>>
<<actor girlfriend>>You're walking like a secret. Fix it. See you later.<</actor>>
<</if>>
<<case 3>>
<<actor you>>Have a wonderful day, babe. 💕<</actor>>
<<if $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>Behave today. I'm still watching you. 🙄<</actor>>
<<else>>
<<actor girlfriend>>You too. Be good for me. 😘<</actor>>
<</if>>
<</switch>>
<</if>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor you>>Morning, sweetheart...<</actor>>
<<actor girlfriend>>Morning. Don't make me regret keeping you. We'll talk later. 😐<</actor>>
<<elseif $sissyScore gte 4>>
<<set $randomResponse = random(1, 2)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Good morning, love. 😊💖<</actor>>
<<actor girlfriend>>Morning, soft boy. Try not to melt before lunch. 😉<</actor>>
<<case 2>>
<<actor girlfriend>>There's my helpful boyfriend. Keep being useful today, okay? 😘<</actor>>
<<actor you>>I... yeah. Of course.<</actor>>
<</switch>>
<<else>>
<<set $randomResponse = random(1, 4)>>
<<switch $randomResponse>>
<<case 1>>
<<actor you>>Good morning, love. Have a wonderful day. Even though we won't see each other later, I'll be thinking of you 😊💖<</actor>>
<<actor girlfriend>>You too! That's so sweet of you. I'll miss you! 😘<</actor>>
<<case 2>>
<<actor you>>Morning, sweetheart. Let's plan something special for another day since we won't meet later, okay?<</actor>>
<<actor girlfriend>>Sure thing! I'll look forward to it. See you around! 😊<</actor>>
<<case 3>>
<<actor you>>Sending you a kiss goodbye since we won't meet up later. Have a great day, love 😘<</actor>>
<<actor girlfriend>>Aww, thank you! 😊 Kisses back! See you tomorrow?<</actor>>
<<case 4>>
<<actor you>>Have a wonderful day, babe. Even though we won't see each other later, I'll be counting down the hours until I do 💕<</actor>>
<<actor girlfriend>>You too! I'll miss you lots! 😘<</actor>>
<</switch>>
<</if>>
/* Big tease only when ranks just changed (new stage since last view) */
<<if setup.classRankingHasUpdate()>>
<div class="quest-banner class-board-tease">
<strong>Ranking board updated</strong>
<p>The office list moved. Students cluster. Nobody pretends they don't look.</p>
[[Check the ranking board|Class board]]
</div>
<</if>>
/* School-day shame hustles: before class (bags / used panties) */
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _mHustles = setup.hustleOpenSchoolList("morning")>>
<<if _mHustles.length gt 0>>
<p class="delayed hint-line">Before class, someone wants a “favor.” Cash if you play along.</p>
<div class="continue-links">
<<for _mi = 0; _mi lt _mHustles.length; _mi++>>
<<set _mh = _mHustles[_mi]>>
<<capture _mh>>
<<link `"Before class: " + _mh.title + " ($" + _mh.pay + ")"` _mh.passage>>
<<set $flags.hustleFromSchool = "morning">>
<</link>>
<</capture>>
<</for>>
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Just go to class|School]]
</div>
<<else>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[School |School]]
</div>
<</if>>
<<else>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[School |School]]
</div>
<</if>>
<</if>></div><<masteraudio stop>>
/* Jump past empty calendar days so every school visit is a real beat */
<<set _startDay = $schoolDay>>
<<set $schoolDay = setup.nextStorySchoolDay($world, $schoolDay)>>
<<set $passageName = 'School ' + $schoolDay + ' Day ' + $world>>
<<if tale.has($passageName)>>
/* If we skipped multiple days, show the weekly loop first */
<<if $schoolDay - _startDay gt 1 && $world eq "anwo" && $schoolDay gte 26>>
<<set $schoolDay = _startDay>>
<<goto "School week loop">>
<<else>>
<<set $schoolDay += 1>>
<<goto $passageName>>
<</if>>
<<else>>
<img @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.gif'" class="centered">
<<if $world eq "anwo">>
<p>No new lectures today, the hierarchy already took attendance in your head.</p>
<<set $schoolDay += 1>>
/* Quiet day still ends via After school (shoe / afternoon gigs) */
<div class="continue-links">[[Leave school|After school]]</div>
<<else>>
/* Normal world after day 2: no more real school beats. Funnel back to the mail door. */
<p class="scene-lead">Hallways feel copied. Same lockers. Same almost-wave that never lands.</p>
<<actor-thought you>>
Nothing new is loading. Like the day is waiting on a click you have not made yet.
The weird mail on your computer. That is the only thing that felt like a next page.
<</actor-thought>>
<<set $schoolDay += 1>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<div class="continue-links">
[[Go home to the Computer|Computer]]
[[Just go home|Home]]
</div>
<</if>>
<</if>>
/* Shared after-class beat: time jump + optional afternoon hustles (Alessia shoe, etc.) */<<silently>>
/* Land after last period so schoolSlot: afternoon gigs are in hours */
<<if $gameDate.getHours() lt 13>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<</if>>
<<if $gameDate.getHours() lt 12 || $gameDate.getHours() gte 18>>
<<run setup.setGameHour(14, 0)>>
<</if>>
<</silently>>
<<nobr>>
<div class="scene-panel compact">
<img class="hero-img" @src="setup.ImagePath+'places/school.jpg'" alt="School exterior">
<h2 class="scene-title">After school</h2>
<p class="scene-lead">Bell's done. Bags, hall, sun on the steps outside campus.</p>
<<if setup.hustleHubOpen() && setup.hustleGlobalReady()>>
<<set _aHustles = setup.hustleOpenSchoolList("afternoon")>>
<<if _aHustles.length gt 0>>
<p class="hint-line">Someone wants a favor before you leave. Cash if you play along. Or just go.</p>
<div class="hub-actions">
<<for _ai = 0; _ai lt _aHustles.length; _ai++>>
<<set _ah = _aHustles[_ai]>>
<<capture _ah>>
<<link `"After school: " + _ah.title + " ($" + _ah.pay + ")"` _ah.passage>>
<<set $flags.hustleFromSchool = "afternoon">>
<</link>>
<</capture>>
<</for>>
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Fountain]]
[[Home]]
</div>
<<else>>
<div class="hub-actions">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Fountain]]
[[Home]]
</div>
<</if>>
<<else>>
<div class="hub-actions">
<<if setup.classRankingHasUpdate()>>[[Ranking board (updated)|Class board]]<</if>>
[[Fountain]]
[[Home]]
</div>
<</if>>
</div>
<</nobr>>
/* Shared exit after school-linked side hustles */<<if $flags.hustleFromSchool eq "morning">>
<<set $flags.hustleFromSchool = "">>
<div class="delayed continue-links">[[Continue to class|School]]</div>
<<elseif $flags.hustleFromSchool eq "afternoon">>
<<set $flags.hustleFromSchool = "">>
<div class="delayed continue-links">
[[Fountain]]
[[Home]]
</div>
<<else>>
<div class="delayed continue-links">[[Home]]</div>
<</if>><div id="conv">
<<actor you>>Excuse?<</actor>>
<<actor bully>>
Yeah. It was a little bitter. You didn't taste it yet? I figured you might like it.
<</actor>>
<<actor you>>What?<</actor>>
<<actor girlfriend>>
A chocolate! Yeah... he gave me a chocolate. For you. Yesterday. 😊
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
Chocolate. Bitter. On her. In your mouth. The timeline is a knife.
<</actor-thought>>
<<else>>
<<actor-thought you>>
$bullyName is smiling too wide. $girlfriendName's smile is perfect and wrong.
<</actor-thought>>
<</if>>
</div>
<span id='options'>
<<you-choice "Really? Can I have it?">>
<<actor girlfriend>>
Yeees, but I forgot it at home. How about I bring it tonight?
Or better, we continue where we left off yesterday? 😏
<</actor>>
[[Sounds good to me 😏|School][$strokeState = "before-second-time-caught"; $aroused = 90]]
<</you-choice>>
<<you-choice "Keep it. I don't like chocolate.">>
<<actor girlfriend>>
Oh. Okay. I know something else you might like. 😏
How about we continue where we left off yesterday?
<</actor>>
[[Sounds good to me 😏|School][$strokeState = "before-second-time-caught"; $aroused = 90]]
<</you-choice>>
<<if $flags.noticedSmell>>
<<you-choice "That wasn't chocolate.">>
<<actor girlfriend>>
Don't be gross in the hallway. Tonight. We'll talk with our mouths busy. 😘
<</actor>>
<<actor bully>>
Relax, man. It's a joke. Mostly.
<</actor>>
[[School|School][$strokeState = "before-second-time-caught"; $aroused = Math.min(92, Math.max($aroused, 80)); $sissyScore += 1; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</you-choice>>
<</if>>
</span><<set $flags.anniversaryTonight = true>>
<<run setup.peakArousal()>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act2/anniversary-fountain.jpg'" alt="anniversary at the fountain">
<<actor girlfriend>>Hey. Don't forget, after school. Fountain. Our anniversary.<</actor>>
<<actor girlfriend>>I waited a whole year for a night that isn't homework and group chat. Tonight gets spicy. Don't make me wait alone. 😏<</actor>>
<<actor-thought you>>
She said it soft, but her eyes said don't mess this up.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "I'll be there. Promise. 💖">>
<<actor girlfriend>>Good. Dress nice. Or at least... try. 😘 [[School|School]]
<</actor>>
<</you-choice>>
<<you-choice "Spicy how? 😳">>
<<actor girlfriend>>If I tell you, you'll ruin it in the bathroom before I get there. Fountain. After class. 😉 [[School|School]]
<</actor>>
<</you-choice>>
</div>At school you walk the halls and suddenly hear a familiar voice.
<<actor girlfriend>>Hey $youName? Didn't you see me, my love?<</actor>>
<p class="delayed">You turn and see <strong>$girlfriendName</strong>.</p>
<<actor-thought you>>
Love?!
In the old world she kissed $exfriendName against the lockers. Public. His. She barely knew your name.
After the mail she says "my love" like you've been hers for months.
<</actor-thought>>
<<actor you>>Hey! No my bad I was lost in my thoughts.<</actor>>
<<actor-thought you>>
WTF. She's my girlfriend.
ANWO did not wait for a breakup. It deleted his claim and wrote yours over it.
$exfriendName is the one on the outside now. Yesterday he still had her waist at the game.
Today the hallway acts like that never happened.
<</actor-thought>>
<<if $flags.day1ExKissSeen>>
<<actor-thought you>>
You still remember the kiss. The rewrite did not erase your memory. Only everyone else's.
<</actor-thought>>
<</if>>
<<actor you>>[[See ya 😊|School]]<</actor>><<masteraudio stop>>
<<audio "have_eyes" play>>
<div class="scene-panel">
<p class="scene-lead">At school you walk the halls and suddenly see your crush <strong>$girlfriendName</strong>. (too late)</p>
<img @src="setup.ImagePath+'school/bump.png'" class="hero-img delayed" alt="">
<<actor girlfriend>>
Don't you have eyes in your head?
<</actor>>
<<actor you>>
Sorry I, I, I...
<</actor>>
<<actor girlfriend>>
Stop talking! Get out of my way!
<</actor>>
<div class="continue-links">
[[Continue to class|School]]
</div>
</div><div class="scene-panel">
<p class="scene-lead">At school you walk the halls and bump into <strong>$girlfriendName</strong>. (too late)</p>
<img @src="setup.ImagePath+'school/bump.png'" class="hero-img delayed" alt="">
<<actor girlfriend>>
Have a nice day!
<</actor>>
<<actor you>>
Oh... yes, you too.
<</actor>>
<<actor bestfriend>>
Stop talking to her, loser! She said hi out of pity. Move.
<</actor>>
<div class="continue-links">
[[Continue to class|School]]
</div>
</div><<actor girlfriend>>Are you serious?<</actor>>
<<actor girlfriend>>$girlfriendMadReason<</actor>>
<<if $sissyScore gte 4>>
<<actor girlfriend>>And after everything you've already given me? Really?<</actor>>
<<elseif $girlfriendTrustLevel lte 5>>
<<actor girlfriend>>I'm already this close to being done with your excuses.<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Sorry, yes I'm simply too horny">>
<<actor girlfriend>>
That's so pathetic. I'm lost for words. Why can't you just ...?
<</actor>>
<<actor you>>
I don't know. I'm simply too horny.
<</actor>>
<<if $sissyScore gte 4>>
<<actor girlfriend>>
At least you're honest. Weak, but honest. Don't make me clean up your mess again.🙄 [[School|School][$sissyScore += 1; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</actor>>
<<elseif $caged>>
<<actor girlfriend>>
You're locked and you still find ways to be a problem. Unbelievable. Bye. [[School|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2)]]
<</actor>>
<<else>>
<<actor girlfriend>>
You are so weak-minded.🙄 Bye. [[School|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 2); $sissyScore += 1]]
<</actor>>
<</if>>
<</you-choice>>
<<you-choice "No, I didn't do that">>
<<actor girlfriend>>
Hmm. Why should I believe you?
<</actor>>
<<actor you>>
Because I'm your boyfriend and I have no reason to lie.
<</actor>>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>>
Okay. I believe you this time. Next time you will have a problem. [[School|School][$girlfriendTrustLevel = setup.changeFavor(-5)]]
<</actor>>
<<elseif $sissyScore gte 6 && $caged>>
<<actor girlfriend>>
Cute try. You're locked for a reason. Don't insult me with lies on top of it.🙄 [[School|School][$girlfriendTrustLevel = 0; $sissyScore += 1]]
<</actor>>
<<else>>
<<actor girlfriend>>
I don't trust you anymore. Stop lying! Grow some balls and own your actions.🙄 [[School|School][$girlfriendTrustLevel = 0]]
<</actor>>
<</if>>
<</you-choice>>
</div><span id="conv"></span>
<<set $relationshipState = "reset">>
<<actor girlfriend>>Hey, strokeboy. Hope the hand was worth blowing our anniversary.<</actor>>
<div id='options'>
<<you-choice "I'm sorry. I didn't mean to hurt you.">>
<<actor girlfriend>>
Okay. I accept the apology, once.
Tonight we continue where we should have started. Fountain or home. My rules. 😏
[[School |School][$strokeState = "before-second-time-caught"; $aroused = Math.min(92, Math.max($aroused, 80)); $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<</actor>>
<</you-choice>>
<<you-choice "I don't care. I don't owe you anything.">>
<<actor girlfriend>>Okay. That's it. We're done.<</actor>>
[[Bye |End lost girlfriend]]
<</you-choice>>
</div><<set $relationshipState = "reset">>
<p class="delayed">
You cut through the hall and spot $girlfriendName with $bullyName by the lockers. They're close, laughing like a private joke.
You hear her before they see you.
</p>
<<actor girlfriend>>...and then he ate it. 😅<</actor>>
<<actor bully>>Wait... you didn't clean up first? And he didn't notice?<</actor>>
<<actor girlfriend>>No. 😏<</actor>>
<span class="delayed">...</span>
<<actor bully>>
OH... hey, $youName! Sorry about yesterday. Didn't mean to wreck your anniversary.
I gave her something, though. Like an excuse. For you.
<</actor>>
<<if $flags.noticedSmell>>
<<actor-thought you>>
Ate it. Didn't clean up. The taste on your tongue last night suddenly has a shape.
<</actor-thought>>
<<elseif $flags.keptQuietSmell>>
<<actor-thought you>>
You didn't ask last night. Now the hallway is asking for you.
<</actor-thought>>
<<else>>
<<actor-thought you>>
An excuse. Your stomach drops without knowing why yet.
<</actor-thought>>
<</if>>
<div id='options'>
[[An excuse? |Ask about excuse]]
[[Ah, don't worry. You didn't do it on purpose.|School][$girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)]]
<<you-choice "What were you two talking about?">>
<<if $flags.noticedSmell>>
<<actor girlfriend>>Oh... my dog. $bullyName was surprised he didn't notice the new food. Funny how noses work. 😇<</actor>>
<<actor-thought you>>
Dog food. Right. Your jaw hurts from not saying it.
<</actor-thought>>
<<else>>
<<actor girlfriend>>Oh... my dog. $bullyName was surprised he didn't smell the difference in the new food. 😇<</actor>>
<</if>>
[[School |School]]
<</you-choice>>
</div>/* Morning stamp: she is his. Not yours. No dump. ANWO steals the rewrite later. */
<<set $flags.day1ExKissSeen = true>>
<div class="scene-panel">
<img class="hero-img" @src="setup.ImagePath+'story/act1/day1-jenny-ex-kiss.jpg'" alt="Jenny kissing her boyfriend in the school hallway">
<p class="scene-lead">Morning hallway. You turn the corner and your whole day is already ruined.</p>
<p class="delayed">
$girlfriendName has $exfriendName against the lockers like that is normal. Soft kiss. His hand on her waist. Couple energy so loud it drowns out the bell.
</p>
<<actor-thought you>>
Not yours. Never was.
You still stop walking like an idiot.
<</actor-thought>>
<<actor bestfriend>>
God, get a room.
Or at least stop giving strays a free show. 🙄
<</actor>>
<<actor bully>>
Damn. Public property energy. 😂
<</actor>>
<<actor-thought you>>
$bullyName is laughing. $bestfriendName is laughing at you.
$girlfriendName does not even look over.
Of course she doesn't. She has a boyfriend.
<</actor-thought>>
<div class="continue-links">
[[Pretend you were walking somewhere|School 1 Day - class]]
</div>
</div><div id="conv">
<<actor teacher>>
Good afternoon, class. Today, we're going to discuss the importance of trust and communication in relationships. Whether it's with friends, family, or partners, these skills are essential.
<</actor>>
<<actor teacher>>
Sometimes, you might feel like you're losing your connection with someone important to you. Expressing your feelings and listening to your partner's perspective is crucial.
<</actor>>
<<actor teacher>>
Communication is key. Express your feelings clearly and listen actively. Any questions so far?
<</actor>>
<<actor-thought girlfriend>>
Mm. Easy lecture. $exfriendName is still warm on my mouth from the hallway.
<</actor-thought>>
<<actor-thought you>>
An hour ago she was kissing him like a movie still.
You write "trust" in your notebook. Loser ritual. Like homework will make her notice you.
<</actor-thought>>
<p class="delayed">After the lesson...</p>
<<actor exfriend>>
Hey, $girlfriendName, ready to head out?
<</actor>>
<<actor girlfriend>>
Yeah. One sec.
$exfriendName, wait up.
<</actor>>
<<actor bully>>
(approaches with a grin) Hey, $exfriendName, $girlfriendName! You guys coming to the game tonight?
<</actor>>
<<actor exfriend>>
Yeah, we'll be there. Right, $girlfriendName?
<</actor>>
<<actor girlfriend>>
Definitely! See you there, $bullyName!
<</actor>>
<<actor-thought you>>
We. You guys. Still a couple. Of course they are.
The kiss was not a rumor. It was the point.
<</actor-thought>>
</div>
<div class="delayed">
[[Go to the game |School 1 Day - game]]
</div>You also went to the game to watch the football game...
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/touchdown.png'">
Touchdown!!!
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/cup.png'">
<<actor you>>
aahh! What was that? Something hit me!
<</actor>>
<<actor girlfriend>>
Oh sorry got too excited! Does it hurt?
<</actor>>
<<actor you>>
oh $girlfriendName mhh.. no, I mean yes? maybe a little bit?
<</actor>>
<<actor girlfriend>>
haha what now? 🤭
<</actor>>
<<actor you>>
I will survive it I think.
<</actor>>
<<actor girlfriend>>
Great to hear that at least. See ya.
<</actor>>
<div class="delayed">
$girlfriendName goes back to $exfriendName and $bestfriendName. His arm finds her waist like it never left.
</div>
<<actor bestfriend>>
Nice throw. The loser deserved it. First time he got wet by a girl... keep that energy, $girlfriendName
<</actor>>
<<actor girlfriend>>
haha yeah! he was in the way
<</actor>>
<<actor exfriend>>
Babe. Focus on the game. Not strays.
<</actor>>
<<actor girlfriend>>
Relax. He's nobody.
<</actor>>
<<actor-thought you>>
Nobody. Correct.
She kissed him this morning. She is leaving with him tonight.
You are the joke that got a cup of water and a pity check-in.
<</actor-thought>>
<<set $relationshipState = 'known'>>
<div class="delayed">
[[Leave school|After school]]
</div>/* --- Social --- */
/* Still his girlfriend. Kiss stamp lingers. No breakup until ANWO rewrite. */
<p class="delayed">
Morning crush traffic: $girlfriendName by the stairs with $bestfriendName, laughing at something on a phone.
$exfriendName is right there, hand on her backpack strap like a claim tag. Couple. Public. Easy.
</p>
<<actor-thought you>>
Yesterday she kissed him like a couple photo.
Today he still has her. Same story. Same hallway. Same you, rotting in the background.
If you time it wrong, you eat a shoulder. Today you aim for ignored-but-alive.
<</actor-thought>>
/* --- Class --- */
<img class="centered delayed" @src="setup.ImagePath+'you/bored'+ random(1, 3) +'.gif'">
<<actor teacher>>
Relationships require trust and communication, whether friends, family, or partners. Write that down; it will be on a quiz and, unfortunately, on your life.
<</actor>>
<<actor-thought girlfriend>>
Easy for her to say. Some people only communicate with volume.
<</actor-thought>>
<<actor-thought you>>
You write "trust" in your notebook and underline it twice like that summons it.
It will not summon her. She already has a boyfriend.
<</actor-thought>>
/* --- Private --- */
<p class="delayed">After the bell, you almost speak. $bullyName's laugh from the doorway kills the sentence in your throat. $exfriendName is already walking $girlfriendName out like a unit.</p>
<span id="conv"></span>
<div id="options">
<<you-choice "*Wave at $girlfriendName from a safe distance.*">>
<<actor girlfriend>>...Hey. 👋<</actor>>
<<actor bestfriend>>Don't encourage strays. He's been staring all week. Gross.<</actor>>
<<actor exfriend>>
Who's that.
<</actor>>
<<actor girlfriend>>
Nobody. Come on.
<</actor>>
<<actor-thought you>>
She waved. Microscopic. You'll live on that for a week like a starving idiot.
<</actor-thought>>
<<set $aroused = $aroused gte 90 ? $aroused : $aroused + 10>>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "*Go straight home. No self-inflicted damage.*">>
<<actor-thought you>>
Cowards survive to day three. That counts.
<</actor-thought>>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
<<you-choice "*Kill time at the fountain and hope the universe is kinder there.*">>
<div class="delayed">[[Leave school|After school]]</div>
<</you-choice>>
</div><img class="hero-img centered" @src="setup.ImagePath+'story/act1/day1-anwo-lecture.jpg'" alt="ANWO lecture">
<<actor teacher>>
Greetings, students! Today, I want to introduce you to an intriguing concept known as ANWO (Alpha's New World Order).
<</actor>>
<<actor teacher>>
Recently, I came across this idea during my research, and I believe it presents a unique opportunity for us to explore and discuss.
<</actor>>
<<actor teacher>>
ANWO proposes a society where alpha individuals, those perceived as leaders or dominant figures, play a central role in shaping societal dynamics.
<</actor>>
<<actor teacher>>
It raises questions about leadership, influence, and the potential impact on various aspects of our lives.
<</actor>>
<<actor teacher>>
Before you leave, I would like to assign a group project that will be due next month.
<</actor>>
<<actor teacher>>
I want each of you to form groups of five and begin discussing the concept of ANWO. Consider whether this concept is worth exploring and its potential implications.
<</actor>>
<<actor exfriend>>
Hey, $girlfriendName, do you want to team up for the project?
<</actor>>
<<actor girlfriend>>
Um, actually, I was thinking of working with $bullyName and $exfriendName on this one.
<</actor>>
<<actor exfriend>>
Oh, really? Why them?
<</actor>>
<<actor girlfriend>>
Well, $bullyName is good with research, and $exfriendName is great at organizing. I think we'd make a strong team.
<</actor>>
<<actor exfriend>>
Fair enough. Let's do it then.
<</actor>>
<<actor bully>>
Did I hear my name? Need another brain for your project, $girlfriendName?
<</actor>>
<<actor girlfriend>>
Actually, $bullyName, we were just talking about forming a group. Would you like to join us?
<</actor>>
<<actor bully>>
Sure thing. I'll bring my expertise to the table.
<</actor>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act1/day1-group-form.jpg'" alt="project group forming">
<<actor-thought exfriend>>
Great, now it's just the three of us.
<</actor-thought>>
<<actor bestfriend>>
Add me... wait. If $youName is coming, I'm charging emotional damage 😈
<</actor>>
<<actor girlfriend>>
Alright, one is missing. How about my boyfriend $youName?
he can fetch interviews. be useful.
<</actor>>
<<actor bully>>
Okay then.
<</actor>>
<<actor girlfriend>>
$youName come over here!
<</actor>>
<<actor you>>
Yes?!
<</actor>>
<<actor girlfriend>>
You wanna form a group with us? Don't make me regret asking.
<</actor>>
<<actor bestfriend>>
Say yes before she changes her mind, stray.
<</actor>>
<<actor you>>
Yes for sure!
<</actor>>
<<actor bestfriend>>
His face. Every time. You'd think she just proposed and not... classwork.
Anyway. Someone has to carry the interviews. Guess that's the boyfriend job description now. 💀
<</actor>>
<<actor bully>>
Alessia, you in or just commentating?
<</actor>>
<<actor bestfriend>>
I'm in. I just also watch. It's a hobby.
<</actor>>
<<actor girlfriend>>
Alright, let's exchange numbers and create a group chat to discuss our project further.
<</actor>>
<<actor exfriend>>
(quickly exchanging numbers) Done.
<</actor>>
<<actor bully>>
Me too. Let's get this show on the road.
<</actor>>
<<actor-thought exfriend>>
Well, at least we'll get the work done.
<</actor-thought>>
<<actor-thought bestfriend>>
He said yes fast. Like she asked him to prom and not a group project. This is going to be fun to watch. Not for him, obviously.
<</actor-thought>>
/* Early heat: he was last pick, hierarchy sting before any cage */
<<actor bully>>
Last slot for the boyfriend. Cute. Don't drag the grade down, yeah?
<</actor>>
<<actor girlfriend>>
He'll be fine. He listens when it matters. 😌
<</actor>>
<<actor-thought you>>
She said it like a compliment. It landed like a ranking.
$bullyName is already the "research" brain. You're the plus-one who got waved in.
Something about the way she looked at him when she said his name makes your stomach do a small, dirty flip.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<<set $sissyScore += 1>>
<<set $flags.phoneUnlocked = true>>
<<set $flags.anwoGroupFormed = true>>
<<set $storyAct = 1>>
<<set $flags.questHint = "Open Phone and read the project group chat.">>
<div class="delayed">
[[Leave school|After school]]
</div>/* --- Social --- */
<<if !$flags.resultsLiveSeen>>
<<set $flags.resultsLiveSeen = true>>
<p class="delayed">
You already knew from the chat: the PDF left the group. $teacherName is almost glowing. That is never good news for the truth.
</p>
<<else>>
<p class="delayed">
The chat was right. $teacherName is almost glowing. That is never good news for the truth.
</p>
<</if>>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-smiling.jpeg'">
<<actor teacher>>
Hello, class. Wonderful projects this cycle. One was so impressive I need those students to stay.
<</actor>>
<<actor teacher>>
$girlfriendName, $bullyName, $exfriendName, $bestfriendName, and $youName, remain after the bell.
<</actor>>
/* --- Class / aftermath --- */
<p class="delayed">After class, the door shuts. The praise starts soft and gets dangerous.</p>
<<actor teacher>>
You are geniuses. I published the results and informed the student council. Happiness metrics. Even economic angles.
<</actor>>
<<actor teacher>>
With work like this, we can reshape more than a grade book.
<</actor>>
<<if $flags.day8SpokeUp>>
<<actor-thought you>>
You tried to flag the bias. Nobody put it in the PDF. Now the PDF is policy.
<</actor-thought>>
<</if>>
<<actor you>>
I need to tell you something about this study...
<</actor>>
<<actor you>>
These results aren't that impressive. The survey led people there because of how the questions were written.
<</actor>>
<<actor teacher>>
WHAT?! Are you saying these results are a lie? That will have severe consequences!
<</actor>>
<<actor bestfriend>>
$youName, what have you DONE?
I told you he was a liability 💀
<</actor>>
<<actor bully>>
Did you cheat?
<</actor>>
<<actor you>>
All of you knew! I told you!
<</actor>>
<<actor bestfriend>>
Girl. He is so loud when he panics. This is embarrassing for *you*, $girlfriendName.
<</actor>>
<p class="delayed">They deny it with the smooth practice of people who already chose the grade.</p>
<<actor exfriend>>
We didn't know anything. You were in charge of the survey.
<</actor>>
<<actor-thought you>>
Gaslight. He ran the online flood. You did park and $sisterName. He's rewriting the spreadsheet with your name on the blame column.
<</actor-thought>>
<<actor-thought girlfriend>>
I wish I could speak up. If I admit I knew, I burn with him.
<</actor-thought>>
/* --- Private pressure --- */
<<actor teacher>>
$youName, I will remember this. For now, we play along. Maybe it blows over.
<</actor>>
<<actor teacher>>
Or maybe it becomes the new normal. Either way... don't make a habit of embarrassing success.
<</actor>>
<<set $flags.day10Confessed = true>>
<<set $sissyScore += 1>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<div class="delayed">
[[Leave school|After school]]
</div>/* --- Social --- */
<p class="delayed">
The hallway buzz is wrong, too excited, too mean. Someone already printed a mock "alpha list" on a phone wallpaper.
</p>
<<actor bully>>
Heard student council wants to "try something new." Bet I make the cut. 😏
<</actor>>
<<actor exfriend>>
If it's based on our project, we all made the cut. That's the point.
<</actor>>
<<actor-thought you>>
"We" is doing a lot of work in that sentence.
<</actor-thought>>
/* --- Class --- */
<img class="centered delayed" @src="setup.ImagePath+'teacher/standing-mean.jpeg'">
<<actor teacher>>
Hello, students. Exciting news.
<</actor>>
<<actor teacher>>
Thanks to the excellent results from the study led by $youName's group, the student council proposes we implement ANWO principles in this class.
<</actor>>
<<actor teacher>>
What that means, practically:
Provisional alpha and beta lists. Public. Updated after each test.
Alphas get first pick of partners for drills. Betas answer first when I call.
Respect is graded. Rolling eyes at an alpha is a mark against you.
And yes... physical confidence counts. Presence. Not just math.
<</actor>>
<<actor teacher>>
Upcoming sessions: performance, presence, instinct. Some of you will lead. Some of you will learn to follow, properly.
<</actor>>
<<actor-thought you>>
Oh no.
<</actor-thought>>
<<actor-thought exfriend>>
What have we gotten ourselves into?
<</actor-thought>>
<<actor bestfriend>>
This is going to be so messy.
especially for $youName. I kind of can't look away 😈
<</actor>>
<<actor teacher>>
Messy is how culture changes. Bring courage. Leave excuses at the door.
<</actor>>
/* --- Private --- */
<p class="delayed">Bell. Bodies pour out. $girlfriendName catches your sleeve before you hit the stairs.</p>
<<actor girlfriend>>
Hey. Breathe. It's still just a class structure... for now.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "This is because of our survey. Because of me.">>
<<actor girlfriend>>Because of all of us. Don't martyr yourself in the hallway.<</actor>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12BlameSelf = true]]</div>
<</you-choice>>
<<you-choice "What if they put me in beta?">>
<<actor girlfriend>>Then you handle it. Or I help you handle it. Quietly.<</actor>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12FearBeta = true; $sissyScore += 1]]</div>
<</you-choice>>
<<you-choice "*Reach for her hand.*">>
<<actor girlfriend>>...Not here. People are watching the new hierarchy already.<</actor>>
<<actor-thought you>>
She doesn't pull away immediately. She delays. Then she slips free... and that delay is worse than a no.
<</actor-thought>>
<div class="delayed">[[Continue|School 12 Day anwo private][$flags.day12ReachedHand = true]]</div>
<</you-choice>>
</div><<set $flags.classListLive = true>>
<<if $flags.day12ReachedHand>>
<<actor girlfriend>>
Later. When it's not a show. I still like you... I'm just not interested in becoming a prop.
<</actor>>
<p class="delayed">After a beat, she hooks two fingers in yours behind the stair rail... hidden, brief, electric, then lets go.</p>
<<run setup.changeFavor(1)>>
<<elseif $flags.day12FearBeta>>
<<actor girlfriend>>
If they call you beta, don't argue in front of them. Argue with me at home. Public fights make you look smaller.
<</actor>>
<<if $sissyScore gte 3>>
<<actor girlfriend>>
And honestly? You already flinch like you're waiting for the label. Fix that face. 😉
<</actor>>
<</if>>
<<else>>
<<actor girlfriend>>
Stop eating yourself alive. We ride this. Together, as long as you don't light yourself on fire for points you can't win.
<</actor>>
<</if>>
<<actor girlfriend>>
Between us? If this place starts handing out labels… I am not interested in a boyfriend who argues with steel and keys in public.
I want someone who listens. Quietly. 😏
<</actor>>
<<actor-thought you>>
Keys. Control. Her perfume cuts through the fear, and something hotter under it.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<<set $flags.classListLive = true>>
<<set $flags.questHint = "Phone: open Ranks — provisional Alpha/Beta list is live.">>
<div class="continue-links">
[[Leave school|After school]]
</div><<actor teacher>>
Hello, students. Today will be your first test.
<</actor>>
<<actor teacher>>
Remember, not everyone can be an Alpha. This is a contest among all of you.
<</actor>>
<<actor teacher>>
The first test is on your mathematics skills. $bullyName, what is 5 x 8?
<</actor>>
<<actor bully>>
40!
<</actor>>
<<actor teacher>>
Perfect! $exfriendName, what is 15 x 15?
<</actor>>
<<actor exfriend>>
225
<</actor>>
<<actor-thought teacher>>
Let's see if I can catch $youName off guard, especially after those questionable project results. It's because of him that we're in this situation.
<</actor-thought>>
<<actor teacher>>
Great job! Now, $youName, what is the square root of 144?
<</actor>>
<<actor you>>
12
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/13/laugh.jpeg'">
<<actor-thought girlfriend>>
Oh no! He forgot -12.
<</actor-thought>>
<<actor teacher>>
Haha, nice try! But that's only partially right. The correct answer is both 12 and -12. We might have our first beta candidate!
<</actor>>
<<actor-thought you>>
Fuck!
<</actor-thought>>
<<actor teacher>>
Soon, we will discuss your sexual fantasies, as understanding reproductive instincts is important for understanding alpha male behavior.
<</actor>>
<<actor teacher>>
$youName, please stay after class for a moment.
<</actor>>
<div class="delayed">
After class...
</div>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-mean.jpeg'">
<<actor teacher>>
$youName, today wasn't your best day. I suggest you prepare for the sexual fantasies test.
<</actor>>
<<actor teacher>>
Here's a hint: Aim to embody the qualities of an alpha male. Avoid behaviors associated with being a "sissy."
<</actor>>
<<actor-thought you>>
What does "sissy" even mean?
<</actor-thought>>
<<actor you>>
Yes, thank you, $teacherName. I'll make sure to prepare thoroughly!
<</actor>>
<<actor-thought you>>
I need to look that up right away.
<</actor-thought>>
<<set $flags.sissyHintGiven = true>>
<<set $flags.questHint = "Phone: Google what a sissy is, then talk to the group chat and finish the quiz.">>
<div class="continue-links">
[[Leave school|After school]]
</div><<if !$flags.sissyTestDone>>
<<set $flags.questHint = "Phone: Google sissy, open the group chat, finish the sissy-type quiz.">>
<<actor-thought you>>
I should google sissy and talk about it with my friends first. The quiz too, I need to be ready.
<</actor-thought>>
<div class="continue-links">
[[Go home and use Phone|Home][$schoolDay = 15; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<<actor-thought you>>
Today I should be prepared well.
<</actor-thought>>
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-thinking.jpeg'">
<<actor teacher>>
Hello students. I hope you have prepared well.
<</actor>>
<<actor teacher>>
For the next test, please put your phones in the basket at the front and I will hand out a paper.
<</actor>>
<<actor teacher>>
Your task for the next 2 hours is to write an essay about how you imagine sex.
<</actor>>
<p class="delayed">
You put all your phones in the basket
</p>
<img class="centered delayed" @src="setup.ImagePath+'lectures/15/smartphone-basket.jpg'">
<p class="delayed">
All of you start writing your essay. Meanwhile your teacher leaves with the smartphones.
</p>
<div class="delayed">
[[Finish essay | School 15 Day anwo finish essay]]
</div>
<</if>><p class="letter-head">My sex life</p>
<p class="letter">...
$girlfriendName spread her legs wider apart, giving me better access to her dripping pussy. I lined up my cock with her entrance and pushed forward, feeling the tightness envelop my length as I entered her slowly. Both of us groaned in unison as our bodies connected intimately once again.
From there on out, it was nonstop fucking, my hips slapping against her ass cheeks, my hands grasping firmly onto her waist as I pulled her closer to meet each powerful thrust. $girlfriendName's head threw back in ecstasy, exposing her long graceful neck which I hungrily claimed with gentle love bites interspersed between deep kisses.
We moved together like a well-oiled machine, lost in the heat of the moment. Tongues tangled, skin smacked against skin, and our moans echoed throughout the empty room. It wasn't long before we both reached orgasm simultaneously - $girlfriendName screaming out my name while cum splattered onto the walls behind us.
Collapsing onto the floor together, we lay entangled in sweat-soaked sheets, catching our breath and basking in the afterglow of an incredible sexual experience shared between two people who could no longer deny their burning desires for each other.
...
</p>
<<actor-thought you>>
This should prove my alpha status!
<</actor-thought>>
[[Teacher comes back | School 15 Day anwo teacher comes back]]<<actor teacher>>
Thank you all for your essays. I look forward to reading them later when we divide into alphas and betas.
<</actor>>
<<actor teacher>>
The essay itself wasn't even the test. I checked your phones while you were writing them.
<</actor>>
<<actor teacher>>
Because nothing reveals more about your sexual fantasies than your search history.
<</actor>>
<<actor teacher>>
$exfriendName, your recent searches include: "$girlfriendName naked," "deepfake girlfriend," "lesbian porn."
<</actor>>
<<actor-thought you>>
This guy is still obsessed with my girlfriend. What a loser.
<</actor-thought>>
<<actor teacher>>
You pass the test!
<</actor>>
<<actor you>>
What? Why?
<</actor>>
<<actor teacher>>
Just because he doesn't have $girlfriendName doesn't automatically make him a beta. He's clearly still fixated on her and interested in women.
<</actor>>
<<actor teacher>>
$bullyName, your searches were: "3-some," "Is 10 inches small?"
<</actor>>
<<actor teacher>>
That's also a pass. Although being unsure about penis size isn't ideal, 10 inches is definitely above average.
<</actor>>
<<actor bully>>
Yeah!
<</actor>>
<<actor teacher>>
Lastly, $youName, you searched for: "What is a sissy?" and "12 sissy types."
<</actor>>
<<actor teacher>>
The sissy question might have been okay, but the 12 types? No alpha male would ever search for something like that. I'm sorry, but you didn't pass this time.
<</actor>>
<<actor you>>
But you told me to educate myself about sissies?!
<</actor>>
<<actor teacher>>
I never said that! I only said not to behave like one. It's not my fault if you decided to look it up. 😉
<</actor>>
<<actor-thought you>>
She tricked me! She knew I would search for it.
<</actor-thought>>
<p class="delayed">In the aisle, $girlfriendName's mouth is a thin line... not quite a smile, not quite pity.</p>
<<actor girlfriend>>
Browser history is a personality test now. We'll... talk later. Softly.
<</actor>>
<<if $sissyScore gte 3>>
<<actor-thought girlfriend>>
He always studies the wrong lessons first.
<</actor-thought>>
<</if>>
<<set $sissyScore += 2>>
<<if $aroused lt 90>><<run setup.nudgeArousal(8)>><</if>>
<<set $flags.day15Passed = true>>
<<set $flags.questHint = "">>
<div class="continue-links">
[[Leave school|After school]]
</div>/* --- Social --- */
<p class="delayed">
Yesterday's "test" is already hallway currency. Someone whispers "sissy types" and laughs when you pass.
</p>
<<actor bully>>
Rough day, man. Searching tutorials on how not to be a loser? Brutal. 😂
<</actor>>
<<actor exfriend>>
Leave him. $teacherName set a trap. Half the class would have googled it.
<</actor>>
<<actor bestfriend>>
Would *we*, though? 🤭
some people just scream "google sissy at 2am"
not naming names. oh wait. $youName
<</actor>>
/* --- Class --- */
<img class="centered delayed" @src="setup.ImagePath+'teacher/sitting-smiling.jpeg'">
<<actor teacher>>
Good morning. Some of you learned that curiosity is not the same as alpha instinct.
<</actor>>
<<actor teacher>>
Today is recovery work: essays returned, ranks provisional. Betas may still rise. Alphas may still fall. Behavior is a daily exam.
<</actor>>
<<actor teacher>>
$youName, eyes up. Shame is useful if it changes you. Useless if it only makes you hide.
<</actor>>
<<actor-thought you>>
She smiles when she says your name. The room hears it.
<</actor-thought>>
/* --- Private --- */
<p class="delayed">After class, $girlfriendName finds you by the corridor water fountain, smaller audience than the park. Still not private.</p>
<<actor girlfriend>>
Hey. Ignore $bullyName. He's high on winning a phone check.
<</actor>>
<<actor girlfriend>>
But... she wasn't totally wrong either. You walked into that search like a good little student. Next time, ask me before you dig a hole with your browser history.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "She told me not to act like a sissy. I was trying to prepare.">>
<<actor girlfriend>>I know. That's what makes it funny, and mean. You're sweet. Sweet gets eaten here.<</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end][$sissyScore += 1]]</div>
<</you-choice>>
<<you-choice "Are you embarrassed to be seen with me?">>
<<if $girlfriendTrustLevel gt 5>>
<<actor girlfriend>>A little on display. Not of you... of the label. Difference. Walk with me anyway.<</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end][$girlfriendTrustLevel = setup.changeFavor(1)]]</div>
<<else>>
<<actor girlfriend>>Don't make me answer that in public. Just... keep your head down a week.<</actor>>
<div class="delayed">[[Continue|School 16 Day anwo end]]</div>
<</if>>
<</you-choice>>
<<you-choice "*Laugh it off.* 'Guess I'm the class cautionary tale.'">>
<<actor girlfriend>>Don't gift them the joke. Let them work for it.<</actor>>
<<actor-thought you>>
Laughing hurts less than defending yourself. You're learning the wrong lessons fast.
<</actor-thought>>
<div class="delayed">[[Continue|School 16 Day anwo end][$sissyScore += 1]]</div>
<</you-choice>>
</div><<actor girlfriend>>
Text me later. And maybe stay off "educational" searches for a bit. 😏
<</actor>>
<<actor girlfriend>>
Also, if anyone in that group chat gets meaner, tell me first. I can be… protective. Or possessive. Same lipstick either way.
<</actor>>
<<actor bully>>
(from down the hall) Yo soft-search! Don't cry into your browser history tonight! 😂
<</actor>>
<p class="delayed">On the board by the door: a provisional list. Marker still wet. Same data as Phone → Ranks.</p>
<<actor-thought you>>
$bullyName near the top. Your name lower. Not last... yet. Someone already took a photo.
<</actor-thought>>
<<actor bestfriend>>
aww look they ranked the search history boy
don't trip on the way out beta 🤭
check your phone if you want the full humiliation package
<</actor>>
<<actor girlfriend>>
Ignore the board. For now.
Or stare at it with everyone else. Phone Ranks is the same list.
Walk.
<</actor>>
<<actor-thought you>>
The hierarchy isn't a theory unit anymore. It's a list on glass, whispers, and her hand almost on your back, claiming you before anyone else can.
<</actor-thought>>
<<run setup.nudgeArousal(8)>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Look at the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div><div id="conv">
<<actor teacher>>
Hello, my students. Before we start, I want to change something about these classes.
<</actor>>
<<actor teacher>>
Council approved "physical confidence" as a ranking factor. Presence. Size. Not only math.
I've realized our alpha students are not getting the respect they deserve from their beta comrades.
<</actor>>
<<actor teacher>>
So today I will show you... clearly, why big-dick males outperform beta males in the only category that seems to matter to some people. Let's start.
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/white-black-cock.jpeg'">
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/alpha-beta-cock.jpeg'">
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/white-black-cock2.jpeg'">
<<actor teacher>>
Here is a comparison. A small-dicked male is simply underperforming in this category.
<</actor>>
<<actor teacher>>
And ladies, we all know that even when we say size doesn't matter... it matters. 😉
<</actor>>
<<actor girlfriend>>
Stop that. I don't believe your nonsense.
<</actor>>
<<actor teacher>>
Okay. You don't believe me? Then we test it. $youName. $bullyName. Front of the room.
Volunteers preferred. Refusal is noted as beta hesitation.
<</actor>>
</div>
<div id="options">
<<you-choice "I will prove you wrong!">>
<<actor bully>>
Okay. I'm in. 😏
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/show-off.png'">
<<include "First time alpha cock see">>
<</you-choice>>
<<you-choice "This is insane. I'm not doing that.">>
<<actor teacher>>
Noted. Refusal still puts you at the front... as the contrast. $bullyName, you're already standing.
<</actor>>
<<actor bully>>
Relax. I'll do the heavy lifting. Literally. 😏
<</actor>>
<<actor bestfriend>>
he said no and still walks up. classic 💀
<</actor>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/1/show-off.png'">
<<include "First time alpha cock see">>
<</you-choice>>
</div><<actor girlfriend>>
...
<</actor>>
<<actor-thought girlfriend>>
Don't look down. Don't look down. You looked down.
That's not... you weren't supposed to react. Your face already did.
<</actor-thought>>
<<actor girlfriend>>
Okay. That's... I mean. That's objectively impressive. I'm not going to pretend I didn't see that.
<</actor>>
<<actor bestfriend>>
jenny's face rn is sending me 💀 she's doing the thing where she tries not to look and looks twice
<</actor>>
<<actor girlfriend>>
Shut up, Alessia.
<</actor>>
<<actor-thought you>>
Your brain stops working for a second. Not because of the size. Because of her face. That half-second where she forgot you were in the room.
You know that face. You've seen it in bed. You've never earned it.
<</actor-thought>>
<<actor you>>
Cool. Great. Can I sit down now?
<</actor>>
<<actor bully>>
Relax, man. It's just genetics. Nothing personal.
<</actor>>
<<actor bestfriend>>
he said "nothing personal" like he didn't just end someone's relationship in front of thirty people. legend.
<</actor>>
<<actor teacher>>
There you have it. Size is data. Data doesn't care about feelings.
Homework: study the difference between alpha and beta. Nobody forgets a size gap like that.
The board will update. Some of you just climbed. Some of you just learned.
<</actor>>
<<run setup.nudgeArousal(12)>>
<<set $flags.anniversaryTonight = true>>
<<set $relationshipState = "reset">>
<p class="delayed">After class, $girlfriendName catches your sleeve in the hallway, away from $bullyName.</p>
<<actor girlfriend>>
Hey. Look at me. Not at the floor.
Tonight is still ours. Anniversary. Fountain after school, or come straight home if you're late.
I told $sisterName I might stop by. Don't leave me hanging after that circus.
<</actor>>
<<actor-thought you>>
Her perfume. Her hand on your arm. Your brain still full of $bullyName and the classroom laugh.
She's trying to be normal. You can hear the effort in her voice.
That's almost worse than if she'd said nothing.
<</actor-thought>>
<<actor you>>
I'll be there. I swear.
<</actor>>
<<actor girlfriend>>
Good boy. Make it worth the wait. 😘
<</actor>>
<<set $flags.questHint = "Anniversary night. You are too wound up, Home → Lose control.">>
<<run setup.peakArousal()>>
<div class="continue-links">
[[Fountain (she might be late)|After school]]
[[Go home aching|Home][$gameDate = setup.changeDate($gameDate, 'hours', 4)]]
</div><div id="conv">
<<actor teacher>>
So, my students: we have covered alpha versus beta.
<</actor>>
<<actor teacher>>
Today we learn what to do with small cocks.
<</actor>>
<img class="centered delayed" @src="setup.ImagePath+'lectures/2/locked-cock.jpg'">
<<actor teacher>>
We lock them up. If they cannot please us, we put them somewhere they cannot do harm... including to themselves.
<</actor>>
<<actor teacher>>
Homework is practical. If you know a small dick that cannot follow rules, lock it until we meet again. Keyholders report progress.
<</actor>>
<<actor you>>
You won't lock me up, right, $girlfriendName? 😨
<</actor>>
<<actor girlfriend>>
No. I think it's a little radical.
I mean... as long as you play by the rules, why cage it? 😏
<</actor>>
<<actor bully>>
After the size demo? Radical is just efficient. 😂
<</actor>>
<<actor bestfriend>>
she's joking. unless she's not. either way, cute panic face $youName
<</actor>>
<<actor-thought you>>
Her smile is soft. Her eyes are not. "Rules" hangs in the air like a collar she hasn't closed yet.
The Day 20 board still lives behind your eyes.
<</actor-thought>>
</div>
<p class="delayed">After the bell, she walks with you as far as the stairs, close enough that $bullyName can see, quiet enough that he cannot hear.</p>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act2/day25-rules-stairs.jpg'" alt="rules warning after class">
<<actor girlfriend>>
That lecture was intense. But she isn't totally wrong about... control.
<</actor>>
<<actor girlfriend>>
I meant what I said. Play by the rules and I don't need a lock.
Hands off yourself. Show up when you say you will. Make me feel chosen, not like a pause between strokes.
<</actor>>
<<actor girlfriend>>
Break that again and I'm not arguing. I'm solving it. $sisterName already thinks she knows how. 😉
<</actor>>
<<if $flags.caughtStroking1>>
<<actor-thought you>>
Anniversary. Her on your bed. Your hand later that same night. She remembers.
<</actor-thought>>
<<else>>
<<actor-thought you>>
She says it like a joke. Your cock still hears a threat.
<</actor-thought>>
<</if>>
<<actor you>>
I can follow rules.
<</actor>>
<<actor girlfriend>>
Good. Prove it. Fountain later, or home. I'll know if you "need a minute" alone. 😘
<</actor>>
<<run setup.peakArousal()>>
<<set $flags.day25RulesWarning = true>>
<<set $flags.mustResolveCage = true>>
<<set $flags.questHint = "You will not sleep this off. Home → take care of yourself.">>
<div class="continue-links">
[[Go home (you are buzzing)|Home][$gameDate = setup.changeDate($gameDate, 'hours', 4)]]
</div><<nobr>>
<<if $flags.ultimateHumiliationDone>>
<<actor-thought you>>
Last time you stood in this hallway, $bullyName was in your living room and $girlfriendName was wearing his cologne on her neck.
Today is just Monday. The lock doesn't know what day it is. You do.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
Steel under denim. Same hallway. Different weight in every step.
The rules from that morning still echo: you clean when she says, you beg and she laughs, you call her yours on paper and he calls her when he wants the real thing.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Something changed. You can feel it in the way $girlfriendName looks at you when she thinks you're not watching.
<</actor-thought>>
<</if>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'places/school.jpg'" alt="school entrance">
<<actor girlfriend>>
morning. walk normal.
<</actor>>
<<if $caged>>
<<actor-thought you>>
Walk normal. She says it like it's easy. Like the steel isn't shifting with every other step.
You nod. She doesn't wait for a reply. She doesn't need one.
<</actor-thought>>
<</if>>
<</nobr>>
<div id="conv"></div>
<<if $caged>>
<div id="options">
<<you-choice "Walk beside her like nothing changed.">>
<<actor girlfriend>>
see? you remember how to be normal.
key's with me. class is class. don't make it weird.
<</actor>>
<<set $complyScore += 1>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(6)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
<<you-choice "Mumble: do the others know?">>
<<actor girlfriend>>
others?
$bestfriendName knew before you did. $bullyName probably guessed when you started walking like that.
nobody's going to ask. nobody cares about your little secret as much as you think.
except me. i care about the key. 😏
<</actor>>
<<set $sissyScore += 1>>
<<run setup.nudgeArousal(8)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
<<you-choice "Can we talk about last night?">>
<<actor girlfriend>>
last night was tuesday. nothing happened on tuesday.
we have rules now. you follow them. i enforce them.
that's the talk. class. now. 😒
<</actor>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(10)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
</div>
<<else>>
<div id="options">
<<you-choice "Head to class together.">>
<<actor girlfriend>>
see you after. behave.
<</actor>>
<<run setup.nudgeArousal(4)>>
<<include "School 26 Day anwo class">>
<</you-choice>>
</div>
<</if>><<nobr>>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day1-anwo-lecture.jpg'" alt="classroom">
<<actor teacher>>
I see everyone made it. Good. Today we continue our discussion on hierarchy dynamics.
<</actor>>
<<if $caged>>
<<actor-thought you>>
Hierarchy dynamics. You're sitting in a cage listening to a lecture about hierarchy.
Someone behind you coughs. $bullyName. He doesn't look at you. He doesn't need to.
<</actor-thought>>
<</if>>
<<actor bully>>
Council updated the rankings over the weekend. Some people climbed. Some people learned where they belong.
<</actor>>
<<if setup.classRankingHasUpdate()>>
<<actor bestfriend>>
the board changed again. $youName, you might want to look. or not. depends on how much honesty you can handle today. 💀
<</actor>>
<<else>>
<<actor bestfriend>>
nothing changed, which is somehow worse. you're exactly where you were. 💀
<</actor>>
<</if>>
<<actor teacher>>
$girlfriendName, $exfriendName, $bullyName. Your project is due next week. Make sure all five members contribute equally.
<</actor>>
<<actor exfriend>>
equally. sure.
<</actor>>
<<actor bestfriend>>
he said "equally" like he's never seen a group project before. classic. 💀
<</actor>>
<<if $flags.ultimateHumiliationDone>>
<<actor-thought you>>
$exfriendName. He was in your living room. He was in your bed. Now he's three rows ahead of you doing group project math like nothing happened.
The teacher doesn't know. The class doesn't know. You know. That's the whole cage.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
You look at $exfriendName and wonder what he sees when he looks at you now.
Probably the same thing he always saw. A plus-one. A wallet. A boyfriend with a deadline.
<</actor-thought>>
<</if>>
<<run setup.peakArousal()>>
<<set $flags.day26Done = true>>
<<set $flags.questHint = "Check the ranking board. After school.">>
<p class="delayed">After class, $girlfriendName catches your arm at the door. Quick. Before anyone notices.</p>
<<actor girlfriend>>
you did fine. walk normal on the way out.
and... don't forget. friday's coming.
<</actor>>
<<if ($flags.fridayDateStage || 0) gte 4>>
<<actor-thought you>>
Friday. $bullyName's night. Or the ex's. Or both. You stopped counting whose turn it is.
She counts. She always counts.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Friday. She says it like a date. You know it's a calendar slot you can't control.
<</actor-thought>>
<</if>>
<</nobr>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div><<if !$flags.phone1Read>>
<<set $flags.questHint = "Open your Phone and read the group chat before school will move on.">>
<<actor-thought you>>
I should read my phone messages first. Home will keep reminding me.
<</actor-thought>>
<div class="continue-links">
[[Go home and check Phone|Home][$schoolDay = 3; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<<actor exfriend>>
Hey I completed the survey, you wanna have a look?
<</actor>>
<div class="continue-links">
[[Start Survey]]
</div>
<</if>><img class="hero-img centered" @src="setup.ImagePath+'story/act1/day3-survey-laptop.jpg'" alt="ANWO survey on laptop">
<p class="letter-head">ANWO survey</p>
<p class="letter">Welcome to the ANWO (Alpha New World Order) survey. Your feedback is important and will help us understand different perspectives on ANWO. Please answer the following questions honestly and to the best of your ability.</p>
[[Start Survey|Section 1]]<<set $score to 0>>
<p class="letter-head">ANWO survey</p>
<p class="letter">How familiar are you with the concept of ANWO?
[['Very familiar'|Q2][$score+= 1]]
[['Somewhat familiar'|Q2][$score+= 0]]
[['Not familiar at all'|Q2][$score+= -1]]
</p><p class="letter-head">ANWO survey</p>
<p class="letter">Do you agree with the idea that alpha males should dominate in society?
[['Strongly agree'|Q3][$score+= 2]]
[['Agree'|Q3][$score+= 1]]
[['Neutral'|Q3][$score+= 0]]
[['Disagree'|Q3][$score+= -1]]
[['Strongly disagree'|Q3][$score+= -2]]
</p><p class="letter-head">ANWO survey</p>
<p class="letter">
What are the potential benefits of ANWO? (Check all that apply)
Stronger leadership <<checkbox "$answer1" false true>>
Increased societal efficiency <<checkbox "$answer2" false true>>
Better decision-making <<checkbox "$answer3" false true>>
Improved discipline <<checkbox "$answer4" false true>>
No benefits <<checkbox "$answer5" false true>>
</p>
<<button [[Next|Q4]]>>
<<if $answer1>><<set $score += 2>><</if>>
<<if $answer2>><<set $score += 2>><</if>>
<<if $answer3>><<set $score += 2>><</if>>
<<if $answer4>><<set $score += 2>><</if>>
<<if $answer5>><<set $score -= 2>><</if>>
<</button>><p class="letter-head">ANWO survey</p>
<p class="letter">
What are the potential drawbacks of ANWO? (Check all that apply)
Increased bullying <<checkbox "$answer1" false true>>
Social division <<checkbox "$answer2" false true>>
Gender inequality <<checkbox "$answer3" false true>>
Suppression of beta males <<checkbox "$answer4" false true>>
None <<checkbox "$answer5" false true>>
</p>
<<button [[Next|Q5]]>>
<<if $answer1>><<set $score -= 2>><</if>>
<<if $answer2>><<set $score -= 2>><</if>>
<<if $answer3>><<set $score -= 2>><</if>>
<<if $answer4>><<set $score -= 2>><</if>>
<<if $answer5>><<set $score += 2>><</if>>
<</button>><p class="letter-head">ANWO survey</p>
<p class="letter">
Do you think ANWO would positively or negatively affect your life personally?
[['Positively'|Q6][$score+= 2]]
[['Neutral'|Q6][$score+= 0]]
[['Unsure'|Q6][$score+= 0]]
[['Negatively'|Q6][$score+= -2]]
</p><p class="letter-head">ANWO survey</p>
<p class="letter">
Do you believe that the concept of ANWO has a place in the future of society?
[['Yes'|Survey End][$score+= 2]]
[['Unsure'|Survey End][$score+= 0]]
[['No'|Survey End][$score+= -2]]
</p><p class="letter-head">ANWO survey Result</p>
Thank you for your participation. Let's see how your responses score!
Your total score is: <<print $score>>
<<if $score > 1>>
Your overall sentiment towards ANWO is positive.
Your feedback suggests that ANWO could offer benefits aligned with enhanced leadership and societal effectiveness. Your perspective on the potential advantages of ANWO indicates optimism about its potential impact. Thank you once again for sharing your thoughts and insights!
<<elseif $score < -10>>
Your overall sentiment towards ANWO is negative.
Your feedback highlights reservations about ANWO, particularly regarding its implications for societal dominance and leadership dynamics. Your perspective suggests skepticism about the potential benefits and the overall impact of ANWO.
Thank you for sharing your insights and contributing to our understanding of diverse viewpoints on ANWO.
<<else>>
Your overall sentiment towards ANWO is neutral.
Your feedback indicates a balanced view regarding ANWO. You acknowledge potential benefits associated with the concept while maintaining a neutral stance on its broader implications. Thank you for sharing your insights and contributing to our understanding of diverse perspectives on ANWO.
<<endif>>
Thank you for your time and participation!
[[Restart Survey | Start Survey]]
[[Discuss Survey]]<<set $flags.day3SurveyDone = true>>
<<set $flags.questHint = "">>
<<actor you>>
I feel like this survey is skewed towards favoring the ANWO concept!
<</actor>>
<<actor you>>
It offers options for agreeing with its principles but doesn't provide balanced choices for those who might disagree or have concerns.
<</actor>>
<<actor you>>
This could make the results more likely to show a positive perception of ANWO.
<</actor>>
<<actor exfriend>>
Yes, but we need to provide significant results otherwise $teacherName won't give us a good mark!
<</actor>>
<<actor girlfriend>>
Yeah!
<</actor>>
<<actor bully>>
$exfriendName is right!
<</actor>>
<<actor-thought you>>
I hope this doesn't get revealed.
<</actor-thought>>
<div class="continue-links">
[[Leave school|After school]]
</div><img class="hero-img centered" @src="setup.ImagePath+'story/act2/day35-jenny-s42.png'" alt="Jenny at classroom desk">
<<nobr>>
<<actor teacher>>
Groups, final push. Your project presentations are next week. Use today to coordinate.
<</actor>>
<<actor bully>>
I'll handle the slides. $exfriendName, data. $girlfriendName, talking parts.
$youName... attendance. 😏
<</actor>>
<<actor bestfriend>>
he said attendance like it's a job description. because it is. 💀
<</actor>>
<<actor girlfriend>>
ignore him. just make sure you show up.
like you do for everything else. 😘
<</actor>>
<<actor-thought you>>
She says "everything else" and your brain fills in the cage, the key, the rules, the Friday calendar.
Ten people in this group. Five of them know something. None of them will ask.
That's the ANWO hierarchy in action.
<</actor-thought>>
<p class="delayed">Break time. $bestfriendName leans across the table, voice carrying one decibel too loud.</p>
<<actor bestfriend>>
so... friday. $bullyName or $exfriendName this week? or both? i lose track. 🤭
<</actor>>
<<actor girlfriend>>
Alessia. Not here.
<</actor>>
<<actor bestfriend>>
i'm just asking. it's a social calendar. not a secret. everyone knows about the friday thing.
well. everyone who pays attention. which is everyone except the guy paying for it. 💅
<</actor>>
<<actor exfriend>>
Can we not do this in public?
<</actor>>
<<actor bestfriend>>
public? this is a group project table. we're all in the group. some of us more than others. 😈
<</actor>>
<<actor bully>>
She's got a point. Friday is a team sport at this point. $youName just doesn't play. He watches. And pays. 😂
<</actor>>
<<actor-thought you>>
Three tables away, someone looks over. Then looks away. Then looks back.
The hallway heard it. The class heard it. $bestfriendName made sure.
You are the guy whose girlfriend has a Friday schedule that doesn't include him.
Public record. Semi-public humiliation. Welcome to the hierarchy.
<</actor-thought>>
<<run setup.nudgeArousal(12)>>
<<set $sissyScore += 2>>
<<set $flags.day35PublicHumiliationDone = true>>
<</nobr>>
<div id="conv"></div>
<div id="options">
<<you-choice "Put your head down and wait for it to pass.">>
<<actor girlfriend>>
hey. look at me.
she's being loud. she's always loud. doesn't change the rules.
friday still costs money. yours.
so stop sulking and act normal. 😒
<</actor>>
<<set $complyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">The bell rings. Nobody else mentions it. Everyone heard it.</p>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</you-choice>>
<<you-choice "Say: at least I get to be there. He doesn't.">>
<<actor bestfriend>>
the AUDACITY. also the cope. you "get to be" in the chair. in the cage. in the corner.
that's not a win, that's a seating chart. 💀
<</actor>>
<<actor bully>>
Damn. She didn't have to go that hard.
...actually, yeah she did. 😂
<</actor>>
<<set $sissyScore += 2>>
<<set $resistScore += 1>>
<<run setup.nudgeArousal(10)>>
<<actor girlfriend>>
don't start fights you can't finish, baby.
class. now. we'll talk about friday at home. where it belongs. 😐
<</actor>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</you-choice>>
<<you-choice "Laugh along. Fake it.">>
<<actor bestfriend>>
he's laughing. either he's broken or he's into it. both are funny. 💅
<</actor>>
<<actor girlfriend>>
you're weird today. but at least you're not crying.
that's growth, i guess. 😏
<</actor>>
<<set $sissyScore += 3>>
<<set $complyScore += 1>>
<<run setup.peakArousal()>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>
<</you-choice>>
</div><<set $flags.fieldSurveyOpen = true>>
<<set $flags.questHint = "Field interviews: Park (before 22:00) and step-sister (before 18:00).">>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day5-field-park.jpg'" alt="field survey work">
/* --- Social --- */
<p class="delayed">
Before class, your group clusters near the lockers. $exfriendName has a clipboard like he was born holding one.
</p>
<<actor exfriend>>
So... we agreed. Everybody runs the survey on at least two people. Real answers. Real data.
<</actor>>
<<actor bestfriend>>
Define "real." People will say whatever makes them sound smart.
<</actor>>
<<actor bully>>
Then ask louder. Or smile more. Works for me. 😏
<</actor>>
<<actor girlfriend>>
Be nice. We need clean results for $teacherName, not a fight in the park.
<</actor>>
/* --- Class --- */
<p class="delayed">Class is mostly project time. $teacherName circles like a shark that grades.</p>
<<actor teacher>>
Fieldwork builds character. Alphas gather truth. Betas invent excuses. Don't make me guess which you are.
<</actor>>
<<actor-thought you>>
She looks at you a second too long when she says "betas." Heat crawls up your neck like she can smell who you are becoming.
<</actor-thought>>
<<actor bully>>
If your boyfriend freezes up in the park, $girlfriendName, I'll handle the charm portion.
<</actor>>
<<actor girlfriend>>
He won't freeze. He'll do what the project needs. 😌
<</actor>>
<<actor-thought you>>
Not: he'll lead. He'll *do what is needed*. Your cock stirs at being managed in public and you hate that it does.
<</actor-thought>>
<<run setup.nudgeArousal(12)>>
/* --- Private --- */
<<actor exfriend>>
Assignments: $youName, two subjects minimum. $girlfriendName and I will handle online if needed.
<</actor>>
<<actor you>>
I'll ask my step-sister. And someone at the park.
<</actor>>
<<actor girlfriend>>
Good. Text the group when you're done. And... be careful how you phrase the questions. People copy energy.
If someone answers like an alpha, write it down. If they look at you like a beta... write that down too.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "The survey already steers people toward ANWO.">>
<<actor exfriend>>That's called design. We want a good grade, not a philosophy degree.<</actor>>
<<actor girlfriend>>Just do your two. We can argue ethics after the A. 😘<</actor>>
<<actor-thought you>>
She squeezes your wrist, soft, dismissive, intimate. The argument dies in your throat.
<</actor-thought>>
<div class="delayed">[[Leave school|After school][$resistScore += 1]]</div>
<</you-choice>>
<<you-choice "Okay. Two people. Easy.">>
<<actor bully>>Look at the team player. Don't mess it up.<</actor>>
<<actor-thought you>>
Easy. You already know your sister will score pro-hierarchy. The park is the wild card.
<</actor-thought>>
<div class="delayed">[[Leave school|After school][$complyScore += 1]]</div>
<</you-choice>>
<<you-choice "*Stay quiet. Nod.*">>
<<actor girlfriend>>You've got that look. Don't overthink it... just collect smiles and yeses.<</actor>>
<<actor-thought you>>
Nodding is easier than being the problem again.
<</actor-thought>>
<div class="delayed">[[Leave school|After school][$sissyScore += 1; $complyScore += 1]]</div>
<</you-choice>>
</div><<if !$flags.surveyPark or !$flags.surveySister>>
<<set $flags.questHint = "Finish both surveys: Park (before 22:00) and step-sister in the morning.">>
<<actor-thought you>>
I still need the park survey and $sisterName's answers before this day counts.
<</actor-thought>>
<div class="continue-links">
[[Go do the surveys|Home][$schoolDay = 8; $gameDate = setup.changeDate($gameDate, 'hours', 2)]]
</div>
<<else>>
<<set $flags.questHint = "">>
<img class="hero-img centered" @src="setup.ImagePath+'story/act1/day8-results-table.jpg'" alt="survey results compilation">
/* --- Social --- */
<p class="delayed">
Your group meets at the back tables to compile numbers. Laptops open. Smiles too bright.
</p>
<<actor you>>
I've finished my interviews. Two of mine were positive.
<</actor>>
<<actor girlfriend>>
Same... mostly positive, one holdout. She called it "playful power," then laughed like she was joking.
<</actor>>
<<actor bully>>
Five positive, one neutral, one negative. The negative was a guy. Shocking.
<</actor>>
<<actor bestfriend>>
Mine were fine. People love a simple hierarchy when you wrap it in "safety."
<</actor>>
/* --- Class / report --- */
<<actor exfriend>>
I posted the survey online. Twenty thousand responses. Eighteen thousand positive. Fifteen hundred neutral. Five hundred negative.
<</actor>>
<<actor you>>
Twenty thousand? That's not a class project. That's a signal.
<</actor>>
<<actor exfriend>>
That's an A. $teacherName wants "significant results." We delivered.
<</actor>>
<<actor teacher>>
I can hear the enthusiasm from here. Compile cleanly. Submit today. History is watching, and so is the student council.
<</actor>>
/* --- Private --- */
<<actor-thought you>>
The questions were skewed. You said so. They smiled and kept stacking yeses.
If this leaves the classroom, it won't be a joke anymore.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "We should flag the bias before we submit.">>
<<actor bestfriend>>And fail? Cute ethics from the guy who freezes in parks. No.<</actor>>
<<actor girlfriend>>Not here. Please. We'll look like we sabotaged our own work.<</actor>>
<<actor bully>>Man wants to confess before the crime is even fun. Sit down.<</actor>>
<<actor bestfriend>>Sit. Smile. Pretend you have a spine later. 💅<</actor>>
<div class="delayed">[[Submit anyway|School 8 Day anwo submit][$flags.day8SpokeUp = true; $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1); $resistScore += 2]]</div>
<</you-choice>>
<<you-choice "Fine. Submit it. I want the grade.">>
<<actor girlfriend>>Smart. We can sleep at night after the score posts. 😉<</actor>>
<<actor-thought you>>
You taste metal. Consent to the lie feels like a collar you put on yourself.
<</actor-thought>>
<div class="delayed">[[Hand in the packet|School 8 Day anwo submit][$flags.day8SpokeUp = false; $sissyScore += 1; $complyScore += 2]]</div>
<</you-choice>>
<<you-choice "*Look at $girlfriendName for a cue.*">>
<<actor girlfriend>>Submit. We'll talk later, if there's anything to talk about.<</actor>>
<<actor-thought you>>
Her eyes say: don't be the problem in public.
<</actor-thought>>
<div class="delayed">[[Follow her lead|School 8 Day anwo submit][$flags.day8SpokeUp = false; $sissyScore += 1; $complyScore += 1]]</div>
<</you-choice>>
</div>
<</if>><<set $flags.day8Submitted = true>>
<<set $flags.questHint = "">>
<<if $flags.day8SpokeUp>>
<<actor exfriend>>
For the record: I'm submitting the clean packet. Your little speech didn't make the PDF.
<</actor>>
<<actor-thought you>>
Of course it didn't. The group is a machine now. You're just a noisy gear.
<</actor-thought>>
<<actor girlfriend>>
Hey. I know you meant well. Just... don't make us targets before we have to be.
<</actor>>
<p class="delayed">A soft squeeze of your hand under the table, then she lets go.</p>
<<else>>
<<actor exfriend>>
Packet's in. Smile for the photo if $teacherName wants one.
<</actor>>
<<actor girlfriend>>
See? Easy. You did your part. That's enough for today. 😘
<</actor>>
<</if>>
<<actor teacher>>
Excellent work, group. I expect the rest of the class to study your methods.
<</actor>>
<<actor teacher>>
And $exfriendName... if those online numbers hold, I may share them beyond this room. Significant results deserve an audience.
<</actor>>
<<actor-thought you>>
Audience. Not a grade. Your stomach does a slow, wrong flip.
<</actor-thought>>
<<set $flags.questHint = "Phone: the project might go public. Check the group chat.">>
<div class="delayed">
[[Leave school|After school]]
</div><<nobr>>
<<set $schoolDay += 1>>
<<set _weekNum = $schoolDay - 26>>
<img class="hero-img centered" @src="setup.ImagePath+'places/school.jpg'" alt="school morning">
<<if $caged && $flags.ultimateHumiliationDone>>
<<actor-thought you>>
Another Monday. The cage doesn't count weekdays. Neither does the key on her collarbone.
You walk through the hallway like you belong here. You don't. You belong under the schedule she writes.
<</actor-thought>>
<<elseif $caged>>
<<actor-thought you>>
Another Monday. Steel under denim. Same lock. Same hallway. Different weight each week.
<</actor-thought>>
<<else>>
<<actor-thought you>>
Another Monday. The project is almost done. The hierarchy is almost permanent. You're almost used to it.
<</actor-thought>>
<</if>>
/* --- Jenny morning --- */
<<if $girlfriendTrustLevel gte 7>>
<<actor girlfriend>>
morning. walk normal. be useful today.
<<if _weekNum gt 2>>we're getting into a routine. i like routines. 😘<<else>>class first. then we talk. 😏<</if>>
<</actor>>
<<elseif $girlfriendTrustLevel lte 3>>
<<actor girlfriend>>
walk. don't talk. class. now.
<</actor>>
<<elseif $girlfriendTrustLevel gte 6>>
<<set _jennyQ = random(1, 3)>>
<<switch _jennyQ>>
<<case 1>>
<<actor girlfriend>>
morning, baby. sleep okay?\ni checked the cage from here. it looked cute on you. 😘
<</actor>>
<<case 2>>
<<actor girlfriend>>
you're here. good.\ni missed you a little. don't let it go to your head. 😉
<</actor>>
<<case 3>>
<<actor girlfriend>>
walk normal. be good today.\ni have plans for you later. the nice kind. 😘
<</actor>>
<</switch>
<<else>>
<<set _jennyQ = random(1, 3)>>
<<switch _jennyQ>>
<<case 1>>
<<actor girlfriend>>
morning. behave. i'm watching.
<</actor>>
<<case 2>>
<<actor girlfriend>>
you're late. again. the cage doesn't excuse bad timing.
<</actor>>
<<case 3>>
<<actor girlfriend>>
walk normal. key's with me. same as always.
<</actor>>
<</switch>
<</if>>
/* --- Alessia snark pool --- */
<<if $flags.phoneUnlocked>>
<<set _alesQ = random(1, 4)>>
<<switch _alesQ>>
<<case 1>>
<<actor bestfriend>>
morning, stray. how was the weekend? wait, don't answer. i saw the snap. 💅
<</actor>>
<<case 2>>
<<actor bestfriend>>
$youName's walking different again. must be a monday thing. or a cage thing. same thing. 💀
<</actor>>
<<case 3>>
<<actor bestfriend>>
i gave up counting his friday nights. it's like a subscription service at this point. 🤭
<</actor>>
<<case 4>>
<<actor bestfriend>>
$girlfriendName, does he get a loyalty card? ten fridays and the eleventh one's free? 😈
<</actor>>
<</switch>>
<<else>>
<<actor bestfriend>>
he's back. every monday. like a boomerang you can't throw away. 💀
<</actor>>
<</if>>
/* --- Bully presence (random, ~1/2) --- */
<<if random(1, 2) eq 1 && $flags.hallwayHierarchyDone>>
<<actor bully>>
<<if $flags.fridayDateLastKey>>
<<set _fDay = (State.variables.fridayDateLastKey || "")>>
weekend update: $girlfriendName looked good on friday. you weren't there, but the receipt was. 😏
<<else>>
weekend's over. back to the hierarchy. you missed nothing. well, you missed friday, but that's your job. 😂
<</if>>
<</actor>>
<</if>>
/* --- Classroom short beat --- */
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/act1/day1-anwo-lecture.jpg'" alt="classroom">
<<actor teacher>>
<<if _weekNum gt 3>>
The project presentations are behind us. Good work, most of you. The council will review the final rankings soon.
<<elseif _weekNum gt 1>>
Keep working on the project. Hierarchy doesn't wait for stragglers.
<<else>>
Today we continue. Pay attention. The rankings are watching.
<</if>>
<</actor>>
/* --- Friday aftermath (if she went out last week) --- */
<<if ($flags.fridayDateStage || 0) gte 6 && random(1, 3) eq 1>>
<<actor bestfriend>>
friday recap: two names on her calendar. one name on the receipt. guess which one is you. 💀
<</actor>>
<<elseif ($flags.fridayDateStage || 0) gte 5 && random(1, 2) eq 1>>
<<actor bestfriend>>
friday recap: $exfriendName texted me. not about the project. about her. i didn't ask for details. i didn't need to. 🤭
<</actor>>
<<elseif ($flags.fridayDateStage || 0) gte 4 && random(1, 2) eq 1>>
<<actor bestfriend>>
friday recap: $bullyName had a good night. $girlfriendName had a better one. you had... a chair and a phone. 💅
<</actor>>
<</if>>
/* --- Day 35 aftermath (Alessia keeps the joke alive) --- */
<<if $flags.day35PublicHumiliationDone && random(1, 3) eq 1>>
<<actor bestfriend>>
still getting asked about the calendar thing. fyi. 🤭
people keep sliding into my dms like i'm the friday receptionist. and i let them. 💀
<</actor>>
<</if>>
/* --- Overnight Snap callback (Jenny) --- */
<<if $flags.phoneOvernightPending && $flags.phoneUnlocked>>
<<actor girlfriend>>
check your snaps. i sent something last night. read it before class or don't bother. 😏
<</actor>>
<</if>>
<<run setup.nudgeArousal(random(4, 8))>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 6)>>
<</nobr>>
<div class="continue-links">
<<if setup.classRankingHasUpdate()>>
[[Check the ranking board|Class board]]
<</if>>
[[Leave school|After school]]
</div>/* 1-in-X: catch her mid date-prep for an alpha (cooldown inside helper) */
<<if setup.trySisterDatePrep()>>
<<goto "Sister date lingerie">>
<<else>>
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister">
<<if $caged>>
<p class="delayed">$sisterName looks you over like she's inventorying metal under cotton.</p>
<<elseif $world eq "anwo">>
<p class="delayed">$sisterName is half-dressed for the day and fully ready to judge you.</p>
<<else>>
<p class="delayed">Your step-sister leans in the doorway, bored and dangerous in a normal way.</p>
<</if>>
<<set _sisSurveyReady = !$flags.surveySister && $gameDate.getHours() lt 18 && ($flags.fieldSurveyOpen || $flags.surveyPark || hasVisited("School 5 Day anwo"))>>
<<if _sisSurveyReady>>
<div class="quest-banner">
<strong>Field survey</strong>
<p>$sisterName is free enough to take your ANWO questionnaire.</p>
[[Run survey with step-sister|Survey - Ask step-sister]]
</div>
<<elseif !$flags.surveySister && ($flags.fieldSurveyOpen || hasVisited("School 5 Day anwo")) && $gameDate.getHours() gte 18>>
<p class="hint-line">She's busy later in the day. Try again before 18:00.</p>
<<elseif !$flags.surveySister && $flags.day3SurveyDone && !$flags.fieldSurveyOpen && !hasVisited("School 5 Day anwo")>>
<p class="hint-line">Field interviews aren't assigned yet. Wait for the school assignment.</p>
<</if>>
<<if _sisSurveyReady>>[[Run survey with step-sister|Survey - Ask step-sister]]<</if>>
<<if $caged>>[[Help step-sister]]<</if>>
<<if $caged && $sisterTaskChapter gte 1>><<link `"Quick check-in with " + $sisterName` "Sister small talk">><</link>><</if>>
[[Home]]
<</if>><<actor you>>
Hey $sisterName, do you have a moment for a quick survey about ANWO?
<</actor>>
<<actor sister>>
ANWO? Is that a cult, a diet, or a dating app for people who like rankings?
<</actor>>
<<actor you>>
Alpha New World Order. Alphas lead. Betas... follow. It's for class.
<</actor>>
<<actor sister>>
Oh. Hierarchy cosplay. Sure... I'm in. I love a questionnaire that flatters power.
<</actor>>
<p class="delayed">After the survey...</p>
<<actor you>>
You scored full points. How?
<</actor>>
<<actor sister>>
Because I believe in strong leadership, and in what happens when a strong man folds.
There's something delicious about a guy who used to posture ending up polite, locked, useful.
Not that I'm speaking from experience. 😈
<</actor>>
<<actor you>>
Okayyy... thanks anyway.
<</actor>>
[[Home][$flags.surveySister = true; $flags.questHint = ""; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]<<switch $sisterTaskChapter>>
<<case 0>>
<<include "Sister visit 1 panties">>
<<case 1>>
<<include "Sister visit 2 clean">>
<<case 2>>
<<include "Sister visit 3 key talk">>
<<default>>
<<include "Sister visit chores">>
<</switch>><img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister visit">
<<actor sister>>
Oh, brother. Look at you. Still locked like a secret under your clothes.
<</actor>>
<<actor sister>>
I handed $girlfriendName the solution. She actually used it. I am weirdly proud and very entertained.
<</actor>>
<<actor sister>>
Task time. Put on my dirty panties over the cage. Photo stays on my phone, not the group chat... unless you bore me.
<</actor>>
<<actor sister>>
Refuse and I tell her you have been rubbing that steel like a prayer.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "No. I am not doing that.">>
<<actor sister>>
Okay. Your girlfriend will hear from me.
<</actor>>
[[See ya|Home][$relationshipState = "girlfriend-mad"; $girlfriendMadReason = "$sisterName told me you have been rubbing your cage like a junkie."]]
<</you-choice>>
<<you-choice "Fine. Just... do not show anyone.">>
<img class="centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'">
<<actor sister>>
Gorgeous. Soft boy fashion. $girlfriendName would laugh and then keep you.
<</actor>>
<<actor-thought you>>
The fabric is warm and wrong and your cage jerks against it like it still has opinions.
<</actor-thought>>
[[Thanks...|Home][$sisterTaskChapter = 1; $sissyScore += 2; $flags.sisterVisit1 = true]]
<</you-choice>>
</div><img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister visit">
<<actor sister>>
Hey, loser. Cage still singing?
<</actor>>
<<actor sister>>
I need my room clean before my friend comes over. You will be the maid. Quiet. Efficient. Eyes down if he shows early.
<</actor>>
<<actor sister>>
Pay is ten bucks and me not inventing new crimes for $girlfriendName.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I will clean. Keep her out of it.">>
[[Clean her room|Sister clean room]]
<</you-choice>>
<<you-choice "I am not your maid.">>
<<actor sister>>
Then you are my cautionary tale. One text.
<</actor>>
[[Leave|Home][$relationshipState = "girlfriend-mad"; $girlfriendMadReason = "$sisterName says you are a lazy locked brat who will not even help family."]]
<</you-choice>>
</div><img class="centered" @src="setup.ImagePath+'sister/room-cleaning.webp'">
<p class="delayed">You clean. She sits on her bed scrolling, occasionally pointing at a dust speck like a queen of nothing.</p>
<<actor sister>>
Nice work, maid. Here is ten. Do not spend it all on lube you will never use properly.
<</actor>>
<<if $backpack.has("apology-gift")>>
<<actor sister>>
Cute... you bought $girlfriendName something. Bribery is a love language. She will like that.
<</actor>>
<</if>>
[[Thanks|Home][$money += 10; $sisterTaskChapter = 2; $sissyScore += 1; $flags.sisterVisit2 = true; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister key talk">
<<actor sister>>
Serious minute. Then we go back to bullying.
<</actor>>
<<actor sister>>
$girlfriendName asked me if dual keyholding is a thing. I said only if she wants drama.
I do not want her key. I want leverage. Different hobby.
<</actor>>
<<actor sister>>
So here is the deal: I keep quiet about your little panty portfolio. You keep being useful, errands, cash, ego snacks.
If you ever get unlocked and act big, I remind everyone who dressed you.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Deal. Just do not ruin us.">>
<<actor sister>>
Us. Cute. You mean her. Fine... I will be a friendly ghost. For now.
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true; $girlfriendTrustLevel = setup.changeFavor(1); $sissyScore += 1]]
<</you-choice>>
<<you-choice "You are enjoying this too much.">>
<<actor sister>>
Obviously. Fall-from-grace is premium entertainment. You are practically a streaming service.
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true; $sissyScore += 2]]
<</you-choice>>
<<you-choice "Tell $girlfriendName I want her to hold the only key. Not you.">>
<<actor sister>>
Aww. Loyalty. I will text her you said that. She will melt... or tighten the schedule. Win-win.
<</actor>>
[[Home][$sisterTaskChapter = 3; $flags.sisterVisit3 = true; $girlfriendTrustLevel = setup.changeFavor(2); $sissyScore += 1]]
<</you-choice>>
</div><img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-visit.jpg'" alt="step-sister chores">
<<actor sister>>
Chore board, locked edition. Pick your suffering.
<</actor>>
[[Clean her room (again)|Sister clean room free]]
[[Just talk|Sister small talk]]
[[Home]]<img class="centered" @src="setup.ImagePath+'sister/room-cleaning.webp'">
<<actor sister>>
Adequate. Here is five for not crying about it.
<</actor>>
[[Home][$money += 5; $sissyScore += 1; $gameDate = setup.changeDate($gameDate, 'hours', 1)]]<<actor sister>>
You are quieter since the cage. Suits you.
Do not ask me for the key. I never took it. I just like knowing you wonder.
<</actor>>
<<if $caged>>
<<actor sister>>
$girlfriendName is lucky. Or you are lucky. Depends who is telling the story.
<</actor>>
<</if>>
[[Home][$gameDate = setup.changeDate($gameDate, 'hours', 1)]]/* Random interrupt while jerking, mean practical, not soft. Cooldown set in trySisterJerkInterrupt. */
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/late/sister-walk-in.jpg'" alt="sister walk-in">
<p class="delayed">The door is not locked. Of course it is not. $sisterName freezes mid-step, takes in the scene, and her mouth does that mean little shape that means she is about to enjoy this.</p>
<<actor sister>>
Oh my god.
Really? In the middle of the day? Gross. And hilarious.
<</actor>>
<<if $caged>>
<<actor sister>>
Wait, the cage is still on and you are still trying?
Loser behavior. Peak content. Do not stop on my account... actually, wait. Stop. I have a better idea.
<</actor>>
<<else>>
<<actor sister>>
Hands off. Now. I am not watching you finish like a podcast.
You got caught. That means you owe me.
<</actor>>
<</if>>
<<actor-thought you>>
Blood in your ears. $sisterName does not look away. She looks entertained.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<if $caged>>
<<you-choice "Put her dirty panties over the cage while she films a three-second laugh.">>
<img class="centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="">
<<actor sister>>
Fashion. Soft boy couture.
If $girlfriendName asks, I will say you volunteered. Because you did. Just now.
<</actor>>
<<set $sissyScore += 3>>
<<set $complyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">She leaves still snickering. The fabric stays warm. The cage stays stupid.</p>
<div class="delayed">[[Hide under the covers|Home]]</div>
<</you-choice>>
<<you-choice "Edge the steel while she mocks you until she says stop.">>
<<actor sister>>
Faster. No, slower. Look at me when you rattle.
Okay. Stop. Hands up. Suffer.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.peakArousal()>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">Denied on command by your step-sister. She calls it enrichment.</p>
<div class="delayed">[[Ache in silence|Home]]</div>
<</you-choice>>
<<you-choice "Beg her not to tell $girlfriendName, do her laundry as payment.">>
<<actor sister>>
Deal. Basket is by the door.
And if you "forget," I invent a worse version for her.
<</actor>>
<<set $sissyScore += 1>>
<<set $complyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You fold her clothes with a locked cock and zero dignity. She rates your corners.</p>
<div class="delayed">[[Done. Still hard.|Home]]</div>
<</you-choice>>
<<else>>
<<you-choice "Finish while she watches and rates you like a bad sport.">>
<<actor sister>>
Wow. That was... sad. Effort: two out of ten.
Wipe up. Then get out of my hallway energy.
<</actor>>
<<set $sissyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 2)>>
<<set $aroused = 0>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You finish under a spotlight of pure mockery. She hums like she won something.</p>
<div class="delayed">[[Crawl into a hole (Home)|Home]]</div>
<</you-choice>>
<<you-choice "Stop mid-stroke. She makes you apologize on your knees.">>
<<actor sister>>
"Sorry for being a gross little pervert in a shared house."
Say it. Louder. Good boy, wait, no. Gross boy. Close enough.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">Denied. Kneeling. She leaves the door open on purpose.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Text $girlfriendName what $sisterName dictates.">>
<<actor sister>>
Type: "got caught by $sisterName. i am pathetic."
Send. Show me. Perfect. She is going to love that.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 2)>>
<<set $girlfriendTrustLevel = Math.max(0, ($girlfriendTrustLevel || 0) - 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">Message sent. Read receipt. Your stomach drops. $sisterName looks proud of her production value.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<</if>>
</div>
</div>/* Random 1-in-X when visiting step-sister: date-night outfit, alpha pickup soon. Cooldown in trySisterDatePrep. */
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'sister/date-ready.jpg'" alt="step-sister dressed for a date">
<p class="delayed">You knock and walk in on autopilot. $sisterName is at the full-length mirror in a tight black dress and heels, finishing an earring. Perfume hits first. Then the fact that she is dressed to leave, not hang out with you.</p>
<<actor sister>>
Knocking is a concept, loser.
Relax. I'm not naked. Yet. This is the part where I still look classy for the restaurant.
<</actor>>
<<actor-thought you>>
That dress is fighting for its life. She knows you noticed. She likes that you noticed.
<</actor-thought>>
<<actor sister>>
Alpha guy. Real one. Tall, pays, does not ask permission to order.
He's picking me up in like twenty. So either help or gawk from the door like a haunted house prop.
<</actor>>
<<if $caged>>
<<actor sister>>
Oh right. You're metal downstairs.
Cute. He's not. If he texts a late "on my way," I might make you wait in the hall so he never has to see the pet.
<</actor>>
<<elseif $world eq "anwo">>
<<actor sister>>
ANWO would love him. You? Soft ranking. Me? Entertainment while I wait for someone who can actually use his hands.
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Ask who he is. Try not to sound jealous.">>
<<actor you>>
So uh... who is he?
<</actor>>
<<actor sister>>
Someone who does not need a survey to know he's above you.
He's taking me somewhere loud and good. If I'm late back, assume I'm busy. Don't text me "you okay?" like a mom.
<</actor>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(8)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">She checks her phone, smiles at a name you do not get to see, and shoos you out with two fingers.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Offer to zip her / grab her bag. Soft servant mode.">>
<<actor you>>
I can... zip you. Or get your bag. Whatever.
<</actor>>
<<actor sister>>
Wow. Useful for once.
Bag's on the bed. Don't sniff anything. Actually, wait. Look at me in the mirror. Yeah. That's the face of a guy who knows he's not coming.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You hand her the clutch like a coat check that failed the vibe check. She tips you with a pity smirk and a door close in your face.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Stare too long. She catches you and rates the dress.">>
<<actor sister>>
Eyes up. Or don't. I paid for this silhouette.
Rate me. Out loud. One to ten. And if you say ten I'm calling you a liar and a simp.
<</actor>>
<<actor you>>
...Nine. Okay, ten. I'm a liar.
<</actor>>
<<actor sister>>
Correct. He's getting the ten. You're getting the hallway.
Under this? Lace. Black. None of your business. Have fun imagining it while I'm out.
<</actor>>
<<set $sissyScore += 1>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 2)>>
<<run setup.nudgeArousal(12)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">She spins once for the mirror, not for you, and the dress does the rest of the humiliation for free.</p>
<div class="delayed">[[Leave before he arrives|Home]]</div>
<</you-choice>>
<<if $caged>>
<<you-choice "Beg her not to tell $girlfriendName you walked in staring.">>
<<actor sister>>
Oh I might.
Or I might say my locked little step-bro almost creamed the carpet because I put on heels.
Behave and I keep it cute. Act weird and I send her a voice note.
<</actor>>
<<set $sissyScore += 2>>
<<set $complyScore += 1>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 2)>>
<<run setup.nudgeArousal(10)>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.refreshPersonality()>>
<p class="delayed">You back out of the room with the cage weighing every step. Somewhere downstairs a car horn might as well be applause.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<</if>>
<<you-choice "Mumble sorry and leave before he shows.">>
<<actor sister>>
Smart. First good choice all day.
Don't wait up. Don't "check the driveway." Go be soft somewhere else.
<</actor>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<run setup.nudgeArousal(6)>>
<p class="delayed">You leave. The perfume follows you down the hall like a taunt.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>/* Legacy hub removed */
<<goto "Home">><<goto "Home">><<if setup.hustleStatus("beg") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/beg-allowance.jpg'" alt="beg for allowance">
<<actor girlfriend>>
you need cash again?
fine. beg properly. not "hey can I borrow."
the phrase. you know the energy.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "Please, keyholder... I need allowance for your errands.">>
<<actor girlfriend>>
better.
don't spend it on yourself first.
<</actor>>
<<set $complyScore += 2>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("beg")>>
<p class="delayed">Transfer hits: <strong>$<<= _pay>></strong>. Shame <<= $humiliation>>/10.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Can you just send money? I'm short.">>
<<actor girlfriend>>
lazy ask.
half. learn manners next time.
<</actor>>
<<set $money += 12>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<set $flags.hustleUnlocked = true>>
<<set $flags.hustleLastDayNum = $day>>
<<if !$hustleLastDone>><<set $hustleLastDone = {}>><</if>>
<<set $hustleLastDone["beg"] = $day>>
<<set $gameDate = setup.changeDate($gameDate, 'hours', 1)>>
<<set $resistScore += 1>>
<p class="delayed">Only <strong>$12</strong>. She still bills you in Shame.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("school-bags") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/carry-bags.jpg'" alt="carry bags">
<p class="delayed">School hallway. $girlfriendName hooks her bag on your shoulder before first period. $bestfriendName dumps hers on top like you're a coat rack with legs.</p>
<<actor girlfriend>>
walk normal.
if anyone asks, you're being useful.
<</actor>>
<<actor bestfriend>>
aww look at the locked mule
don't drop my stuff loser
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "I've got them. Let's go.">>
<<actor girlfriend>>
good.
tip for not embarrassing me in the hall.
<</actor>>
<<set $complyScore += 1>>
<<set _pay = setup.completeHustle("school-bags")>>
<p class="delayed">Cash in a side pocket: <strong>$<<= _pay>></strong>. Two bags. One cage. Shame <<= $humiliation>>/10.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Both bags? Seriously?">>
<<actor bestfriend>>
seriously. move.
<</actor>>
<<actor girlfriend>>
he asked. still carrying. still paid.
<</actor>>
<<set $sissyScore += 1>>
<<set _pay = setup.completeHustle("school-bags")>>
<p class="delayed"><strong>$<<= _pay>></strong>. Your shoulders complain. Alessia doesn't.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("bags") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/carry-bags.jpg'" alt="carry bags">
<p class="delayed">Mall corridor. $girlfriendName stacks bags on your arms like a coat rack with a pulse.</p>
<<actor girlfriend>>
don't drop anything.
and smile if someone stares. you're the boyfriend who carries. cute.
<</actor>>
<<actor-thought you>>
Steel under denim. Lace tags peek from a bag that is not for you.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Yes. I've got them.">>
<<actor girlfriend>>
good bag boy.
tip for not embarrassing me.
<</actor>>
<<set $complyScore += 1>>
<<set _pay = setup.completeHustle("bags")>>
<p class="delayed">She peels off <strong>$<<= _pay>></strong> like you're staff. Shame <<= $humiliation>>/10.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "This is a lot...">>
<<actor girlfriend>>
then hold tighter.
still getting paid. still locked.
<</actor>>
<<set $sissyScore += 1>>
<<set _pay = setup.completeHustle("bags")>>
<p class="delayed"><strong>$<<= _pay>></strong> in your pocket. Dignity stays in the food court.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("bully-coffee") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/bully-coffee.jpg'" alt="coffee for the bully">
<<actor girlfriend>>
he wants coffee.
you're closer. go.
and don't make that face -- cash is cash.
<</actor>>
<p class="delayed">You find $bullyName outside like he owns the shade. He barely looks up from his phone.</p>
<<actor bully>>
Damn. She really sent the locked one.
Black. Large. Don't spill.
<</actor>>
<span id="conv"></span>
<div id="options">
<<you-choice "...Okay. One black large.">>
<p class="delayed">You buy it. You hand it over. His fingers brush the cup, not you.</p>
<<actor bully>>
Good boy energy. Here's for the walk.
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 1>>
<<set _pay = setup.completeHustle("bully-coffee")>>
<<run setup.nudgeArousal(8)>>
<p class="delayed">Bills on your palm: <strong>$<<= _pay>></strong>. He already forgot your name. Shame <<= $humiliation>>/10.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Why am I doing this?">>
<<actor bully>>
Because she said so. And you like money more than pride. Move.
<</actor>>
<<set $resistScore += 1>>
<<set $sissyScore += 2>>
<<set _pay = setup.completeHustle("bully-coffee")>>
<p class="delayed">He still tips <strong>$<<= _pay>></strong>. The laugh is free.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("alessia-shoe") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/alessia-shoe.jpg'" alt="shoe task">
<p class="delayed">After school. Steps still warm. $bestfriendName "drops" a shoe like it planned itself. Dirt on the white edge. Her smile is pure devil.</p>
<<actor bestfriend>>
oops
you're free right? locked boys have free hands
wipe it. properly. i'll venmo your little allowance
<</actor>>
<<if $girlfriendTrustLevel gte 5>>
<<actor girlfriend>>
do it.
she's mean. you're useful. both can be true.
<</actor>>
<<else>>
<<actor girlfriend>>
don't make a scene.
just clean it. 😐
<</actor>>
<</if>>
<span id="conv"></span>
<div id="options">
<<you-choice "Kneel enough to wipe. Get it done.">>
<<actor bestfriend>>
there we go
pathetic and paid. my favorite combo
<</actor>>
<<set $complyScore += 2>>
<<set $sissyScore += 2>>
<<set _pay = setup.completeHustle("alessia-shoe")>>
<p class="delayed"><strong>$<<= _pay>></strong> lands. Your knees remember the step. Shame <<= $humiliation>>/10.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Wipe standing. Minimal.">>
<<actor bestfriend>>
half-assed
half pay then. still did it though loser
<</actor>>
<<set $resistScore += 1>>
<<set $sissyScore += 1>>
<<set _pay = setup.completeHustle("alessia-shoe", { pay: 15 })>>
<p class="delayed">Only <strong>$<<= _pay>></strong>. She still got the show.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("used-panty") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/used-panty-assign.jpg'" alt="last night panties">
<img class="hero-img centered delayed" @src="setup.ImagePath+'you/chastity-panty.png'" alt="lace against the cage">
<<actor girlfriend>>
morning assignment.
these are from last night.
yes... <em>that</em> night. he was in me. these were on the floor.
you're wearing them under your clothes to school.
photo of the waistband against the cage before you leave.
i pay for proof.
<</actor>>
<<actor-thought you>>
Warm-wrong fabric. Not yours. Not clean. The cage presses into lace that smelled like her and him.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Put them on. Send the photo. Go.">>
<<set $flags.wearingUsedPanty = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="under clothes all day">
<<actor girlfriend>>
good boy.
walk normal. if you squirm i'll know.
<</actor>>
<<set $complyScore += 3>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("used-panty")>>
<p class="delayed">Transfer: <strong>$<<= _pay>></strong>. All day under denim. Sleep is the only laundry. Shame <<= $humiliation>>/10.</p>
<<include "Hustle school exit">>
<</you-choice>>
<<you-choice "Hesitate. Almost refuse.">>
<<set $flags.wearingUsedPanty = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'story/hustles/used-panty-worn.jpg'" alt="under clothes all day">
<<actor girlfriend>>
then no cash.
and i tell $bestfriendName you flinched at used panties.
put them on.
<</actor>>
<<set $resistScore += 1>>
<<set $sissyScore += 3>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("used-panty", { extraShame: 1 })>>
<p class="delayed">You still wear them. <strong>$<<= _pay>></strong>. The hesitation was free entertainment.</p>
<<include "Hustle school exit">>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("condom-drink") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/condom-drink.jpg'" alt="cleanup stipend">
<p class="delayed">Evening. Her place or yours... same hierarchy. $bullyName is half-dressed, bored-smug. $girlfriendName holds your key on one finger like jewelry. Cash and foil on the nightstand. Cleanup stipend.</p>
<<actor girlfriend>>
cleanup stipend.
you wanted money. this is money with taste.
<</actor>>
<<actor bully>>
Open up, experiment.
Don't waste it.
<</actor>>
<<actor-thought you>>
Rubber. Salt. Proof. The cage stays shut while your mouth does the job his cock already finished.
<</actor-thought>>
/* Explicit cleanup beat (inbox drop → story/hustles/condom-clean.webp) */
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="condom cleanup">
<span id="conv"></span>
<div id="options">
<<you-choice "Do it. Eyes down. Finish it.">>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="cleanup done">
<<actor girlfriend>>
there.
paid and useful. good statue.
<</actor>>
<<set $complyScore += 3>>
<<set $sissyScore += 3>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("condom-drink")>>
<p class="delayed"><strong>$<<= _pay>></strong> on the nightstand. Your throat burns. Shame <<= $humiliation>>/10.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Gag. Still finish.">>
<img class="hero-img centered porn-frame delayed" @src="setup.ImagePath+'story/hustles/condom-clean.webp'" alt="messy cleanup">
<<actor bully>>
Messy. Still counts.
<</actor>>
<<actor girlfriend>>
cute face. full job. same pay.
<</actor>>
<<set $sissyScore += 4>>
<<set $resistScore += 1>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("condom-drink", { extraShame: 1 })>>
<p class="delayed"><strong>$<<= _pay>></strong>. Tears optional. Cash isn't.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>><<if setup.hustleStatus("key-bully") neq "open">>
<<goto "Home">>
<<else>>
<div class="scene-panel compact">
<img class="hero-img centered" @src="setup.ImagePath+'story/hustles/key-to-bully.jpg'" alt="key lent to bully">
<p class="delayed">$girlfriendName unhooks the key from her chain. She doesn't unlock you. She holds it out to $bullyName.</p>
<<actor girlfriend>>
borrow.
not forever. long enough.
make him remember who doesn't get the key.
<</actor>>
<<set $flags.keyWithBully = true>>
<<actor bully>>
Damn.
She's really lending me the remote.
Pocket. Don't beg.
<</actor>>
<<actor-thought you>>
The click of metal on his ring is louder than the cage. Your cock is still locked. The permission just left the room with him.
<</actor-thought>>
<span id="conv"></span>
<div id="options">
<<you-choice "Stay quiet while he teases the key in front of you.">>
<<actor bully>>
Look at that face.
Key's warm. You're not getting warm. Walk.
<</actor>>
<<actor girlfriend>>
good.
he tips for the show. key comes back to me.
<</actor>>
<<set $flags.keyWithBully = false>>
<<set $complyScore += 3>>
<<set $sissyScore += 2>>
<<run setup.peakArousal()>>
<<set $girlfriendTrustLevel = Math.min(10, $girlfriendTrustLevel + 1)>>
<<set _pay = setup.completeHustle("key-bully")>>
<p class="delayed">Key back on her chain. Cash: <strong>$<<= _pay>></strong>. Your pulse still thinks he owns it. Shame <<= $humiliation>>/10.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Ask for it back. Soft.">>
<<actor bully>>
Ask harder. Nah -- still no.
<</actor>>
<<actor girlfriend>>
that was the point.
pay him with silence next time.
<</actor>>
<<set $flags.keyWithBully = false>>
<<set $resistScore += 2>>
<<set $sissyScore += 3>>
<<set $girlfriendTrustLevel = Math.max(0, $girlfriendTrustLevel - 1)>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("key-bully", { extraShame: 1 })>>
<p class="delayed">He flicks the key to her. Still tips <strong>$<<= _pay>></strong>. Asking cost favor.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
<<you-choice "Let him pocket-check the cage while he holds the key.">>
<<actor bully>>
Steel's real. Cute.
Stay locked, experiment.
<</actor>>
<<actor girlfriend>>
hot.
you're disgusting. in a useful way.
<</actor>>
<<set $flags.keyWithBully = false>>
<<set $complyScore += 2>>
<<set $sissyScore += 4>>
<<run setup.peakArousal()>>
<<set _pay = setup.completeHustle("key-bully", { extraShame: 1, extraSissy: 1 })>>
<p class="delayed">Public-adjacent check. Private cash <strong>$<<= _pay>></strong>. Key returns. Hierarchy doesn't.</p>
<div class="delayed">[[Home]]</div>
<</you-choice>>
</div>
</div>
<</if>>
/* his-tip (Jamal store errands) cut for now, passage kept as soft stub */<<goto "Home">>/* Whole passage in nobr — SC turns every source newline into <br> (was ~50 empty breaks). */
<<nobr>>
<<audio "reception_bell" play>>
<<silently>>
/* Story cap = what is allowed; climb = slow ramp from shifts; tier = min(cap, climb) */
<<set _cap = setup.workStoryCap()>>
<<set _climb = setup.workShiftClimb()>>
<<set _tier = setup.workKinkTier()>>
<<set _shift = random(1, 5)>>
<<set _pay = setup.workShiftPay()>>
<<set _shiftsBefore = $workShiftsDone || 0>>
<<set _sissyBefore = $sissyScore || 0>>
/* Still per kink tier (always show a hero; reception gif as secondary for lobby motion) */
<<if _tier gte 3>>
<<set _deskStill = "work/desk-owned.jpg">>
<<elseif _tier gte 2>>
<<set _deskStill = "work/desk-keyholder.jpg">>
<<elseif _tier gte 1>>
<<set _deskStill = "work/desk-keyholder.jpg">>
<<else>>
<<set _deskStill = "work/desk-soft.jpg">>
<</if>>
<</silently>>
<div class="scene-panel compact work-shift-panel">
<img class="hero-img centered" @src="setup.ImagePath + _deskStill" alt="hotel desk">
<img class="hero-img centered delayed" @src="setup.ImagePath+'work/reception'+ random(1, 2) +'.gif'" alt="lobby">
/* Boss: simple, once. No jargon cards. */
<<if !$flags.workBossBriefed>>
<<set $flags.workBossBriefed = true>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content">Weekend desk. Simple job. Show up. Smile. Don't scare the guests. You get paid cash. That's the whole deal. Whatever else is going on under your belt or on your phone... not my business. Keep it quiet and keep coming back.</span></div></div>
<<else>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content"><<if _tier gte 3>>You're weird lately. Still reliable. That's all I need.<<elseif _tier gte 2>>Same as always. Desk. Guests. Don't make me notice you.<<elseif _tier gte 1>>Looking a little tense. Stand up straight and work.<<else>>Clock in. Don't overthink it.<</if>></span></div></div>
<</if>>
<<if _tier gte 3>>
/* --- Owned heat: chastity + cuck flash + sissy desk humiliation --- */
<<if _shift eq 1>>
<<actor-thought you>>
Lobby smile. Suit pants hide the cage. A honeymoon couple checks in, hands all over each other.
Your lock answers with a useless throb. You book their suite like a eunuch with a keyboard.
<</actor-thought>>
<p class="delayed">They thank you. You say "enjoy your stay." The steel says <em>not you</em>.</p>
<<run setup.nudgeArousal(10)>>
<<set $sissyScore += 1>>
<<elseif _shift eq 2>>
<<actor-thought you>>
Phone under the desk. $girlfriendName: photo of the key between her fingers.
Caption: work hard, locked pet. no breaks for that clitty.
<</actor-thought>>
<<actor girlfriend>>
(text) stand straight. smile. remember who owns the key while you earn mall money for my lingerie. 🔐
<</actor>>
<p class="delayed">You type room numbers with perfect posture. Manager calls you reliable. She calls you sealed.</p>
<<run setup.peakArousal()>>
<<set $sissyScore += 1>>
<<elseif _shift eq 3>>
<<actor-thought you>>
Tall guest. Easy laugh. Not $bullyName. Close enough that the cage remembers the chair in the corner.
<</actor-thought>>
<p class="delayed">You hand him a key card. Your own key is on her necklace. Hierarchy with a name tag.</p>
<<run setup.nudgeArousal(12)>>
<<set $sissyScore += 1>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
Bathroom stall. Careful silence. You check the lock like a dirty secret and almost moan when it shifts.
Femdom rule from last night: no touching the bars at work. You break it for half a second. Shame hits harder than pleasure.
<</actor-thought>>
<p class="delayed">Back to the desk. Smile. Deny. Get paid to be her public good boy.</p>
<<run setup.peakArousal()>>
<<set $sissyScore += 2>>
<<else>>
<<if $flags.phoneUnlocked>>
<<actor girlfriend>>
(text) $bullyName asked if you're still locked at that little hotel job
i said obviously
be cute for the guests. be useless for fucking. 😈
<</actor>>
<<else>>
<<actor-thought you>>
You invent his voice in the lobby noise. Still locked. Still working. Still not the one she rides.
<</actor-thought>>
<</if>>
<p class="delayed">Shift ends. Pay is real. The cage is the uniform under the uniform.</p>
<<run setup.nudgeArousal(10)>>
<<set $sissyScore += 1>>
<</if>>
<<elseif _tier eq 2>>
/* --- Key rules: femdom texts, chastity discipline, soft cuck --- */
/* First time this tier: she orders the pink brief (setup, not random mid-shift dump) */
<<if !$flags.workPinkBriefOrdered>>
<<set $flags.workPinkBriefOrdered = true>>
<<set $flags.workPinkBriefOn = true>>
<img class="hero-img centered delayed" @src="setup.ImagePath+'work/pink-brief.jpg'" alt="pink brief under work slacks">
<<if $flags.phoneUnlocked>>
<<actor girlfriend>>
(text) new rule for hotel shifts
pink brief under the slacks. soft. silly. mine.
you don't get a reason that sounds fair. you get attitude training.
nobody sees it. you feel it. that's the point. 🔐
<</actor>>
<<else>>
<<actor-thought you>>
Morning order before you left: pink brief under the work slacks.
"For attitude," she said. Soft fabric over the cage. Humiliating on purpose.
<</actor-thought>>
<</if>>
<p class="delayed">You put them on. Lock, pink, hotel polyester. Her joke that only you have to live in.</p>
<<run setup.nudgeArousal(10)>>
<<set $sissyScore += 2>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<elseif _shift eq 1>>
<<actor-thought you>>
Keyholder rules follow you to work. Stand. Smile. Don't rattle.
A woman guest looks through you like furniture. That shouldn't turn you on. It does.
<</actor-thought>>
<p class="delayed">You stay polite. The steel stays honest.</p>
<<run setup.nudgeArousal(8)>>
<<set $sissyScore += 1>>
<<elseif _shift eq 2>>
<<actor girlfriend>>
(text) edge later. not now.
if you leak in those pants i will know.
earn money for me like a good locked wallet. 🔐
<</actor>>
<p class="delayed">You almost drop a key card. Manager thinks you're tired. You're denied.</p>
<<run setup.peakArousal()>>
<<set $sissyScore += 1>>
<<elseif _shift eq 3>>
<<actor-thought you>>
Couple argues softly about whose card pays. She wins. He laughs it off.
You book the room and feel smaller than the tip jar.
<</actor-thought>>
<p class="delayed">Cuck energy without a name. Just vibes and a cage.</p>
<<run setup.nudgeArousal(10)>>
<<set $humiliation = Math.min(10, ($humiliation || 0) + 1)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
<<if $flags.workPinkBriefOn>>
Still the pink brief under the slacks. Her "attitude" homework.
Nobody sees. You feel every seam over the cage. Sissy secret under hotel polyester.
<<else>>
Cage under the slacks. Posture. Panic. Her rules without a private joke today.
<</if>>
<</actor-thought>>
<p class="delayed">Six hours of posture and panic. Paycheck for her rules.</p>
<<run setup.nudgeArousal(12)>>
<<set $sissyScore += 2>>
<<else>>
<<actor-thought you>>
End of shift. Bathroom check: still locked. Still hers.
<<if $flags.workPinkBriefOn>>Pink still there. Still stupid. Still working.<</if>>
You practice the smile she likes: soft, useless, employed.
<</actor-thought>>
<p class="delayed">Envelope. Steel. Home to the key.</p>
<<run setup.nudgeArousal(8)>>
<</if>>
<<elseif _tier eq 1>>
/* --- Fresh cage: chastity panic + mild femdom --- */
<<if _shift eq 1>>
<<actor-thought you>>
Lobby morning. Suit pants hide the cage if you don't walk like a secret.
Honeymoon couple. Your lock answers with a dull throb.
<</actor-thought>>
<p class="delayed">You book their suite with a perfect smile. Nobody hears the steel. You do.</p>
<<run setup.nudgeArousal(8)>>
<<elseif _shift eq 2>>
<<actor-thought you>>
Manager wants you standing longer. Every minute is posture versus panic.
<</actor-thought>>
<p class="delayed">You invent "computer work" so you can sit. The key is not here. The paycheck is.</p>
<<run setup.nudgeArousal(6)>>
<<elseif _shift eq 3>>
<<actor-thought you>>
Phone buzzes. $girlfriendName. One preview word: <em>behave</em>.
<</actor-thought>>
<<actor girlfriend>>
(text) locked at work. good.
don't touch. just earn. 🔐
<</actor>>
<p class="delayed">Hands steady for guests. Mind wrecked for her.</p>
<<run setup.nudgeArousal(10)>>
<<set $sissyScore += 1>>
<<elseif _shift eq 4>>
<<actor-thought you>>
Bathroom: careful angle, careful silence. Hotel restrooms are not private enough for rattling metal.
<</actor-thought>>
<p class="delayed">You make it through. Denial as a shift skill.</p>
<<run setup.nudgeArousal(8)>>
<<else>>
<<actor-thought you>>
You almost say "yes keyholder" to a guest by accident. Catch it. Smile. Die inside a little.
<</actor-thought>>
<p class="delayed">Professional. Sealed. Paid.</p>
<<run setup.nudgeArousal(6)>>
<<set $sissyScore += 1>>
<</if>>
<<else>>
/* --- Soft desk (tier 0): mild only; light cage note if sealed but climb not there yet --- */
<<if $caged && _cap gte 1>>
<<if _shift eq 1 || _shift eq 2>>
<<actor-thought you>>
First locked shifts. The cage is quiet under the slacks if you walk right.
Mostly you just work. The steel is background noise. For now.
<</actor-thought>>
<p class="delayed">Nobody knows. You almost forget. Then you sit wrong and remember.</p>
<<run setup.nudgeArousal(4)>>
<<else>>
<<actor-thought you>>
Front desk. Names. Smiles. A tiny metal reminder when you stand too long.
<</actor-thought>>
<p class="delayed">Soft shift. Lock is still a secret, not a scene.</p>
<<run setup.nudgeArousal(3)>>
<</if>>
<<elseif _shift eq 1>>
<<actor-thought you>>
Front desk autopilot. Names, rooms, smiles. Money is the only plot today.
<</actor-thought>>
<p class="delayed">Boring shift. Clean pay.</p>
<<elseif _shift eq 2>>
<<actor-thought you>>
A guest flirts at the counter. You keep it professional. She still talks past you to her partner like you are furniture.
<</actor-thought>>
<p class="delayed">Soft humiliation. Tips of ego, not cash.</p>
<<run setup.nudgeArousal(6)>>
<<elseif _shift eq 3 && $world eq "anwo">>
<<actor-thought you>>
Between check-ins your brain drifts to rankings. Her. The project.
<</actor-thought>>
<p class="delayed">You finish slightly elsewhere. Pay is real.</p>
<<run setup.nudgeArousal(4)>>
<<elseif _shift eq 4>>
<<actor-thought you>>
Manager snaps for coffee. You bring it. Something in you likes being ordered. You hate that.
<</actor-thought>>
<p class="delayed">Service smile. Small seed. Envelope at close.</p>
<<run setup.nudgeArousal(6)>>
<<else>>
<<actor-thought you>>
Boring pays. Mall money. Gift money.
<</actor-thought>>
<p class="delayed">Shift done.</p>
<</if>>
<</if>>
<<set _result = setup.completeWorkShift({ pay: _pay, arousal: 2 })>>
<<set _pay = _result.pay>>
<<if _result.climbed>>
<<run setup.nudgeArousal(4)>>
<</if>>
<div class="actor a-custom delayed"><img @src="setup.ImagePath+'work/hotel-chef.png'" alt=""><div><span class="name-container"><span class="name">Boss</span></span><span class="content"><<if _result.climbed>>Shift done. Here's $<<= _pay >>. You look more... used to this place. See you next weekend.<<else>>Shift done. Here's $<<= _pay >>. Same time next weekend.<</if>></span></div></div>
<p class="hint-line delayed">Wallet: $<<= $money >> · weekends worked: <<= $workShiftsDone >></p>
<div class="continue-links work-shift-links">[[Home]]</div>
</div>
<</nobr>>